それに関しては、Windows と Unix の間に大きな違いはありません。
どちらにも、2 つのレベルの割り当てがあります。オペレーティング システムは、大きなチャンク (1 ページ以上。x86 では、ページ サイズは通常 4096 バイト) でプロセスにメモリを割り当てます。プロセス内で実行されるランタイム ライブラリは、このスペースを分割し、その一部をコードに割り当てます。
メモリをオペレーティング システムに戻すには、まず、これらの大きなチャンクの 1 つから割り当てられたすべてのメモリをランタイム ライブラリに解放する必要があります。ランタイム ライブラリは、必要に応じて、オペレーティング システムにそのメモリのチャンクを解放するように指示できます。
Linux では、 と がbrk
ありmmap
ます。brk
プロセスに割り当てられた大きなメモリ チャンクのサイズを制御します。拡大または縮小できますが、一方の端のみです。malloc
従来、より多くのメモリを割り当てる必要がある場合はこのメモリのチャンクを拡張し、可能な場合は縮小します。ただし、縮小は簡単ではありません。その割り当ての前にすべてが解放されたとしても、最後に1バイトのタイミングの悪い割り当てが必要であり、縮小できなくなります。これは、「Unix はメモリを解放しない」というミームのソースです。
ただし、匿名もありmmap
ます。Anonymousmmap
はオペレーティング システムにメモリのチャンクを要求します。このチャンクは、プロセス メモリ空間のどこにでも配置できます。このチャンクは、まだ解放されていない後の割り当てがある場合でも、不要になったときに簡単に返すことができます。malloc
も使用しますmmap
(特に、解放後にメモリのチャンク全体を簡単に返すことができる大規模な割り当ての場合)。
もちろん、Windows と Linux の両方で、ランタイム ライブラリのメモリ アロケータ (またはアロケータ) の動作が気に入らない場合は、独自のものを使用して、オペレーティング システムにメモリを要求し、必要な方法で分割することができます (場合によっては、別のアロケータからメモリを要求しますが、より大きなブロックで)。興味深い用途の 1 つは、タスク (たとえば、Web サーバー要求) に関連付けられたすべてのメモリ用のアロケータを用意することです。このアロケータは、タスクの最後に完全に破棄されます (すべてのピースを個別に解放する必要はありません)。もう 1 つの興味深い用途は、固定サイズのオブジェクト (たとえば、5 バイトのオブジェクト) のアロケーターです。これにより、メモリの断片化が回避されます。