Как выделяется память в линуксе?
Помогите, пожалуйста, разобраться. Есть 2 программки, одна просто выделяет себе всю доступную память, другая пытается при этом сразу эту память использовать. malloctest.c
#define SIZE 4096
int main(){
int i, oldi;
void* ma[SIZE];
for(i=0; i<SIZE; i++){
ma[i]=malloc(1024*1024);
if(ma[i]==NULL)
break;
}
oldi=i;
printf("allocated %i times 1M = %i\n", i, i*1024*1024);
for(; i<SIZE; i++){
ma[i]=malloc(1024);
if(ma[i]==NULL)
break;
}
printf("allocated %i times 1k = %i\n", i-oldi, (i-oldi)*1024);
printf("total allocated %i\n", (oldi*1024*1024) + (i-oldi)*1024);
for(; i!=0; i--)
free(ma[i]);
}
#define SIZE 4096
int main(){
int i, oldi;
void* ma[SIZE];
for(i=0; i<SIZE; i++){
ma[i]=malloc(1024*1024);
memset(ma[i], 0, 1024*1024);
if(ma[i]==NULL)
break;
printf("%i ok\n ", i);
}
oldi=i;
printf("allocated %i times 1M = %i\n", i, i*1024*1024);
for(; i<SIZE; i++){
ma[i]=malloc(1024);
memset(ma[i], 0, 1024);
if(ma[i]==NULL)
break;
}
printf("allocated %i times 1k = %i\n", i-oldi, (i-oldi)*1024);
printf("allocated totally %i\n", (oldi*1024*1024) + (i-oldi)*1024);
for(; i!=0; i--)
free(ma[i]);
}
$ cat /proc/sys/vm/overcommit_memory
2
$ cat /proc/sys/vm/overcommit_ratio
85
$ free
total used free shared buffers cached
Mem: 2072164 1085868 986296 0 32640 222244
-/+ buffers/cache: 830984 1241180
Swap: 0 0 0
$ grep Commit /proc/meminfo
CommitLimit: 1761336 kB
Committed_AS: 911168 kB
$ ./malloctest
allocated 744 times 1M = 780140544
allocated 506 times 1k = 518144
total allocated 780658688
$ ./malloctest_w_use
0 ok
...
652 ok
653 ok
Segmentation fault
Во-первых, почему не выделяется вся доступная память? Её остаётся ~200 Мб свободной. Во-вторых, (хотя причина наверняка та же) почему программка сегфолтится?
И общие наблюдения следущие: когда загрузка памяти подходит к ~1Гб без буферов и кешей, программы начинают ругаться «failed to allocate...» или падать в сегфолт. Почему такое может быть? Ядро самосборное, включена поддержка памяти до 4Гб.
Ткните меня в мануал, где бы об этом писалось. Статьи Дреппера до конца не дочитал, но быстро просмотрев, не нашёл там возможных причин.