Linux操作系統(tǒng) 進程管理課件_第1頁
Linux操作系統(tǒng) 進程管理課件_第2頁
Linux操作系統(tǒng) 進程管理課件_第3頁
Linux操作系統(tǒng) 進程管理課件_第4頁
Linux操作系統(tǒng) 進程管理課件_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第10章Linux操作系統(tǒng)本章內(nèi)容:進程管理,存儲管理,文件系統(tǒng),設備管理,中斷、異常及系統(tǒng)調(diào)用,進程通信。10.1

進程管理內(nèi)容進程描述符;進程的調(diào)度時機及調(diào)度算法;進程的創(chuàng)建與消亡。10.1.1進程與進程描述符1.進程概念

2.進程描述符(進程控制塊)

由一個task_struct結(jié)構表示。task_struct結(jié)構是一個復雜的結(jié)構,占一千多字節(jié),其各個成員用來準確描述進程在各方面的信息.主要有以下幾個部分:

Linux進程與傳統(tǒng)UNIX進程的概念沒有多大區(qū)別;沒有真正意義上的線程概念。但Linux通過clone()系統(tǒng)調(diào)用支持輕權進程;Linux還支持內(nèi)核線程的概念,內(nèi)核線程永遠在核心態(tài)運行,沒有用戶空間。(1)進程標識

包括進程的標識號(pid)、進程的用戶標識、進程的組標識等。每個進程的標識號是惟一的。

(2)調(diào)度相關信息

這部分內(nèi)容與進程調(diào)度有關,一部分信息見后面的第5節(jié)。進程描述符中還需要有結(jié)構保存當進程被換出時寄存器的狀態(tài),該進程恢復運行時便可從正確的狀態(tài)開始繼續(xù)運行。(3)進程虛擬空間信息

Linux的進程都在自己的私有地址空間中運行,task_struct的成員mm指向一個mm_struct結(jié)構,該結(jié)構描述進程空間。

(7)描述進程間關系的指針

所有的進程通過一個雙向鏈表鏈接在一起。通過宏for_each_task可以對每個進程操作。指向其父進程、子進程、兄弟進程描述符的指針。需要根據(jù)pid號能夠快速找到進程,系統(tǒng)以pid為關鍵字建立了一個哈希表,哈希函數(shù)值相同的進程通過進程描述符的pidhash_next和pidhash_pprev成員鏈在一起。10.1.2核心態(tài)與核心棧uniontask_union{ structtask_structtask; unsignedlongstack[2048];};

Linux的運行分為兩種模式──核心態(tài)和用戶態(tài)。內(nèi)核總在核心態(tài)下運行,而普通進程通常在用戶模式下運行,只有通過系統(tǒng)調(diào)用才能切換到核心態(tài)運行。進程擁有兩個棧,用戶模式棧與核心模式棧,分別在相應模式下使用。進程描述符和進程核心棧的空間分配在一起,內(nèi)核為它們分配兩個連續(xù)的物理頁面。

因為進程描述符已經(jīng)占用了1KB多的空間,所以核心棧的有效空間是6KB多一點,合理的設計使得這個容量已經(jīng)足夠了。核心棧與進程描述符如圖10-1所示。兩個物理頁幀8KB進程描述符核心模式棧圖10-1核心棧與進程描述符棧自頂向下增長

TASK_STOPPED:進程處于暫停狀態(tài),主要用于調(diào)試目的。如正在運行的進程收到SIGSTOP信號將進入TASK_STOPPED狀態(tài)。

TASK_ZOMBIE:表示進程已經(jīng)結(jié)束運行并釋放了大部分占用的資源,但task_struct結(jié)構還未被釋放。10.1.4進程的切換時機當前進程放棄CPU的情況可以分為兩種。一、進程主動地放棄CPU

這種情況大體可以分為兩類:

1.隱式地主動放棄CPU。往往是因為需要的資源目前不能獲取,如執(zhí)行read(),select()等系統(tǒng)調(diào)用的過程中,這種情況下的處理過程如下:

1)將進程加入合適的等待隊列。

2)把當前進程的狀態(tài)改為TASK_INTERRUTIBLE或TASK_UNINTERRUTIBLE。

3)調(diào)用schedule()函數(shù),該函數(shù)的執(zhí)行結(jié)果往往是當前進程放棄CPU。

進程的調(diào)度時機

進程的調(diào)度時機分成兩種情形:

例如,進程被動放棄CPU的情形。當進程描述符的need_resched被置1時,并不立即直接調(diào)用schedule()調(diào)度函數(shù)。而是在隨后的某個時刻,當進程從內(nèi)核態(tài)返回用戶態(tài)之前檢查need_resched是否為1,如果為1,則調(diào)用schedule()調(diào)度函數(shù)。直接調(diào)用schedule()調(diào)度函數(shù),例如進程主動放棄CPU的第一類情形;間接調(diào)用schedule()。10.1.5進程的調(diào)度算法

核心函數(shù)是schedule(),該函數(shù)的任務是選出一個可運行的進程。1.進程描述符有如下成員與調(diào)度有關:

1)policy標識進程的調(diào)度策略。

SCHED_OTHER普通進程;SCHED_FIFO實時進程,采用先進先出的調(diào)度算法;SCHED_RR實時進程,采用輪轉(zhuǎn)法。2)rt_priority實時進程的優(yōu)先級,普通進程不使用這個成員;3)nice普通進程的優(yōu)先級;4)counter進程目前的CPU時間配額。2.對于普通進程來講CPU時間的分配是典型的時分策略。

