进程有哪些状态?这个问题在面试的时候出现的概率也比较高。
如果你学过操作系统这门课,那一定看过这张图:
运行、就绪、阻塞指的就是进程的三种状态。 要想搞懂这三种状态,还得从操作系统的进程调度说起。
假设CPU是单核的,单核的CPU一次只能处理一件事情,但是在操作系统上往往有多个任务需要执行。
于是操作系统就会轮流让任务占用CPU,比如先让第一个进程占用CPU,运行个5ms,然后把它放一边去,再让第二个进程占用CPU,也运行个几毫秒。
因为轮转的速度特别快,所以在正常人看来,这些进程好像是在同时执行。
有了这个背景,再来看进程的状态就会比较容易。
所谓运行,就是进程占用CPU正在执行的状态。
所谓就绪,就是万事俱备,等待被操作系统调度的状态。
最后还有一种阻塞,比如程序在运行的时候,遇到了类似scanf这样阻塞的函数,需要等待用户从键盘输入,这个时候即使让他占用CPU运行,也是浪费时间,干脆就让它进入阻塞的状态,直到条件满足,也就是有用户输入了数据,再让它回到就绪的状态,等待被操作系统调用。
再来看下Linux下进程的状态。
这个分的就更细了,结合代码来说明。
int main() { while (1); }先来个死循环,运行起来,此时它是R的状态,表示正在运行,加号表示前台运行。
代码稍微修改一下,加上printf输出。
int main() { while (1) { printf(" "); } return 0; }此时变成了S状态,就是睡眠状态。
那么问题就来了,程序正在运行,为什么就是睡眠状态?
因为printf需要访问外设,比CPU速度慢很多,程序大部分时间都在等待输出,并不是在等待被调度,所以并不属于运行状态。
还有一种睡眠状态叫D,Disk sleep,也叫深度睡眠。
服务器压力过大时,操作系统会杀掉一些进程,如果是D状态,操作系统无法干预,比如dd这个命令,进程就是D状态。
还有一种T状态也比较常见,一个正在运行的程序,如果按下ctrl z,就会进入暂停状态。
审核编辑:刘清
-
Linux系统
+关注
关注
4文章
594浏览量
27441 -
状态机
+关注
关注
2文章
492浏览量
27574 -
LINUX内核
+关注
关注
1文章
316浏览量
21672 -
printf函数
+关注
关注
0文章
31浏览量
5899
原文标题:细说进程的状态
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论