2022年,卷的第一篇,也是在1月1号卷的,加油2022。
10.1 进程的状态
10.1.1 进程的状态
我们在前面学习过,进程是一个动态的过程,所谓的动态,当然会有状态的变化了。
那进程有几个状态呢?其实在不同的的进程模型是不一样的。
接下来我们都来学习一波。
10.1.2 三态模型
三态模型是最简单的,就是我们所熟知的:运行态,就绪态,阻塞态。
进程为啥会有这三种状态,其实跟进程调度是有关的,一个操作系统其实有很多进程,比如,Windows系统每一个软件其实都是多个进程,我们在用电脑的时候,感觉这些进程都是同行在运行,可以看看这一篇重学计算机(八、进程与创建进程),里面的并行和并发,在并发的时候,其实就是操作系统在切换进程运行,所以进程才会出现各种状态。
- 运行态:该进程此刻在运行。
- 就绪态:进程能够运行,但是没有得到CPU,CPU分配给另一个进程。调度器可以在下一次任务切换时选择该进程。
- 阻塞态:进程正在睡眠无法进行,因为它在等待一个外部事件。调度器无法在下一次调度切换时选择该进程。
画一个图分析一下:(2022年的第一个图)
① :当进程在运行的时候,碰到需要等待事件的时候,就会切换成阻塞状态。(比如等待键盘的输入)
② :当进程在阻塞态的时候,是不能直接进入运行态的,必须先进入就绪态,表示着进程已经准备好了,可以被调度了。(比如键盘输入了,可以进行就绪态)
③ :准备好的进程都在就绪态,等待CPU的降临。(有点像狼多肉少的感觉,哈哈)。等CPU分配到该进程的时候,就可以切换成运行态。
④ :几家欢乐几家愁,有的进程被CPU分配了时间之后,当然有的进程就被冷落了,冷落了之后再次进入就绪态,等到CPU的降临。
10.1.3 五态模型
上面已经介绍了进程三态。接着我们来继续看五态模型。
五态模型其实就是比三态多了一个创建态,一个停止态。
创建态:就是进程创建的时候的状态。我们之前也写了fork函数创建进程。
停止态:进程停止执行。当进程接收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号的时候,都会进入这个状态。当接收到SIGCONT信号,会重新回到就绪态。
⑤ :进程在调用fork的时候就是在创建态,这个状态不是很重要,也不存在多久。
⑥ : 从运行态到停止态需要接收到信号,可以看上面。
⑦ :当然而已有信号把进程从停止态,换回到就绪态。
10.1.4 其他进程状态
其实我们上面描述的还有其他细节没说,这里我们来聊聊这些进程状态的细节。
TASK_RUNNING(运行态):其实在linux中,运行态和就绪态是一起的,统一叫TASK_RUNNING。
TASK_INTERRUPTIBLE(可中断):阻塞状态中,是分为可中断,和不可中断两种状态的。可中断状态会因为接收到信号而提前被唤醒,从而进入就绪态,然后CPU就感觉先分配时间到这个进程中。当然某些条件达成,也是可以唤醒的。
TASK_UNINTERRUPTIBLE(不可中断):处于等待中的进程,可以等待资源满足的时候被唤醒,但不可以由其他进程通过信号或中断唤醒。所以用kill也不能杀死该进程。这个状态存在的意义就是,内核在某些处理流程是不能被打断的。
TASK_TRACED(被跟踪):进程被停止,被另一个进程跟踪。这种情况是gdb的时候,碰到断点的时候,就会进入这个状态。
EXIT_ZOMBIE(僵死):表示进程已经结束了,但是其父进程没有调用wait4或waitpid()来释放进程描述符。这个状态就在等待收尸的过程,所以叫僵死状态。(后面会详细描述僵尸进程)
EXIT_DEAD(死亡):这个进程是收完尸了,正式进入退出状态,这个状态很快,所以很难观察到。
10.1.4 ps查看进程的状态
养兵千日,用兵一时。上一节讲过了ps查看进程的信息,这次讲了好多进程的状态,我们就用ps来好好查看一下进程的状态。
root 1431 0.3 0.6 92844 6628 ? Ss 19:10 0:00 sshd: root@pts/1
root 1458 0.2 0.5 22588 5300 pts/1 Ss 19:10 0:00 -bash
root 1480 9.7 0.0 4352 644 pts/1 R+ 19:10 0:00 ./test_file
root 1481 9.7 0.0 4352 72 pts/1 R+ 19:10 0:00 ./test_file
root 1482 0.0 0.3 37364 3288 pts/0 R+ 19:10 0:00 ps -aux
我们上一节看过,STAT表示进程的状态,我们来看看每个字母代表什么意思:
参数 | 含义 |
---|---|
D | 不可中断(通常IO进程) |
R | 正在运行,或在可运行队列中的进程(就绪态) |
S(大写) | 处理休眠状态 |
T | 停止或被追踪 |
Z | 僵死进程 |
W | 进入内存交换(从内核2.6开始无效) |
X | 死掉的进程 |
对于BSD格式和当使用stat关键字时,可能会显示额外的字符:
参数 | 含义 |
---|---|
< | 高优先级 |
N | 低优先级 |
L | 页面是否锁定在内存中(用于实时和定制IO) |
s | 是一个会话主进程 |
l | 多进程 |
+ | 位于前台进程组 |
这个状态介绍讲的不错。
本来安排了进程的退出和终止和替换,结果内容太多了,就安排在下一节吧。