Maximalna velkost pola v jazyku C

Sten

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #15 kdy: 18. 04. 2012, 14:51:38 »
...
Původně mi o zvětšování stacku nešlo, to jsem zjistil jenom tak vedle, šlo o to najít řešení pro předávání dat mezi dvěma řídícími objekty ze dvou knihoven mimo moji kontrolu, kde jeden čekal a periodicky volal metodu read, když chtěl data, a druhý čekal a periodicky volal metodu write, když měl data k dispozici. V metodách read a write se vždycky přehodil kontext do té druhé a tak se ta data předávala.
Aha, díky.
PS: použití shared memory bylo diskvalifikování tím "předávání dat mezi dvěma řídícími objekty ze dvou knihoven mimo moji kontrolu"?

Použití shared memory bylo diskvalifikováno tím, že to běželo v jednom vlákně.


Ivan

Re:Maximalna velkost pola v jazyku C
« Odpověď #16 kdy: 18. 04. 2012, 17:01:03 »
podivej se na funkci alloca, ta alokuje pamet na zasobniku. Na linuxu a i na ostatnich Unixech je to(zhruba) tak, ze zasobnik ma max. velikost cca 4MB(popr. 32MB na FreeBSD), pak je jedna zamcena stranka a za ni pokracuje zasobnik dalsiho vlakna. Za zamcena stranka je takova pojistka proti preteceni zasobniku. Kdyz ti pretece zasobnik tak program spadne na segfault.

Max. velikost zasobniku pro vlakno jde nastavit pomoci pthread_attr_t.

Ivan

martin

Re:Maximalna velkost pola v jazyku C
« Odpověď #17 kdy: 19. 04. 2012, 00:06:04 »
Velikost stacku lze měnit v shellu bash pomocí vestavěné funkce ulimit (viz help ulimit, nikoliv man ulimit). Změna se projeví pro všechny následně spouštěné procesy. Takové quick&dirty řešení by tedy spočívalo v napsání shellového wrapperu, kde by se zavolal ulimit -s <velikost_v_kiB> a následně daný program.

Osobně považuji za nejlepší řešení v C to, co už tu někdo navrhnul, tedy jen deklaraci ukazatele (long *pole) a následnou alokaci pomocí malloc (s příslušným ošetřením chyb) pro potřebný počet prvků, po použití zavolání free.
Někým jiným navrhovaná alloca fungovat nebude, protože alokuje na zásobníku (podobně jako v C99 deklarace pole s předem neznámým počtem prvků n: long pole[n], kde n se dozvím až za běhu).

Martin Pelikan

Re:Maximalna velkost pola v jazyku C
« Odpověď #18 kdy: 19. 04. 2012, 17:12:03 »
Doporuceni: nevymyslejte ptakoviny na stacku a alokujte si pole dynamicky pomoci {m,c}alloc(), pripadne mmap(), ktery je vetsinou pod tim. alloca() jen zvysi stack pointer, tj. nemate (pokud nejste ultra prase) sanci zjistit, jestli jste neprelezl ulimitem definovane maximum (typicky ohranicene chranenou strankou za koncem stacku). A pokud ultra prase jste, asi vam dojde, ze malloc() je rychlejsi ;-)

Je to navic bezpecnejsi, az bude vas program neodolny proti buffer overflow. Zatimco na stacku timhle prepisete navratovou adresu a dal jste utocnikovi v podstate shell ;-), u pameti na heapu maximalne vytecete z primapovanych stranek a system vas zabije.
Moderni systemy maji malloc() opravdu rychly.

Jestli si to predstavujete tak, ze long pole[10]; pole[11] = 1; vygeneruje nejakou chybu, smula. Stack slouzi jen pro docasna a mala data.