kernel:"process" (3) processのサイクル

processの生成

  • コマンドやプログラムを実行するためには、fork()システムコールを使用して新しいprocessの生成を行う
  • fork()システムコールを受けて、kernelはdo_fork()関数を呼び出し、子processのprocess idを取得、子processのtask_struct構造体の生成、構造体メンバーの初期化を行う
  • 子processが実行待ち状態に遷移することにより、生成された子processは親processとは独立して処理を行うことができる状態となる
  • 親process側では生成した子processのprocess idをfork()システムコールに対して戻す

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の実行を開始するためにexec()システムコールを発行する
  • exec()システムコールの発行により、 kernelは親processのメモリーをコピーし、子processが利用するメモリーに割り当てる
  • 割り当てられたメモリーは、実行するプログラムの内容により上書きされる(Copy on write)
  • プログラムに格納されたデータはkernelにより適切な領域(変数などのデータ領域や、実行命令列などのテキスト領域など)をメモリ上の領域に配置する(road)

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構造体の削除を行う