僵尸进程

 2024-02-16 00:01:59  阅读 0

Linux进程中僵尸进程的五种状态:(选自《深入理解Linux内核》) 1、可运行(正在运行或在运行队列中等待) 可中断等待(睡眠、阻塞、等待某个条件) 形成或收到信号) 2. 3. 不间断等待(不间断睡眠不能被信号停止,只有内核程序使用()函数显式唤醒它们并从不间断睡眠状态转变) 4. 僵尸(进程已被终止) ,但进程描述符一直存在,直到父进程调用wait4()系统调用才被释放) 5、暂停(进程收到、、、信号后停止运行) 其中,僵尸进程是一种非常特殊的进程,它有放弃了几乎所有的内存空间,没有任何可执行代码,并且无法调度。 它只是在进程列表中保留一个位置来记录该进程的退出状态等信息,以供其他进程收集。 另外,僵尸进程不再占用任何内存空间。 僵尸进程“除了留下一些信息供人们依赖之外,对系统没有任何影响”。 如何生成僵尸进程:当一个进程调用exit命令结束自己的生命时,它并没有真正被销毁,而是留下一个称为僵尸进程()的数据结构(系统调用exit,它的作用是使进程退出但仅限于将正常进程变成僵尸进程,并不能完全破坏)。

在Linux进程的状态中,僵尸进程是一种非常特殊的一种。 它已经放弃了几乎所有的内存空间,没有任何可执行代码,并且无法调度。 它只保留进程列表中的一个位置,不再记录僵尸进程。 占用任意内存的进程的退出状态等信息都可以被其他进程收集。 否则,就是一片死空间。 它需要它的父进程来收集它的尸体。 如果其父进程没有安装信号处理函数来调用wait或()等待子进程结束,并且没有显式忽略该信号,那么它将一直处于僵尸状态。 如果父进程结束,init进程会自动接管子进程并清理它。 还是可以清除的。 但如果父进程是一个循环,不会结束,那么子进程就会一直处于僵尸状态。 这就是为什么系统中有时会出现很多僵尸进程的原因。 如何检查僵尸进程:使用ps命令可以看到标记为Z的进程是僵尸进程。 如何清除僵尸进程: 1、重写父进程,在子进程死亡后收集其尸体。 具体方法是接管信号。 子进程死亡后,会向父进程发送信号。 父进程收到这个信号后,执行()函数来收子进程的尸体。 这是基于这样的原理:即使父进程没有调用wait,内核也会向其发送消息,尽管默认的处理是忽略它。 如果你想回复这个消息,可以设置一个处理函数。

2. 杀死父进程。 父进程死亡后,僵尸进程就成为“孤儿进程”,并被1号进程init收养。 init会一直负责清理僵尸进程(它产生的所有僵尸进程也会消失。============================ ============== 在 Linux 中,可以使用 ps auwx 来发现僵尸进程 a all w/ tty、其他用户所有 和终端,包括其他用户 u user- user- 的进程面向(用户友好) -w,w Wide 宽格式输出 xw/o ttys 会在僵尸进程后被标记 ps axf 查看进程树,以树形形式显示进程列表 ps axm 会列出线程 在 Linux 下,进程和线程是统一的,是轻量级进程的两种方式 ps axu 显示进程的详细状态========================== ================kill - -9 一般无法杀死使用kill -15、kill -9及以后的进程,反而会出现更多的僵尸进程。 pid -k pid.你可以考虑杀掉他.kill -9 他 ===================== ============= ========= 但是,它的父进程还没有处理好善后事宜(获取终止子进程的信息,一个已经终止,释放它还占用的信息)。 资源)进程称为僵尸进程( )。

linux僵尸进程父进程是1_kill僵尸进程父进程为1_linux popen函数变为僵尸进程

避免的方法:在SVR4中,如果调用配置或者设置为忽略,1)不会产生僵尸子进程。 另外,在使用SVR4版本时,可以设置标志以避免子进程僵尸。 这也可以在Linux中使用,在程序的开头调用这个函数(,); 2)调用fork两次。 程序8-5 完成了这个任务。 3)等待子进程返回。 ============================================== = 该进程是僵尸进程过程。 防止的一种方法是使用wait等函数来获取进程的终止状态来释放资源。 另一种是分叉两次============================================ 表中只有一条记录,不占用其他资源。 除非你的系统的数量限制已经几乎超出,否则该进程不会造成更大的危害。 也许唯一的办法就是系统消除这个进程。 ============================================= 即还有 A记录),但是任何程序都有僵尸状态,它会占用一点内存资源(这只是一个症状,不用害怕。

如果程序有问题并且你有机会遇到它,那么解决大量僵尸问题的简单而有效的方法就是重新启动它。 Kill是一个没有任何效果的fork和/”Unix下一些进程的运行方式。当一个进程死亡时,它并没有完全消失。当进程终止时,它不再运行,但仍然有一些残留的小东西在等待为了让父进程恢复,这些残留的东西包括子进程的返回值等东西,当父进程fork()一个子进程时,必须使用wait()或者()来等待子进程退出正是这个wait()动作让子进程的残余消失了。当然,上面的规则有一个例外:父进程可以忽略而不用wait()。这是可以做到的(在支持的系统上)例如,Linux): main() { (, ); /* 现在我不必 wait()! */ fork(); fork(); fork(); /* , , ! */ , 现在, sub 进程死亡时, 父进程没有 wait(). 通常, 使用 ps 可以看到它显示为 "". 它将永远保持这样的状态, 直到父进程 wait(), 或者被处理如下。

这是您必须知道的另一条规则:当父进程在 wait() 子进程之前死亡(假设它没有忽略它)时,子进程会将 init(pid 1) 进程视为其父进程。 如果子流程有效,我们就有一点控制权,这不是问题。 但如果子进程已经有麻烦了。 看,原来的父进程不能再 wait()了,因为它已经死了。 这样一来,init是如何知道wait()这些进程的呢。 答:不可预测。 在某些系统上,init 会定期销毁其所有进程。 在其他系统上,它只是拒绝成为任何进程的父进程并立即销毁它们。 如果您使用上述系统之一,则可以编写一个简单的循环,用属于 init 的进程填充进程表。 这可能不会让您的系统管理员高兴,对吧? 您的任务:确保您的父进程不会忽略或 wait() 它 forks() 的所有进程。 然而,您并不总是需要这样做(例如,如果您想构建一个或某个东西),但如果您不熟悉 fork(),则必须小心编程。 另外,不要有任何心理束缚。 总结:子进程变成wait()直到父进程,除非父进程忽略它。 此外,父进程在没有wait()的情况下死亡的子进程(仍然是假设父进程没有忽略它)(仍然是活动的或活动的)成为init的子进程,init对它们进行了大量的处理。

标签: 进程 僵尸 忽略

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码