文章目录
一、运行状态
R状态:进程已经准备好随时被调度了。
运行队列
每个 CPU
都会维护一个自己的运行队列(一个CPU
,一个运行队列)。
运行状态和运行队列
二、睡眠状态
S状态
- S状态(
sleeping
):可中断睡眠(浅度睡眠)状态。 - 操作系统在资源紧缺时,可以直接杀死该状态的进程。
cpp
int main()
{
whilie(1)
{
printf("hello process");
}
}
printf
是从外设上取数据,循环打印时,不一定每次要打印时,外设都已经准备好了,因为CPU
比外设速度快的多,所以CPU
会等待外设。- 我们在运行该程序时,发现进程状态是
S
,表明大部分时间进程还是在等待的,而不是在运行(可以在某个瞬间看到它是R
状态,但概率很低)。
而大部分进程都会与外设有关,会有等待的状态。
D状态
- D状态(
disk sleep
):不可中断睡眠(深度睡眠)。 - 操作系统不会杀
D
状态的进程。
D状态产生的原因
导致的情况:
数据丢掉啦!!!
那么是谁的错呢?
- 对于操作系统:
- 我本身就有管理它们的能力,而且资源紧缺时有权利杀掉进程。
- 如果紧缺时不杀这个进程,那系统整体就要挂了,那系统中的十几个进程就都要挂了,损失的数据就更多了,所以杀掉该进程是正确的选择。
- 对于进程:
我是受害者,我被操作系统杀死了,跟我没关系。 - 对于磁盘:
我就是一个跑腿的,让我干什么就干什么,跟我没关系。
所以为了避免这种情况,再增加一种状态:
三、暂停状态
T状态
T状态(stopped
):暂停状态。
-
手动暂停,继续进程
查看
kill
信号:
其中,
18
:进程继续,19
:进程暂停。可以使用
kill
信号进行进程的手动暂停和继续。 -
自动暂停进程
有些进程被禁止做某些操作,但如果进程硬要这样干,进程就会被暂停。
t 状态
- t 状态(
tracing stop
):被追踪的暂停状态。 - 当进程处于被追踪状态时,进程暂停,等一等追踪我的那个东西。
四、僵尸状态
Z状态(zombie
):僵尸状态,进程已经执行完毕,但并未获得进程退出的相关信息时的状态。
为什么有僵尸状态
PCB 的释放:
- 进程执行完毕后,代码和数据可以直接释放,但
PCB
要留下,直到里面的退出信息被父进程读取了,然后PCB
才能释放。 - 如果父进程不读取,那僵尸状态会一直存在,
task_struct
对象也会一直存在,会占用内存,即内存泄漏。
一般父进程是不会自动读取子进程的结束信息的,但 bash
会自动读取,所以我们没有手动读取程序的结束信息也没有内存泄露。
孤儿进程
- 父进程死亡的子进程,就称为孤儿进程。
- 如果父进程先子进程挂掉,那子进程的
PCB
就无法释放了,为了避免这种情况,子进程会被另一个父亲领养(一般是被1
号进程(操作系统)领养)。
本文到这里就结束了,如果对您有帮助的话,可以给个赞支持一下哦,如果有哪里有错误,欢迎指正。