在某個時刻,運行隊列中的每個進程都有一個counter值,當所有運行隊列中的counter值都變?yōu)?以后,表明一輪已經(jīng)結(jié)束,每個進程的counter根據(jù)其nice重新賦值,開始新的一輪執(zhí)行過程。擁有CPU的進程每次時鐘中斷counter值減一。

5)現(xiàn)在進入了函數(shù)的核心部分??蛇\行進程隊列的每個進程都將被計算出一個權值,主要是利用goodness()函數(shù),討論見后。最終最大的權值保存在變量c中,與之對應的進程描述符保存在變量next中。6)檢查c是否為0。若為0則表明所有可執(zhí)行進程的時間配額都已用完,因而對所有進程的counter重新“充電”,然后重新執(zhí)行第5)步。7)如果next進程就是當前進程,則結(jié)束shedule()的運行。否則進行進程切換,CPU改由next進程占據(jù)。

4.goodness()函數(shù)

goodness()函數(shù)計算進程的當前權值。該函數(shù)的第一個參數(shù)是待估進程的描述符。

如果該進程是實時進程,它的權值為1000+rt_priority,1000是普通進程權值無法到達的數(shù)字,因而實時進程總可以優(yōu)先得到執(zhí)行。對于普通進程,它的權值為counter+20-nice,如果其又是內(nèi)核線程,由于無需切換用戶空間,則將權值加一作為獎勵。10.1.6進程的創(chuàng)建1.進程的起源

Linux最早產(chǎn)生的進程是啟動過程中創(chuàng)建出idle進程(不是通過fork(),而是編碼制作出來),pid號為0。它是創(chuàng)建一個內(nèi)核線程,該線程進行一系列初始化動作后最終會執(zhí)行/sbin/init文件,執(zhí)行該文件的結(jié)果是運行模式從核心態(tài)切換到了用戶態(tài),該線程演變成了用戶進程init,pid號為1。init進程是一個非常重要的進程,一切用戶態(tài)進程都是它的后代進程。intmain(void){ pid_tpid; if((pid=fork())<0){printf("forkfailed\n");exit(1); } elseif(pid==0){/*子進程執(zhí)行進入此部分*/ execlp("echoall","echoall",(char*)0); }else{/*父進程*/ printf("forksuccess\n");exit(0);}}

3.sys_clone(),sys_vfork(),sys_fork()三個系統(tǒng)調(diào)用可以實現(xiàn)創(chuàng)建子進程,這三個系統(tǒng)調(diào)用最終都會調(diào)用do_fork()函數(shù)完成主要工作。該函數(shù)的第一個參數(shù)clone_flags可由多個標志位組成,常見的標志位有:CLONE_VM

子進程父進程共享進程空間;CLONE_FS子進程父進程共享文件系統(tǒng)信息;CLONE_FILES

子進程父進程共享打開的文件;CLONE_VFORK

如果父進程想使子進程釋放空間時喚醒它,則置該位。

sys_clone()對應的clone_flags可能是多個標志位的組合,取決于具體情況。

sys_fork()對應的clone_flags值是SIGCHILD。SIGCHILD的作用是子進程終結(jié)或暫停時給父進程發(fā)信號。

sys_vfork()對應的clone_flags值是CLONE_VFORK|CLONE_VM|SIGCHILD。

vfork()是一個老的函數(shù)調(diào)用,子進程共享父進程的空間,包括頁表,父進程被掛起直到子進程執(zhí)行exec系列函數(shù)或子進程退出時。在合適的場合,較之fork()時的“寫時拷貝”策略vfork()無疑開銷更小。

5)調(diào)用get_pid()函數(shù)為子進程得到一個pid號。6)依次調(diào)用copy_files(),copy_fs(),copy_sighand(),copy_mm()分別復制父進程文件處理、信號處理及進程空間的信息。以上函數(shù)的具體行為取決clone_flags參數(shù),例如,copy_mm()時,如果clone_flags包含有CLONE_VM標志,則子進程共享父進程的空間,不會進行復制。7)調(diào)用copy_thread()初始化子進程的核心模式棧時,核心棧保存了進程返回用戶空間的上文。此處與平臺相關,以i386為例,其中很重要的一點是存儲寄存器eax值的位置被置0,這個值就執(zhí)行系統(tǒng)調(diào)用后子進程的返回值。

8)將父進程的當前的時間配額counter分一半給子進程。9)利用宏SET_LINKS將子進程插入所有進程都在其中的雙向鏈表。調(diào)用hash_pid(),將子進程加入相應的hash隊列。10)調(diào)用wake_up_process(),將該子進程插入可運行隊列。至此,子進程創(chuàng)建完畢,并在可運行隊列中等待被調(diào)度運行。11)如果clone_flags包含有CLONE_VFORK標志,則將父進程掛起直到子進程釋放進程空間。進程描述符中有一個信號量vfork_sem可以起到將進程掛起的作用。12)返回子進程的pid值,該值就是系統(tǒng)調(diào)用后父進程的返回值。4)設置進程的退出狀態(tài),調(diào)用exit_notify()處理該進程與其父進程和子進程的各種關系。在該函數(shù)中會將該進程狀態(tài)置為TASK_ZOMBIE。5)調(diào)用schedule()調(diào)度函數(shù)切換到別的進程。

3.TASK_ZOMBIE進程

在do_exit(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論