Linux內核設計與實現 第三章

                             Linux內核設計與實現 第三章

這一章介紹了Linux中進程的實現

進程描述符

Linux的進程信息放在一個叫進程描述符(task_struct)的結構中,各個進程描述符又組合成一個雙向循環鏈表,即任務隊列。這裏的任務隊列屬於操作系統。對於每個進程來講,在進程棧中還有另一個結構來描述本進程,這個結構往往就在棧頂或者棧底,叫thread_info。在改變進程狀態或者進行其他操作時,我們可以先在進程地址空間找到thread_info然後再訪問其task_struct。

                                        

進程狀態

運行(可執行或者正在執行)R,阻塞(等待某些條件),不可中斷(也是阻塞,不過在阻塞時不再接收別的信號,只等待自己阻塞的條件)被其他進程跟蹤,停止執行。一共五種。

進程樹

子進程可以直接訪問父進程,父進程中有一個鏈表保存子進程,可以通過遍歷鏈表訪問子進程。所有進程有共同的祖先也就是init進程。所以訪問系統中所有進程有兩種方式:通過父子關係和通過任務隊列。

進程創建

寫時拷貝,也就是父進程在創建子進程時候直接共享所有資源,當子進程對進程棧做出改變的時候再把改變的這部分寫到別的地方,此處屬於子進程。fork()->clone()->do_fork()->copy_process():1。創建內核棧、threadinfo、taskstuct  2。確保資源沒有超出。 3。taskstruct內很多成員需要被清零,比如一些計數  4。設置子進程狀態  5。賦予子進程權限   6。分配pid   7。根據clone()的參數,copyprocess()共享打開的文件進程地址空間等信息。 8。copyprecess()返回一個指向子進程的指針。dofork函數讓子進程開始運行。

線程

Linux中的線程比較有意思——只是某幾個共享資源的進程。所以創建過程基本和進程一樣,只是需要傳遞一些參數表明子進程和父進程共享資源。創建線程時候只需要向clone()傳遞一些參數標誌來指明需要共享的資源。內核在後臺做一些工作的線程,這些線程有一些特點,比如沒有獨立的地址空間,而且只能由其他內核線程創建(kthread_create方法)

進程終結

顯示終結(exit)或者隱式終結:調用do_exit():1將taskstruct中的flag設置爲PF_EXITING   2遞減計數器,若爲0則釋放相應資源   3完成系統規定的退出動作  4調用exit_notify()給父進程發送信號並且給子進程重新尋找養父(防止變成孤兒進程),並把進程狀態設置爲Z。 5切換到新進程

刪除進程描述符

儘管到目前爲止,進程已經僵死了,但是系統仍然需要保留它的描述符以獲得其信息。因此還需要刪除它的進程描述符:父進程調用wait(),如果是孤兒進程,則永遠處於僵死狀態。

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