%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E4%BB%AE%E6%83%B3%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A8%E7%89%A9%E7%90%86%E3%83%A1%E3%83%A2%E3%83%AA%E9%96%93%E3%81%AE%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%8C%E5%B8%B8%E3%81%AB%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
を使用してヒープからブロックを割り当てるとしますmalloc
。大きなサイズのメモリを割り当てる場合は、内部でmalloc
を呼び出しmmap
、小さなサイズの割り当ての場合は、内部でmalloc
を呼び出しますbrk
。
ヒープは連続的であることに注意してくださいsbrk()
。brk()
割り当てが比較的中規模で、内部的にmalloc
呼び出されるとしますbrk
。
電話するとmalloc(small); malloc(medium); free(medium)
この記事によるとUnix のメモリ割り当ての低レベルな方法の混乱の歴史
適切なものを free() して、ブレークの先頭に未使用の領域のブロックを作成した場合、malloc() などが最終的に呼び出され
brk()
、sbrk()
プログラムのブレークを縮小してメモリを OS に返す可能性があります。
空き中ブロックが最後(割り当てられた小さなブロックが最後から2番目)なので、メモリは OS に返されます。
以下が私の質問です:
「メモリは OS に返される」という記述について私が理解しているのは、仮想メモリと物理メモリ間の空きブロックのマッピングが削除され、他のプロセスがこの空きブロックによって元々占有されていた物理メモリを使用できるということです。私の理解は正しいでしょうか?
今回は、
malloc(medium); malloc(small); free(medium)
最後に割り当てられたブロックがまだあるので、仮想メモリと物理メモリ間の空きブロックのマッピングはまだ存在しますか?他のプロセスはこの空きブロックの物理メモリを使用できますか?
答え1
物理メモリを他の目的に再利用できるメカニズムは他にもあります。この場合、特にスワップです。メモリの負荷が十分に高い場合、プロセスの物理メモリをスワップアウトして、他のメモリのためのスペースを確保できます。
現在、メモリをオペレーティングシステムに戻すことの主な利点は、オペレーティングシステムが知っているメモリは再度使用されないため、対応する物理メモリをそれ以上の手続きなしで破棄することができます。(関連するSOの質問に対する私の回答詳細については。)
仮想メモリと物理メモリ間のマッピングは、ある程度流動的です。上記のスワップに関するポイントを参照してください。シナリオでは、プログラム ブレークを削減できないため、プロセスに割り当てられた仮想アドレス空間は変更できず、カーネルは、マップされた物理メモリは「貴重」であり、重要なデータが含まれていると想定する必要があります。ただし、これはカーネルが物理メモリを再使用できないことを意味するのではなく、その際にそこに保存されているデータが失われないようにする必要があることを意味します。