进程有哪些状态?细说进程的状态

描述

进程有哪些状态?这个问题在面试的时候出现的概率也比较高。

如果你学过操作系统这门课,那一定看过这张图:

printf函数  

运行、就绪、阻塞指的就是进程的三种状态。 要想搞懂这三种状态,还得从操作系统的进程调度说起。

假设CPU是单核的,单核的CPU一次只能处理一件事情,但是在操作系统上往往有多个任务需要执行。

于是操作系统就会轮流让任务占用CPU,比如先让第一个进程占用CPU,运行个5ms,然后把它放一边去,再让第二个进程占用CPU,也运行个几毫秒。

因为轮转的速度特别快,所以在正常人看来,这些进程好像是在同时执行。

有了这个背景,再来看进程的状态就会比较容易。

所谓运行,就是进程占用CPU正在执行的状态。

所谓就绪,就是万事俱备,等待被操作系统调度的状态。

最后还有一种阻塞,比如程序在运行的时候,遇到了类似scanf这样阻塞的函数,需要等待用户从键盘输入,这个时候即使让他占用CPU运行,也是浪费时间,干脆就让它进入阻塞的状态,直到条件满足,也就是有用户输入了数据,再让它回到就绪的状态,等待被操作系统调用。

再来看下Linux下进程的状态。

printf函数  

这个分的就更细了,结合代码来说明。

int main()
{
    while (1);
}
先来个死循环,运行起来,此时它是R的状态,表示正在运行,加号表示前台运行。

printf函数  

代码稍微修改一下,加上printf输出。
int main()
{
    while (1)
    {
        printf("
");
    }
    
    return 0;
}
  此时变成了S状态,就是睡眠状态。

printf函数  

那么问题就来了,程序正在运行,为什么就是睡眠状态?

因为printf需要访问外设,比CPU速度慢很多,程序大部分时间都在等待输出,并不是在等待被调度,所以并不属于运行状态。

还有一种睡眠状态叫D,Disk sleep,也叫深度睡眠。

printf函数  

服务器压力过大时,操作系统会杀掉一些进程,如果是D状态,操作系统无法干预,比如dd这个命令,进程就是D状态。

还有一种T状态也比较常见,一个正在运行的程序,如果按下ctrl z,就会进入暂停状态。

printf函数   printf函数  




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分