図1 コピー・オン・ライトの動作。例外処理により,コピー・オン・ライトを実行します。
[画像のクリックで拡大表示]
 子プロセス生成時に親プロセスのメモリー空間を複製せず,書き込み処理が発生したときにはじめて複製する仕組みです。プロセスの生成時間を短くするために,Linuxカーネルで用いられています。

 Linuxでは,アプリケーションなどのプログラムを「プロセス」という単位で実行しています。プロセスは,必ず別のプロセスから生成されます。生成された側のプロセスを「子プロセス」,生成する側のプロセスを「親プロセス」と呼びます。

 子プロセス生成時には通常,親プロセスの情報をすべて複製(コピー)します。コピーされる情報は,プロセスの各種情報を管理するtask_struct構造体や,親プロセスが利用しているメモリー内のデータなどです。

 メモリー内のデータをすべてコピーすることは,大変時間がかかる“重たい”処理です。にもかかわらず,コピーしたデータは通常,実行するプログラムによりいずれ上書きされてしまいます。つまり使われない無駄なデータをコピーすることになります。

 このような無駄と思われる処理をプロセス生成時に実行させないように,コピー・オン・ライトでは,プロセス生成時にメモリー内のデータをコピーしません。その代わりに,親プロセスのメモリー空間を共有します。これで,プロセス生成にかかる時間を大幅に短縮できます。

 ただし,共有しているメモリー空間に対し,どちらかのプロセスが書き込み要求を発行した場合には,その書き込み内容を反映させるために別々のメモリー空間を用意しなければなりません。

 コピー・オン・ライトでは,書き込み要求を発行した側のプロセスに新しいメモリー空間を割り当てます。そして,割り当てたメモリー空間に,共有しているメモリー空間からデータをコピーします。コピーが完了したら,メモリー空間の共有を外します。このように“書き込み(ライト)よってコピーする”という意味で,コピー・オン・ライトと呼ばれています。

 具体的には次のように動作します。共有しているメモリー空間は書き込み禁止が指定されています。一方のプロセスがそのメモリーの内容を書き換えようとすると,例外が発生します(図1)。この例外処理により,新しいメモリー空間が割り当てられ,そのメモリー空間にデータがコピーされます。コピーが完了したらメモリー空間の共有が外されます。なお,メモリー空間はページという小さい単位で分割されています。そのため,ページ単位で処理が実行されます。