【Linux】进程状态

一. 操作系统中常见的进程状态以及理解

1. 进程状态是什么?它是如何起作用的?

提起操作系统中的进程状态,你脑海里可能有几种概念,比如运行,阻塞,挂起,等待,停止,死亡等。这些概念你或许了解,或许只是知道,不管怎样,这篇文章可以让你深刻地理解这些操作系统状态的概念。
我们首先要先明白,进程是如何在计算机上运行的?在磁盘上有许多二进制程序,也就是程序员写好的软件。比如我们有一个可执行程序A,当我们执行这个可执行程序时,也就把这个程序的代码和数据加载到了内存中,此时它也就叫做进程。在操作系统内部,有专门用来管理进程的结构体,叫做struct task_struct,也称作PCB,这个结构体中保存了进程的各种属性,包括进程状态等。**其实进程状态也不过就是进程PCB中的一个整数,这个整数是多少,代表进程此时处于什么状态。**在CPU执行进程时,通过找到进程的PCB,从而找到进程的代码和数据,从而去执行这个进程的方法。
在这里插入图片描述

而进程这么多状态,本质上就是为了满足不同的运行场景的!
在我们的计算机中,CPU只有一个,但是进程很多。或者有的计算机是多个CPU的,但是CPU数一定是少于进程数的。也就是说,一定存在多个进程在一个CPU上跑的情况。为了便于解释,我们这么只研究只有一个CPU的情况。计算机只有一个CPU,但是进程很多,多的进程如何在同一个CPU上跑呢?进程排队!
少的CPU为了管理多的进程,就创建并维护了运行队列struct runqueue!
这个运行队列中包含了一个head头节点以及其他属性,其他属性有:进程数量,状态是怎么样的等。
并且,需要强调的是,不是进程的代码和数据在这个运行队列中排队,而是进程的PCB在这个运行队列中排队。就好比我们线上招聘,我们并不是本人在公司排队,而是我们的简历在公司的简历池排队!
在这里插入图片描述

这里我们着重理解一些操作系统中常下的运行状态,阻塞状态,挂起状态等。理解了这三个进程状态,在之后学习Linux下的状态以及其他状态就容易多了!

2. 理解运行状态

进程处于运行状态,它是在运行吗?不一定!

一个CPU上有一个运行队列,上面说过,让进程入运行队列,本质上是将struct task_struct放入struct runqueue中。
当进程的PCB处于CPU的运行队列中时,不管CPU实际上是否在执行这个进程,我们都可以称这个进程处于运行状态!所以,我们需要注意:当一个进程处于运行状态,它不一定在运行;当一个进程在运行,它一定处于运行状态!

在CPU执行进程时,也有一个时间片的概念,当进程运行到指定时间时,就会切换到运行队列中的其他进程。比如,假设某个CPU的时间片是10毫秒,那么在1秒内它就可以跑100个进程。有了时间片,CPU就可以在短时间内将运行队列中的所有进程都跑一遍!

3. 理解阻塞状态

进程不只需要CPU资源,它也可能需要外设资源! CPU在运行进程时有时候是需要访问外设的,比如printf,scanf,图形化程序访问显卡等。但是根据冯若依曼体系结构,CPU相对很快,外设相对很慢。外设相对于进程也是少量的,比如我用迅雷下载资源,用百度网盘上传资源,打开B站看视频,网卡这时候就很忙,它要被多个进程所访问。
外设为了管理要要访问它的进程,它也有等待队列。
那我们如何理解阻塞状态呢?好比你去银行办事,在排到之后,要求去填表,服务人员不会在你填表期间一直等着你,而是会先给下一个人提供服务。在CPU执行进程时,可能进程要去访问外设,但是外设资源此时被占用着,它要去等待外设就绪,而CPU此时也不再调度这个进程了,这时候这个进程不再处于运行状态,而是处于阻塞状态!
也就是说:阻塞状态就是进程此时不能被CPU调度,进程的PCB此时也不再处于CPU的运行队列,而是处于其他资源的等待队列中,此时它的状态就是阻塞状态。
而所谓进程从运行状态切换到阻塞状态,本质上是进程的PCB处于不同的队列中。并且进程的状态不同,在PCB内部表示进程状态的整数变量的值也不同。

3. 理解挂起状态

上面说到,如果一个进程被CPU调度时要访问外设,等待外设资源就绪,它要从运行状态切换到阻塞状态。假如进程此时等待着磁盘的资源,并且磁盘资源需要很长时间才能就绪,在进程等待磁盘资源期间,它的代码和数据以及PCB结构体仍然在内存中加载着。如果这时候内存突然不够用了怎么办?操作系统会暂时将这个进程的代码和数据保存到磁盘上,从而节省内存空间。
我们将一个进程暂时被唤出到磁盘的状态,叫做挂起状态。
值得注意的是,上面说到,在进程的阻塞状态,如果此时内存不够用,它会被唤出到磁盘上。也就是说,当进程处于挂起状态时,一定处于阻塞状态。当处于阻塞状态时,它不一定处于挂起状态。

二. Linux下的进程状态及理解

