1.浅度睡眠状态【S】(挂起)
——S (sleeping)可中断
睡眠状态
进程因
等待某个条件
(如 I/O 完成、互斥锁释放或某个事件发生)而无法继续执行。在这种情况下,进程会进入阻塞状态
,在阻塞状态下,进程不能继续执行,并且等待某个事件或资源的完成后或者接收到信号,操作系统会自动将其状态转换为运行状态,继续执行接下来的任务。
* 我们的bash,也可以算是一种【阻塞状态】,一直等待着我们去输入命令行,一旦有了的话它就进行读取
* 浅度睡眠可以被信号唤醒:kill -9 PID
1 #include <stdio.h>
2 #include <unistd.h>
3
4 int main(void)
5 {
6 int a = 0;
7 printf("Enter# ");
8 scanf("%d", &a);
9
10 printf("echo : %d\n", a);
11 return 0;
12 }
将该进程运行起来我们可以看到其是出于S+的状态,因为【shell】此时正在等待用户的输入,遇到I/O操作。
- 可以使用
kill -9 PID
杀掉它,也就是激活
。下面讲的深度睡眠状态不能通过操作系统将其杀掉的,而是要等到磁盘写入完毕或者什么事情执行完毕后其才会去自动结束这个进程,或者是在外部断电、直接拔掉电源即可
总结来说
- 浅度睡眠状态下,可以接收任何信号,并且等待某个事件或资源的完成后或者接收到信号,又会
自动
回到运行状态
。这也是区别之一
2.深度睡眠状态【D】
——D
(disk sleep)不可中断
睡眠状态
深度睡眠状态
:处于 D 状态的进程。这意味着进程正在等待事件发生,而且不能被任何信号唤醒,除非是设备断电了等物理因素。
为了更好理解深度睡眠,我引用一篇博客中的例子:
-
1.现在在操作系统里有一个进程,它呢想要把数据写到磁盘上去,磁盘这个时候听到了它的请求,就开始写数据,不过我们知道外设尤其是像磁盘这种设备的速度都是比较慢的,所以呢这个时候进程就会一直地等待下去
-
2.但是呢,光这么无休止地等待下去可不行。因为当前这个时候操作系统中的已经有非常多的进程了,那么OS它看不下去了,路过的时候看到当前的这个进程正处于等待状态,也不运行,于是二话不说把它终止了
-
3.所以呢,同学们,我们要明白这么一个道理:操作系统认为当前系统能行的话就直接让用户去用就可以了,如果扛不住了就置换页表,实在不行了就去会杀进程。
-
4.造成严重问题:那么当这个进程被杀掉的时候,磁盘说:我在写数据的时候出了问题。它这个时候就回去找那个调度它的进程,但是发现这个进程没了???所以磁盘就特别尴尬:我要怎么办呢?写好的这个数据该不该还放在这里【一般的设备都会选择丢失】如果这份数据是普通的那还好,但如果其为银行当中那种非常重要的数据呢
🚩如何解决呢?
-
在上面例子中,操作系统会在内存压力很大的情况下,杀死掉哪些一直在进行等待的进程。但是,杀死进程可能会引发严重后果,所以,最好的办法就是【让该进程拥有一块
免死金牌
】 -
图也是很搞笑-_-
-
这个免死金牌具体来说就是给该进程的状态设置为
深度睡眠状态
。那么这个进程就不会被杀死了,当磁盘写完数据后告知进程,那么它就可以将自己放入【运行队列】里去运行,此时它的状态就变成R了
📅事务总是具有两面性:
抛出问题:那这个时候就又有同学问了:D状态这么强大吗,那如果一个操作系统里有很多的D状态,这怎么办呢?
1️⃣ 这个D状态的话操作系统是没有办法将其杀掉的,而是要等到磁盘写入完毕或者什么事情执行完毕后其才会去自动结束这个进程,或者是在外部断电、直接拔掉电源
即可
2️⃣一般一个系统里面如果存在D状态的话,那这个系统中的磁盘压力已经非常大
了;如果存在多个D状态的话,则表示这个系统已经是非常危险了,最好马上重装一下系统