プロセスが分岐すると、仮想メモリまたは常駐メモリがコピーされますか?

プロセスが分岐すると、仮想メモリまたは常駐メモリがコピーされますか?

Linuxで新しいプロセスを作成する標準的な方法は、親プロセスのメモリスペースをコピーして呼び出すexecvまで、子プロセスの環境になることです。

仮想メモリ(プロセスで要求されたメモリ)または常駐メモリ(実際に使用されているメモリ)のどちらのメモリ空間を言いますか?

同期:スワップ領域が制限されているデバイスと、仮想メモリ領域と常駐メモリ領域の差が大きいアプリケーションがあります。メモリ不足のためにアプリケーションが分岐することができず、仮想スペースのサイズを減らすのに役立つことを確認したいと思います。

ベストアンサー1

最新のシステムでは、forkシステムコールを使用した結果、実際にメモリはコピーされません。ページテーブルはすべて読み取り専用としてマークされているため、カーネルコードに最初に書き込もうとするとトラップが発生します。コピーは、最初のプロセスが書き込みを試みたときにのみ発生します。

これを記録中にコピーと呼びます。

ただし、コミットされたアドレス空間を追跡する必要があるかもしれません。カーネルがページをコピーするときに使用可能なメモリまたはスワップがない場合は、メモリを解放するためにいくつかのプロセスを終了する必要があります。これは常に望ましいとは限らないので、カーネルがコミットしたメモリ量を追跡することが可能です。

カーネルが使用可能なメモリ+スワップ領域よりも多くのメモリをコミットしている場合、フォークを呼び出そうとするとエラーコードが表示されることがあります。空き容量が十分な場合、カーネルは、親プロセスの全体の仮想サイズをフォーク後の両方のプロセスにコミットします。

おすすめ記事