Linux进程全解6——进程的诞生和消亡
以下內(nèi)容源于朱有鵬《物聯(lián)網(wǎng)大講堂》的課程學(xué)習(xí)整理,如有侵權(quán),請(qǐng)告知?jiǎng)h除。
1、進(jìn)程的誕生
(1)進(jìn)程0和進(jìn)程1
- 進(jìn)程0,是操作系統(tǒng)在啟動(dòng)過(guò)程中,由內(nèi)核一點(diǎn)點(diǎn)構(gòu)建起來(lái);
- 內(nèi)核態(tài)下的進(jìn)程1,是由進(jìn)程0利用內(nèi)核內(nèi)部的“fork”創(chuàng)建出來(lái),然后才轉(zhuǎn)變?yōu)橛脩魬B(tài)下的進(jìn)程1;
(2)fork
(3)vfork
2、進(jìn)程的消亡
(1)正常終止和異常終止;
(2)進(jìn)程在運(yùn)行時(shí)需要消耗系統(tǒng)資源(內(nèi)存、IO),進(jìn)程終止時(shí),應(yīng)該完全釋放這些資源(如果進(jìn)程消亡后仍然沒(méi)有釋放,相應(yīng)資源會(huì)丟失)。
(3)linux系統(tǒng)設(shè)計(jì)時(shí)規(guī)定
- 每一個(gè)進(jìn)程退出時(shí),操作系統(tǒng)會(huì)自動(dòng)回收這個(gè)進(jìn)程涉及到的所有的資源;
- 譬如malloc申請(qǐng)的內(nèi)容沒(méi)有free時(shí),當(dāng)前進(jìn)程結(jié)束時(shí)這個(gè)內(nèi)存會(huì)被釋放;
- 譬如open打開的文件沒(méi)有close的在程序終止時(shí)也會(huì)被關(guān)閉;
- 但是操作系統(tǒng)只是回收了這個(gè)進(jìn)程工作時(shí)消耗的內(nèi)存和IO,而并沒(méi)有回收這個(gè)進(jìn)程本身占用的內(nèi)存(8KB,主要是task_struct和棧內(nèi)存)。
(3)操作系統(tǒng)不能回收進(jìn)程本身的8KB內(nèi)存,需要?jiǎng)e人來(lái)輔助回收。
- 因此每個(gè)進(jìn)程都需要一個(gè)幫助它收尸的人,這個(gè)人就是這個(gè)進(jìn)程的父進(jìn)程。
3、僵尸進(jìn)程
(1)子進(jìn)程先于父進(jìn)程結(jié)束
- 子進(jìn)程結(jié)束后,父進(jìn)程此時(shí)并不一定立即就能幫子進(jìn)程“收尸”;
- 在這一段時(shí)間內(nèi)(子進(jìn)程已經(jīng)結(jié)束,而父進(jìn)程尚未幫其收尸),子進(jìn)程就被稱為僵尸進(jìn)程。
(2)子進(jìn)程除task_struct和棧外,其余內(nèi)存空間皆已清理。
(3)父進(jìn)程可以使用wait或waitpid,顯式地回收子進(jìn)程(剩余待回收的)內(nèi)存資源并且獲取子進(jìn)程退出狀態(tài)。
(4)父進(jìn)程也可以不使用wait或者waitpid回收子進(jìn)程,父進(jìn)程結(jié)束時(shí)一樣會(huì)回收子進(jìn)程(剩余待回收的)內(nèi)存資源。
- 這樣設(shè)計(jì)是為了防止父進(jìn)程忘記顯式調(diào)用wait/waitpid來(lái)回收子進(jìn)程從而造成內(nèi)存泄漏
4、孤兒進(jìn)程
(1)父進(jìn)程先于子進(jìn)程結(jié)束,子進(jìn)程成為一個(gè)孤兒進(jìn)程。
(2)linux系統(tǒng)規(guī)定,所有的孤兒進(jìn)程都自動(dòng)成為一個(gè)特殊進(jìn)程(進(jìn)程1,也就是init進(jìn)程)的子進(jìn)程。
總結(jié)
以上是生活随笔為你收集整理的Linux进程全解6——进程的诞生和消亡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上海宝付教你如何更好地保护手机隐私
- 下一篇: 破产姐妹第六季/全集2 Broke Gi