• 在 User Space 執行的程式
使用 fork()、vfork() 或 clone() 函式產生新的行程
(實際上是透過系統呼叫,切換到 Kernel Mode 進行行程建立的動作)
• 在 Kernel Space 執行的程式
使用 kernel_thread() 產生 Kernel Mode 的行程
無論是以上哪種方式,最後產生出行程的工作,都是由 do_fork() 來完成
定義於 arch/i386/kernel/process.c
而 do_fork() 主要的工作是複製父行程的 Task 結構給子行程,並給予新的 PID
此時,父、子行程會暫時共用資源,只有 PID、堆疊空間等特定的資料會不同
當子行程對共享資源有寫入的動作時,再進行對應的資料複製,稱為 Copy-on-Write 的技術
Linux 終止行程的情形可分為兩種:
• 行程自己結束執行
User Space 的行程的終止,是在 main() 程式結束返回處插入 return() 或 exit() 函式
(結果會經由系統呼叫切換到 Kernel Space,然後進行終止程序的動作)
• 行程被 Kernel 結束執行
例如,行程收到 kill 的訊號,或因發生錯誤而停止執行,或系統重開機 ...
無論是以上哪種方式,最後的清理工作都是由 do_exit() 來釋放該行程持有的資源
定義於 kernel/exit.c
在 do_exit() 完成後,行程的 Task 結構仍會存在,但行程已處於 Zombie 狀態,且不能執行
這是為了讓系統在行程終結後,還有機會取得該行程的相關資訊給父行程使用
沒有留言:
張貼留言