![嵌入式操作系統(tǒng)chap5進(jìn)程課件_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/46640cd5-b06a-414e-812f-8850a1c43822/46640cd5-b06a-414e-812f-8850a1c438221.gif)
![嵌入式操作系統(tǒng)chap5進(jìn)程課件_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/46640cd5-b06a-414e-812f-8850a1c43822/46640cd5-b06a-414e-812f-8850a1c438222.gif)
![嵌入式操作系統(tǒng)chap5進(jìn)程課件_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/46640cd5-b06a-414e-812f-8850a1c43822/46640cd5-b06a-414e-812f-8850a1c438223.gif)
![嵌入式操作系統(tǒng)chap5進(jìn)程課件_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/46640cd5-b06a-414e-812f-8850a1c43822/46640cd5-b06a-414e-812f-8850a1c438224.gif)
![嵌入式操作系統(tǒng)chap5進(jìn)程課件_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/23/46640cd5-b06a-414e-812f-8850a1c43822/46640cd5-b06a-414e-812f-8850a1c438225.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第五章第五章操作系統(tǒng)進(jìn)程操作系統(tǒng)進(jìn)程l在在LinuxLinux系統(tǒng)中,進(jìn)程操作。需要掌握以下基本內(nèi)系統(tǒng)中,進(jìn)程操作。需要掌握以下基本內(nèi)容容 進(jìn)程的進(jìn)程的基本概念基本概念 LinuxLinux進(jìn)程及進(jìn)程創(chuàng)建進(jìn)程及進(jìn)程創(chuàng)建 LinuxLinux進(jìn)程進(jìn)程系統(tǒng)調(diào)用系統(tǒng)調(diào)用 LinuxLinux進(jìn)程調(diào)度進(jìn)程調(diào)度學(xué)習(xí)目標(biāo)主要內(nèi)容進(jìn)程的基本概念進(jìn)程的基本概念LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建LinuxLinux進(jìn)程的系統(tǒng)調(diào)用進(jìn)程的系統(tǒng)調(diào)用LinuxLinux進(jìn)程調(diào)度進(jìn)程調(diào)度一、進(jìn)程的基本概念一、進(jìn)程的基本概念 進(jìn)程的基本概念進(jìn)程的基本概念 進(jìn)程的狀態(tài)及轉(zhuǎn)換進(jìn)程的狀態(tài)
2、及轉(zhuǎn)換 進(jìn)程的組成進(jìn)程的組成l在傳統(tǒng)的操作系統(tǒng)中,程序并不能獨(dú)立運(yùn)行,作為資源分在傳統(tǒng)的操作系統(tǒng)中,程序并不能獨(dú)立運(yùn)行,作為資源分配和獨(dú)立運(yùn)行的基本單元都是配和獨(dú)立運(yùn)行的基本單元都是進(jìn)程進(jìn)程。l程序是一個(gè)普通文件程序是一個(gè)普通文件,是機(jī)器代碼指令和數(shù)據(jù)的集合,這,是機(jī)器代碼指令和數(shù)據(jù)的集合,這些指令和數(shù)據(jù)存儲在磁盤上的一個(gè)些指令和數(shù)據(jù)存儲在磁盤上的一個(gè)可執(zhí)行映象可執(zhí)行映象(Executable Image)中。)中。l進(jìn)程進(jìn)程是程序的一次是程序的一次“動態(tài)執(zhí)行動態(tài)執(zhí)行”,也就是說進(jìn)程是,也就是說進(jìn)程是“執(zhí)行執(zhí)行中的程序中的程序”。每一個(gè)進(jìn)程都有自己的。每一個(gè)進(jìn)程都有自己的地址空間地址空間,包括
3、文本,包括文本區(qū)域、數(shù)據(jù)區(qū)域和堆棧區(qū)域。區(qū)域、數(shù)據(jù)區(qū)域和堆棧區(qū)域。1 1、進(jìn)程的基本概念、進(jìn)程的基本概念一、進(jìn)程的基本概念一、進(jìn)程的基本概念l進(jìn)程是由正文段(進(jìn)程是由正文段(Text)、用戶數(shù)據(jù)段()、用戶數(shù)據(jù)段(User Segment)以及系統(tǒng)數(shù)據(jù)段(以及系統(tǒng)數(shù)據(jù)段(System Segment)共同組成的一個(gè)執(zhí)行)共同組成的一個(gè)執(zhí)行環(huán)境,它是一個(gè)環(huán)境,它是一個(gè)動態(tài)實(shí)體動態(tài)實(shí)體。l相對的,程序是相對的,程序是硬盤上存放硬盤上存放的一個(gè)文件(代碼)。當(dāng)程序的一個(gè)文件(代碼)。當(dāng)程序被運(yùn)行,它也就成為了被運(yùn)行,它也就成為了進(jìn)程進(jìn)程。 1 1、進(jìn)程的基本概念、進(jìn)程的基本概念一、進(jìn)程的基本概念一、
4、進(jìn)程的基本概念l線程線程是系統(tǒng)分配處理器時(shí)間資源的基本單元,或者說進(jìn)程之是系統(tǒng)分配處理器時(shí)間資源的基本單元,或者說進(jìn)程之內(nèi)獨(dú)立執(zhí)行的一個(gè)單元。對于操作系統(tǒng)來說,其調(diào)度單元是內(nèi)獨(dú)立執(zhí)行的一個(gè)單元。對于操作系統(tǒng)來說,其調(diào)度單元是線程。線程。一個(gè)進(jìn)程至少包括一個(gè)線程,通常將該線程稱為主線一個(gè)進(jìn)程至少包括一個(gè)線程,通常將該線程稱為主線程。一個(gè)進(jìn)程從主線程的執(zhí)行開始進(jìn)而創(chuàng)建一個(gè)或多個(gè)附加程。一個(gè)進(jìn)程從主線程的執(zhí)行開始進(jìn)而創(chuàng)建一個(gè)或多個(gè)附加線程,就是所謂基于多線程的多任務(wù)。線程,就是所謂基于多線程的多任務(wù)。l在在Linux 2.6內(nèi)核中,內(nèi)核中,Linux采用了更為先進(jìn)的線程模型:采用了更為先進(jìn)的線程模型
5、:NPTL(Native POSIX Thread Library)。與傳統(tǒng)的)。與傳統(tǒng)的LinuxThreads線程模型比,線程模型比,NPTL與與POSIX標(biāo)準(zhǔn)兼容,并且標(biāo)準(zhǔn)兼容,并且性能提升明顯,也具備更好的可伸縮性。對性能提升明顯,也具備更好的可伸縮性。對Linux內(nèi)核而言,內(nèi)核而言,線程和進(jìn)程沒有本質(zhì)的區(qū)別,它們都是調(diào)度的基本單位(實(shí)線程和進(jìn)程沒有本質(zhì)的區(qū)別,它們都是調(diào)度的基本單位(實(shí)際上,際上,Linux內(nèi)核基于進(jìn)程機(jī)制實(shí)現(xiàn)線程),本書內(nèi)核基于進(jìn)程機(jī)制實(shí)現(xiàn)線程),本書重點(diǎn)介紹重點(diǎn)介紹進(jìn)程進(jìn)程的內(nèi)容。的內(nèi)容。1 1、進(jìn)程的基本概念、進(jìn)程的基本概念一、進(jìn)程的基本概念一、進(jìn)程的基本概念1
6、 1、進(jìn)程的基本概念、進(jìn)程的基本概念一、進(jìn)程的基本概念一、進(jìn)程的基本概念進(jìn)程和程序區(qū)別和聯(lián)系進(jìn)程和程序區(qū)別和聯(lián)系(1)動態(tài)性和靜態(tài)性。)動態(tài)性和靜態(tài)性。 (2)從結(jié)構(gòu)上看每個(gè)進(jìn)程的實(shí)體都是由)從結(jié)構(gòu)上看每個(gè)進(jìn)程的實(shí)體都是由程序段和相應(yīng)的數(shù)據(jù)程序段和相應(yīng)的數(shù)據(jù)段段兩部分構(gòu)成的,這一特征與程序的含義相近。兩部分構(gòu)成的,這一特征與程序的含義相近。(3)一個(gè)進(jìn)程可以涉及到一個(gè)或幾個(gè)程序的執(zhí)行;反之一程)一個(gè)進(jìn)程可以涉及到一個(gè)或幾個(gè)程序的執(zhí)行;反之一程序可以對應(yīng)多個(gè)進(jìn)程,即同一程序段可在不同數(shù)據(jù)集合上序可以對應(yīng)多個(gè)進(jìn)程,即同一程序段可在不同數(shù)據(jù)集合上運(yùn)行,可構(gòu)成不同的進(jìn)程運(yùn)行,可構(gòu)成不同的進(jìn)程 。2 2
7、、進(jìn)程的狀態(tài)及其轉(zhuǎn)換、進(jìn)程的狀態(tài)及其轉(zhuǎn)換一、進(jìn)程的基本概念一、進(jìn)程的基本概念(1)運(yùn)行狀態(tài)運(yùn)行狀態(tài):進(jìn)程正在處理機(jī)上運(yùn)行的狀態(tài),該進(jìn)程已獲:進(jìn)程正在處理機(jī)上運(yùn)行的狀態(tài),該進(jìn)程已獲得必要的資源,也獲得了處理機(jī),用戶程序正在處理機(jī)上得必要的資源,也獲得了處理機(jī),用戶程序正在處理機(jī)上運(yùn)行。運(yùn)行。(2)阻塞狀態(tài)阻塞狀態(tài):進(jìn)程等待某種事件完成(例如,等待輸入:進(jìn)程等待某種事件完成(例如,等待輸入/輸輸出操作的完成)而暫時(shí)不能運(yùn)行的狀態(tài),處于該狀態(tài)的進(jìn)出操作的完成)而暫時(shí)不能運(yùn)行的狀態(tài),處于該狀態(tài)的進(jìn)程不能參加競爭處理機(jī),此時(shí),即使分配給它處理機(jī),它程不能參加競爭處理機(jī),此時(shí),即使分配給它處理機(jī),它也不能
8、運(yùn)行。也不能運(yùn)行。(3)就緒狀態(tài)就緒狀態(tài):該進(jìn)程運(yùn)行所需的一切條件都得到滿足,但:該進(jìn)程運(yùn)行所需的一切條件都得到滿足,但因處理機(jī)資源個(gè)數(shù)少于進(jìn)程個(gè)數(shù),所以該進(jìn)程不能運(yùn)行,因處理機(jī)資源個(gè)數(shù)少于進(jìn)程個(gè)數(shù),所以該進(jìn)程不能運(yùn)行,而必須等待分配處理機(jī)資源,一旦獲得處理機(jī)就立即投入而必須等待分配處理機(jī)資源,一旦獲得處理機(jī)就立即投入運(yùn)行。運(yùn)行。2 2、進(jìn)程的狀態(tài)及其轉(zhuǎn)換、進(jìn)程的狀態(tài)及其轉(zhuǎn)換一、進(jìn)程的基本概念一、進(jìn)程的基本概念2 2、進(jìn)程的狀態(tài)及其轉(zhuǎn)換、進(jìn)程的狀態(tài)及其轉(zhuǎn)換一、進(jìn)程的基本概念一、進(jìn)程的基本概念3 3、進(jìn)程的組成、進(jìn)程的組成一、進(jìn)程的基本概念一、進(jìn)程的基本概念l進(jìn)程實(shí)體一般由進(jìn)程實(shí)體一般由程序段、
9、數(shù)據(jù)段和進(jìn)程控制塊(程序段、數(shù)據(jù)段和進(jìn)程控制塊(PCB)PCB)這三這三部分組成。其中進(jìn)程的程序段就是該進(jìn)程所對應(yīng)的可執(zhí)行部分組成。其中進(jìn)程的程序段就是該進(jìn)程所對應(yīng)的可執(zhí)行程序。而數(shù)據(jù)段就是該程序運(yùn)行過程中要用到的數(shù)據(jù)或工程序。而數(shù)據(jù)段就是該程序運(yùn)行過程中要用到的數(shù)據(jù)或工作區(qū)。作區(qū)。 3 3、進(jìn)程的組成、進(jìn)程的組成一、進(jìn)程的基本概念一、進(jìn)程的基本概念l進(jìn)程控制塊作用進(jìn)程控制塊作用 每個(gè)進(jìn)程有唯一進(jìn)程控制塊每個(gè)進(jìn)程有唯一進(jìn)程控制塊 操作系統(tǒng)根據(jù)操作系統(tǒng)根據(jù)PCBPCB對進(jìn)程實(shí)施控制盒管理,記錄進(jìn)程動對進(jìn)程實(shí)施控制盒管理,記錄進(jìn)程動態(tài)、并發(fā)等運(yùn)行特征態(tài)、并發(fā)等運(yùn)行特征 PCBPCB是進(jìn)程存在的唯一
10、標(biāo)志是進(jìn)程存在的唯一標(biāo)志 當(dāng)系統(tǒng)或父進(jìn)程創(chuàng)建一個(gè)進(jìn)程時(shí),實(shí)際上就是為其建當(dāng)系統(tǒng)或父進(jìn)程創(chuàng)建一個(gè)進(jìn)程時(shí),實(shí)際上就是為其建立一個(gè)進(jìn)程控制塊。立一個(gè)進(jìn)程控制塊。 l進(jìn)程控制塊既能標(biāo)識進(jìn)程的存在,又能刻畫出進(jìn)程的動態(tài)進(jìn)程控制塊既能標(biāo)識進(jìn)程的存在,又能刻畫出進(jìn)程的動態(tài)特征,它是一個(gè)進(jìn)程僅有的被系統(tǒng)真正感知的部分。對操特征,它是一個(gè)進(jìn)程僅有的被系統(tǒng)真正感知的部分。對操作系統(tǒng)而言,所有進(jìn)程控制塊將構(gòu)成并發(fā)執(zhí)行控制和維護(hù)作系統(tǒng)而言,所有進(jìn)程控制塊將構(gòu)成并發(fā)執(zhí)行控制和維護(hù)系統(tǒng)工作的依據(jù)。系統(tǒng)工作的依據(jù)。3 3、進(jìn)程的組成、進(jìn)程的組成一、進(jìn)程的基本概念一、進(jìn)程的基本概念主要內(nèi)容進(jìn)程的基本概念進(jìn)程的基本概念Linu
11、xLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建LinuxLinux進(jìn)程的系統(tǒng)調(diào)用進(jìn)程的系統(tǒng)調(diào)用LinuxLinux進(jìn)程調(diào)度進(jìn)程調(diào)度二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程 Linux進(jìn)程的基礎(chǔ)進(jìn)程的基礎(chǔ) 進(jìn)程的描述符進(jìn)程的描述符 進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換 進(jìn)程隊(duì)列指針進(jìn)程隊(duì)列指針 進(jìn)程隊(duì)列的全局變量進(jìn)程隊(duì)列的全局變量1 1、LinuxLinux進(jìn)程基礎(chǔ)進(jìn)程基礎(chǔ)二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lLinux進(jìn)程一般分為交互進(jìn)程、批處理進(jìn)程和守護(hù)進(jìn)程三進(jìn)程一般分為交互進(jìn)程、批處理進(jìn)程和守護(hù)進(jìn)程三類。與類。與Windows任務(wù)管理器一樣,在任務(wù)管理器一樣,
12、在Linux中可以通過中可以通過ps命令查看系統(tǒng)當(dāng)前的進(jìn)程,例如下面的命令列出系統(tǒng)所有命令查看系統(tǒng)當(dāng)前的進(jìn)程,例如下面的命令列出系統(tǒng)所有的進(jìn)程:的進(jìn)程: rootlocalhost # ps -auxl如果進(jìn)程太多,可以把如果進(jìn)程太多,可以把ps命令的輸出保存到一個(gè)文件中:命令的輸出保存到一個(gè)文件中: rootlocalhost # ps -aux mypsoutlps是是Linux進(jìn)程管理中最重要的一個(gè)命令,它提供了很多進(jìn)程管理中最重要的一個(gè)命令,它提供了很多的選項(xiàng)參數(shù)的選項(xiàng)參數(shù)1 1、LinuxLinux進(jìn)程基礎(chǔ)進(jìn)程基礎(chǔ)二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lps的輸出列說明的輸出列
13、說明1 1、LinuxLinux進(jìn)程基礎(chǔ)進(jìn)程基礎(chǔ)二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lps命令的選項(xiàng)參數(shù)命令的選項(xiàng)參數(shù) 1 1、LinuxLinux進(jìn)程基礎(chǔ)進(jìn)程基礎(chǔ)二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lLinux進(jìn)程狀態(tài)進(jìn)程狀態(tài) 1 1、LinuxLinux進(jìn)程基礎(chǔ)進(jìn)程基礎(chǔ)二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程Linux系統(tǒng)中的進(jìn)程都具有以下系統(tǒng)中的進(jìn)程都具有以下4個(gè)要素。個(gè)要素。(1) 有一個(gè)程序有一個(gè)程序正文段正文段供其執(zhí)行。供其執(zhí)行。(2) 有進(jìn)程專用的有進(jìn)程專用的系統(tǒng)堆??臻g系統(tǒng)堆??臻g。(3) 有一個(gè)有一個(gè)進(jìn)程描述符進(jìn)程描述符,即在內(nèi)核中的一個(gè),即在內(nèi)核中的一個(gè)
14、task_struct數(shù)據(jù)結(jié)數(shù)據(jù)結(jié)構(gòu)。有了這個(gè)數(shù)據(jù)結(jié)構(gòu),進(jìn)程才能成為內(nèi)核調(diào)度的一個(gè)基構(gòu)。有了這個(gè)數(shù)據(jù)結(jié)構(gòu),進(jìn)程才能成為內(nèi)核調(diào)度的一個(gè)基本單位,接受內(nèi)核的調(diào)度。同時(shí),該結(jié)構(gòu)還記錄著進(jìn)程所本單位,接受內(nèi)核的調(diào)度。同時(shí),該結(jié)構(gòu)還記錄著進(jìn)程所占用的各項(xiàng)資源。占用的各項(xiàng)資源。(4) 有一個(gè)有一個(gè)獨(dú)立的地址空間獨(dú)立的地址空間,即擁有專有的用戶空間和專用,即擁有專有的用戶空間和專用的用戶空間堆棧。的用戶空間堆棧。 1 1、LinuxLinux進(jìn)程基礎(chǔ)進(jìn)程基礎(chǔ)二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程Linux的進(jìn)程狀態(tài)共有的進(jìn)程狀態(tài)共有6種。種。 (1) TASK_RUNNING:正在運(yùn)行:正在運(yùn)行(己獲
15、得己獲得CPU)或準(zhǔn)備運(yùn)行或準(zhǔn)備運(yùn)行(就就緒態(tài)緒態(tài)等待獲得等待獲得CPU)的進(jìn)程。的進(jìn)程。 (2) TASK_INTERRUPTIBLE:可中斷等待狀態(tài)。進(jìn)程處于等:可中斷等待狀態(tài)。進(jìn)程處于等待隊(duì)列中,一旦資源可用時(shí)被喚醒,也可以由其他進(jìn)程通過待隊(duì)列中,一旦資源可用時(shí)被喚醒,也可以由其他進(jìn)程通過信號信號(SIGNAL)或中斷喚醒。或中斷喚醒。 (3) TASK_UNINTERRUPTIBLE:不可中斷等待狀態(tài)。進(jìn)程:不可中斷等待狀態(tài)。進(jìn)程處于等待隊(duì)列中,一旦資源可用時(shí)被喚醒,但不可以由其他處于等待隊(duì)列中,一旦資源可用時(shí)被喚醒,但不可以由其他進(jìn)程通過信號進(jìn)程通過信號(SIGNAL)或中斷喚醒。或
16、中斷喚醒。 (4) TASK_ZOMBIE:進(jìn)程僵死狀態(tài)。進(jìn)程停止運(yùn)行但是尚未:進(jìn)程僵死狀態(tài)。進(jìn)程停止運(yùn)行但是尚未釋放釋放PCB。 (5) TASK_STOPPED:進(jìn)程停止?fàn)顟B(tài)。可能被特定信號終止,:進(jìn)程停止?fàn)顟B(tài)。可能被特定信號終止,也可能是受其他進(jìn)程的跟蹤調(diào)用而暫時(shí)將也可能是受其他進(jìn)程的跟蹤調(diào)用而暫時(shí)將CPU出讓給跟蹤它出讓給跟蹤它的進(jìn)程。的進(jìn)程。 (6) TASK_SWAPPING:頁面被交換出內(nèi)存的進(jìn)程。:頁面被交換出內(nèi)存的進(jìn)程。 2 2、LinuxLinux進(jìn)程描述符進(jìn)程描述符二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lLinux系統(tǒng)的每一個(gè)可調(diào)度實(shí)體都有一個(gè)系統(tǒng)的每一個(gè)可調(diào)度實(shí)體
17、都有一個(gè)進(jìn)程描述符進(jìn)程描述符。l進(jìn)程描述符可以表示進(jìn)程描述符可以表示進(jìn)程的各種狀態(tài)信息進(jìn)程的各種狀態(tài)信息,是內(nèi)核操作進(jìn)程,是內(nèi)核操作進(jìn)程的手段。進(jìn)程描述符用的手段。進(jìn)程描述符用task_struct數(shù)據(jù)結(jié)構(gòu)表示,該結(jié)構(gòu)包數(shù)據(jù)結(jié)構(gòu)表示,該結(jié)構(gòu)包含了一個(gè)進(jìn)程所擁有的各種信息,非常龐大,在內(nèi)核文件的含了一個(gè)進(jìn)程所擁有的各種信息,非常龐大,在內(nèi)核文件的includelinux sched.h中定義。中定義。ltask_struct就是就是Linux系統(tǒng)中的系統(tǒng)中的PCB。l系統(tǒng)內(nèi)核中還有一個(gè)系統(tǒng)內(nèi)核中還有一個(gè)task向量表向量表,是指向系統(tǒng)中每一個(gè)是指向系統(tǒng)中每一個(gè)task_struct數(shù)據(jù)結(jié)構(gòu)的指針
18、的數(shù)據(jù)結(jié)構(gòu)的指針的task數(shù)組。因而數(shù)組。因而task向量表就向量表就是是Linux系統(tǒng)中的系統(tǒng)中的PCB表。表。 l在創(chuàng)建一個(gè)新進(jìn)程時(shí),系統(tǒng)在內(nèi)存中申請一個(gè)空的在創(chuàng)建一個(gè)新進(jìn)程時(shí),系統(tǒng)在內(nèi)存中申請一個(gè)空的task_struct區(qū),即空閑區(qū),即空閑PCB塊,并填入所需信息,同時(shí)將指塊,并填入所需信息,同時(shí)將指向該結(jié)構(gòu)的指針填入到向該結(jié)構(gòu)的指針填入到task數(shù)組中。數(shù)組中。2 2、LinuxLinux進(jìn)程描述符進(jìn)程描述符二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lLinux系統(tǒng)的系統(tǒng)的PCB包括很多參數(shù),每個(gè)包括很多參數(shù),每個(gè)PCB約占約占1KB多的內(nèi)多的內(nèi)存空間。用于表示存空間。用于表示PC
19、B的結(jié)構(gòu)的結(jié)構(gòu)task_struct簡要描述如下:簡要描述如下:struct task_structvolatile long state; unsigned short uid;int pid;int processor;.; (見見P100)l傳統(tǒng)上,這樣的數(shù)據(jù)結(jié)構(gòu)被叫作傳統(tǒng)上,這樣的數(shù)據(jù)結(jié)構(gòu)被叫作進(jìn)程控制塊(進(jìn)程控制塊(PCB process control block)2 2、LinuxLinux進(jìn)程描述符進(jìn)程描述符二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lTask_struct結(jié)構(gòu)的描述:結(jié)構(gòu)的描述:進(jìn)程標(biāo)識進(jìn)程標(biāo)識進(jìn)程狀態(tài)進(jìn)程狀態(tài)(State)進(jìn)程調(diào)度信息和策略進(jìn)程調(diào)度信息和策
20、略標(biāo)識號標(biāo)識號(Identifiers)進(jìn)程通信有關(guān)的信息進(jìn)程通信有關(guān)的信息(IPC)進(jìn)程鏈接信息進(jìn)程鏈接信息(Links)時(shí)間和定時(shí)器信息時(shí)間和定時(shí)器信息(Times and Timers)文件系統(tǒng)信息文件系統(tǒng)信息(Files System)處理器相關(guān)的上下文信息處理器相關(guān)的上下文信息2 2、LinuxLinux進(jìn)程描述符進(jìn)程描述符二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程2 2、LinuxLinux進(jìn)程描述符進(jìn)程描述符二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l標(biāo)識信息:用簡單數(shù)字對進(jìn)程進(jìn)行標(biāo)識標(biāo)識信息:用簡單數(shù)字對進(jìn)程進(jìn)行標(biāo)識 pid_t pid;進(jìn)程標(biāo)識號;進(jìn)程標(biāo)識號 pid_t
21、pgrp;進(jìn)程組標(biāo)識號;進(jìn)程組標(biāo)識號 pid_t tty_old_pgrp;進(jìn)程控制終端所在的組標(biāo)識進(jìn)程控制終端所在的組標(biāo)識 pid_t session;進(jìn)程所在的會話標(biāo)識號進(jìn)程所在的會話標(biāo)識號 pid_t tgid;線程組號線程組號 int leader;布爾量,標(biāo)志布爾量,標(biāo)志,表示進(jìn)程是否為會話主管表示進(jìn)程是否為會話主管 l狀態(tài)信息:描述進(jìn)程動態(tài)的變化狀態(tài)信息:描述進(jìn)程動態(tài)的變化l調(diào)度信息調(diào)度信息:描述進(jìn)程優(yōu)先級、調(diào)度策略等信息描述進(jìn)程優(yōu)先級、調(diào)度策略等信息l進(jìn)程間通信信息:描述多個(gè)進(jìn)程在同一任務(wù)上協(xié)作工作進(jìn)程間通信信息:描述多個(gè)進(jìn)程在同一任務(wù)上協(xié)作工作l虛擬內(nèi)存信息:描述每個(gè)進(jìn)程擁有的
22、地址空間虛擬內(nèi)存信息:描述每個(gè)進(jìn)程擁有的地址空間l時(shí)間和定時(shí)器信息:描述進(jìn)程在生命周期內(nèi)使用時(shí)間和定時(shí)器信息:描述進(jìn)程在生命周期內(nèi)使用CPU統(tǒng)統(tǒng)計(jì)、計(jì)費(fèi)等信息計(jì)、計(jì)費(fèi)等信息l進(jìn)程標(biāo)識符:進(jìn)程標(biāo)識符:每一個(gè)進(jìn)程都有一個(gè)唯一的標(biāo)識符,內(nèi)核通過這個(gè)標(biāo)識每一個(gè)進(jìn)程都有一個(gè)唯一的標(biāo)識符,內(nèi)核通過這個(gè)標(biāo)識符來識別不同的進(jìn)程。符來識別不同的進(jìn)程。 進(jìn)程標(biāo)識符進(jìn)程標(biāo)識符PID也是內(nèi)核提供給用戶程序的接口,用戶也是內(nèi)核提供給用戶程序的接口,用戶程序通過程序通過PID對進(jìn)程發(fā)號施令。對進(jìn)程發(fā)號施令。 PID是是32位的無符號整數(shù),它被順序編號位的無符號整數(shù),它被順序編號每個(gè)進(jìn)程都屬于某個(gè)用戶組每個(gè)進(jìn)程都屬于某個(gè)用
23、戶組 task_struct結(jié)構(gòu)中定義有用戶標(biāo)識符結(jié)構(gòu)中定義有用戶標(biāo)識符UID(user identifier)和組標(biāo)識符)和組標(biāo)識符GID(Group identifier) 這兩種標(biāo)識符擁有系統(tǒng)的安全控制這兩種標(biāo)識符擁有系統(tǒng)的安全控制 系統(tǒng)通過這兩種標(biāo)識符控制進(jìn)程對系統(tǒng)中文件和設(shè)備系統(tǒng)通過這兩種標(biāo)識符控制進(jìn)程對系統(tǒng)中文件和設(shè)備的訪問的訪問2 2、LinuxLinux進(jìn)程描述符進(jìn)程描述符二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程3 3、LinuxLinux進(jìn)程狀態(tài)及轉(zhuǎn)換進(jìn)程狀態(tài)及轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l狀態(tài)信息:狀態(tài)信息: Linux的進(jìn)程狀態(tài)的進(jìn)程狀態(tài) stat
24、e (include/linux/sched.h) 若進(jìn)程可運(yùn)行若進(jìn)程可運(yùn)行,則則state的取值如下所示:的取值如下所示:#define TASK_RUNNING 0 /*R執(zhí)行態(tài)執(zhí)行態(tài)*/#define TASK_INTERRUPTIBLE 1 /*S可中斷睡眠可中斷睡眠*/#define TASK_UNINTERRUPTIBLE 2 /*D不可中斷睡眠不可中斷睡眠*/#define TASK_ZOMBIE 4 /*Z僵死狀態(tài),退出狀態(tài)僵死狀態(tài),退出狀態(tài)*/#define TASK_STOPPED 8 /*T暫停狀態(tài)或跟蹤狀態(tài)暫停狀態(tài)或跟蹤狀態(tài)*/#define TASK_EXCLUSIV
25、E 32 /*T排他狀態(tài),不可獨(dú)立使用,排他狀態(tài),不可獨(dú)立使用,必須與必須與TASK_INTERRUPTIBLE或或TASK_UNINTERRUPTIBLE合用。合用。 EXIT_DEAD /*X退出狀態(tài),進(jìn)程即將被銷毀退出狀態(tài),進(jìn)程即將被銷毀*/ TASK_DEAD /*死亡狀態(tài)死亡狀態(tài) */l在內(nèi)核源代碼中的定義如下在內(nèi)核源代碼中的定義如下:l/usr/src/linux/fs/proc/array.c static const char *task_state_array = R (running), /* 0 */ S (sleeping), /* 1 */ D (disk sleep
26、), /* 2 */ T (stopped), /* 4 */ T (tracing stop), /* 8 */ Z (zombie), /* 16 */ X (dead) /* 32 */; 內(nèi)核內(nèi)核 2.6.26 中的新狀態(tài)定義中的新狀態(tài)定義#define TASK_KILLABLE#define TASK_STOPPED #define TASK_TRACED3 3、LinuxLinux進(jìn)程狀態(tài)及轉(zhuǎn)換進(jìn)程狀態(tài)及轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程狀態(tài)狀態(tài)定義定義RRunning.運(yùn)行中運(yùn)行中SInterruptible Sleep.等待調(diào)用等待調(diào)用DUninterrupti
27、ble Sleep.等待磁盤等待磁盤IOTStoped.暫?;蛘吒櫊顟B(tài)暫停或者跟蹤狀態(tài)XDead.即將被撤銷即將被撤銷ZZombie.進(jìn)程已經(jīng)結(jié)束,僅映像進(jìn)程已經(jīng)結(jié)束,僅映像名留存名留存WPaging.內(nèi)存交換內(nèi)存交換N優(yōu)先級低的進(jìn)程優(yōu)先級低的進(jìn)程優(yōu)先級高的進(jìn)程優(yōu)先級高的進(jìn)程s進(jìn)程的領(lǐng)導(dǎo)者進(jìn)程的領(lǐng)導(dǎo)者L鎖定狀態(tài)鎖定狀態(tài)l多線程狀態(tài)多線程狀態(tài)+前臺進(jìn)程前臺進(jìn)程Linux的進(jìn)程狀態(tài)的進(jìn)程狀態(tài) state二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l狀態(tài)信息:狀態(tài)信息:Linux有有10個(gè)進(jìn)程標(biāo)志個(gè)進(jìn)程標(biāo)志(process flags)。)。PF_ALIGNWARN 打印打印“對齊對齊”警告信息。
28、警告信息。PF_PTRACED 被被ptrace系統(tǒng)調(diào)用監(jiān)控。系統(tǒng)調(diào)用監(jiān)控。PF_TRACESYS 正在跟蹤。正在跟蹤。PF_FORKNOEXEC 進(jìn)程剛創(chuàng)建,但還沒執(zhí)行。進(jìn)程剛創(chuàng)建,但還沒執(zhí)行。PF_SUPERPRIV 超級用戶特權(quán)。超級用戶特權(quán)。PF_DUMPCORE dumped core。PF_SIGNALED 進(jìn)程被信號進(jìn)程被信號(signal)殺出。殺出。PF_STARTING 進(jìn)程正被創(chuàng)建。進(jìn)程正被創(chuàng)建。PF_EXITING 進(jìn)程開始關(guān)閉。進(jìn)程開始關(guān)閉。PF_USEDFPU 該進(jìn)程使用該進(jìn)程使用FPU(SMP only)。PF_DTRACE delayed trace (used
29、 on m68k)。3 3、LinuxLinux進(jìn)程狀態(tài)及轉(zhuǎn)換進(jìn)程狀態(tài)及轉(zhuǎn)換l進(jìn)程間狀態(tài)轉(zhuǎn)換:進(jìn)程間狀態(tài)轉(zhuǎn)換:3 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程3 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l獲得獲得CPU,若申請不到某個(gè)資源,則調(diào)用,若申請不到某個(gè)資源,則調(diào)用sleep_on()或或interruptible_sleep_on()睡眠,其睡眠,其task_struct掛到相應(yīng)的等掛到相應(yīng)的等待隊(duì)列。待隊(duì)列。sleep_on()或或interruptible_slee
30、p_on()將調(diào)用將調(diào)用schedule()函數(shù)把睡眠進(jìn)程釋放的函數(shù)把睡眠進(jìn)程釋放的CPU分配給分配給run-queue隊(duì)隊(duì)列的某個(gè)就緒進(jìn)程。列的某個(gè)就緒進(jìn)程。l狀態(tài)為狀態(tài)為TASK_INTERRUPTIBLE申請的資源有效時(shí)被喚申請的資源有效時(shí)被喚醒(如醒(如wake_up_interruptible()),也可以由信號),也可以由信號(signal)或定時(shí)中斷喚醒。而狀態(tài)為或定時(shí)中斷喚醒。而狀態(tài)為TASK_UNINTERRUPTIBLE申請的資源有效時(shí)被喚醒(如申請的資源有效時(shí)被喚醒(如wake_up() ,喚醒后,進(jìn)程,喚醒后,進(jìn)程狀態(tài)改為狀態(tài)改為TASK_RUNNING,并進(jìn)入運(yùn)行隊(duì)列
31、。,并進(jìn)入運(yùn)行隊(duì)列。l進(jìn)程執(zhí)行系統(tǒng)調(diào)用進(jìn)程執(zhí)行系統(tǒng)調(diào)用sys_exit()或收到或收到SIG_KILL信號而調(diào)用信號而調(diào)用do_exit()時(shí),進(jìn)程狀態(tài)變?yōu)闀r(shí),進(jìn)程狀態(tài)變?yōu)門ASK_ZOMBIE,釋放所申請,釋放所申請資源。通過啟動資源。通過啟動schedule()把把CPU分配給其它就緒進(jìn)程。分配給其它就緒進(jìn)程。若進(jìn)程通過系統(tǒng)調(diào)用設(shè)置若進(jìn)程通過系統(tǒng)調(diào)用設(shè)置PF_SYSTRACE,則在系統(tǒng)進(jìn)入,則在系統(tǒng)進(jìn)入ptrace(),狀態(tài)變?yōu)椋瑺顟B(tài)變?yōu)門ASK_STOPPED,CPU分配給其它就分配給其它就緒進(jìn)程。只有通過其它進(jìn)程發(fā)送緒進(jìn)程。只有通過其它進(jìn)程發(fā)送SIG_KILL或或SIG_CONT,才能
32、喚醒進(jìn)程,重新進(jìn)入運(yùn)行隊(duì)列。才能喚醒進(jìn)程,重新進(jìn)入運(yùn)行隊(duì)列。 (1)分析不可被中斷的睡眠進(jìn)程:分析不可被中斷的睡眠進(jìn)程:l終端終端1)rootlocalhost state# vi testu.c#include void main() if (!vfork() sleep(100); rootlocalhost state# gcc testu.c -o testu./testul終端終端2)rootlocalhost state# ps aux|grep testuroot 24773 0.0 0.0 1336 224 pts/2 D 15:34 0:00 ./testuroot 2484
33、0 0.0 0.2 4816 640 pts/3 S 15:36 0:00 grep testu3 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程(2) 分析被跟蹤或被停止的進(jìn)程狀態(tài)分析被跟蹤或被停止的進(jìn)程狀態(tài)(T) :l終端終端1)lrootlocalhost state# strace top終端終端2)rootlocalhost state# ps auxf|grep toproot 24978 4.3 0.2 1552 552 pts/2 S 15:42 0:00 | _ strace toproot 24979 2.6 0.3 5
34、156 960 pts/2 T 15:42 0:00 | _ toproot 24981 0.0 0.2 4812 636 pts/3 S 15:42 0:00 _ grep top3 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程(2)分析進(jìn)程的可中斷睡眠態(tài)與運(yùn)行態(tài)分析進(jìn)程的可中斷睡眠態(tài)與運(yùn)行態(tài) :l終端終端1) rootlocalhost state# vi pisqrt.cl編譯鏈接后編譯鏈接后: rootlocalhost state# gcc -Wall -o pisqrt pisqrt.c -lm l監(jiān)控監(jiān)控pisqrt進(jìn)程進(jìn)程
35、 rootlocalhost state# watch -n 1 ps aux|grep pisqrt|grep -v ps|awk print $2|sort -k 8l終端終端2) rootlocalhost state# strace ./pisqrt . read(3, 177ELF11100000000030301000200X1., 512) = 512fstat64(3, st_mode=S_IFREG|0755, st_size=1572440, .) = 0old_mmap(NULL, 1279916, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3,
36、 0) = 0 x49e000 3 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程#include #include #include #include void run_status(void) double pi = M_PI; double pisqrt; long i; for (i=0; i100000000; +i) pisqrt = sqrt(pi); int main (void) run_status(); sleep(10); run_status(); exit(EXIT_SUCCESS);(2)分析進(jìn)程的可中斷睡眠態(tài)
37、與運(yùn)行態(tài)分析進(jìn)程的可中斷睡眠態(tài)與運(yùn)行態(tài) :l此時(shí)切換到終端此時(shí)切換到終端1看看pisqrt進(jìn)程狀態(tài)進(jìn)程狀態(tài),此時(shí)為此時(shí)為R狀態(tài)狀態(tài):root 3792 99.9 0.0 1516 268 pts/2 R 02:40 0:01 ./pisqrt root 3801 0.0 0.0 3700 672 pts/1 S 02:40 0:00 grep pisqrtroot 3791 1.0 0.0 1728 564 pts/2 S 02:40 0:00 strace ./pisqr l之后之后pisqrt進(jìn)程進(jìn)入進(jìn)程進(jìn)入S狀態(tài),因?yàn)閳?zhí)行了狀態(tài),因?yàn)閳?zhí)行了sleep(10)函數(shù),函數(shù),10秒之后秒之后p
38、isqrt再次進(jìn)入再次進(jìn)入R狀態(tài),最終退出。狀態(tài),最終退出。3 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程(3)分析進(jìn)程的僵死態(tài)(分析進(jìn)程的僵死態(tài)(Z):l終端終端1) rootlocalhost state# vi testz.cl編譯鏈接后編譯鏈接后: rootlocalhost state# gcc -Wall -o testz testz.cl監(jiān)控監(jiān)控testz進(jìn)程進(jìn)程 rootlocalhost state# watch -n 1 ps aux|grep testz|grep -v ps|awk print $2|sort -
39、k 8“l(fā)終端終端2) rootlocalhost state# ./testzl查看終端查看終端1:root 5402 0.0 0.0 1380 240 pts/3 S 16:05 0:00 | _ ./ testz root 5401 0.0 0.0 0 0 pts/3 Z 16:05 0:00 | _ testz l20秒后查看終端秒后查看終端2:child pid=5401 parent pid=54023 3、LinuxLinux進(jìn)程的狀態(tài)與轉(zhuǎn)換進(jìn)程的狀態(tài)與轉(zhuǎn)換二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程#include #include #include #include #inc
40、lude int main () if(!fork() printf(child pid=%dn, getpid(); exit(5); sleep(20); printf(parent pid=%dn, getpid(); exit(EXIT_SUCCESS);4 4、LinuxLinux進(jìn)程的隊(duì)列指針進(jìn)程的隊(duì)列指針二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l操作系統(tǒng)以隊(duì)列方式管理進(jìn)程。主要有線性方式、鏈表方操作系統(tǒng)以隊(duì)列方式管理進(jìn)程。主要有線性方式、鏈表方式和索引方式。式和索引方式。1)線性表方式線性表方式:不論進(jìn)程的狀態(tài)如何,將所有的:不論進(jìn)程的狀態(tài)如何,將所有的PCB連續(xù)連續(xù)地存放在
41、內(nèi)存的系統(tǒng)區(qū)。這種方式適用于系統(tǒng)中地存放在內(nèi)存的系統(tǒng)區(qū)。這種方式適用于系統(tǒng)中進(jìn)程數(shù)目進(jìn)程數(shù)目不多不多的情況。的情況。2)索引表方式索引表方式:該方式是線性表方式的改進(jìn),系統(tǒng)按照進(jìn):該方式是線性表方式的改進(jìn),系統(tǒng)按照進(jìn)程的狀態(tài)分別建立程的狀態(tài)分別建立就緒索引表、阻塞索引表就緒索引表、阻塞索引表等。等。3)鏈接表方式鏈接表方式:系統(tǒng)按照進(jìn)程的狀態(tài)將進(jìn)程的:系統(tǒng)按照進(jìn)程的狀態(tài)將進(jìn)程的PCB組成隊(duì)組成隊(duì)列,從而形成列,從而形成就緒隊(duì)列、阻塞隊(duì)列、運(yùn)行隊(duì)列就緒隊(duì)列、阻塞隊(duì)列、運(yùn)行隊(duì)列等等 4 4、LinuxLinux進(jìn)程的隊(duì)列指針進(jìn)程的隊(duì)列指針二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程線性表方式線性表
42、方式:空間固定、查找費(fèi)時(shí):空間固定、查找費(fèi)時(shí)索引方式:索引方式:空間整齊、容易維護(hù)空間整齊、容易維護(hù)4 4、LinuxLinux進(jìn)程的隊(duì)列指針進(jìn)程的隊(duì)列指針二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程鏈接方式:鏈接方式:構(gòu)建方便、容易維護(hù)構(gòu)建方便、容易維護(hù)4 4、LinuxLinux進(jìn)程的隊(duì)列指針進(jìn)程的隊(duì)列指針二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l為了有效的管理系統(tǒng)中的每個(gè)進(jìn)程,需要采用一種高效的為了有效的管理系統(tǒng)中的每個(gè)進(jìn)程,需要采用一種高效的數(shù)據(jù)結(jié)構(gòu)把系統(tǒng)內(nèi)全部進(jìn)程組織起來。在需要進(jìn)程的信息數(shù)據(jù)結(jié)構(gòu)把系統(tǒng)內(nèi)全部進(jìn)程組織起來。在需要進(jìn)程的信息時(shí),可以從該結(jié)構(gòu)中查找到相關(guān)進(jìn)程。時(shí),可以
43、從該結(jié)構(gòu)中查找到相關(guān)進(jìn)程。Linux的所有進(jìn)程的所有進(jìn)程組成一個(gè)組成一個(gè)雙向鏈表雙向鏈表。task_struct中的中的struct task_struct *next_task, *prev_task;ltask_struct中的中的struct list_head run_list;llist_head是是Linux內(nèi)核當(dāng)中定義的一個(gè)內(nèi)核當(dāng)中定義的一個(gè)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)用來實(shí)現(xiàn)雙用來實(shí)現(xiàn)雙向鏈表,向鏈表,Linux內(nèi)核中使用上百個(gè)雙向鏈表來存放各種數(shù)據(jù)內(nèi)核中使用上百個(gè)雙向鏈表來存放各種數(shù)據(jù)結(jié)結(jié)(usr/src/linux/include/list.h) ,提供了用來操作該鏈表的,提供了用來操
44、作該鏈表的函數(shù)和宏,它們實(shí)現(xiàn)了對鏈表的插入、刪除、轉(zhuǎn)移、合并、函數(shù)和宏,它們實(shí)現(xiàn)了對鏈表的插入、刪除、轉(zhuǎn)移、合并、遍歷。遍歷。 struct list_head struct list_head *next, *prev;4 4、LinuxLinux進(jìn)程的隊(duì)列指針進(jìn)程的隊(duì)列指針二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l在在Linux中,內(nèi)核使用中,內(nèi)核使用current變量變量表示當(dāng)前表示當(dāng)前正在運(yùn)行的進(jìn)正在運(yùn)行的進(jìn)程程。current是一個(gè)是一個(gè)task_struct類型的全局變量。類型的全局變量。ltask_struct 結(jié)構(gòu)中成員結(jié)構(gòu)中成員void *stack就是就是指向下面的內(nèi)指
45、向下面的內(nèi)核棧結(jié)構(gòu)體的核棧結(jié)構(gòu)體的“棧底棧底”,在系統(tǒng)運(yùn)行的時(shí)候,宏,在系統(tǒng)運(yùn)行的時(shí)候,宏current獲獲得的就是當(dāng)前進(jìn)程的得的就是當(dāng)前進(jìn)程的struct task_struct結(jié)構(gòu)體。結(jié)構(gòu)體。l進(jìn)程通過進(jìn)程通過alloc_thread_info函數(shù)分配它的內(nèi)核棧,通過函數(shù)分配它的內(nèi)核棧,通過free_thread_info函數(shù)釋放所分配的內(nèi)核棧。函數(shù)釋放所分配的內(nèi)核棧。 5 5、LinuxLinux進(jìn)程的隊(duì)列全局變量進(jìn)程的隊(duì)列全局變量二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l 其中,其中,THREAD_SIZE_ORDER宏在宏在/asm/thread_info.h文件中被定義為文件中
46、被定義為1,也就是說,也就是說alloc_thread_info函數(shù)通過調(diào)函數(shù)通過調(diào)用用_get_free_pages函數(shù)分配函數(shù)分配2個(gè)頁的內(nèi)存?zhèn)€頁的內(nèi)存(它的首地址是(它的首地址是8192字節(jié)對齊的)。字節(jié)對齊的)。lLinux內(nèi)核通過內(nèi)核通過thread_union聯(lián)合體來表示進(jìn)程的內(nèi)核棧,聯(lián)合體來表示進(jìn)程的內(nèi)核棧,其中其中THREAD_SIZE宏的大小為宏的大小為8192。5 5、LinuxLinux進(jìn)程的隊(duì)列全局變量進(jìn)程的隊(duì)列全局變量二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程l 當(dāng)進(jìn)程從用戶態(tài)切換到內(nèi)核態(tài)時(shí),進(jìn)程的內(nèi)核棧總是空的,當(dāng)進(jìn)程從用戶態(tài)切換到內(nèi)核態(tài)時(shí),進(jìn)程的內(nèi)核??偸强盏?,
47、所以所以ARM的的sp寄存器指向這個(gè)寄存器指向這個(gè)棧的頂端棧的頂端。因此,內(nèi)核能夠。因此,內(nèi)核能夠輕易地通過輕易地通過sp寄存器獲得當(dāng)前正在寄存器獲得當(dāng)前正在CPU上運(yùn)行的進(jìn)程。上運(yùn)行的進(jìn)程。 5 5、LinuxLinux進(jìn)程的隊(duì)列全局變量進(jìn)程的隊(duì)列全局變量二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程lstruct thread_info是記錄部分進(jìn)程信息的結(jié)構(gòu)體,其中包是記錄部分進(jìn)程信息的結(jié)構(gòu)體,其中包括了進(jìn)程上下文信息。括了進(jìn)程上下文信息。l關(guān)鍵是其中的關(guān)鍵是其中的task成員,指向的是所創(chuàng)建的進(jìn)程的成員,指向的是所創(chuàng)建的進(jìn)程的struct task_struct結(jié)構(gòu)體。結(jié)構(gòu)體。 而其中的
48、而其中的stack成員就是內(nèi)核棧。從這成員就是內(nèi)核棧。從這里可以看出內(nèi)核棧空間和里可以看出內(nèi)核棧空間和 thread_info是共用一塊空間。是共用一塊空間。lthread_info結(jié)構(gòu)的第一個(gè)成員就是一個(gè)指向結(jié)構(gòu)的第一個(gè)成員就是一個(gè)指向task_struct結(jié)結(jié)構(gòu)的指針,所以要用構(gòu)的指針,所以要用current_thread_info()-task表示表示task_struct的地址,但是整個(gè)過程對用戶是完全透明的,的地址,但是整個(gè)過程對用戶是完全透明的,還是可以用還是可以用current表示當(dāng)前進(jìn)程。表示當(dāng)前進(jìn)程。 5 5、LinuxLinux進(jìn)程的隊(duì)列全局變量進(jìn)程的隊(duì)列全局變量二、二、L
49、inuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程struct thread_info struct task_struct *task; /* main task structure */struct exec_domain *exec_domain; /* execution domain */unsigned long flags; /* low level flags */unsigned long status; /* thread-synchronous flags */. .5 5、LinuxLinux進(jìn)程的隊(duì)列全局變量進(jìn)程的隊(duì)列全局變量二、二、LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程 內(nèi)核棧內(nèi)核棧
50、-struct thread_info-struct task_struct-struct thread_info-struct task_struct三者三者的關(guān)系如下圖:的關(guān)系如下圖: 4KB*2=8192B1KB7KB主要內(nèi)容進(jìn)程的基本概念進(jìn)程的基本概念LinuxLinux系統(tǒng)進(jìn)程系統(tǒng)進(jìn)程LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建LinuxLinux進(jìn)程的系統(tǒng)調(diào)用進(jìn)程的系統(tǒng)調(diào)用LinuxLinux進(jìn)程調(diào)度進(jìn)程調(diào)度三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建 fork()函數(shù)()函數(shù) 進(jìn)程之間的關(guān)系進(jìn)程之間的關(guān)系 init進(jìn)程進(jìn)程 Linux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程1 1、forkfor
51、k()函數(shù)()函數(shù)三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建l Linux中一般進(jìn)程都是由現(xiàn)有的一個(gè)進(jìn)程創(chuàng)建的,也就是中一般進(jìn)程都是由現(xiàn)有的一個(gè)進(jìn)程創(chuàng)建的,也就是我們所說的父進(jìn)程,子進(jìn)程。具體的創(chuàng)建是通過我們所說的父進(jìn)程,子進(jìn)程。具體的創(chuàng)建是通過fork()實(shí)現(xiàn)實(shí)現(xiàn)的。的。 lfork()()這個(gè)函數(shù)名是英文中這個(gè)函數(shù)名是英文中“分叉分叉”的意思。的意思。l因?yàn)橐粋€(gè)進(jìn)程在運(yùn)行中,如果使用了因?yàn)橐粋€(gè)進(jìn)程在運(yùn)行中,如果使用了fork,就產(chǎn)生了另一,就產(chǎn)生了另一個(gè)進(jìn)程,于是進(jìn)程就個(gè)進(jìn)程,于是進(jìn)程就分叉分叉了,所以這個(gè)名字取得很形象。了,所以這個(gè)名字取得很形象。fork的語法:的語法:#incl
52、ude #include pid_t fork(); /pid_t是系統(tǒng)定義的類型,一般被定義為是系統(tǒng)定義的類型,一般被定義為short int。 2 2、進(jìn)程之間關(guān)系、進(jìn)程之間關(guān)系三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建進(jìn)程之間的父子關(guān)系進(jìn)程之間的父子關(guān)系l每個(gè)進(jìn)程只有一個(gè)父進(jìn)程,但可以有每個(gè)進(jìn)程只有一個(gè)父進(jìn)程,但可以有0個(gè)、個(gè)、1個(gè)、個(gè)、2個(gè)或多個(gè)或多個(gè)子進(jìn)程。個(gè)子進(jìn)程。PPaPbPcPdPe三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建進(jìn)程之間的父子關(guān)系進(jìn)程之間的父子關(guān)系2 2、進(jìn)程之間關(guān)系、進(jìn)程之間關(guān)系3 3、initinit進(jìn)程進(jìn)程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程
53、的創(chuàng)建l Linux在啟動時(shí)就創(chuàng)建一個(gè)稱為在啟動時(shí)就創(chuàng)建一個(gè)稱為init的特殊進(jìn)程的特殊進(jìn)程,其進(jìn)程標(biāo),其進(jìn)程標(biāo)識符識符PID為為1,它是用戶態(tài)下所有進(jìn)程的祖先進(jìn)程,以后誕,它是用戶態(tài)下所有進(jìn)程的祖先進(jìn)程,以后誕生的所有進(jìn)程都是它的生的所有進(jìn)程都是它的子進(jìn)程子進(jìn)程 或是它的兒子,或是它或是它的兒子,或是它的孫子。的孫子。l1號進(jìn)程運(yùn)行時(shí)查詢系統(tǒng)當(dāng)前存在的終端數(shù),然后為每個(gè)終號進(jìn)程運(yùn)行時(shí)查詢系統(tǒng)當(dāng)前存在的終端數(shù),然后為每個(gè)終端創(chuàng)建一個(gè)新的管理進(jìn)程,這些進(jìn)程在終端上等待著用戶端創(chuàng)建一個(gè)新的管理進(jìn)程,這些進(jìn)程在終端上等待著用戶的登錄。當(dāng)用戶正確登錄后,系統(tǒng)再為每一個(gè)用戶啟動一的登錄。當(dāng)用戶正確登錄后
54、,系統(tǒng)再為每一個(gè)用戶啟動一個(gè)個(gè)shell進(jìn)程,由進(jìn)程,由shell進(jìn)程等待并接受用戶輸入的命令。進(jìn)程等待并接受用戶輸入的命令。rootlocalhost root# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 1368 92 ? S 06:53 0:04 initroot 2 0.0 0.0 0 0 ? SW 06:53 0:00 keventd.4 4、LinuxLinux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建vfork()fork()sys_clone
55、()kernel_thread()sys_vfork()sys_fork()copy_process()do_fork()內(nèi)核空間內(nèi)核空間用戶空間用戶空間clone()4 4、LinuxLinux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建l 在在 Linux 內(nèi)核中內(nèi)核中,供用戶供用戶創(chuàng)建進(jìn)程創(chuàng)建進(jìn)程的體系調(diào)用的體系調(diào)用fork()函數(shù)函數(shù)的的相應(yīng)函數(shù)是相應(yīng)函數(shù)是 sys_fork()、sys_clone()、sys_vfork()。這三個(gè)。這三個(gè)函數(shù)都是通過調(diào)用內(nèi)核函數(shù)函數(shù)都是通過調(diào)用內(nèi)核函數(shù) do_fork() 來實(shí)現(xiàn)來實(shí)現(xiàn)的。的。l按照調(diào)用時(shí)所應(yīng)用按照調(diào)用時(shí)
56、所應(yīng)用 的的 clone_flags 參數(shù)差別參數(shù)差別 ,do_fork() 函函數(shù)數(shù)完成的事件也各異完成的事件也各異。 lsys_fork和和sys_vfork在在arch/um/kernel/syscall.c文件中實(shí)現(xiàn),文件中實(shí)現(xiàn),sys_clone函數(shù)在函數(shù)在arch/um/sys-i386/syscall.c文件中實(shí)現(xiàn)文件中實(shí)現(xiàn) 4 4、LinuxLinux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建l 在在kernel/fork.c文件內(nèi)找到文件內(nèi)找到 do_fork函數(shù)原型函數(shù)原型 long do_fork(unsigned long clone_fl
57、ags,/克隆標(biāo)識克隆標(biāo)識 unsigned long stack_start,/棧起始位置棧起始位置 struct pt_regs *regs, /指向通用寄存器值的指針指向通用寄存器值的指針 unsigned long stack_size,/棧大小,一般設(shè)置為棧大小,一般設(shè)置為0 int _user *parent_tidptr,/父進(jìn)程在用戶態(tài)下父進(jìn)程在用戶態(tài)下pid的的地址,該參數(shù)在地址,該參數(shù)在CLONE_PARENT_SETTID標(biāo)志被設(shè)定時(shí)標(biāo)志被設(shè)定時(shí)有意義;有意義; int _user *child_tidptr) /子進(jìn)程在用戶態(tài)下子進(jìn)程在用戶態(tài)下pid的地址,的地址,該參
58、數(shù)在該參數(shù)在CLONE_CHILD_SETTID標(biāo)志被設(shè)定時(shí)有意義。標(biāo)志被設(shè)定時(shí)有意義。4 4、LinuxLinux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建l clone_flags:該標(biāo)志位的該標(biāo)志位的4個(gè)字節(jié)分為兩部分個(gè)字節(jié)分為兩部分。最低的。最低的一一個(gè)字節(jié)個(gè)字節(jié)為子進(jìn)程結(jié)束時(shí)發(fā)送給父進(jìn)程的為子進(jìn)程結(jié)束時(shí)發(fā)送給父進(jìn)程的信號代碼信號代碼,通常為,通常為SIGCHLD;剩余的;剩余的三個(gè)字節(jié)三個(gè)字節(jié)則是則是各種各種clone標(biāo)志的組合標(biāo)志的組合,也就是若干個(gè)標(biāo)志之間的也就是若干個(gè)標(biāo)志之間的或運(yùn)算或運(yùn)算。通過。通過clone標(biāo)志可以有選標(biāo)志可以有選擇的對擇的對父
59、進(jìn)程的資源進(jìn)行復(fù)制父進(jìn)程的資源進(jìn)行復(fù)制;常見的;常見的clone標(biāo)志:標(biāo)志: 4 4、LinuxLinux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建l do_fork函數(shù)函數(shù)的主要作用就是的主要作用就是復(fù)制原來的進(jìn)程成為另一個(gè)新的復(fù)制原來的進(jìn)程成為另一個(gè)新的進(jìn)程進(jìn)程,它完成了整個(gè)進(jìn)程創(chuàng)建中的大部分工作,它完成了整個(gè)進(jìn)程創(chuàng)建中的大部分工作,do_fork函數(shù)函數(shù)中比較重要的有兩個(gè)部分,首先是給中比較重要的有兩個(gè)部分,首先是給子進(jìn)程分配進(jìn)程號子進(jìn)程分配進(jìn)程號,然后,然后是利用具體的是利用具體的進(jìn)程號創(chuàng)建子進(jìn)程進(jìn)程號創(chuàng)建子進(jìn)程。ldo_fork() 函數(shù)程序代碼位于函數(shù)
60、程序代碼位于 kernel/fork.c 文件中。文件中。 l下面是下面是do_fork()函數(shù)執(zhí)行的主要過程:函數(shù)執(zhí)行的主要過程: 4 4、LinuxLinux進(jìn)程創(chuàng)建過程進(jìn)程創(chuàng)建過程三、三、LinuxLinux進(jìn)程的創(chuàng)建進(jìn)程的創(chuàng)建 (1)一開始,該函數(shù)定義了一個(gè))一開始,該函數(shù)定義了一個(gè)task_struct類型的指針類型的指針p,用來接收,用來接收即將為新進(jìn)程(子進(jìn)程)所分配的即將為新進(jìn)程(子進(jìn)程)所分配的進(jìn)程描述符進(jìn)程描述符。緊接著使用。緊接著使用alloc_pidmap函數(shù)函數(shù)為這個(gè)新進(jìn)程為這個(gè)新進(jìn)程分配一個(gè)分配一個(gè)pid。由于系統(tǒng)內(nèi)的。由于系統(tǒng)內(nèi)的pid是循是循環(huán)使用的,所以采用環(huán)使用的,所以采用位圖方
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級上冊數(shù)學(xué)聽評課記錄《5.6 找最大公因數(shù)》(7)-北師大版
- 茶葉代加工合同范本
- 公益基金合作協(xié)議書范本
- 北京混凝土外加劑買賣合同范本
- 醫(yī)院停車場管理承包合同范本
- 公司租用個(gè)人車輛合同范本
- 九年級歷史下冊 第四單元 第16課《主要資本主義國家的發(fā)展變化》說課稿2 華東師大版
- 成都各區(qū)小升初數(shù)學(xué)試卷
- 冀教版數(shù)學(xué)七年級下冊《垂直》聽評課記錄1
- 常州高一上期中數(shù)學(xué)試卷
- 5《這些事我來做》(說課稿)-部編版道德與法治四年級上冊
- 2025年度高端商務(wù)車輛聘用司機(jī)勞動合同模板(專業(yè)版)4篇
- 2025年福建福州市倉山區(qū)國有投資發(fā)展集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 2025年人教版新教材數(shù)學(xué)一年級下冊教學(xué)計(jì)劃(含進(jìn)度表)
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 2025長江航道工程局招聘101人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年黑龍江哈爾濱市面向社會招聘社區(qū)工作者1598人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年國新國際投資有限公司招聘筆試參考題庫含答案解析
- 2025年八省聯(lián)考四川高考生物試卷真題答案詳解(精校打印)
- 《供電營業(yè)規(guī)則》
- 執(zhí)行總經(jīng)理崗位職責(zé)
評論
0/150
提交評論