免責事項:私はコンピュータ工学の学位を持っていますが、このトピックについて明確に説明したことはありません。私は私が知っているものの一部をまとめて全体を作りました。私が間違った部分がある場合は、修正してください。
Cプログラムがあるとしますmalloc(1MB)
。この関数は、オペレーティングシステムからメモリページを割り当てません。これは、ヒープを使用して仮想メモリアドレス空間に一連のアドレスを割り当てることです。このアドレスはまだ物理メモリページにマップされていません。そのアドレスに最初に書き込むとき、CPUは例外(または割り込みなど)を取得し、そのアドレスに新しいメモリページを割り当てると書き込みが成功します。
次に関数を呼び出しますfree()
。この関数はまた、メモリページをオペレーティングシステムに戻すことはありません。それがすることは、後で再利用できるようにアドレス範囲をヒープに戻すだけです。
私のポイントは、メモリページが決して解放されないことです(プロセスが終了するまで)。そうなんですか?メモリページを解放するためのシステムコールはありません。そうですか?そして、オペレーティングシステム自体は、どのページが使用されなくなったかを推測することはできません。できることは、最近使用されていないページを確認し、そのページをスワップ位置に移動することです。
関連(やや)質問:アプリケーションが割り当てられたメモリの一部を解放することを強制できますか? また関連:https://stackoverflow.com/questions/1421491/does-calling-free-or-delete-ever-release-memory-back-to-the-system
ベストアンサー1
原則として、実際にはページを無料で提供することが可能です。
malloc
free
予約されたアドレス空間は必ずしも発生しません。とを使用して実装することができます。mmap
このmunmap
場合、そのアドレス空間と埋め込まれたページは後でカーネルに返されることがありますmunmap
。割り当てられたアドレス空間を減らすためにプロセスを使用することもできますsbrk
。
これmadvise
この機能は、アドレス空間を解放せずにページを削除するためにも使用できます。