fork()関数の高速化
コピーオンライトという仕組みを使用することで、第2章のプロセス管理(基礎編)で示したfork()関数を使用したプロセス生成をさらに高速化することができます。具体的には、fork()関数の呼び出し時に親プロセスの全てのメモリを子プロセスにコピーするのではなく、ページテーブルのみコピー(共有)することで、fork()関数呼び出し時の処理が高速化します。つまり、親プロセスまたは子プロセスがデータの更新を行わない限り、両プロセスはメモリを共有することができる(同じページテーブルを参照する)ので、メモリの使用量を減少させることができます。
どちらかのプロセスがデータの更新を行おうとした際に、データの共有が解除されます。例えば、子プロセスがデータを更新するために、特定のページにアクセスした場合を考えます。アクセスされた特定のページのデータが物理メモリ上にコピーされ、子プロセスの当該ページの仮想アドレスに紐付けされている物理アドレスが書き換えられます。この段階で、各プロセスは専用のページを持つことになります。その後、子プロセスはデータの変更を行いますが、親プロセスと子プロセスの当該ページの物理メモリは共有解除されているため、子プロセスのデータのみ更新されます。「Copy on Write」が示す通り、書き込み時(変更時)に物理メモリのコピーを行なっていることが分かります。
execve()関数の高速化
第4章では、mmap()システムコールによって実行中のプロセスに対して新規のメモリを割り当てた後、デマンドページングによって、該当ページへの初回アクセス時に対応する物理メモリを紐付けることを示しました。このデマンドページングという仕組みは、execve()関数の発行後にも使用されます。execve()関数の発行によりプロセス上で動作するプログラムを変更することができますが、システムコールの発行直後はページテーブルエントリが作成されるものの、プロセス用の物理メモリは紐付けられていません。ページへの初回アクセス時に物理メモリの紐付けを行うことで、execve()関数の処理を高速化することができます。
プロセス間通信
複数のプロセスがデータの共有を行ったり、同期的に処理を行う際に、プロセス間通信というOSの機能を使用します。プロセス間通信を実現する手段の一つとして、共有メモリがあります。fork()関数呼び出し後に、データの更新を行うと親プロセスと子プロセスのメモリの共有が解除されます。しかし、共有メモリを使用することで、複数のプロセスが同じメモリ領域を共有することができ、データの更新をした際にもそれぞれのプロセスで変更が共有されます。
排他制御
複数の処理が特定のリソースに同時にアクセスできないようにする仕組みです。