Linux进程

进程

一、冯诺依曼体系结构

​ 这里的存储器指的是内存,而磁盘、U盘等都是外存;

​ 输入设备和输出设备都是外设,输入设备包括:键盘、摄像头、话筒、磁盘、网卡、鼠标;输出设备包括:显示器、播放器、磁盘、网卡;

​ CPU包括运算器和控制器,分别进行算术逻辑运算和流程控制;

​ 外设和CPU之间使用总线连接起来,进行传输;

​ CPU寄存器是纳秒级别,内存是微秒级别,外设是毫秒级别的;由木桶原理可知,最终的效率是由外设决定的,速度相差太大。而内存可以起到适配速度差的效果,最终表现出来的就是内存的速度;

​ 执行可执行文件的时候,会将磁盘数据预加载到内存中,之后的交互过程实际上是CPU与内存之间的,并行IO过程靠的就是CPU与内存的交互,而CPU的运算过程必须保证是串行的;

冯诺依曼体系结构规定程序运行先载入到内存中,这是由硬件决定的,即软件依赖硬件;

二、操作系统

2.1认识操作系统

​ 操作系统是一款进行软硬件资源管理的软件。

​ 对于软件的运行通常是从上往下贯穿执行的,依次是用户->用户操作接口(shell、库函数)->系统调用->操作系统内核(内存模块、进程模块、文件模块、驱动模块)->驱动程序->硬件;

​ 操作系统的核心工作就是通过对下管理好软硬件资源,对上提供一个良好的使用和操作环境;

​ 系统调用是用c实现的函数,专门用来调用操作系统;由于操作系统不相信用户,防止非法地访问,只是对外提供来系统调用接口;

2.2操作系统管理

​ 先描述再组织,将被管理对象的属性提取出来,然后用某中数据结构将对象存储起来;即用结构体对象来描述不同的对象,这其实就是计算机世界对现实世界的抽象建模;

三、进程的认识

3.1进程

​ 一个正在运行的程序叫做进程。进程之前一定是相互独立的;

shell 复制代码
ps axj
#查看所有进程
top
#查看当前运行的进程
kill -9 pid
#杀死pid进程
kill -l
#查看所有信号

​ 操作系统将进程对象管理起来,使用结构体对象PCB(进程控制块)描述,然后使用双向链表进行组织;

​ Linux中的结构体对象是task_struct,存放着当前进程的属性,包括标识符如pid,状态,优先级,程序计数器用来恢复进程上下文,内存指针找代码和数据,记账信息:记录调度时间;

​ /proc目录下存放着进程的信息,通过pid来查找相应的目录,exe指的是当前程序所在的目录,cwd指的是当前工作目录。每一个命令行都是是一个bash进程;

shell 复制代码
getpid()#获取当前进程pid
getppid()#获取父进程pid
fork()#创建子进程

​ 子进程和父进程如果看到的是同一份资源,为了保证进程的独立性,其中进行写入的一方要进行写时拷贝;

3.2进程状态

3.2.1一般进程状态

​ 一般的操作系统进程状态分为运行、阻塞、挂起;

​ 运行队列的进程处于运行态,随时可以被调度器进行调度;为防止一个进程长时间占有CPU时间,导致其他进程饥饿,使用了时间片进行管理,即时间片时间一到,就切换进程;

​ 由于需要硬件响应,进程会从运行队列移动到等待队列,等待响应,此时进程处于阻塞状态;

​ 当内存资源严重不足时,会将等待队列的阻塞态进程等较为闲置的进程换出到磁盘,缓解内存压力,等到压力减小时再换回,此时换到磁盘的进程叫做挂起态;

3.2.2Linux进程状态
shell 复制代码
dd
#模仿高IO像磁盘写入
exit(0)
#进程终止,退出码为0

​ R:运行状态,R+表示的是前台运行;

​ S:浅阻塞状态,等待响应;

​ D:深度睡眠状态,该进程一般是处于磁盘读写时,不会接收任何请求,直至读写完成;

