【Linux】僵尸进程(Z状态)和孤儿进程
先了解下進程都有什么狀態(tài):
進程狀態(tài):就緒,阻塞,運行
linux下進程狀態(tài):
運行狀態(tài)?:并不意味著進程一定在運行中,它表明進程在運行中,或在運行隊列里(只要拿到時間片就能運行)
可中斷休眠狀態(tài)(S):當前處于休眠狀態(tài),但這種休眠可以被打斷(也稱睡眠狀態(tài))
不可中斷休眠狀態(tài)(D):當前處于休眠狀態(tài),但這種休眠不會被打斷(也稱磁盤休眠狀態(tài))
停止狀態(tài)(T):什么都不干
死亡狀態(tài)(X):(只是一個返回狀態(tài))
僵死狀態(tài)(Z):進程已經(jīng)退出,但資源沒有完全被釋放時處于的一種狀態(tài)(等待后續(xù)被處理的一種狀態(tài))
僵尸進程(Z狀態(tài))
談到僵尸進程,我們首先要知道為什么有了僵尸進程?因為父進程需要知道子進程退出時的退出原因及結(jié)果。
1.什么是僵尸進程?
它是一個比較特殊的狀態(tài)。當子進程退出并且父進程沒有讀取到子進程退出的返回代碼,導致子進程資源無法完全釋放,就會產(chǎn)生僵死(尸)進程。
產(chǎn)生:子進程退出,操作系統(tǒng)就要封鎖線程,子進程的退出原因保存在自己身上(pcb中),所以操作系統(tǒng)也不能直接回收子進程資源,而是通知父進程,但父進程沒有關注到操作系統(tǒng)的通知,導致子進程退出了但資源沒有完全釋放
- 僵尸進程會以終止狀態(tài)保持在進程表中,并且會一直在等待父進程讀取退出狀態(tài)代碼,所以,只要子進程退出,父進程還在運行,但父進程沒有讀取子進程狀態(tài),子進程進入Z狀態(tài)
2.創(chuàng)建一個僵尸進程(只要讓子進程先退出,父進程一直執(zhí)行即可)
測試代碼如下:
#include<stdio.h> #include<unistd.h> #include<stdlib.h>int main() { pid_t id=fork();//創(chuàng)建一個進程if(id<0){ perror("fork");return 1;} else if(id==0){//child//子進程先退出while(1){ printf("I am child:pid:%d!,ppid:%d\n",getpid(),getppid());sleep(5);//5微妙后,子進程退出exit(EXIT_SUCCESS);//進程退出,調(diào)用exit()函數(shù)} } else{while(1){ //father讓父進程一直執(zhí)行printf("I am father:pid:%d!,p//pid:%d\n",getpid(),getppid());sleep(20);//每個20秒打印一次后為Z狀態(tài)}} return 0; }Linux下的結(jié)果:
在另一個終端下啟動監(jiān)控,查看進程信息(ps aux | grep jsjc)可以看到子進程進入Z狀態(tài):
注:狀態(tài)后面帶 + 表示前臺進程(當前只能一個進程做事),不帶 + 表示后臺進程(當前可以有很多進程做事)
3.危害:
導致內(nèi)存泄漏:
- 一個用戶能創(chuàng)建的進程是有限的,僵尸進程過多,導致創(chuàng)建新的子進程會失敗
- 內(nèi)存資源:內(nèi)核中的pcb沒有被回收,如果不及時回收,導致操作系統(tǒng)內(nèi)中可用資源越來越少
4.如何避免僵尸進程?
只要讓子進程退出后,父進程接收子進程的退出信息就可以避免,所以,父進程通過進程等待的方式,回收子進程的資源,獲取子進程的信息
孤兒進程
孤兒進程恰恰相反,是父進程退出,子進程就稱之為“孤兒進程”
1.孤兒進程要被領養(yǎng)?父進程退出,資源被回收,子進程沒父進程了,如果子進程退出,就需要有進程來回收它,否則成為僵尸狀態(tài)
- 孤兒進程被1號init進程領養(yǎng)(可理解為1號進程就是系統(tǒng)),即由init進程回收。
2.創(chuàng)建一個孤兒進程(只需要讓父進程先退出,子進程繼續(xù)執(zhí)行)
測試代碼如下:
Linux 下的運行結(jié)果:(由下圖可以看到,父進程退出后,子進程被1號進程領養(yǎng))
進程信息如下:
- R狀態(tài)并不是說明當前進程在CPU里運行,而是表明進程要么是在運行中要么是在運行隊列里(即隨時隨地能被調(diào)動)
3.如果父進程退出,父進程父進程會變成僵尸狀態(tài)嗎?
不會,因為父進程的父進程為bash,父進程的退出信息會由bash接收到
總結(jié)
以上是生活随笔為你收集整理的【Linux】僵尸进程(Z状态)和孤儿进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于SSM+Vue的邮票管理系统的设计与
- 下一篇: Linux下用rar压缩和解压文件