を使用してヒープからブロックを割り当てるとしますmalloc
。大きなサイズのメモリを割り当てると内部で呼び出さmalloc
れ、mmap
小さいサイズのメモリを割り当てると内部で呼び出さmalloc
れますbrk
。
sbrk()
またはを使用すると、ヒープは連続的です。brk()
malloc
私の割り当てが比較的中型で内部的に呼び出されるとしましょうbrk
。
私が電話すると仮定しましょうmalloc(small); malloc(medium); free(medium)
この記事によるとUnixで混乱する低レベルメモリ割り当て方法の歴史
割り込みの上に未使用のスペースを作成するために正しくfree()を実行した場合、malloc()と会社は最終的にプログラムの割り込みを呼び出すか縮小し、
brk()
メモリsbrk()
をオペレーティングシステムに返すことがあります。
空き中間ブロックが最後のブロックなので(小さい割り当てブロックは最後から2番目のブロックです)、メモリはオペレーティングシステムに返されます。
私の質問は次のとおりです。
「メモリがオペレーティングシステムに返されます」という文の私の理解は、利用可能なブロックの仮想メモリと物理メモリ間のマッピングが削除され、利用可能なブロックが元々占有していた物理メモリを他のプロセスが使用できることです。 。私の理解は正しいですか?
今回私が呼び出したのは
malloc(medium); malloc(small); free(medium)
最後に割り当てブロックがあるので、仮想メモリと物理メモリ間の空きブロックマッピングはまだ存在しますか?他のプロセスはこの空き物理メモリブロックを使用できますか?
答え1
物理メモリを他の目的にリサイクルする他のメカニズムがあります。特に、この場合はスワップを使用します。メモリ圧力が十分に高い場合は、プロセスの物理メモリを交換して別のメモリを解放できます。
今日、オペレーティングシステムにメモリを返すことの主な利点は、オペレーティングシステムが次のことを実行できることです。知るこのメモリは再利用されないため、別途意識せずにその物理メモリを破棄することができます。 (望むより関連SOの質問に対する私の答えもっと学ぶ。 )
仮想メモリと物理メモリ間のマッピングはやや不安定です。上記の交換のポイントをご覧ください。あなたのシナリオではプログラム割り込みを減らすことができないので、プロセスに割り当てられた仮想アドレス空間を変更することはできません。しかし、これはカーネルが物理メモリの用途を変更できないという意味ではありません。カーネルが物理メモリの用途を変更できないことを意味します。これは、単にプロセス中に保存されたデータが失われないようにする必要があることを意味します。