目录
1.新建态:字面意思,一个进程刚刚被新建出来,还没有加入到任何队列中
2.运行态:task_struct在运行队列中等待CPU执行
3.阻塞态:等待非CPU资源,例如:等待键盘输入就绪,等待网卡等各种非CPU资源...
4.挂起态:内存不足时,OS会挑选需要等待资源时间过长的进程先换出到磁盘(SWAP分区),此时只是将内容和数据换出到磁盘,task_struct仍然还在内存中,当挂起态需要被运行时,先要进行换入内存操作,再添加到运行队列等待。
5.终止态:字面意思
内存到磁盘换入换出的过程就是I/O的过程,这个过程很浪费时间
挂起所做的事其实本质就是用时间来换取空间
Linux内核中对于状态的标识与定义
进程分为前台进程和后台进程,状态符号后带有“+”说明是前台进程
前台进程:运行时会占用Shell进程,使Shell无法运行,可以使用ctrl+c结束进程
后台进程:运行时不会影响Shell进程,ctrl+c没有用,可以使用kill -9 进程pid杀掉
例如:./process为将进程当作前台进程运行
./process &为将进程当作后台进程运行
进程在运行中或者进程在运行队列里
对应操作系统理念中的运行态
进程在等待事件完成,在等待某种资源(S状态也可称为可中断睡眠)
对应操作系统中的阻塞态/挂起态
深度睡眠,不可被中断,不可被被动唤醒
当服务器压力过大时,OS会通过一定的手段,杀掉一些进程,来起到节省空间的作用!
如果是S状态时,可以被OS杀掉;
如果是D状态时,不能被OS杀掉,OS无法插手,只能等进程自动醒来;
dd命令可以模拟出D状态的进程
一个进程退出且被检测好回收后,就是X状态
该状态不好捕捉,如果有大量结束的进程都在等待OS回收,才可观察到,瞬时性非常强
此时一个进程已经退出,还不允许被回收释放,处于一个检测状态
维持这个状态,等待OS或者父进程检测后来进行回收。
Z与X状态的结合就是操作系统理论的终止状态
以上例子,子进程先于父进程结束,处于一个待检测状态,但父进程还没有调用系统调用,也就是还没有读取到子进程退出时的返回值,这时子进程就是一个僵尸进程
总结:
只要子进程退出,父进程还没有退出,且父进程还没有读取到子进程的状态代码(子进程返回值),子进程就会进入僵尸状态,成为一个僵尸进程,等待父进程读取退出状态代码。
僵尸进程的危害:
子进程一直处于Z状态,无法被回收
维护退出状态本身要用数据维护,task_struct就需要一直维护
最终结果就是:PCB需要一直维护状态,内存资源也一直被占用,发生内存泄漏!