讀書筆記:只有在事件發生的情況下執行非阻塞才能提高效率

殭屍進程:是指父進程退出之後,而子進程退出之前,該子進程即處於殭屍態.

出現殭屍進程的兩種情況:

1.子進程結束之後系統並不會立即釋放子進程的進程表項,而要等父進程來確認子進程的的退出信息(如果父進程還在),在這子進程退出之後,父進程讀取子進程的退出信息之前,即子進程爲殭屍進程.

2.父進程異常退出或結束,然而子進程還在運行.這時子進程的ppid變爲1,即init進程,init 進程接管該進程,並等待子進程結束.

殭屍進程會佔據着內核資源,這是不允許的,因爲內核資源有限.我們可以在父進程內調用下列函數來防止出現殭屍進程.

     #include <sys/types.h>
       #include <sys/wait.h>
       pid_t wait(int *status);
       pid_t waitpid(pid_t pid, int *status, int options);
       

  wait將阻塞父進程,直到該進程的某個子進程結束.它返回結束進程的pid.

      這wait函數的阻塞特性顯然並不是服務器進程期待的,而waitpid函數解決了這個問題,處理方法如下:

      waitpid 的第一個參數是指定了父進程所等待結束的子進程,第二個參數是存儲結束的子進程的狀態信息

  waitpid 函數的第三個參數 options 可以控制waitpid的行爲,該參數的常用取值是  WNOHANG  (waitpid的行爲將是非阻塞的:等待結束的進程結束會立即返回結束進程的pid,如果等待結束的子進程沒有結束或者意外終止了,則waitpid會立即返回0)

  當某個子進程要結束的時候就給父進程發送信號 SIGCHILD ,父進程接收到該信號後就調用waitpid函數,並把第一個參數設置爲該子進程進程號,第三個參數設置爲非阻塞選項,這樣在子進程結束後就可以立即徹底結束該子進程,避免子進程長期佔用內核資源或者因爲調用wait函數而長期阻塞父進程(這就是所謂的事件發生的情況下調用非阻塞函數效率是最高的:在子進程結束事件發生時再調用非阻塞的等待子進程結束的函數waitpid )


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章