原則として、プロセスによってメモリページを解放することは可能ですか?

原則として、プロセスによってメモリページを解放することは可能ですか?

免責事項:私はコンピュータ工学の学位を持っていますが、このトピックについて明確に説明したことはありません。私は私が知っているものの一部をまとめて全体を作りました。私が間違った部分がある場合は、修正してください。

Cプログラムがあるとしますmalloc(1MB)。この関数は、オペレーティングシステムからメモリページを割り当てません。これは、ヒープを使用して仮想メモリアドレス空間に一連のアドレスを割り当てることです。このアドレスはまだ物理メモリページにマップされていません。そのアドレスに最初に書き込むとき、CPUは例外(または割り込みなど)を取得し、そのアドレスに新しいメモリページを割り当てると書き込みが成功します。

次に関数を呼び出しますfree()。この関数はまた、メモリページをオペレーティングシステムに戻すことはありません。それがすることは、後で再利用できるようにアドレス範囲をヒープに戻すだけです。

私のポイントは、メモリページが決して解放されないことです(プロセスが終了するまで)。そうなんですか?メモリページを解放するためのシステムコールはありません。そうですか?そして、オペレーティングシステム自体は、どのページが使用されなくなったかを推測することはできません。できることは、最近使用されていないページを確認し、そのページをスワップ位置に移動することです。

関連(やや)質問:アプリケーションが割り当てられたメモリの一部を解放することを強制できますか? また関連:https://stackoverflow.com/questions/1421491/does-calling-free-or-delete-ever-release-memory-back-to-the-system

ベストアンサー1

原則として、実際にはページを無料で提供することが可能です。

mallocfree予約されたアドレス空間は必ずしも発生しません。とを使用して実装することができます。mmapこのmunmap場合、そのアドレス空間と埋め込まれたページは後でカーネルに返されることがありますmunmap。割り当てられたアドレス空間を減らすためにプロセスを使用することもできますsbrk

これmadviseこの機能は、アドレス空間を解放せずにページを削除するためにも使用できます。

おすすめ記事