LINUX.ORG.RU

Сообщения byteworm

 

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

Помогите, пожалуйста, разобраться. Есть 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

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

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

byteworm
()

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

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

byteworm
()

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

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

byteworm
()

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