這篇文章主要為大家展示了“Linux系統(tǒng)進程的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux系統(tǒng)進程的示例分析”這篇文章吧。
專業(yè)從事網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計,小程序設(shè)計,網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團隊竭力真誠服務(wù),采用H5建站+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站開發(fā),讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。
1. 什么是進程
進程是處于執(zhí)行期的程序以及它所包含的所有資源的總稱,包括虛擬處理器,虛擬空間,寄存器,堆棧,全局?jǐn)?shù)據(jù)段等。
在Linux中,每個進程在創(chuàng)建時都會被分配一個數(shù)據(jù)結(jié)構(gòu),稱為進程控制塊(Process Control Block,簡稱PCB)。PCB中包含了很多重要的信息,供系統(tǒng)調(diào)度和進程本身執(zhí)行使用。所有進程的PCB都存放在內(nèi)核空間中。PCB中最重要的信息就是進程PID,內(nèi)核通過這個PID來唯一標(biāo)識一個進程。PID可以循環(huán)使用,最大值是32768。init進程的pid為1,其他進程都是init進程的后代。
除了進程控制塊(PCB)以外,每個進程都有獨立的內(nèi)核堆棧(8k),一個進程描述符結(jié)構(gòu),這些數(shù)據(jù)都作為進程的控制信息儲存在內(nèi)核空間中;而進程的用戶空間主要存儲代碼和數(shù)據(jù)。
2.進程的創(chuàng)建
進程是通過調(diào)用::fork(),::vfork()和::clone()系統(tǒng)調(diào)用創(chuàng)建新進程。在內(nèi)核中,它們都是調(diào)用do_fork實現(xiàn)的。傳統(tǒng)的fork函數(shù)直接把父進程的所有資源復(fù)制給子進程。而Linux的::fork()使用寫時拷貝頁實現(xiàn),也就是說,父進程和子進程共享同一個資源拷貝,只有當(dāng)數(shù)據(jù)發(fā)生改變時,數(shù)據(jù)才會發(fā)生復(fù)制。通常的情況,子進程創(chuàng)建后會立即調(diào)用exec(),這樣就避免復(fù)制父進程的全部資源。
三者的區(qū)別如下:
::fork():父進程的所有數(shù)據(jù)結(jié)構(gòu)都會復(fù)制一份給子進程(寫時拷貝頁)。
::vfork():只復(fù)制task_struct和內(nèi)核堆棧,所以生成的只是父進程的一個線程(無獨立的用戶空間)。
::clone():功能強大,帶了許多參數(shù)。::clone()可以讓你有選擇性的繼承父進程的資源,既可以選擇像::vfork()一樣和父進程共享一個虛擬空間,從而使創(chuàng)造的是線程,你也可以不和父進程共享,你甚至可以選擇創(chuàng)造出來的進程和父進程不再是父子關(guān)系,而是兄弟關(guān)系。
3. 進程的撤銷
進程通過調(diào)用exit()退出執(zhí)行,這個函數(shù)會終結(jié)進程并釋放所有的資源。父進程可以通過wait4()查詢子進程是否終結(jié)。進程退出執(zhí)行后處于僵死狀態(tài),直到它的父進程調(diào)用wait()或者waitpid()為止。父進程退出時,內(nèi)核會指定線程組的其他進程或者init進程作為其子進程的新父進程。當(dāng)進程接收到一個不能處理或忽視的信號時,或當(dāng)在內(nèi)核態(tài)產(chǎn)生一個不可恢復(fù)的CPU異常而內(nèi)核此時正代表該進程在運行,內(nèi)核可以強迫進程終止。
4. 進程管理
內(nèi)核把進程信息存放在叫做任務(wù)隊列(task list)的雙向循環(huán)鏈表中(內(nèi)核空間)。鏈表中的每一項都是類型為task_struct,稱為進程描述符結(jié)構(gòu)(process descriptor),包含了一個具體進程的所有信息,包括打開的文件,進程的地址空間,掛起的信號,進程的狀態(tài)等。
Linux通過slab分配器分配task_struct,這樣能達到對象復(fù)用和緩存著色(通過預(yù)先分配和重復(fù)使用task_struct,可以避免動態(tài)分配和釋放所帶來的資源消耗)。
內(nèi)核把所有處于TASK_RUNNING狀態(tài)的進程組織成一個可運行雙向循環(huán)隊列。調(diào)度函數(shù)通過掃描整個可運行隊列,取得最值得執(zhí)行的進程投入執(zhí)行。避免掃描所有進程,提高調(diào)度效率。
5. 進程的內(nèi)核堆棧
Linux為每個進程分配一個8KB大小的內(nèi)存區(qū)域,用于存放該進程兩個不同的數(shù)據(jù)結(jié)構(gòu):thread_info和進程的內(nèi)核堆棧。
進程處于內(nèi)核態(tài)時使用不同于用戶態(tài)堆棧,內(nèi)核控制路徑所用的堆棧很少,因此對棧和描述符來說,8KB足夠了。
以上是“Linux系統(tǒng)進程的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!