目录
进程状态:
操作系统简图
调用进程bin.exe的详细过程
cpu运行队列的结构
R进程和阻塞进程
进程状态:挂起:
Linux操作:
编辑
R运行状态
S休眠状态
T暂停状态:
kill
kill -18 表示继续
kill -9 杀死进程
D状态:深度睡眠状态:
进程状态:
在我们的理解中,进程状态就是进程运行的状态,是这样吗?
操作系统简图
假如我们有一个可执行程序bin.exe,假如我们想要把该程序加载到内存中,应该怎么操作呢?
调用进程bin.exe的详细过程
1: 我们的可执行程序文件bin.exe是放在内存中的,假如我们想要把程序加载到内存中,我们首先会把bin.exe加载到内存中,然后生成pcb进程控制块,进程控制块的形式是一个结构体,结构体内部包括进程的所有属性,然后我们的cpu通过进程控制块来控制调用进程,但是注意cpu的数量远远小于进程,所以这些进程要以队列的形式进行排列,由cpu进行依此调用。 如图所示:
注释:cpu以队列的形式对进程进行调用
2:我们知道,程序还可以调用硬件,例如程序A中有printf函数,可以打印信息到显示器上,我们可以发现:进程的数量也是远大于硬件的,所以一个硬件也是对应多个进程的,所以进程不仅需要等待cpu的处理,也需要等待硬件的处理,如图所示:
由上面的铺垫,我们可以知道:进程状态的定义。
进程状态:在运行队列中的进程的状态叫做进程状态。
进程状态的总结:
1:一个cpu对应一个运行队列
2:让进程进入队列,本质是让该进程的pcb进入队列
3:当进程pcb在运行队列中,进程状态就是R。
4:进程状态不是进程运行时的状态,还是进程在运行队列时的状态。
5:进程不仅要占用cpu的资源,还有可能调用外设(硬件)的资源。
cpu运行队列的结构
进程队列分为两部分,第一部分是进程控制块指针,指向下一个进程的pcb
第二部分是其他属性,这个属性通常只是一个常数,例如1表示运行,0表示死亡,2表示睡眠等等。
R进程和阻塞进程
例如:cpu调用一个进程,该进程有一个fwrite函数,fwrite需要调用硬盘,但是硬盘被其他的进程占用了,那么cpu怎么操作呢?难道让cpu干等着吗?
答:cpu的速度非常快,效率很高,所以cpu一定不能干等着,cpu把该含有fwrite的进程从进程队列中拿出,把它放在硬盘的等待队列中,然后cpu开始处理下一个进程。
这个fwrite对应的进程就叫做阻塞进程
R进程:进程在cpu的运行队列。
阻塞进程:进程在硬件的等候队列。
处于阻塞状态的Z进程,当硬件处理到这个进程时,这个进程从阻塞状态变成R状态,并且从硬件的等候队列拿到cpu的运行队列,由cpu处理过之后就可以访问外设了。
拿来拿去处理的都不是进程,而是进程的pcb。
进程状态:挂起:
如图所示,我们的程序bin.exe被加载到内存中,pcb就是其对应的进程控制块,该进程需要调用硬件,所以该进程是阻塞进程,阻塞进程不会被立即调用,所以阻塞进程短期内并不能够被调用
当我们的进程数量很多时,内存已经快要装不下了,我们怎么处理呢?
答:因为阻塞进程并不会马上就运行,为了节省空间,我们可以把阻塞进程对应的代码和数据存放到磁盘中,阻塞进程所对应的内存就可以供其他进程来使用,进而节省了空间。
1:内存的呼入换出:将进程的相关数据加载或保存到硬盘上。
2:挂起进程一定是阻塞进程,阻塞进程不一定是挂起进程。
Linux操作:
我们重点介绍这些进程状态
R运行状态
我们首先创建两个文件
myprocess.c对应的是我们进程的代码,Makefile对应的是我们的进程的依赖方法和依赖对象。
我们对该进程进行调用。
这个指令表示筛选出名字中由myprocess的进程,第一个就是我们需要的进程。
我们可以加上进程的标题,这样更方便查看。
这里的R是run的缩写,表示运行状态。
S休眠状态
我们对进程的代码进行修改:
然后我们对该进程进行调用
在进程进行运行的时候,我们创建一个ssh渠道来查看进程的状态。
我们的进程在运行途中,对应的状态却是S,表示的是休眠状态。
原因如下:我们的cpu是很快的,我们的printf进行调用时需要访问显示器,显示器是外设,比较慢,所以等显示器需要话比较长的时间。
这些时间如果按照百分比来划分的话:大约99%是在等外设就绪,1%的时间在打印数据。
所以,我们大概有99%可能都在等外设就绪,这时候进程处于阻塞状态,我们查看进程状态时,进程显示的是休眠状态。
休眠状态是阻塞状态的一种。
T暂停状态:
我们对进程的代码进行修改
我们运行进程:
我们查看kill指令:
kill
19号对应的就是暂停指令。
我们查看运行的进程:
我们的进程的pid是5632,假如我们想要暂停进程时,我们可以输入指令:
当我们输入指令之后:
进程暂停。
这时候,进程的状态变成T,表示暂停。
暂停也算是阻塞的一种
kill -18 表示继续
把暂停的进程恢复运行:
接下来,查看进程的属性:
进程属性变成了R,但是少了一个+号,这个是怎么回事呢?
我们先杀死该进程:
kill -9 杀死进程
接下来,我们对进程代码进行编辑:
我们对进程进行调用:
我们查看进程的状态:
进程中带有+号,进程在运行时,我们在shell输入指令不会生效,并且我们按ctrl+c可以结束掉该进程
我们先暂停该进程,然后再继续运行该进程:
这个时候,进程的状态是S
我们可以在进程运行状态下输入指令
并且按CTRL+c不会终止指令。
+状态表示的是前台进程,前台进程可以通过CTRL+C直接终止,并且一旦进程运行了,shell命令就无法解析了
-状态表示的是后台进程,后台进程不能通过CTRL+C直接终止,但是可以解析shell命令。
我们可以使用kill -9 来结束后台进程。
D状态:深度睡眠状态:
D状态表示深度睡眠状态,d表示浅度睡眠,深度睡眠不可以被终止,浅度睡眠是可以被终止的
进程A的作用是往磁盘中输入数据和信息,当进程空间不够时,操作系统会采用kill一些进程的方法来解决问题,假如我们kill了进程A,磁盘输入的信息也就失效了,这个时候,我们可以把进程A的状态修改为深度睡眠状态,在该状态下,进程A不会被操作系统杀死,只有通过断电或者进程自己醒来的方法解决。