主頁 > 知識(shí)庫 > Linux系統(tǒng)進(jìn)程深入理解

Linux系統(tǒng)進(jìn)程深入理解

熱門標(biāo)簽:硅谷的囚徒呼叫中心 家政服務(wù)網(wǎng)絡(luò) 外呼系統(tǒng) 解決方案 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 電話機(jī)器人搭建 服務(wù)器配置 美團(tuán)

1. 什么是進(jìn)程

進(jìn)程是處于執(zhí)行期的程序以及它所包含的所有資源的總稱,包括虛擬處理器,虛擬空間,寄存器,堆棧,全局?jǐn)?shù)據(jù)段等。

在Linux中,每個(gè)進(jìn)程在創(chuàng)建時(shí)都會(huì)被分配一個(gè)數(shù)據(jù)結(jié)構(gòu),稱為進(jìn)程控制塊(Process Control Block,簡稱PCB)。PCB中包含了很多重要的信息,供系統(tǒng)調(diào)度和進(jìn)程本身執(zhí)行使用。所有進(jìn)程的PCB都存放在內(nèi)核空間中。PCB中最重要的信息就是進(jìn)程PID,內(nèi)核通過這個(gè)PID來唯一標(biāo)識(shí)一個(gè)進(jìn)程。PID可以循環(huán)使用,最大值是32768。init進(jìn)程的pid為1,其他進(jìn)程都是init進(jìn)程的后代。

除了進(jìn)程控制塊(PCB)以外,每個(gè)進(jìn)程都有獨(dú)立的內(nèi)核堆棧(8k),一個(gè)進(jìn)程描述符結(jié)構(gòu),這些數(shù)據(jù)都作為進(jìn)程的控制信息儲(chǔ)存在內(nèi)核空間中;而進(jìn)程的用戶空間主要存儲(chǔ)代碼和數(shù)據(jù)。

2.進(jìn)程的創(chuàng)建

進(jìn)程是通過調(diào)用::fork(),::vfork()和::clone()系統(tǒng)調(diào)用創(chuàng)建新進(jìn)程。在內(nèi)核中,它們都是調(diào)用do_fork實(shí)現(xiàn)的。傳統(tǒng)的fork函數(shù)直接把父進(jìn)程的所有資源復(fù)制給子進(jìn)程。而Linux的::fork()使用寫時(shí)拷貝頁實(shí)現(xiàn),也就是說,父進(jìn)程和子進(jìn)程共享同一個(gè)資源拷貝,只有當(dāng)數(shù)據(jù)發(fā)生改變時(shí),數(shù)據(jù)才會(huì)發(fā)生復(fù)制。通常的情況,子進(jìn)程創(chuàng)建后會(huì)立即調(diào)用exec(),這樣就避免復(fù)制父進(jìn)程的全部資源。

三者的區(qū)別如下

::fork():父進(jìn)程的所有數(shù)據(jù)結(jié)構(gòu)都會(huì)復(fù)制一份給子進(jìn)程(寫時(shí)拷貝頁)。

::vfork():只復(fù)制task_struct和內(nèi)核堆棧,所以生成的只是父進(jìn)程的一個(gè)線程(無獨(dú)立的用戶空間)。

::clone():功能強(qiáng)大,帶了許多參數(shù)。::clone()可以讓你有選擇性的繼承父進(jìn)程的資源,既可以選擇像::vfork()一樣和父進(jìn)程共享一個(gè)虛擬空間,從而使創(chuàng)造的是線程,你也可以不和父進(jìn)程共享,你甚至可以選擇創(chuàng)造出來的進(jìn)程和父進(jìn)程不再是父子關(guān)系,而是兄弟關(guān)系。

3. 進(jìn)程的撤銷

進(jìn)程通過調(diào)用exit()退出執(zhí)行,這個(gè)函數(shù)會(huì)終結(jié)進(jìn)程并釋放所有的資源。父進(jìn)程可以通過wait4()查詢子進(jìn)程是否終結(jié)。進(jìn)程退出執(zhí)行后處于僵死狀態(tài),直到它的父進(jìn)程調(diào)用wait()或者waitpid()為止。父進(jìn)程退出時(shí),內(nèi)核會(huì)指定線程組的其他進(jìn)程或者init進(jìn)程作為其子進(jìn)程的新父進(jìn)程。當(dāng)進(jìn)程接收到一個(gè)不能處理或忽視的信號(hào)時(shí),或當(dāng)在內(nèi)核態(tài)產(chǎn)生一個(gè)不可恢復(fù)的CPU異常而內(nèi)核此時(shí)正代表該進(jìn)程在運(yùn)行,內(nèi)核可以強(qiáng)迫進(jìn)程終止。

4. 進(jìn)程管理

內(nèi)核把進(jìn)程信息存放在叫做任務(wù)隊(duì)列(task list)的雙向循環(huán)鏈表中(內(nèi)核空間)。鏈表中的每一項(xiàng)都是類型為task_struct,稱為進(jìn)程描述符結(jié)構(gòu)(process descriptor),包含了一個(gè)具體進(jìn)程的所有信息,包括打開的文件,進(jìn)程的地址空間,掛起的信號(hào),進(jìn)程的狀態(tài)等。

 

Linux通過slab分配器分配task_struct,這樣能達(dá)到對(duì)象復(fù)用和緩存著色(通過預(yù)先分配和重復(fù)使用task_struct,可以避免動(dòng)態(tài)分配和釋放所帶來的資源消耗)。

內(nèi)核把所有處于TASK_RUNNING狀態(tài)的進(jìn)程組織成一個(gè)可運(yùn)行雙向循環(huán)隊(duì)列。調(diào)度函數(shù)通過掃描整個(gè)可運(yùn)行隊(duì)列,取得最值得執(zhí)行的進(jìn)程投入執(zhí)行。避免掃描所有進(jìn)程,提高調(diào)度效率。

5. 進(jìn)程的內(nèi)核堆棧

Linux為每個(gè)進(jìn)程分配一個(gè)8KB大小的內(nèi)存區(qū)域,用于存放該進(jìn)程兩個(gè)不同的數(shù)據(jù)結(jié)構(gòu):thread_info和進(jìn)程的內(nèi)核堆棧。

進(jìn)程處于內(nèi)核態(tài)時(shí)使用不同于用戶態(tài)堆棧,內(nèi)核控制路徑所用的堆棧很少,因此對(duì)棧和描述符來說,8KB足夠了。

標(biāo)簽:烏蘭察布 韶關(guān) 防城港 撫州 北海 南昌 臨沂 邢臺(tái)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux系統(tǒng)進(jìn)程深入理解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266