目录
- 一、可中断的睡眠状态(S浅度睡眠状态)
- 二、不可中断的睡眠状态(D深度睡眠状态)
- 三、关于S浅度睡眠状态与D深度睡眠状态的理解
一、可中断的睡眠状态(S浅度睡眠状态)
S(sleeping)在本质上也是阻塞状态的一种,可以说是阻塞的一种分支
S状态是Linux中可中断的睡眠状态,表示进程正在等待某个事件或资源
S状态下的进程可以被信号或中断唤醒并继续执行。
在这种状态下,进程无法继续执行,因为它需要等待的资源或事件尚未发生。
此时进程不会占用CPU资源,操作系统会调度其他可执行的进程
等待某个事件或资源的完成后或者接收到信号,又会自动回到运行状态
例如我们平时的命令行等待我们输入命令时就是一个浅度睡眠状态
将进程运行起来我们可以看到其是S+的状态,因为命令行此时正在等待用户的输入,遇到I/O操作。
二、不可中断的睡眠状态(D深度睡眠状态)
D状态是Linux中不可中断的睡眠状态,也称为磁盘睡眠状态。在这种状态下,进程正在等待磁盘I/O操作或其他无法被中断的硬件操作完成。
进程无法响应任何信号或中断,除非是设备断电了等物理因素。
进程只能等待操作完成后才能继续执行。
三、关于S浅度睡眠状态与D深度睡眠状态的理解
学了挂起状态,我们可以知道,在内存不足时,会通过挂起状态来释放我们的内存
但是如果在极端情况下,即使挂起状态释放内存也不够呢?这时操作系统就没办法了,只能亲自动手开始杀进程了
但是这时用户有一个特别重要的信息要通过进程写入磁盘,但这个进程又刚好被操作系统杀了呢?这可就麻烦了,信息丢失可是个大问题
于是为了保证某些正在干重要事情的进程不被杀掉,给这些进程加了一块“免死金牌” D状态,操作系统在杀进程时,如果进程只是一个普通的‘S’,操作系统可以杀,但如果是‘D’,那么因为有免死金牌,操作系统不能杀
这个免死金牌具体来说就是给该进程的状态设置为深度睡眠状态。那么这个进程就不会被杀死了,当磁盘写完数据后告知进程,那么它就可以将自己放入【运行队列】里去运行,此时它的状态就变成R了
D状态的话操作系统是没有办法将其杀掉的,而是要等到磁盘写入完毕或者什么事情执行完毕后其才会去自动结束这个进程,或者是在外部断电、直接拔掉电源即可
那如果D状态的进程特别多呢?
一般系统中D状态的进程是很少见的,如果你看到了D状态的进程,那就说明你的系统里挂不远了,洗洗睡吧