今天在書上看到了 “僵尸行程與孤兒行程”的描述,又查看了一些資料,對這兩種行程又多了點認識,這里簡要記錄下,
這兩種行程粗看好像是差不多的,因為都有可能會被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.uj5u.com/caozuo/154261.html
標籤:Linux
