僵屍進程
形成原因
僵死狀態(Zombies)是一個比較特殊的狀態;
當子進程退出並且父進程沒有讀取到子進程退出的返回代碼時就會產生僵死(屍)進程;
僵屍進程會以終止狀態保持在進程表中,並且會一直在等待父進程讀取退出狀態代碼。
總的來說:子進程退出,父進程還在運行,父進程沒有讀取子進程狀態,子進程進入僵屍狀態(Z狀態)
危害
1、維護退出狀態本身就是要用數據維護,也屬於進程基本信息,所以保存在task_struct(PCB)中,換句話說,僵屍狀態一直不退出,PCB一直都要維護
2、假設一個父進程創建很多子進程不回收,會造成內存資源浪費
3、會造成內存泄漏
解決方案
進程等待---wait函數和waitpid函數
wait函數
創建一個子進程,子進程正常邏輯,父進程調用wait函數來進行等待,當子進程退出的時候,由於父進程在等待,所以子進程就不會變成僵屍進程
父進程一開始調用wait函數,就會阻塞在wait函數中,等待子進程
直到子進程退出,wait函數調用才返回,父進程接着執行wait函數之后的代碼
孤兒進程
形成原因
父進程先於子進程退出,子進程會被1號進程領養(1號進程稱init進程)
1號進程會在子進程退出的時候,回收子進程的退出信息,防止子進程變成僵屍進程
危害
沒什么危害,因為該進程只是父進程換成了init進程,依然可以正常運行