​ T:暂停状态,18(继续信号)/19(暂停信号)控制;

​ t:暂停状态,gdb调试时断点暂停;

​ X:死亡状态,终止;

​ Z:僵尸状态,等待父进程回收,在此期间内不可以被杀死,最终会导致内存泄露;

​ 如果父进程被回收了,那么子进程就变成了孤儿进程,会被操作系统领养释放;

3.3进程优先级

​ 进程根据优先级的不同,会优先被调度器进行调度;

shell 复制代码
ps -l#查看当前终端的优先级
ps -al#查看所有优先级

​ 新的优先级=旧的优先级+nice值,PRI:优先级,NI:nice值。nice值范围[-20,19];不能随意修改优先级;

​ 更改优先级的本质就是修改nice值

shell 复制代码
nice -n nice值 命令
renice -n nice值 pid 
进入top后按"r"-->输入进程PID-->输入nice值

3.4进程调度

​ Linux O(1)调度算法

​ 操作系统根据优先级进行调度,O(1)调度算法以空间换时间,使用位图管理队列数组,有两个队列数组,分别是run和wait队列数组,数组大小为140个队列,队列数组安数组下标,优先级逐渐降低。同一个优先级维护在一个队列,通过实现了两个数组的指针实现两个数组的轮换。通过位图是否为零,来判断队列是否为空。时间片运行时间结束,将进程连接到等待队列,使用CR3和eip寄存器来恢复上下文;

3.5环境变量和命令行参数

3.5.1环境变量

​ 环境变量表存放在系统的配置文件中,根据环境变量实现一些默认动作如:指令的默认查找路径,白名单添加;环境变量是系统提供的一组kv变量,不同的用户使用不同的环境变量

常见的环境变量:

​ PATH,记录着取那些路径下查找指令,修改使用PATH=$PATH:增加内容;

shell 复制代码
env
#查看环境变量
getenv("PATH")
#获取环境变量
3.5.2命令行参数

​ 命令行参数,int argc,char* argv[];用来实现指令带选项,实现不同的功能;

​ 命令行参数以空格为分隔符,argc指的是字符串数量,argv是字符串表;

​ 最终形成了两个向量表,一个命令行参数表,一个环境变量表,都以NULL结尾;

3.5.3设置环境变量
shell 复制代码
$myvalue=123
#定义本地变量
export myvalue
#将本地变量导出环境变量
unset myvalue
#取消环境变量
set
#查看所有变量(环境变量与本地变量)
3.5.4内建命令

​ 命令分为常规命令(由bash的子进程完成)和内建命令(由bash亲自完成)

shell 复制代码
chdir()
#修改进程当前工作目录
extern char**environ
#第三方变量指向环境变量表
相关推荐
粥啊、17 分钟前
十六、流编辑器sed(stream editor)
linux·运维·服务器
高hongyuan25 分钟前
Windows 安装 Jenkins 教程
运维·windows·jenkins
小Mie不吃饭42 分钟前
Linux | 零基础Ubuntu卸载MySQL Server 零痕迹
linux·运维·ubuntu
小嵌同学1 小时前
Linux RTC 驱动框架
linux·arm开发·驱动开发·嵌入式硬件
不爱学英文的码字机器1 小时前
在 Linux 中如何使用粘滞位 (t-bit)共享文件
linux·服务器·数据库
cr.sheeper1 小时前
Vulnhub靶场morpheus获得shell攻略
linux·网络安全·vulnhub
vvw&1 小时前
如何在 Ubuntu 22.04 上安装 Elasticsearch
linux·运维·服务器·后端·ubuntu·elasticsearch·搜索引擎
坏柠2 小时前
使用内网穿透工具,为树莓派配置公网地址实现远程ssh
运维·ssh
花晓木2 小时前
SSH无法启动问题:OpenSSL version mismatch. Built against 30000070, you have 30200020
linux·运维·ssh