僵尸进程与孤儿进程你真的了解吗?
2019-11-22 09:31:13来源:博客园 阅读 ()
僵尸进程与孤儿进程你真的了解吗?
今天在书上看到了 “僵尸进程与孤儿进程”的描述,又查看了一些资料,对这两种进程又多了点认识,这里简要记录下。
这两种进程粗看好像是差不多的,因为都有可能会被init进程回收,但是总的来说还是有点不一样,不管从产生的方式和危害程序都是不一样的。
僵尸进程与孤儿进程的产生
僵尸进程:子进程先结束,然后父进程又不管他,init进程来管理回收。
孤儿进程:父进程先结束,子进程找不到父了,init进程来回收。
僵尸进程回收:把父进程杀死,然后就由init回收了。
所以,僵尸进程与孤儿进程的产生就看是父进程还是子进程先结束。
僵尸进程
子进程结束时,父进程没有对子进程进行等待,不管他的死活。如果程序中父进程能正常结束还好,因为一旦子进程找不到它的父的话,会由init进程接管进行回收处理。
最悲剧的是,一般父进程都是挂一个循环在那里,不会结束的,这个时候系统发现你的父进程还存在的,然后init就不会管你,就产生僵尸进程了,而且如果产生太多会浪费大量的系统资源。
僵尸进程也不能用kill杀死,因为他的进程已经死了。
以下程序会产生僵尸进程,父进程没有等待子进程。通过ps -ef中,能看到
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die('fork error');
} else if ($pid > 0) {
echo "I'm parent" .PHP_EOL;
while(true){
sleep(3);
}
} else {
echo "I'm child".PHP_EOL;
}
孤儿进程
顾名思义就是进程成孤儿了,因为它的父进程先结束了,它产生的子进程就懵逼了,找不到它的父了,这个时候就只能被init接管回收了。
以下程序父进程先结束,子进程延时一下,然后posix_getppid()会返回1,表示被init接管了
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die('fork error');
} else if ($pid > 0) {
echo "I'm parent" .PHP_EOL;
sleep(1);
} else {
echo "I'm child,ppid:".posix_getppid().PHP_EOL;
sleep(3);
echo "I'm child,ppid:" .posix_getppid().PHP_EOL;
}
僵尸进程与孤儿进程的危害
孤儿进程它会被init最终回收掉,所以危害相对来说要小很多,但是僵尸进程因为会占用大量的进程号和系统资源,如果父进程一直不结束,那么init进程也接管不了,这样就会一直消耗资源源,所以危害相对要高一些。
编写多进程程序时,父进程还是需要使用wait,waitpid等来等待子进程的结束,从而回收资源。
原文链接:https://www.cnblogs.com/smartrui/p/11909444.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 作业(进程)调度算法 2020-05-16
- Linux 进程状态 2020-05-13
- Linux常用命令(续) 2020-05-12
- 进程管理类命令 2020-05-10
- 进程监控类命令 2020-05-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash