进程的状态

进程状态(简单介绍)

所谓的状态其实就是一个整形变量,通过#define定义的不同状态对应的不同整形,如:

#define Ready 1
#define New 2
#define block 3
.......

然后tast_struct中包含的int status只需要改变它的值即可
并且状态决定了它的后续动作,怎么讲呢?

因为进程也不是一直运行的,因为一个CPU只有一个运行队列,比如说一个程序需要等待你scanf,从键盘这个硬件上读取资源,那么他不会一直等待的,因为这样就无法运行其他的进程了,所以这时候进程就变成了阻塞状态,所以操作系统会把它连入需要等待的资源提供的等待队列,因为操作系统管理的底层硬件也是通过不同的数据结构表来链接的,而操作系统最清楚硬件的就绪状态,操作系统管理的硬件struct Device这个结构体中包含了一个task_struct对象来管理对应的资源,所以当遇到等待资源时,进程会先变成阻塞状态,再放入相应的硬件队列中等待,等到资源后,再把它放入运行队列中,因为CPU的速度很快很快,所以并不会因为先执行了其他的进程而导致要等待资源的进程需要很久才被处理。

说了这么多,要告诉大家的是:状态的变迁,其实就是PCB被操作系统放入不同的队列中!

常见的一些教材上的状态:阻塞,运行,挂起。
那么在Linux中具体的这些状态有哪些呢?下面我们就来看看。

阻塞

R运行状态(running):

并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

在这里插入图片描述

可以看到进程的运行状态,R+表示这是一个前台程序:ctrl+z可以直接杀掉,如果在程序后面加一个&就变成后台程序不能被杀掉。
在这里插入图片描述

S睡眠状态(sleeping):

意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
(interruptible sleep))。
在这里插入图片描述

在这里插入图片描述
我们运行这个代码,可以看到程序并不是R状态,但是为什么呢?这个程序不是正在运行吗?

进程状态为 S+ 的主要原因是 sleep(1) 调用。在这个调用期间,进程会被挂起,不会使用CPU资源,因此显示为 S(睡眠)状态。printf 的执行时间相对较短,不会显著改变进程的状态。
那如果去掉sleep函数呢?结果还是一样的吗?

在这里插入图片描述
可以看到两次结果一次是R一次是S,去掉 sleep 调用后,进程仍可能显示为 S 状态,因为 printf 的 I/O 操作可能导致进程短暂进入睡眠状态等待外设准备好。
所以这是个概率问题,基本上只有很小的概率会是S状态,因为CPU的处理速度太快。

D磁盘休眠状态(Disk sleep):

有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的
进程通常会等待IO的结束。

当操作系统过于繁忙时,内存中可能会有大量的进程。在这种情况下,操作系统可能会选择直接终止某些进程。例如,在配置较低的手机上运行高耗能的游戏时,可能就直接闪退了,这就是操作系统直接终止该程序的过程。这是因为该进程使操作系统过于繁忙,为了防止系统崩溃,操作系统会将其终止。

而D状态相当于给了程序一个“免死金牌”避免它被挂掉,这时候OS便不会主动杀掉这个进程。

T停止状态(stopped):

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行。
要出现T状态,我们可以通过kill给进程发送信号,其中19号状态,就是SIGSTOP暂停的信号。
在这里插入图片描述

可以看到进程由R变成T此时进程就处于T状态了,而且会被从前台转到后台运行。

此时如果想要从T状态恢复,可以使用kill -18信号,其代表SIGCONT,即继续进程。

不过就算从T状态恢复了,其也依然是一个后台进程。
在这里插入图片描述

t状态:

也是一个暂停状态,它其是一种被追踪的暂停状态,属于阻塞状态。就是只有收到某个命令后,进程才会继续执行。
比如说使用gdb调试程序的时候,当执行到一个断点时,此时进程就属于t状态。
在这里插入图片描述
此时在等待gdb的命令

此前所有的状态都是阻塞状态,下面我们来谈论挂起状态

挂起

很好理解,当内存不够用资源不足的时候,操作系统会把数据和代码交换到磁盘中,这个操作叫换出,磁盘中叫swap分区,直到获得资源,再把磁盘中的代码和数据拷贝回来,这个过程叫做换入,然后再运行程序。

X死亡状态(dead):

这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

Z状态:

也叫僵尸状态,字面意思就是躺在地上不动了,实际上就是当子进程退出的时候,父进程没有对子进程的数据和代码读取,就好比法医需要对si者进行验尸对吧,来确保它的状态。而所有进程结束后,都必须经过Z状态
在这里插入图片描述

在这里插入图片描述
两个进程,子进程在10秒后退出,而父进程一直执行,当子进程退出时,父进程并没有对子进程进行数据的读取,可以看到它的状态时Z

孤儿进程:

这个也很好理解,所谓孤儿就是无父无母,当一个子进程的父进程退出的时候,子进程比它后退出,子进程退出的时候没有人来接收数据,这就是孤儿进程。
在这里插入图片描述

在这里插入图片描述
此时PPID = 1,Linux中1号进程代表OS操作系统。

表示孤儿进程会被1号进程操作系统认领,退出时PCB由操作系统来回收。

以上就是进程状态的介绍,如有错误欢迎指正,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值