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