『Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識』第3章を読む
第3章 プロセス管理
はじめに
武内 覚 著『Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識』をテキストとして学習した記録です。
本書を読んで筆者が解釈した内容について記述しています。
なので本書の内容の間違った解釈やあるいは単純に間違った記述がある可能性があります。
二段階のプロセスの生成
プロセスの生成方法は二つある
- 同じプログラムを別のプロセスとして処理する
- 異なるプログラムを生成する
fork()
前者の同じプログラムを別のプロセスとして処理する場合に用いる。 あるプロセス内でfork()を発行するとその呼び出した元のプロセスが複製される。 fork()関数は下記のような手順でプロセスの複製を行う。
- あるプロセス内でfork()が発行される。
- 複製するプロセスのためのメモリ領域を確保する
- fork()の発行元のプログラムを複製して用意したメモリ領域に書き込む。
- fork()の発行元のプロセス(親)と複製したプロセス(子)それぞれのfork()発行地点に処理を返す。この時、親プロセスにはfork()の返り値として複製したプロセスのpidを返し、子プロセスには返り値として0を返す。
execve()
後者の異なるプロセスを生成するための関数はexecve()である。 execve()は新しいプロセスを一つ増やすのではなく既存のプロセスを新しいプロセスとして書き換えるという働きをする。 その際に引数として書き込むプログラムやその引数を渡す。
execve()の性質上それを呼び出したプロセスはそこで書き換えられてしまう。多くの場合は異なるプロセスを元のプロセスの他に生成したい場合は予めfork()を発行し、その子プロセスでexecve()を発行するというような流れになる。「fork and exec」と呼ばれるフローである。
終了処理
_exit()
_exit()を発行し終了処理を行う。標準Cライブラリのexit()関数から呼び出されることが多い。
_exit()が発行されるとプロセスで処理されていたプログラムに割り当てられていたメモリ領域が解放される。
main()関数から復帰した場合も_exit()の発行が行われる。