LINUX.ORG.RU

Сообщения byteworm

 

Как выделяется память в линуксе?

Форум — Development

Помогите, пожалуйста, разобраться. Есть 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]);
}
и malloctest_w_use.c
#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
Т.е. overcommit отключен. полностью свободной памяти > 960Mb, но можно ещё освободить.
$ ./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Гб.

Ткните меня в мануал, где бы об этом писалось. Статьи Дреппера до конца не дочитал, но быстро просмотрев, не нашёл там возможных причин.

byteworm
()

специалисты по AI

Форум — Talks

на ЛОРЕ же должны быть занимающиеся AI.

подскажите тематические форумы. и где почитать, что сейчас развивается по этой теме? особенно интересует swarm intelligence

byteworm
()

Разбить wav на несколько

Форум — Desktop

Подскажите чем можно разбить 1 большой wav на несколько маленьких по cue sheet. для mp3/ogg есть mp3splt. есть что-то подобное для wav?
спасибо

byteworm
()

посоветуйте лит-ру

Форум — Talks

посоветуйте лит-ру по AI и нейронным сетям и еще по графическим алгоритмам. желательно с линками. :) язык - русский или английский, но предпочтительней русский, т.к. читается быстрее. спасибо

byteworm
()

RSS подписка на новые темы