歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux基礎知識:進程創建與退出小談

個人學習筆記,僅為加深記憶,水平有限,有錯的地方,大家指正。

1、進程創建使用fork()

用戶空間執行fork,陷入內核執行系統調用,創建子進程,實現父進程的拷貝,拷貝包括(進程控制塊、頁表)。父進程和子進程的頁表共享物理頁,沒有實現內存的拷貝,linux采用了copy-on-write技術,就是子進程執行後如果有往內存寫入的操作,操作系統就為子進程拷貝一份父進程內存的數據,父子進程的頁表各自有自己的物理頁相對應。

往往子進程創建以後都是通過exec執行另外的程序,此時釋放從父進程復制過來的全部資源。這種情況就不需要拷貝父進程的大量數據了,cow技術避免了拷貝父進程的大量無用數據。

子進程創建完成後,返回2次,子進程返回0,父進程返回子進程的進程號(PID),PID存放在進程控制塊(task_struct)中。返回後,父子進程各自執行任務。

我們還可以使用vfork()函數創建子進程,vfork()和fork()相比最大的好處是沒有拷貝頁表項.vfork()創建子進程後,父進程只能等待子進程終結或者執行另外程序後,父進程才能繼續執行。

2、exit通常是子程序中用來終結程序的,調用後,進程終結。

exit內部機制是怎麼運行的呢。

子程序exit代碼在用戶空間執行系統調用,系統調用陷入內核執行,操作系統釋放進程控制塊(PCB)中的資源,包括(頁表項、文件描述符、信號量等),此時PCB還存在,然後設置returncode,發送SIGCLD信號給父進程,此時子進程的狀態為ZOMBLE(僵死)。

父進程調用wait系統調用,陷入內核等待子進程發送的SIGCLD信號,接受到後,父進程取得子進程PCB中的errorcode,子進程運行的滴答數信息,然後wait調用返回。

子進程釋放PCB資源,調度合適的進程執行(進程上下文切換),執行另一進程,此時子進程完全消亡。

Copyright © Linux教程網 All Rights Reserved