




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章Linux操作系統(tǒng)本章內(nèi)容:進(jìn)程管理,存儲(chǔ)管理,文件系統(tǒng),設(shè)備管理,中斷、異常及系統(tǒng)調(diào)用,進(jìn)程通信。10.1
進(jìn)程管理內(nèi)容進(jìn)程描述符;進(jìn)程的調(diào)度時(shí)機(jī)及調(diào)度算法;進(jìn)程的創(chuàng)建與消亡。10.1.1進(jìn)程與進(jìn)程描述符1.進(jìn)程概念
2.進(jìn)程描述符(進(jìn)程控制塊)
由一個(gè)task_struct結(jié)構(gòu)表示。task_struct結(jié)構(gòu)是一個(gè)復(fù)雜的結(jié)構(gòu),占一千多字節(jié),其各個(gè)成員用來(lái)準(zhǔn)確描述進(jìn)程在各方面的信息.主要有以下幾個(gè)部分:
Linux進(jìn)程與傳統(tǒng)UNIX進(jìn)程的概念沒(méi)有多大區(qū)別;沒(méi)有真正意義上的線程概念。但Linux通過(guò)clone()系統(tǒng)調(diào)用支持輕權(quán)進(jìn)程;Linux還支持內(nèi)核線程的概念,內(nèi)核線程永遠(yuǎn)在核心態(tài)運(yùn)行,沒(méi)有用戶空間。(1)進(jìn)程標(biāo)識(shí)
包括進(jìn)程的標(biāo)識(shí)號(hào)(pid)、進(jìn)程的用戶標(biāo)識(shí)、進(jìn)程的組標(biāo)識(shí)等。每個(gè)進(jìn)程的標(biāo)識(shí)號(hào)是惟一的。
(2)調(diào)度相關(guān)信息
這部分內(nèi)容與進(jìn)程調(diào)度有關(guān),一部分信息見(jiàn)后面的第5節(jié)。進(jìn)程描述符中還需要有結(jié)構(gòu)保存當(dāng)進(jìn)程被換出時(shí)寄存器的狀態(tài),該進(jìn)程恢復(fù)運(yùn)行時(shí)便可從正確的狀態(tài)開(kāi)始繼續(xù)運(yùn)行。(3)進(jìn)程虛擬空間信息
Linux的進(jìn)程都在自己的私有地址空間中運(yùn)行,task_struct的成員mm指向一個(gè)mm_struct結(jié)構(gòu),該結(jié)構(gòu)描述進(jìn)程空間。
(7)描述進(jìn)程間關(guān)系的指針
所有的進(jìn)程通過(guò)一個(gè)雙向鏈表鏈接在一起。通過(guò)宏for_each_task可以對(duì)每個(gè)進(jìn)程操作。指向其父進(jìn)程、子進(jìn)程、兄弟進(jìn)程描述符的指針。需要根據(jù)pid號(hào)能夠快速找到進(jìn)程,系統(tǒng)以pid為關(guān)鍵字建立了一個(gè)哈希表,哈希函數(shù)值相同的進(jìn)程通過(guò)進(jìn)程描述符的pidhash_next和pidhash_pprev成員鏈在一起。10.1.2核心態(tài)與核心棧uniontask_union{ structtask_structtask; unsignedlongstack[2048];};
Linux的運(yùn)行分為兩種模式──核心態(tài)和用戶態(tài)。內(nèi)核總在核心態(tài)下運(yùn)行,而普通進(jìn)程通常在用戶模式下運(yùn)行,只有通過(guò)系統(tǒng)調(diào)用才能切換到核心態(tài)運(yùn)行。進(jìn)程擁有兩個(gè)棧,用戶模式棧與核心模式棧,分別在相應(yīng)模式下使用。進(jìn)程描述符和進(jìn)程核心棧的空間分配在一起,內(nèi)核為它們分配兩個(gè)連續(xù)的物理頁(yè)面。
因?yàn)檫M(jìn)程描述符已經(jīng)占用了1KB多的空間,所以核心棧的有效空間是6KB多一點(diǎn),合理的設(shè)計(jì)使得這個(gè)容量已經(jīng)足夠了。核心棧與進(jìn)程描述符如圖10-1所示。兩個(gè)物理頁(yè)幀8KB進(jìn)程描述符核心模式棧圖10-1核心棧與進(jìn)程描述符棧自頂向下增長(zhǎng)
TASK_STOPPED:進(jìn)程處于暫停狀態(tài),主要用于調(diào)試目的。如正在運(yùn)行的進(jìn)程收到SIGSTOP信號(hào)將進(jìn)入TASK_STOPPED狀態(tài)。
TASK_ZOMBIE:表示進(jìn)程已經(jīng)結(jié)束運(yùn)行并釋放了大部分占用的資源,但task_struct結(jié)構(gòu)還未被釋放。10.1.4進(jìn)程的切換時(shí)機(jī)當(dāng)前進(jìn)程放棄CPU的情況可以分為兩種。一、進(jìn)程主動(dòng)地放棄CPU
這種情況大體可以分為兩類:
1.隱式地主動(dòng)放棄CPU。往往是因?yàn)樾枰馁Y源目前不能獲取,如執(zhí)行read(),select()等系統(tǒng)調(diào)用的過(guò)程中,這種情況下的處理過(guò)程如下:
1)將進(jìn)程加入合適的等待隊(duì)列。
2)把當(dāng)前進(jìn)程的狀態(tài)改為TASK_INTERRUTIBLE或TASK_UNINTERRUTIBLE。
3)調(diào)用schedule()函數(shù),該函數(shù)的執(zhí)行結(jié)果往往是當(dāng)前進(jìn)程放棄CPU。
進(jìn)程的調(diào)度時(shí)機(jī)
進(jìn)程的調(diào)度時(shí)機(jī)分成兩種情形:
例如,進(jìn)程被動(dòng)放棄CPU的情形。當(dāng)進(jìn)程描述符的need_resched被置1時(shí),并不立即直接調(diào)用schedule()調(diào)度函數(shù)。而是在隨后的某個(gè)時(shí)刻,當(dāng)進(jìn)程從內(nèi)核態(tài)返回用戶態(tài)之前檢查need_resched是否為1,如果為1,則調(diào)用schedule()調(diào)度函數(shù)。直接調(diào)用schedule()調(diào)度函數(shù),例如進(jìn)程主動(dòng)放棄CPU的第一類情形;間接調(diào)用schedule()。10.1.5進(jìn)程的調(diào)度算法
核心函數(shù)是schedule(),該函數(shù)的任務(wù)是選出一個(gè)可運(yùn)行的進(jìn)程。1.進(jìn)程描述符有如下成員與調(diào)度有關(guān):
1)policy標(biāo)識(shí)進(jìn)程的調(diào)度策略。
SCHED_OTHER普通進(jìn)程;SCHED_FIFO實(shí)時(shí)進(jìn)程,采用先進(jìn)先出的調(diào)度算法;SCHED_RR實(shí)時(shí)進(jìn)程,采用輪轉(zhuǎn)法。2)rt_priority實(shí)時(shí)進(jìn)程的優(yōu)先級(jí),普通進(jìn)程不使用這個(gè)成員;3)nice普通進(jìn)程的優(yōu)先級(jí);4)counter進(jìn)程目前的CPU時(shí)間配額。2.對(duì)于普通進(jìn)程來(lái)講CPU時(shí)間的分配是典型的時(shí)分策略。
在某個(gè)時(shí)刻,運(yùn)行隊(duì)列中的每個(gè)進(jìn)程都有一個(gè)counter值,當(dāng)所有運(yùn)行隊(duì)列中的counter值都變?yōu)?以后,表明一輪已經(jīng)結(jié)束,每個(gè)進(jìn)程的counter根據(jù)其nice重新賦值,開(kāi)始新的一輪執(zhí)行過(guò)程。擁有CPU的進(jìn)程每次時(shí)鐘中斷counter值減一。
5)現(xiàn)在進(jìn)入了函數(shù)的核心部分??蛇\(yùn)行進(jìn)程隊(duì)列的每個(gè)進(jìn)程都將被計(jì)算出一個(gè)權(quán)值,主要是利用goodness()函數(shù),討論見(jiàn)后。最終最大的權(quán)值保存在變量c中,與之對(duì)應(yīng)的進(jìn)程描述符保存在變量next中。6)檢查c是否為0。若為0則表明所有可執(zhí)行進(jìn)程的時(shí)間配額都已用完,因而對(duì)所有進(jìn)程的counter重新“充電”,然后重新執(zhí)行第5)步。7)如果next進(jìn)程就是當(dāng)前進(jìn)程,則結(jié)束shedule()的運(yùn)行。否則進(jìn)行進(jìn)程切換,CPU改由next進(jìn)程占據(jù)。
4.goodness()函數(shù)
goodness()函數(shù)計(jì)算進(jìn)程的當(dāng)前權(quán)值。該函數(shù)的第一個(gè)參數(shù)是待估進(jìn)程的描述符。
如果該進(jìn)程是實(shí)時(shí)進(jìn)程,它的權(quán)值為1000+rt_priority,1000是普通進(jìn)程權(quán)值無(wú)法到達(dá)的數(shù)字,因而實(shí)時(shí)進(jìn)程總可以優(yōu)先得到執(zhí)行。對(duì)于普通進(jìn)程,它的權(quán)值為counter+20-nice,如果其又是內(nèi)核線程,由于無(wú)需切換用戶空間,則將權(quán)值加一作為獎(jiǎng)勵(lì)。10.1.6進(jìn)程的創(chuàng)建1.進(jìn)程的起源
Linux最早產(chǎn)生的進(jìn)程是啟動(dòng)過(guò)程中創(chuàng)建出idle進(jìn)程(不是通過(guò)fork(),而是編碼制作出來(lái)),pid號(hào)為0。它是創(chuàng)建一個(gè)內(nèi)核線程,該線程進(jìn)行一系列初始化動(dòng)作后最終會(huì)執(zhí)行/sbin/init文件,執(zhí)行該文件的結(jié)果是運(yùn)行模式從核心態(tài)切換到了用戶態(tài),該線程演變成了用戶進(jìn)程init,pid號(hào)為1。init進(jìn)程是一個(gè)非常重要的進(jìn)程,一切用戶態(tài)進(jìn)程都是它的后代進(jìn)程。intmain(void){ pid_tpid; if((pid=fork())<0){printf("forkfailed\n");exit(1); } elseif(pid==0){/*子進(jìn)程執(zhí)行進(jìn)入此部分*/ execlp("echoall","echoall",(char*)0); }else{/*父進(jìn)程*/ printf("forksuccess\n");exit(0);}}
3.sys_clone(),sys_vfork(),sys_fork()三個(gè)系統(tǒng)調(diào)用可以實(shí)現(xiàn)創(chuàng)建子進(jìn)程,這三個(gè)系統(tǒng)調(diào)用最終都會(huì)調(diào)用do_fork()函數(shù)完成主要工作。該函數(shù)的第一個(gè)參數(shù)clone_flags可由多個(gè)標(biāo)志位組成,常見(jiàn)的標(biāo)志位有:CLONE_VM
子進(jìn)程父進(jìn)程共享進(jìn)程空間;CLONE_FS子進(jìn)程父進(jìn)程共享文件系統(tǒng)信息;CLONE_FILES
子進(jìn)程父進(jìn)程共享打開(kāi)的文件;CLONE_VFORK
如果父進(jìn)程想使子進(jìn)程釋放空間時(shí)喚醒它,則置該位。
sys_clone()對(duì)應(yīng)的clone_flags可能是多個(gè)標(biāo)志位的組合,取決于具體情況。
sys_fork()對(duì)應(yīng)的clone_flags值是SIGCHILD。SIGCHILD的作用是子進(jìn)程終結(jié)或暫停時(shí)給父進(jìn)程發(fā)信號(hào)。
sys_vfork()對(duì)應(yīng)的clone_flags值是CLONE_VFORK|CLONE_VM|SIGCHILD。
vfork()是一個(gè)老的函數(shù)調(diào)用,子進(jìn)程共享父進(jìn)程的空間,包括頁(yè)表,父進(jìn)程被掛起直到子進(jìn)程執(zhí)行exec系列函數(shù)或子進(jìn)程退出時(shí)。在合適的場(chǎng)合,較之fork()時(shí)的“寫(xiě)時(shí)拷貝”策略vfork()無(wú)疑開(kāi)銷更小。
5)調(diào)用get_pid()函數(shù)為子進(jìn)程得到一個(gè)pid號(hào)。6)依次調(diào)用copy_files(),copy_fs(),copy_sighand(),copy_mm()分別復(fù)制父進(jìn)程文件處理、信號(hào)處理及進(jìn)程空間的信息。以上函數(shù)的具體行為取決clone_flags參數(shù),例如,copy_mm()時(shí),如果clone_flags包含有CLONE_VM標(biāo)志,則子進(jìn)程共享父進(jìn)程的空間,不會(huì)進(jìn)行復(fù)制。7)調(diào)用copy_thread()初始化子進(jìn)程的核心模式棧時(shí),核心棧保存了進(jìn)程返回用戶空間的上文。此處與平臺(tái)相關(guān),以i386為例,其中很重要的一點(diǎn)是存儲(chǔ)寄存器eax值的位置被置0,這個(gè)值就執(zhí)行系統(tǒng)調(diào)用后子進(jìn)程的返回值。
8)將父進(jìn)程的當(dāng)前的時(shí)間配額counter分一半給子進(jìn)程。9)利用宏SET_LINKS將子進(jìn)程插入所有進(jìn)程都在其中的雙向鏈表。調(diào)用hash_pid(),將子進(jìn)程加入相應(yīng)的hash隊(duì)列。10)調(diào)用wake_up_process(),將該子進(jìn)程插入可運(yùn)行隊(duì)列。至此,子進(jìn)程創(chuàng)建完畢,并在可運(yùn)行隊(duì)列中等待被調(diào)度運(yùn)行。11)如果clone_flags包含有CLONE_VFORK標(biāo)志,則將父進(jìn)程掛起直到子進(jìn)程釋放進(jìn)程空間。進(jìn)程描述符中有一個(gè)信號(hào)量vfork_sem可以起到將進(jìn)程掛起的作用。12)返回子進(jìn)程的pid值,該值就是系統(tǒng)調(diào)用后父進(jìn)程的返回值。4)設(shè)置進(jìn)程的退出狀態(tài),調(diào)用exit_notify()處理該進(jìn)程與其父進(jìn)程和子進(jìn)程的各種關(guān)系。在該函數(shù)中會(huì)將該進(jìn)程狀態(tài)置為TASK_ZOMBIE。5)調(diào)用schedule()調(diào)度函數(shù)切換到別的進(jìn)程。
3.TASK_ZOMBIE進(jìn)程
在do_exit(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025數(shù)字資源中心建設(shè)合同
- 2025版商業(yè)店鋪?zhàn)赓U合同2
- DB3308T 127-2024基層智治大腦 事件數(shù)據(jù)匯聚流轉(zhuǎn)基本要求
- 2025租賃合同補(bǔ)充協(xié)議書(shū)
- 貨車駕駛員勞務(wù)合同書(shū)
- 二零二五版人力資源部經(jīng)理勞動(dòng)合同樣本
- 榮成市自然保護(hù)地整合優(yōu)化方案
- 2025如何處理違反租賃合同的情況
- 2025商場(chǎng)照明系統(tǒng)維護(hù)合同模板
- 英語(yǔ)學(xué)習(xí)之旅
- DB36T 1641-2022 養(yǎng)老機(jī)構(gòu)突發(fā)事件應(yīng)急預(yù)防與處置規(guī)程
- 《子宮頸癌》課件
- 動(dòng)土作業(yè)安全技術(shù)交底
- 手術(shù)室護(hù)理質(zhì)量控制講解
- 大學(xué)物業(yè)服務(wù)月考核評(píng)價(jià)評(píng)分表
- GB 36893-2024空氣凈化器能效限定值及能效等級(jí)
- 19G522-1鋼筋桁架混凝土樓板圖集
- RPA財(cái)務(wù)機(jī)器人開(kāi)發(fā)與應(yīng)用 課件 6.1 RPA網(wǎng)銀付款機(jī)器人
- 軟件開(kāi)發(fā)中介服務(wù)協(xié)議范本
- 云南省昆明市2025屆高三年級(jí)第二次聯(lián)考+物理試卷
- 企業(yè)宣傳與品牌形象設(shè)計(jì)手冊(cè)
評(píng)論
0/150
提交評(píng)論