18

マニュアルページは私に多くのことを教えてくれました。それを通して、「glibc」のメモリ管理の背景知識をたくさん知っています。

しかし、私はまだ混乱しています。「malloc_trim(0)」(パラメーターとしてゼロに注意) は、( 1. )「ヒープ」セクションのすべてのメモリが OS に返されることを意味しますか? または(2.)ヒープの最上位領域のすべての「未使用」メモリだけがOSに返されますか?

答えが ( 1. ) の場合、ヒープ内のメモリがまだ使用されている場合はどうなりますか? ヒープがどこかでメモリを使用した場合、それらは削除されますか、それとも関数は正常に実行されませんか?

一方、答えが ( 2. )の場合、ヒープの上部ではなく場所にある「穴」はどうですか? それらはもう使用されていないメモリですが、ヒープの一番上の領域はまだ使用されています。この呼び出しは効率的に機能しますか?

ありがとう。

4

2 に答える 2

6

のマニュアルページにmalloc_trimは、空きメモリを解放すると書かれているため、ヒープにメモリが割り当てられている場合、ヒープ全体は解放されません。このパラメータは、まだ一定量のメモリが必要であることがわかっている場合に存在するため、それ以上のメモリを解放すると、後で glibc が不要な作業を行わなければならなくなります。

ホールに関しては、これはメモリ管理と OS へのメモリの返却に関する標準的な問題です。プログラムで使用できる主な低レベルのヒープ管理はbrksbrkであり、トップを変更してヒープ領域を拡張または縮小することしかできません。したがって、オペレーティング システムに穴を返す方法はありません。より多くのヒープを割り当てるためにプログラムが呼び出されるとsbrk、その領域の上部が空いていて、戻すことができる場合にのみ、その領域を返すことができます。

メモリを割り当てるには、他にもより複雑な方法があり (たとえば、 anonymousを使用)、ベースの割り当てmmapとは異なる制約があることに注意してください。sbrk

于 2013-03-21T22:19:07.517 に答える