Linux學(xué)習(xí)-進程管理與調(diào)度(二)-進程的創(chuàng)建與銷毀

一、進程與線程的創(chuàng)建

Linux創(chuàng)建進程方式
fork():以復(fù)制的方式創(chuàng)建子進程,然后直接把資源復(fù)制給新創(chuàng)建的進程。Linux的fork()使用copy-on-write實現(xiàn),即copy本身兩個進程是共享一份地址拷貝,只有在需要寫時,資源才會被復(fù)制,讓兩個進程擁有各自的拷貝。
fork過程復(fù)制資源包括代碼段,數(shù)據(jù)段,堆,棧。fork調(diào)用者所在進程便是父進程,新創(chuàng)建的進程便是子進程;在fork調(diào)用結(jié)束,從內(nèi)核返回兩次,一次繼續(xù)執(zhí)行父進程,一次進入執(zhí)行子進程。父進程fork返回值子進程的pid,子進程返回值是0 。

copy-on-write

vfork():在無mmu 的cpu里面是不可能執(zhí)行copy-on-write的,即沒有fork ,所以使用vfork,vfork有個特點是資源復(fù)制中內(nèi)存資源是共享的,其他資源對拷一份。

Linux創(chuàng)建線程的方式
pthread_create():用戶線程創(chuàng)建。
kthread_create():內(nèi)核線程創(chuàng)建。

父進程與復(fù)制的進程完全共享他們的系統(tǒng)資源,這就是線程的實現(xiàn)。

內(nèi)核線程:沒有獨立的地址空間,即mm指向NULL。這樣的線程只在內(nèi)核運行,不會切換到用戶空間。 所有內(nèi)核線程都是由kthreadd作為內(nèi)核線程的祖師爺,衍生而來的。

總結(jié)一張fork、vfork、pthread_create的進程復(fù)制系統(tǒng)資源copy操作對比圖:

fork、vfork、pthread_create對比

對于用戶空間來說,線程是進程內(nèi)部的一個執(zhí)行路徑,它們共享進程的系統(tǒng)資源,與進程的pid也保持一致,只是tid不同。但是在內(nèi)核空間來看,每一個線程其實也是一個單獨的進程,只是共享父進程的系統(tǒng)資源而已,問題來了,既然是單獨的進程,那么每個線程應(yīng)該都得有自己唯一的pid,那么為什么用戶空間getPid是相同的呢?

posix標(biāo)準要求:一個進程有多個線程,向上要看起來像一個整體,即getPid要獲取到相同的pid。
Linux障眼法:創(chuàng)造了一個TGID,讓又p1 fork出來的線程類型的進程TGID與父進程保持一致,getPid實際上獲取的是TGID。

通過命令來查看:
top 是進程視角,查看的id實際上是各個進程(線程)的TGID
top -H 是線程視角,查看的是各個線程的自己獨有的id即PID

二、進程銷毀

進程銷毀通過系統(tǒng)調(diào)用exit(),大部分任務(wù)都靠do_exit()來完成,總結(jié)起來無非就是重置標(biāo)志位、釋放系統(tǒng)資源、以及給子進程找養(yǎng)父等操作。

這里所謂的給子進程找養(yǎng)父是這么一個場景:
如果父進程在子進程之前退出,必須有機制來保證子進程能找到新的父進程,否則這些成為孤兒的進程會再退出時沒有父進程來收尸,永遠處于僵尸狀態(tài)而白白耗費內(nèi)存。

托孤機制
給子進程在找一個subreaper作為父進程,如果找不到,就讓init(pid=1)成為他的父進程。

subreaper進程:

subreaper進程實現(xiàn)
托孤參考

如果干掉p2和p4,那么p3只能托孤給init,而p5則托孤給subreaper。(pstree命令可看樹狀結(jié)構(gòu))

總結(jié):
Linux進程都是子死父清場,如果父死,子未死,那就托孤。如果子死,父未死但是也不清場,那么子就一直是僵尸。

參考:
宋寶華Linux的進程、線程以及調(diào)度
《 Linux內(nèi)核設(shè)計與實現(xiàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容