




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第10章Linux操作系統本章內容:進程管理,存儲管理,文件系統,設備管理,中斷、異常及系統調用,進程通信。10.1
進程管理內容進程描述符;進程的調度時機及調度算法;進程的創建與消亡。10.1.1進程與進程描述符1.進程概念
2.進程描述符(進程控制塊)
由一個task_struct結構表示。task_struct結構是一個復雜的結構,占一千多字節,其各個成員用來準確描述進程在各方面的信息.主要有以下幾個部分:
Linux進程與傳統UNIX進程的概念沒有多大區別;沒有真正意義上的線程概念。但Linux通過clone()系統調用支持輕權進程;Linux還支持內核線程的概念,內核線程永遠在核心態運行,沒有用戶空間。(1)進程標識
包括進程的標識號(pid)、進程的用戶標識、進程的組標識等。每個進程的標識號是惟一的。
(2)調度相關信息
這部分內容與進程調度有關,一部分信息見后面的第5節。進程描述符中還需要有結構保存當進程被換出時寄存器的狀態,該進程恢復運行時便可從正確的狀態開始繼續運行。(3)進程虛擬空間信息
Linux的進程都在自己的私有地址空間中運行,task_struct的成員mm指向一個mm_struct結構,該結構描述進程空間。
(7)描述進程間關系的指針
所有的進程通過一個雙向鏈表鏈接在一起。通過宏for_each_task可以對每個進程操作。指向其父進程、子進程、兄弟進程描述符的指針。需要根據pid號能夠快速找到進程,系統以pid為關鍵字建立了一個哈希表,哈希函數值相同的進程通過進程描述符的pidhash_next和pidhash_pprev成員鏈在一起。10.1.2核心態與核心棧uniontask_union{ structtask_structtask; unsignedlongstack[2048];};
Linux的運行分為兩種模式──核心態和用戶態。內核總在核心態下運行,而普通進程通常在用戶模式下運行,只有通過系統調用才能切換到核心態運行。進程擁有兩個棧,用戶模式棧與核心模式棧,分別在相應模式下使用。進程描述符和進程核心棧的空間分配在一起,內核為它們分配兩個連續的物理頁面。
因為進程描述符已經占用了1KB多的空間,所以核心棧的有效空間是6KB多一點,合理的設計使得這個容量已經足夠了。核心棧與進程描述符如圖10-1所示。兩個物理頁幀8KB進程描述符核心模式棧圖10-1核心棧與進程描述符棧自頂向下增長
TASK_STOPPED:進程處于暫停狀態,主要用于調試目的。如正在運行的進程收到SIGSTOP信號將進入TASK_STOPPED狀態。
TASK_ZOMBIE:表示進程已經結束運行并釋放了大部分占用的資源,但task_struct結構還未被釋放。10.1.4進程的切換時機當前進程放棄CPU的情況可以分為兩種。一、進程主動地放棄CPU
這種情況大體可以分為兩類:
1.隱式地主動放棄CPU。往往是因為需要的資源目前不能獲取,如執行read(),select()等系統調用的過程中,這種情況下的處理過程如下:
1)將進程加入合適的等待隊列。
2)把當前進程的狀態改為TASK_INTERRUTIBLE或TASK_UNINTERRUTIBLE。
3)調用schedule()函數,該函數的執行結果往往是當前進程放棄CPU。
進程的調度時機
進程的調度時機分成兩種情形:
例如,進程被動放棄CPU的情形。當進程描述符的need_resched被置1時,并不立即直接調用schedule()調度函數。而是在隨后的某個時刻,當進程從內核態返回用戶態之前檢查need_resched是否為1,如果為1,則調用schedule()調度函數。直接調用schedule()調度函數,例如進程主動放棄CPU的第一類情形;間接調用schedule()。10.1.5進程的調度算法
核心函數是schedule(),該函數的任務是選出一個可運行的進程。1.進程描述符有如下成員與調度有關:
1)policy標識進程的調度策略。
SCHED_OTHER普通進程;SCHED_FIFO實時進程,采用先進先出的調度算法;SCHED_RR實時進程,采用輪轉法。2)rt_priority實時進程的優先級,普通進程不使用這個成員;3)nice普通進程的優先級;4)counter進程目前的CPU時間配額。2.對于普通進程來講CPU時間的分配是典型的時分策略。
在某個時刻,運行隊列中的每個進程都有一個counter值,當所有運行隊列中的counter值都變為0以后,表明一輪已經結束,每個進程的counter根據其nice重新賦值,開始新的一輪執行過程。擁有CPU的進程每次時鐘中斷counter值減一。
5)現在進入了函數的核心部分??蛇\行進程隊列的每個進程都將被計算出一個權值,主要是利用goodness()函數,討論見后。最終最大的權值保存在變量c中,與之對應的進程描述符保存在變量next中。6)檢查c是否為0。若為0則表明所有可執行進程的時間配額都已用完,因而對所有進程的counter重新“充電”,然后重新執行第5)步。7)如果next進程就是當前進程,則結束shedule()的運行。否則進行進程切換,CPU改由next進程占據。
4.goodness()函數
goodness()函數計算進程的當前權值。該函數的第一個參數是待估進程的描述符。
如果該進程是實時進程,它的權值為1000+rt_priority,1000是普通進程權值無法到達的數字,因而實時進程總可以優先得到執行。對于普通進程,它的權值為counter+20-nice,如果其又是內核線程,由于無需切換用戶空間,則將權值加一作為獎勵。10.1.6進程的創建1.進程的起源
Linux最早產生的進程是啟動過程中創建出idle進程(不是通過fork(),而是編碼制作出來),pid號為0。它是創建一個內核線程,該線程進行一系列初始化動作后最終會執行/sbin/init文件,執行該文件的結果是運行模式從核心態切換到了用戶態,該線程演變成了用戶進程init,pid號為1。init進程是一個非常重要的進程,一切用戶態進程都是它的后代進程。intmain(void){ pid_tpid; if((pid=fork())<0){printf("forkfailed\n");exit(1); } elseif(pid==0){/*子進程執行進入此部分*/ execlp("echoall","echoall",(char*)0); }else{/*父進程*/ printf("forksuccess\n");exit(0);}}
3.sys_clone(),sys_vfork(),sys_fork()三個系統調用可以實現創建子進程,這三個系統調用最終都會調用do_fork()函數完成主要工作。該函數的第一個參數clone_flags可由多個標志位組成,常見的標志位有:CLONE_VM
子進程父進程共享進程空間;CLONE_FS子進程父進程共享文件系統信息;CLONE_FILES
子進程父進程共享打開的文件;CLONE_VFORK
如果父進程想使子進程釋放空間時喚醒它,則置該位。
sys_clone()對應的clone_flags可能是多個標志位的組合,取決于具體情況。
sys_fork()對應的clone_flags值是SIGCHILD。SIGCHILD的作用是子進程終結或暫停時給父進程發信號。
sys_vfork()對應的clone_flags值是CLONE_VFORK|CLONE_VM|SIGCHILD。
vfork()是一個老的函數調用,子進程共享父進程的空間,包括頁表,父進程被掛起直到子進程執行exec系列函數或子進程退出時。在合適的場合,較之fork()時的“寫時拷貝”策略vfork()無疑開銷更小。
5)調用get_pid()函數為子進程得到一個pid號。6)依次調用copy_files(),copy_fs(),copy_sighand(),copy_mm()分別復制父進程文件處理、信號處理及進程空間的信息。以上函數的具體行為取決clone_flags參數,例如,copy_mm()時,如果clone_flags包含有CLONE_VM標志,則子進程共享父進程的空間,不會進行復制。7)調用copy_thread()初始化子進程的核心模式棧時,核心棧保存了進程返回用戶空間的上文。此處與平臺相關,以i386為例,其中很重要的一點是存儲寄存器eax值的位置被置0,這個值就執行系統調用后子進程的返回值。
8)將父進程的當前的時間配額counter分一半給子進程。9)利用宏SET_LINKS將子進程插入所有進程都在其中的雙向鏈表。調用hash_pid(),將子進程加入相應的hash隊列。10)調用wake_up_process(),將該子進程插入可運行隊列。至此,子進程創建完畢,并在可運行隊列中等待被調度運行。11)如果clone_flags包含有CLONE_VFORK標志,則將父進程掛起直到子進程釋放進程空間。進程描述符中有一個信號量vfork_sem可以起到將進程掛起的作用。12)返回子進程的pid值,該值就是系統調用后父進程的返回值。4)設置進程的退出狀態,調用exit_notify()處理該進程與其父進程和子進程的各種關系。在該函數中會將該進程狀態置為TASK_ZOMBIE。5)調用schedule()調度函數切換到別的進程。
3.TASK_ZOMBIE進程
在do_exit(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論