processの生成
do_fork()関数に置ける処理の概要一覧
fork()システムコールにおいて実行される処理 | 関数名 | ソースファイル | 備考 |
---|---|---|---|
子processのprocess idの取得 | alloc_pidmap() | kernel/pid.c | do_fork()関数により呼び出される |
子processのtask_struct構造体の生成 | dup_task_create() | kernel/fork.c | copy_process()関数により呼び出される |
子processのtask_struct構造体メンバーの初期化 | copy_process() | kernel/fork.c | 初期値の設定/一部のメンバーは親processを引き継ぐ |
子processの状態を"実行待ち"とする | wake_up_new_task() | kernel/sched.c | do_fork()関数により呼び出される |
processの実行
processの終了
- exit()システムコールが発行されると、kernelはdo_exit()関数を実行し、セマフォによる排他処理やメモリの解放処理、ファイルの解放処理を行い、task_struct構造体のメンバーを解放する
- 解放処理を終了すると、kernelはexit_notify()関数を使用して親processに対してprocessの終了を通知、自身の状態をTASK_ZOMBIEに遷移する
- 親processへの通知には"SIGCHLD"シグナルを使用する
- 子process自身による終了処理はここまでのため、この状態においては子processが使用していたtask_struct構造体は残った状態となっている
- task_struct構造体だけが残っているprocessを"ゾンビプロセス"と呼ぶ
processの消滅
- 子processが残したtask_struct構造体の削除処理は親processが行う
- 親processが発行したwait()システムコールに対して、子processがSIGCHLDシグナルを送った場合、親processは子processの終了を認識し、task_struct構造体の削除を行う