1.操作系统管理的理念
先描述再组织。
以我们创建的c程序为例,当我们运行写好的可执行程序时,系统会为其创建为一个结构体task_struct,结构体内包含了该可执行程序的属性,此时该程序便成为了一个进程(对应的代码数据 + 对应的PCB结构体)。进程在操作系统中都有一个户口,用于表示这个进程。这个户口操作系统被称为PCB(进程控制块),由于不止一个进程在系统中运行,所以需要一个进程管理器将大量的进程进行管理。
这就像我们上户口一样,我们带着我们的信息到派出所,派出所将我们的信息整理好写入系统中,然后给予我们身份证号。
2.进程id
系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
如何获取pid,命令如下。
方法1 : 只获取一次
ps ajx | head -1 && ps ajx | grep 进程的名字
方法2 : 持续获取pid(监视脚本)
while :;do ps ajx | head -1 && ps ajx | grep 进程的名字 | grep -v grep; echo"这里写上一些分隔符例如*******" ; sleep 3; done
3.进程的状态(state)
从系统层面讲进程状态有运行、阻塞、挂起等状态。
具体实现上,进程状态分为
源码 | 解释 |
R (running) | 运行状态 |
S (sleeping) | 可中断睡眠状态 |
D (disk sleep) | 不可中断睡眠状态 |
T (stopped) | 暂停状态 |
t (stracing stop) | 调试暂停状态 |
Z (zombie) | 僵尸状态 |
X (dead) | 终止状态 |
- 运行状态
cpu需要一个个将进程加载然后运行,所以需要一个进程队列来管理进程运行先后,进程处于这个运行队列,此时便是运行状态(所以运行状态的进程不一定在运行中,也可能在等待运行)
- 可中断睡眠状态
当进程需要等待某种特定资源(例如从磁盘读取数据),便进入睡眠状态(有两种睡眠状态),处于可中断等待态的进程则可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度
- 不可中断睡眠状态
处于不可中断等待态的进程是因为硬件环境不能满足而等待,它任何情况下都不能被打断
- 暂停状态(调试暂停状态)
此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态.调试暂停状态也是是暂停状态。
- 僵尸状态
子进程虽然已经终止,而父进程依旧在运行,终止进程的信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。当父进程结束时,init 进程会很善良地把那些僵尸进程领养过来,并合理的回收它们的资源,那些僵尸进程就得到了妥善的处理了。
- 终止状态
进程结束时,由系统回收资源,具有瞬时性,所以很难观察到。