进程状态的理解
本文介绍了进程的三种基本状态(运行、阻塞、挂起)及其在Linux系统中的具体实现,包括R运行、S睡眠、D磁盘休眠等状态。重点分析了僵尸进程(Z状态)的形成原因:当子进程退出但父进程未读取其退出状态时产生。僵尸进程会持续占用系统资源,导致内存泄漏等问题。文章阐述了回收僵尸进程的实质是释放PCB资源和传递终止状态,并强调及时检测和回收僵尸进程对系统管理的重要性。父进程应通过wait()/waitpid
进程状态
运行,阻塞,挂起
1.运行
一个cpu一个调度队列
2.阻塞
3.挂起
task_struct在内存,其进程对应的代码和数据被交换到swap分区
如果还是不行,linuxos会选择性的杀掉特定的进程
2.具体的操作系统状态
static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */
"D (disk sleep)", /*2 */
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */
};
• R运⾏状态(running):并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏队列⾥。
• S睡眠状态(sleeping):意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠(interruptiblesleep))。
可以被打断,被os杀死
• D磁盘休眠状态(Disksleep)有时候也叫不可中断睡眠状态(uninterruptiblesleep),在这个状态的进程通常会等待IO的结束。凡是有关磁盘的进程是不能被杀掉的
目的是防止数据损坏:如果在I/O操作中途强制终止进程,可能导致文件系统或数据结构不一致
• T停⽌状态(stopped):可以通过发送SIGSTOP信号给进程来停⽌(T)进程。这个被暂停的
进程可以通过发送SIGCONT信号让进程继续运⾏。
• X死亡状态(dead):这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。
3.僵尸进程
Z(zombie)-僵⼫进程
• 僵死状态(Zombies)是⼀个⽐较特殊的状态。当进程退出并且⽗进程(使⽤wait()系统调⽤)没有读取到⼦进程退出的返回代码时就会产⽣僵死(⼫)进程
• 僵死进程会以终⽌状态保持在进程表中,并且会⼀直在等待⽗进程读取退出状态代码。
• 所以,只要⼦进程退出,⽗进程还在运⾏,但⽗进程没有读取⼦进程状态,⼦进程进⼊Z状态,处于"死亡但未安葬"的状态。
1.进程退出了,退出信息是什么?
main函数的返回值 or 收到的信号值
2.进程退出了,退出信息保存在哪里?
task_struct
3.检测z状态进程,回收z状态进程本质是在做什么?
回收Z状态进程本质上是在 释放资源 ,具体包括:
1. 释放进程表项(PCB)
- 回收进程控制块占用的内核内存空间
- 释放该进程占用的进程ID,使其可以被重新分配给新进程
2. 传递终止状态
- 将子进程的终止状态(退出码、终止原因等)传递给父进程
- 使父进程能够得知子进程的执行结果
3. 完整清理进程痕迹
- 确保进程相关的所有内核数据结构都被正确释放
- 避免资源泄露和系统资源耗尽
4.具体怎么回收,谁来回收?
正常回收 - wait()/waitpid()系统调用
父进程主动调用wait()或waitpid()等待子进程结束并回收其资源
僵尸状态本质就是,只保留进程的task_struct,未来让父进程orOS来帮我们获得到子进程的退出信息,看进程是否是正常退出。
4.僵⼫进程危害
• 进程的退出状态必须被维持下去,因为他要告诉关⼼它的进程(⽗进程),你交给我的任务,我办的怎么样了。可⽗进程如果⼀直不读取,那⼦进程就⼀直处于Z状态?是的!
• 维护退出状态本⾝就是要⽤数据维护,也属于进程基本信息,所以保存task_struct(PCB)中,换句话说,Z状态⼀直不退出,PCB⼀直都要维护?是的!
• 那⼀个⽗进程创建了很多⼦进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本⾝就要占⽤内存,想想C中定义⼀个结构体变量(对象),是要在内存的某个位置进⾏开辟空间!
• 内存泄漏?
是的!
及时检测和回收Z状态进程是系统管理中的重要任务。
更多推荐



所有评论(0)