進程是執行期間的程式及其它所包含的資源的總稱。
進程通過fork()系統調用產生,該系統調用通過複製一個現有進程來建立一個全新的進程。fork()調用一次返回兩次:一次回到父進程、一次回到新建立的子進程。
進程描述符及任務結構
核心把進程放在task list的雙向迴圈鏈表中,其中每一項都是一個task_struct結構(即進程描述符)。task_struct結構比較大(32位機器上約1.7K),包含了核心管理進程所需的全部資訊。
Linux通過slab分配器分配task_struct結構,以達到對象複用和緩衝著色的目的。
每個進程通過pid來標識,預設最大值為32768,可以通過/proc/sys/kernel/pid_max修改。
thread_info結構
struct thread_info {
struct task_struct *task; /* main task structure */
struct exec_domain *exec_domain; /* execution domain */
unsigned long flags; /* low level flags */
unsigned long status; /* thread-synchronous flags */
__u32 cpu ; /* current CPU */
int preempt_count ; /* 0 => preemptable, <0 => BUG */
mm_segment_t addr_limit ; /* thread address space:
0-0xBFFFFFFF for user-thead
0-0xFFFFFFFF for kernel-thread
*/
void *sysenter_return;
struct restart_block restart_block ;
unsigned long previous_esp; /* ESP of the previous stack in case
of nested (IRQ) stacks
*/
__u8 supervisor_stack [0];
};
該結構在核心棧的尾端分配。
如何尋找當前正在運行進程的進程描述符
為什麼要屏蔽掉低13位(當THREAD_SIZE為8192時):
核心中的棧是從高地址到低地址,thread_info和核心棧(核心態堆棧)共用同一塊記憶體, 而每個任務的thread_info在核心棧的尾端分配.