でメモリ割り当てを拡張しようとするとrealloc()
、Linuxはメモリの一部を配置し、古いメモリをコピーして破棄しますか?その場合、realloc()の最大サイズは、カーネル以外のメモリ全体の半分未満に制限されます。
私はその通りですか、それとも現在どのアルゴリズムが適用されていますか?
でメモリ割り当てを拡張しようとするとrealloc()
、Linuxはメモリの一部を配置し、古いメモリをコピーして破棄しますか?その場合、realloc()の最大サイズは、カーネル以外のメモリ全体の半分未満に制限されます。
私はその通りですか、それとも現在どのアルゴリズムが適用されていますか?
glibc realloc実装は、カーネルのmremapインターフェースを利用して、物理メモリに余分なコピーを作成することなく、プロセスの仮想アドレス空間で割り当てられた領域を拡張または再配置します。この動作は、glibcが割り当てを「大きい」と見なしたときに始まります。これは、前回チェックしたときに128Kを超えていました。割り当てが少ない場合は、コピーを作成します。
プロセスの仮想メモリマップに、現在のアドレスまたはその他の未使用領域のいずれかで新しい割り当てに使用できる十分な連続スペースがない場合、mremapは失敗する可能性がありますが、古い割り当てと新しい割り当てを保持するのに十分なスペースは必要ありません。同時。
一般に、ヒープセグメントは下位アドレスから上位アドレスに増加します。一定量のヒープスペースがプロセスに割り当てられ、プロセスによってのみ管理する必要があります。
メモリスペースを拡張するときに、古いコンテンツを移動せずに直接拡張するスペースが存在する場合は、そうします。それ以外の場合は、古いコンテンツを見つけた新しいスペースにコピーし、その新しいスペースから拡張します。古いメモリ領域は「解放」され、必要に応じて追加の割り当てに使用できます。ただし、古いスペースはカーネルに戻されません。
したがって、realloc()によって割り当てることができるスペースの量は、プロセスに割り当てられるヒープスペースの量(ヒープセグメントのサイズ)によってのみ制限されます。
また、多くのLinux実装では、プロセスのセグメントサイズを変更するためにsbrk()システムコールを利用しています。理解を深めるために、このリンクを参照することをお勧めします -Linuxでsbrk / brkはどのように実装されていますか?