[Bulma] Gestió de memòria

JOSEP jbort en tsc.upc.edu
Mar Dic 11 16:06:01 CET 2007


Toni Pizà escribió:
> Bones! He intentat fer una matriu bidimensional de caracters en C, de
> dimensió 5000 * 5000. Si tan sols faig la declaració i acab el
> programa, funciona bé, per exemple :
>
>   1 #include <stdio.h>
>   2
>   3 #define MAX 5000
>   4
>   5 int main() {
>   6         char matriu[MAX][MAX];
>   7
>   8         return 0;
>   9 }
>
> En canvi, si faig qualsevol cosa, una assignació o una crida a funció,
> després de la delcaració, retorna un core dumped quan l'intent
> executar. Per exemple, si a la linia 7 pos un simple printf("Hello
> world!\n"), rebenta.
>
> Si ajust la mida de la matriu a 2985, a vegades rebenta i a vegades
> s'executa correctament. La màquina té 1 GB de RAM i dos gigas de swap,
> per memòria física no crec que sigui. Sembla un Expedient X :P
>
> Estic fent feina amb una KUbuntu amb kernel 2.6.22-14-generic, la
> versió 2.6.1-1ubuntu10 de libc6-dev, gcc versió 4.1.3 20070929 i el
> següent ulimit :
>
>  servoalab:~$ ulimit -a
> core file size          (blocks, -c) 0
> data seg size           (kbytes, -d) unlimited
> scheduling priority             (-e) 0
> file size               (blocks, -f) unlimited
> pending signals                 (-i) 8126
> max locked memory       (kbytes, -l) 32
> max memory size         (kbytes, -m) unlimited
> open files                      (-n) 1024
> pipe size            (512 bytes, -p) 8
> POSIX message queues     (bytes, -q) 819200
> real-time priority              (-r) 0
> stack size              (kbytes, -s) 8192
> cpu time               (seconds, -t) unlimited
> max user processes              (-u) 8126
> virtual memory          (kbytes, -v) unlimited
> file locks                      (-x) unlimited
>
> Algú sap que podria ser?? Em té intrigat .. :)
>
>   

Si no recordo malament es pq aquesta variable es diensona a l'stack.
(5000*5000) chars *1byte/1char=25.000.000bytes => 
25.000.000/1024=25.000kb (aprox) > 8192 kb ( que tens definits per a 
l'stack, ulimit -s)

prova a augmentar les dimensions de l'stack per sobre de les diensions 
de la matriu, per exemple en el teu cas "ulimit -s 30000" (>25.000kb)

tembé tens la possibilitat de dimensionar la matriu dinamicament amb un 
malloc per exemple ,  així crec que no utilitza l'stack.




Más información sobre la lista de distribución Bulmailing