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