进程状态

运行,阻塞,挂起

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状态进程是系统管理中的重要任务。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