他にも述べたように、カーネルにメモリを返すのはプロセスの義務です。
は、通常のメモリを割り当てるには2つの方法があります:一定規模以上おmalloc()
/new
メモリブロック場合は、メモリがmmap()
を経由してOSから割り当てとすぐ、それは自由であるとしてeturnedます。より小さいブロックは、sbrk
ボーダーを上にシフトすることによって、プロセスのデータ領域を増加させることによって割り当てられます。このメモリは、特定のサイズを超えるブロックがそのセグメントの最後に空いている場合にのみ解放されます。
例えば:
a = new char[1000];
b = new char[1000];
メモリマップ(擬似コード、私は非常によくC++知らない):あなたはa
無料、今、あなたは真ん中に穴を持っている場合は
---------------+---+---+
end of program | a | b |
---------------+---+---+
を。それは解放することができないので解放されません。 b
を解放すると、プロセスのメモリが縮小される場合もあれば、縮小されない場合もあります。未使用の剰余がシステムに戻される。
#include <stdlib.h>
int main()
{
char * a = malloc(100000);
char * b = malloc(100000);
char * c = malloc(100000);
free(c);
free(b);
free(a);
}
ような単純なプログラムテストは、(brk
値が最初(malloc()
ために)増加し、再び減少していることを示している
brk(0) = 0x804b000
brk(0x8084000) = 0x8084000
brk(0x80b5000) = 0x80b5000
brk(0x809c000) = 0x809c000
brk(0x8084000) = 0x8084000
brk(0x806c000) = 0x806c000
あるようstrace
出力をもたらしますfree()
)。
未使用のメモリは無駄なメモリなので、他の誰かが使用するまで、linuxはメモリを使います。 – PlasmaHH
あなたは、この明らかに漏れやすいプロセスによって使用されるカーネルヒープまたはヒープについて話していますか? –
@Tom:私はユーザー空間プロセスのヒープについて話しています – waffleman