63-Linux如何解决僵死进程

这篇博客详细介绍了Linux中僵死进程的概念,当子进程先于父进程结束而父进程未调用wait()获取退出码时,子进程成为僵死状态。僵死状态会导致内核资源占用和软件层面的资源浪费。解决僵死进程的方法包括在父进程中调用wait()或让父进程先结束。文中还探讨了进程的虚拟地址空间、PCB、写时拷贝等概念,并通过代码示例演示了僵死状态的产生及解决办法。
摘要由CSDN通过智能技术生成

一:回顾

1.每一个进程都有一个地址空间,叫做进程的虚拟地址空间,范围从0x0000 0000 ~ 0xffff fffff,上面(高地址)1G供内核使用,下面3G(低地址)供用户使用,代码段从0x0804 8000开始 0x0000 0000~0x0804 8000是空闲的,最下面是代码段,然后是数据段,然后是堆,然后是栈,堆是从低地址往高地址增长的,栈是从高地址往低地址增长的

在这里插入图片描述

2.fork()的时候会把整个虚拟地址空间都复制(即整个进程的实体)

3.逻辑地址(虚拟地址)和物理地址(绝对地址):打印的时候打印的地址或者通过监视器监视的都是逻辑地址,因为无法预知哪些物理地址是空闲的,只能在虚拟地址空间进行布局

4.打印物理地址没有意义(程序结束,再运行,这时的物理地址又不一样了,但是物理地址也是可以打印的,只不过没有意义),只有运行程序的时候才会分配物理地址(被加载到内存)

5.复制进程的时候,先复制的是PCB,然后才是复制进程的实体,如果PCB复制不成功,那么进程的实体就不用复制了。理论上来说,父进程有多大的虚拟地址空间,那么子进程也应该有多大的虚拟地址空间

6.写时拷贝:复制的时候父子进程共享暂时不会修改的页面,如果有父进程或者子进程要对页面进行修改时,才进行复制,写时拷贝会把复制的时间推迟,或者有时候都不需要复制,这样可以提高fork的效率,可以减少内存空间复制的数量

7.代码段是只读的

二:学习

僵死进程:

1.僵死进程概念:子进程先于父进程结束,父进程没有调用 wait() 获取子进程的退出码,此时子进程就变成僵死进程了

2.什么是退出码:退出码就是子进程中有一个 return 0 或者 exit(0) ,这个0就是退出码,退出码存在于PCB(进程控制块也叫进程描述符)中,父进程 wait() 获取子进程PCB中的退出码,然后返回到父进程,当父进程获取了PCB的退出码后,PCB才会被回收

3.子进程结束后,进程的实体先被回收,只有父进程调用 wait() 获取了子进程的退出码以后,PCB才会被回收,这时才算完全回收了(就是这么设计的,linux/unix 都设计成这样)

4.状态有:就绪 执行 堵塞 僵死状态

5.僵死状态时PCB不回收有什么危害:①占用内核空闲②软件层面的资源也会占用

6.僵死状态:子进程已经结束,就等着父进程获取子进程PCB里面的退出码后将PCB回收

7.如果子进程的父进程先结束了,这时子进程就变成孤儿进程了,这时系统就会给他找一个父进程( init 进程,之前 init 进程的 pid 恒为1,但是现在不一定是 init 进程了,可能是其他的一些进程去接管孤儿进程),总之都会给孤儿进程分配父进程,这时 init 进程会执行 wait ,获取子进程的退出码,然后回收子进程,就是这种设计机制

8.执行代码时,一开始还显示僵死进程,但是父进程结束后,僵死进程就消失了,这是因为父进程结束后,又为子进程重新找了个父进程( init 进程接管),这个父进程负责 wait 获取子进程的退出码,然后释放子进程,这时僵死状态就消失了

9.如果父进程先于子进程结束,那么一定不会产生僵死进程,因为子进程还没有结束,父进程先结束了,那么这时子进程的父进程就是init进程,那么子进程结束时一定会被回收

10.getpid()获取自己的id,getppid()获取父进程的id

11.以前的版本一定是1号进程( id 为1的进程,init),但是现在较新的版本可能不是1号(id为1的进程,init),但是他们的作用都是一样的,都是获取子进程的退出码,然后回收子进程

12.为什么子进程结束后没有给出命令提示符呢?但是敲击回车发现并没有阻塞,这是因为父进程结束后,已经给出命令提示符了,只是子进程还没有结束,又继续在命令提示符后面输出了,把命令提示符覆盖了,其实早就已经给出了,并不是没有给出命令提示符

13.如何解决僵死进程:①在父进程中调用 wait() ②让父进程先结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值