1.Linux系统的的主要状态
Linux进程的主要态度分为
"R (running)", /* 0 /
"S (sleeping)", / 1 /
"D (disk sleep)", / 2 /
"T (stopped)", / 4 /
"t (tracing stop)", / 8 /
"X (dead)", / 16 /
"Z (zombie)", / 32 */
1.Running
running 也就是运行态
我们先来写一个代码让他跑起来


我们发现这个代码在跑的时候 是running状态
也就是运行状态
2.Sleeping
sleeping状态也就是可中断休眠状态状态
我们把代码做一点改变

再运行我们发现这个时候跑的这个代码的的进程不是running态而是sleeping态了

为什么这个时候代码是sleeping态
我们printf本质上是从内存读取数据输入到显示器
但是每次输出到显示器上
显示器需要准备一点时间
所以这个时候进程是可中断休眠的状态
等显示器准备好再输出到显示器上
我们运算器的速度很快所以我们基本很难查看到
内存输入到显示器的那一刻(也就是running态)
所以我们读到的大多数是进程可中断休眠显示器准备的时候
也就是sleeping态
3.Disk sleep
Disk sleep状态也就是不可中断睡眠状态
这个状态不好演示
举个例子
我们从内存往磁盘内写如数据
但是磁盘是外存速度比内存慢很多
这个时候磁盘要写入(期间进程属于休眠状态)
写入完后 要告诉进程 结束进程
但是这个时候呢 操作系统发现进程太多 快要爆掉了
于是操作系统就把这个进程杀死
但是这个时候磁盘写完了 回去找进程 找不到进程
这个时候会出现问题
就是这个数据丢失了 如果说这个数据特别重要怎办???
所以就有了 disk sleep这个状态 就是告诉操作系统
我这个进程很重要 虽然在休眠 但是你也不能杀死我
不然会出大事
正常情况下非常罕见(IO 完成速度快,进程很快会退出 D 状态)。
若长期存在 D 状态进程,通常暗示 IO 子系统异常(如磁盘故障、远程文件系统挂载失效),需排查硬件或存储问题(如用 iostat 分析磁盘 IO 瓶颈)。
4.Stopped
我们之前学过杀死进程kill -9 是杀死进程
但是kill还要有其他很多作用
我们可以通过kill -l查看

其中 18 和 19分别是暂停进程和开始进程
当进程被暂停的时候状态就是stopped(T)
至于+号后面会解释

5.Tracing stop

当我们使用gdb调试代码的时候
在断点的时候停下来 进程就是tracing_stop态
6.Dead
当一个进程运行结束的时候
父进程要对这个进程的数据进行处理
处理结束后这个进程就是dead态也就是死亡态
由于死亡态是一个瞬间的状态 不方便演示
7.Zombie
Zombie态 也就是将亡态 当一个进程结束后未处理的时候就是Zombie态
我们来写一个验证的代码 当子进程结束后 父进程没结束 这个时候子进程的状态是不是zombie态
exit(0)的意思是退出进程


我们发现和我们预想的一模一样
当子进程结束后 父进程未对子进程进行处理 此时子进程的状态是zombie态
那么如果父进程先exit 子进程会怎么样???


我们发现 当父进程结束的时候 子进程不会死亡
但是子进程的父进程会变成PID为1的进程
也成为孤儿进程
zombie进程的危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。
可父进程如果一直不读取,那子进程就一直处于 Z 状态?是的! 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在 task_struct (PCB) 中,换句话说,Z 状态一直不退出,PCB 一直都要维护?
是的! 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想 C 中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
内存泄漏?是的!
Linux进程状态详解
2299

被折叠的 条评论
为什么被折叠?



