免責事項:私はコンピュータ工学の学位を持っていますが、このトピックについて明確に説明したことはありません。私は私が知っているものの一部をまとめて全体を作りました。私が間違った部分がある場合は、修正してください。
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
この機能は、アドレス空間を解放せずにページを削除するためにも使用できます。
答え2
最後に、OSカーネルは(仮想メモリ)ページの断片的な「リターン」を許可しますか(これを行うと乱雑になる可能性があり、実際には関係がなく、使用されていないページはとにかくRAMからすばやく削除されます)。ほぼ同じ理由で、言語のランタイムは何かを維持することができます(たとえば、Cで移動して解放したスペースがアドレス空間の連続ページであることを保証できるものがmalloc()
ないfree()
場合 - もっと要求するために再提供)、スペースは後で費用が発生します)。
Unixでは、sbrk(2)
プロセスのデータセグメントを拡張/縮小できますが、次のものがあるとします。一つデータセグメント(最終的に複数の可能性があります)とランタイムスタックは、原則として拡張および縮小されます。繰り返しますが、言語の実行時やカーネルがその役割を果たすかどうかは、実装によって異なります。
たとえば、Cの標準を確認してください。 C標準はそのような詳細を抽象化し、リソース制約を処理し、プログラムが解釈可能な方法で実行されるべきであるというas if規則を慎重に定式化します。