在这里插入图片描述
这是Linux操作系统中进程状态的定义,通过注释可以看出,运行状态本质是就是一个整数,在进程的PCB中,这个整数是几,就代表这个进程是什么状态。在这张图片中,第二个T用t表示更好一些,Linux进程查看以及下文讲解均用t表示。

1. 理解R状态

R(running)状态,也就是运行状态。

下面通过代码见见运行状态。我们写一段不访问外设的代码(如果访问外设可能很难查不到R状态)。
在这里插入图片描述
在这里插入图片描述
ps ajx命令可以查看进程状态,从上图中我们可以看出,myproc程序处于R+状态,也就是运行状态。myproc下面那个进程是grep工具,它当然也处于运行状态。
这里,你可能要问,"R+“中的”+"是干啥的?它涉及到了前台进程和后台进程的概念,这里不方便解释,在下文讲到t状态时再进行解释。

2. 理解S状态

S状态,即睡眠状态。
将上面的代码进行一些修改,使它访问外设。
在这里插入图片描述
在这里插入图片描述
可以看到,进程此时的状态就是S状态了。原因是printf需要访问显示器外设,而外设是很慢的。我们不要只看到打印的速度确实是很快的,要以CPU为参照点,它对于CPU来说就是很慢的。这个进程可能有99%的时间都是在等待外设就绪,只有1%的时间在执行打印代码。所以,在这个时候查看进程的状态,大概率查到的是S状态,你可以去尝试着验证一些。从这里也可以看出计算的速度和IO的速度差别是很大的。

3. 理解T状态

t状态,即暂停状态。很多书籍中没有暂停状态,它们直接将暂停状态归为阻塞的一种了,实际上Linux是有细分的暂停状态的。
下面尝试将一个进程的运行状态切换为暂停状态。
在这里插入图片描述
发出进程暂停的命令,可以将进程状态切换为暂停状态。

18号命令可以解除进程的暂停状态。
在这里插入图片描述
从上面两图可以看出,不管是进程暂停之后,还是进程暂停又解除暂停之后,进程的那个"+"都不见了。
“+“代表这个进程是前台进程还是后台进程,如果有”+”,说明是前台进程,反之是后台进程。
前台进程:在终端中运行的进程,占据终端控制权,接收用户输入。
后台进程:在终端中以非交互方式运行的进程,不占据终端控制权,可以继续在终端执行其他命令。

在进程暂停之后,它处于阻塞状态。但是与睡眠状态同理,我们无法得知它是否挂起。

4. 理解D状态

D状态,也就是深度睡眠状态。S状态是浅度睡眠,是可以被终止的,而D状态是深度睡眠,是不可以被终止的。
睡眠状态我们比较难看到,它一般在企业内部做高IO,高并发的时候可能会见到,我们在这里也就不演示了,解释即可。
在进程处于D状态之后,它不能被操作系统杀死,只能通过断电或者重启来终止。
它有什么应用场景呢?
假如此时内存中有一个进程A,进程A需要向磁盘中写入数据,但是磁盘是外设,写入数据是比较慢的,进程A就一直在内存中等待磁盘的写入。如果在这个时候,内存资源被大量占用,操作系统检查内存,发现进程A什么也没干,操作系统此时就会杀死进程A。这也就是企业内部服务器在高访问时挂掉的原因。操作系统杀死进程A之后,磁盘写入数据失败,而此时磁盘又找不到进程A了,于是数据就丢失了,这个数据,可能很重要!为了避免这个问题,我们可以给进程A设置为D状态,让它不能被操作系统杀死,它也就只能通过断电,或者进程自己醒来,来解决!

5. 理解t状态

在这里插入图片描述
在编译时加上-g选项,表示进程可以被调试。
对进程进行调试
在这里插入图片描述
在这里插入图片描述

可以看到进程此时就处于t状态了。
t状态也属于一种暂停状态,在断点处进程暂停下来,等待继续执行。

6. 理解Z状态

Z状态,即僵尸状态。
为什么会有僵尸状态?进程被创建出来,是为了完成某种任务的,这也就是进程叫做task的原因。Linux系统在进程结束之后,会将结果返回给你,所以在进程退出的时候,不能立即释放进程的资源,要等待父进程进行读取!
我们如何见到僵尸状态?用父进程创建子进程,然后让父进程不要退出,并且什么都不做,让子进程正常退出,这时候子进程就会处于僵尸状态。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到,子进程这时候就处于僵尸状态了。

这里顺便提一下孤儿进程
在父进程创建子进程之后,如果父进程提前退出,后续子进程退出谁来回收它呢?我们写点代码看一下。
在这里插入图片描述
在这里插入图片描述
可以看到,子进程此时的ppid已经为1。一号进程也就是操作系统。也就是说,此时子进程会被操作系统领养,被操作系统领养的进程就叫做孤儿进程。并且,需注意,如果是前台进程创建的子进程,如果孤儿了,会自动变成后台进程。

7. 理解X状态

X状态,死亡状态。即进程已经死亡了,并且因为它已经不存在了,我们也无法查看到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzu_ljk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值