![]() |
|
Linux下的進(jìn)程結(jié)構(gòu) |
|
進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計數(shù)器和處理器的所有寄存器及存儲臨時數(shù)據(jù)的進(jìn)程堆棧,因此正在執(zhí)行的進(jìn)程包括處理器當(dāng)前的一切活動。 因為Linux是一個多進(jìn)程的操作系統(tǒng),所以其他的進(jìn)程必須等到系統(tǒng)將處理器使用權(quán)分配給自己之后才能運行。當(dāng)正在運行的進(jìn)程等待其他的系統(tǒng)資源時,Linux內(nèi)核將取得處理器的控制權(quán),并將處理器分配給其他正在等待的進(jìn)程,它按照內(nèi)核中的調(diào)度算法決定將處理器分配給哪一個進(jìn)程。 內(nèi)核將所有進(jìn)程存放在雙向循環(huán)鏈表(進(jìn)程鏈表)中,其中鏈表的頭是init_task描述符。鏈表的每一項都是類型為task_struct,稱為進(jìn)程描述符的結(jié)構(gòu),該結(jié)構(gòu)包含了與一個進(jìn)程相關(guān)的所有信息,定義在<include/linux/sched.h>文件中。task_struct內(nèi)核結(jié)構(gòu)比較大,它能完整地描述一個進(jìn)程,如進(jìn)程的狀態(tài)、進(jìn)程的基本信息、進(jìn)程標(biāo)識符、內(nèi)存相關(guān)信息、父進(jìn)程相關(guān)信息、與進(jìn)程相關(guān)的終端信息、當(dāng)前工作目錄、打開的文件信息、所接收的信號信息等。 下面詳細(xì)講解task_struct結(jié)構(gòu)中為重要的兩個域:state(進(jìn)程狀態(tài))和pid(進(jìn)程標(biāo)識符)。 1)進(jìn)程狀態(tài) Linux中的進(jìn)程有以下幾種狀態(tài)。 它們之間的轉(zhuǎn)換關(guān)系如圖3.2所示。
內(nèi)核可以使用set_task_state和set_current_state宏來改變指定進(jìn)程的狀態(tài)和當(dāng)前執(zhí)行進(jìn)程的狀態(tài)。 2)進(jìn)程標(biāo)識符 Linux內(nèi)核通過唯一的進(jìn)程標(biāo)識符PID來標(biāo)識每個進(jìn)程。PID存放在進(jìn)程描述符的pid字段中,新創(chuàng)建的PID通常是前一個進(jìn)程的PID加1,不過PID的值有上限(大值 = PID_MAX_DEFAULT – 1,通常為32767),讀者可以查看/proc/sys/kernel/pid_max來確定該系統(tǒng)的進(jìn)程數(shù)上限。 當(dāng)系統(tǒng)啟動后,內(nèi)核通常作為某一個進(jìn)程的代表。一個指向task_struct的宏current用來記錄正在運行的進(jìn)程。current經(jīng)常作為進(jìn)程描述符結(jié)構(gòu)指針的形式出現(xiàn)在內(nèi)核代碼中,例如,current->pid表示處理器正在執(zhí)行的進(jìn)程的PID。當(dāng)系統(tǒng)需要查看所有的進(jìn)程時,則調(diào)用for_each_process()宏,這將比系統(tǒng)搜索數(shù)組的速度要快得多。 在Linux中獲得當(dāng)前進(jìn)程的進(jìn)程號(PID)和父進(jìn)程號(PPID)的系統(tǒng)調(diào)用函數(shù)分別為getpid()和getppid()。 本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》 熱點鏈接:
1、Linux下多任務(wù)系統(tǒng)之進(jìn)程的基本概念 |