進程的內核視角
一個進程就是進程表中的一個表項,所以進程表是系統中最重要的數據結構,地位類似內存管理表和buffer cache。進程表中的每一項是一個struct task_struct數據結構,定義在文件include/linux/sched.h文件中。進程表是既是數組也是一個雙鏈表,物理上實現爲靜態指針數組,數組長度由定義在include/linux/tasks.h文件中的NR_TASKS常量指定,每個task_struct駐留在預留的內存頁中,通過 next_task和prev_task指針訪問元素數據。全局變量current指向當前正在運行的進程,current只被調度器修改。一個進程只能處於內核模式和用戶模式中之一種模式。用戶進程打主體運行在用戶模式,而系統調用運行在內核模式。進程使用的棧在用戶模式和內核模式也是存在很大區別的,內核模式的棧是固定大小,而用戶模式的棧是可以伸縮的。
創建和銷燬進程
UNIX系統通過fork系統調用創建一個進程,調用exit()或者接收一個信號結束一個進程。在Linux中,它們分別在kernel/fork.c和kernel/exit.c文件中被實現。Forking過程比較簡單,主要步驟如下
- 獲取空白page保存task_struct
- 查詢一個空的進程插槽
- 獲取另一個空白page爲kernel_stack_page使用
- 拷貝父進程的LDT到子進程中
- 複製父進程的mmap信息