Linux进程理解( 六 )


我们还知道电脑的进程是很多的,那么内存总有一天会填满,如果内存被填满了,我们又想添加一个急着用的进程,那么OS该怎么办?OS开始去内存里面开始去看看是不是存在,短期不会调用的进程,也就是一些处于等待资源的,我们一看确实存在,我们想是不是可以把这个进程里面的代码数据放在swap分区,我们把保留内存当中,给新进程腾一点空间,那么这个只保留进程的状态就是挂起状态.
Linux进程状态
我们已经谈过理论了,这里需要和实际结合,而且这里面还有很多事情要做,而且还需要看看如何查看它们的状态.
你们会发现这Linux的状态可不是有点多,而是非常多,最关键的是我们这里还需要把这些实际进程与理论相结合,不过大家不要急,我们一一解释.
R 状态
R是运行态,并不意味着进程一定在运行中 , 它表明进程要么是在运行中要么在运行队列里 .
我们开始演示一下查看进程的状态.
#include#include int main(){while(1){printf("I am a process\n");sleep(1);}return 0;}
这里面开始出问题了,我们这个进程不是一直再运行吗,为何好象打印的是sleep状态,这就有点疑惑了.我们可以从这个角度理解,打印函数可是非常快的,而且我们每次打印一次就会休眠1秒,这就意味着我们很多时候是出于S状态的,也就是阻塞态.我把sleep屏蔽掉.再看看现象.
#include#include int main(){while(1){printf("I am a process\n");}return 0;}
你会发现我们这里面还是存在问题,我们可是把sleep给屏蔽了,为何还是S.我问一个问题,往哪打印数据,这里肯定是显示器啊,那么显示器是硬件吗?是的,它的资源调度的慢,这就不是个阻塞态对上了吗,所以进程有很大的时间处在阻塞态.
说实话,我们得到一个运行态的进程确实有点困难,这里给一个死循环,里面什么都不做,这样就可以得到一个运行态了.
#include#include int main(){while(1){}return 0;}
S 状态
S可以认为是sleep的缩写,这里是阻塞状态,前面我们已经演示过S状态了,一般情况下,只要是程序调度了硬件(CPU不算),有极大可能进程较多时间处于阻塞态.
#include#include int main(){while(1){printf("I am a process\n");}return 0;}
D 状态
D状态是深层睡眠的状态,这个状态不能被杀掉.D状态不是太好演示,这里我们简单的理解一下.

Linux进程理解

文章插图
这里面我们举一个例子,看好了,如果一个进程要往磁盘里面打印500MB的文件,好了,我把这个任务告诉磁盘,你写吧,我在这等着,现在这个进程处于阻塞态,操作系统一看,这有个占据很大资源的进程,我OS把他给杀掉,这也就是我们平常可能遇到软件卡退的原因,主要就是造作系统觉得你这个进程占据的资源太大,我给你杀掉,那么这时候OS也觉得这个进程有点大,我把你杀掉,那么磁盘一直在写数据,无论你写入成功还是没写成功,我们总要给原本的进程返沪一个信号吧,磁盘等会一看,好家伙进程好象被杀掉了,我该给谁说结果.如果我们写入成功还好一点,要是没写入成功,如果这500MB是银行的客户资料,你就会知道什么是痛苦了.这里面S状态就不行了,我们需要更深层次的睡眠,这就是D状态.
X 状态
X就是死亡状态,像资源等都被释放掉了,没什么可以说的.
Z 状态
进程如果要结束一般是不会直接释放资源的,而是处于Z状态.在现实生活中也是如此,一般一个人死亡,像警察,医院会做一系列工作后才会正式宣布人已经死亡,进程也是如此.这个状态是Linux独有的状态.