Portál AbcLinuxu, 30. dubna 2025 14:00
Tu přesně mám ale je strašně tlustá, ještě jsem se jí celou neprokousal.
ctenari vzali na vedomi, ze vm je v c++ borec
Jak (moc) se liší od C++?
Díky. A blíž k Javě má který?
wrapper je presne to co rika slovnik - obal, napriklad sada funkci nejake knihovny zabalena do tridy jako treba gtkmm
Bavíme-li se stále o C(++), tak zjistíme, že zásobník, tak jak se dnes praktikuje, může velmi rychle dojít.
Neni moc duvodu, proc by mel zasobnik dojit driv nez halda. V adresnim prostoru maji oba mista dost, a fyzicke stranky se, tipuji, prideluji celkem bez ohledu na to, zda se jedna o zasobnik nebo haldu. Oboje muze byt omezeno ulimitem, ktery ale v obou pripadech je mozne nastavit na unlimited.
Akorat si nejsem jist, zda proces nekdy uvolnuje stranky, ktere mu jsou pridelene pro zasobnik.
Bohuzel to tak neni. Na linuxu mate 4 mega na stack. Pak nasleduje 1 zamcena stranka, na kterou kdyz slapnete tak naspaduje SEGFAULT. A za touhle strankou pokracuje stack dalsiho vlakna. Na FreeBSD je to tak ze 1. "hlavni" vlakno ma 16MB stack a dalsi uz dostavaji po ctyrech. Vsechno je to ale samozrejme konfigurovatelne.
> Bohuzel to tak neni. Na linuxu mate 4 mega na stack
Coz je prave ten limit nastaveny ulimitem. Kdyz pred spustenim programu zadate 'ulimit -s unlimited', tak tam ten limit nebude.
Nene, vas stack konci tam, kde zacina stack dalsiho threadu.
No tak si to zkus:
test.c:
#include <stdio.h>
#include <stdlib.h>
int
recurse(int i)
{
if (i < 10000000)
{
return 1 + recurse(i+1);
}
else
{
int j;
printf("Hluboko\n");
scanf("%d", &j);
return j;
}
}
int
main(void)
{
int j = recurse(0);
printf("Rv %d\n", j);
}
feanor:~$ gcc test.c -o test
feanor:~$ ulimit -s unlimited
feanor:~$ ./test
Hluboko
1
Rv 10000001
Zabrana pamet na stacku kolem 500 MB.
> A za touhle strankou pokracuje stack dalsiho vlakna
Mimochodem, tusite nekdo, proc na Linuxu nejsou vlakna implementovana tak, ze by bylo kazde v odlisnem adresovem prostoru, pouze by sdilela vsechny adresove segmenty krome stacku (a pripadne prostoru pro thread-specific variables)? Respektive, zda by takova implementace mela nejake vyznamne nevyhody? Krom evidentni nemoznosti sahat z jednoho vlakna do stacku druheho (coz je IMHO stejne dost prasarna). Obecne by context switch mezi vlakny ve stejnem adresovem prostoru mohl byt rychlejsi, ale opravdu tomu v Linuxu tak je?
Mimochodem, tusite nekdo, proc na Linuxu nejsou vlakna implementovana tak, ze by bylo kazde v odlisnem adresovem prostoru, pouze by sdilela vsechny adresove segmenty krome stacku (a pripadne prostoru pro thread-specific variables)?Tipuji, že čistě proto, že to prostě někdo implementoval takhle. Oddělené adresní prostory pro zásobníky by podle mého neměly být v rozporu se specifikací v POSIXu, čili nevidím jiný důvod, proč se používá zrovna tato implementace.
Respektive, zda by takova implementace mela nejake vyznamne nevyhody?Měla by o něco málo větší režii při vytváření vlákna, ale je otázka, nakolik by to vadilo (už tak je režie vytváření vláken výrazně větší než na Windows; naopak režie vytváření procesů je podstatně nižší - skoro řádově - než u Win).
Obecne by context switch mezi vlakny ve stejnem adresovem prostoru mohl byt rychlejsi, ale opravdu tomu v Linuxu tak je?Rychlejší je. Nevím o kolik (to by se musel změřit), ale každopádně se při přepínání úloh se sdíleným adresním prostorem nenačítají tabulky stránek. Jde ovšem o to, jaká je v praxi pravděpodobnost, že dvě po sobě následující naplánované úlohy jsou dvě vlákna téhož procesu.
Já myslím, že sahat na korektně zamykané proměnné na zásobníku jiného vlákna je zcela korektní.Jenže jde o to, proč to vůbec dělat. Nenapadá mě nic rozumného, k čemu by to bylo dobré.
Vy snad ano?Také o ničem takovém nevím.
> Já myslím, že sahat na korektně zamykané proměnné na zásobníku jiného vlákna je zcela korektní.
Korektni to sice je, ale asi bych se tomu radsi ve vetsine pripadu vyhnul. ;–)
To by pak asi nemelo smysl rozlisovat mezi vlakny a procesy, ne?
Jinak, treba na zSeries procesu (ktery vychazi ze System/360) hardwarovy stack puvodne nebyl, a proto se treba v z/OS nepouziva. Misto toho tam jsou instrukce na ulozeni vicero registru do pameti. Vysledek je, ze zasobnik muze byt nesouvisly, a tedy teoreticky tam s pretecenim zasobniku jednoho vlakna nejsou problemy.
Proc?
perl se hodi tak max. pro 10 % populace, tedy pro lidi, kteri nemaji problem s tim, ze k cili vede nekolik cest. Lide , ktere nevysiluje svoboda svou neustalou nutnosti se rozhodovat. Pro lidi, kteri potrebuji ruznorodost, aby mohli kombinovat nove cesty, pristupy, reseni. Perl je narocny, protoze je mnohotvarny, nesvazany, chaoticky.
Vaclav Klaus nenavidi perl.
jak vis? :)
Dalsi rozdil je v tom, ze MQ je implementovano pres syscally, takze kdyz neco resite tak staci spustit lsof, strace, dbg a hned vite kdo na koho ceka a muzete z toho usoudit proc. U D-BUS nezjistite vubec nic, anebo je to velice slozite.
nebo … SGP BaltazarTak malé děti sem snad nechodí ... nebo ne?
Každý byl jednou mladý Já jsem začínal v DOSu, s quick basicem a právě tím Baltazarem, ale spíš než programování to bylo hraní.
V posledných týždňoch som mal možnosť si na to siahnuť a vyzerá, že je to Turing-complete. Má to premenné, konštanty, celé a reálne čísla, reťazce, bitové a logické operátory, riadiace štruktúry, možnosť definovať funkcie, knižnicu matematických funkcií, prácu so súbormi, ... Existuje C# verzia, ktorá má objekty, podporu pre DirectX, .NET, ... Takže by som to až tak nezhadzoval.nebo … SGP BaltazarTak malé děti sem snad nechodí ... nebo ne?
BTW: jsou mezí vámi tací, kteří postupovali směrem Java → C++, nebo jste se všichni učili nejdřív céčko a pak až Javu?
Učit se C++ je docela dobrodružné , ale všechno tam dá mnohem víc práce. Už jen když srovnám knížky Mistrovství v C++ a Java: Programujeme profesionálně – obě jsou přibližně stejně tlusté, ale je dost velký rozdíl, jaké programy po jejich přečtení člověk umí vytvářet v C++ a jaké v Javě (gui, tisk, xml, databáze, corba…). Ale neberte to jako rýpání, jen taková poznámka na okraj
doufám, že mě to céčko nepřestane bavit a bude to k něčemu dobré.
ad čtení – přijde mi to, nebo se fakt C/C++ fakt snáze píše než čte? Připadá mi, že po pár hodinách studia jsem v tom schopný napsat program, který nějak funguje, ale abych byl schopný číst zdrojáky někoho jiného mi to často nestačí, často narážím na konstrukce, které neznám, které jsem zatím nepotřeboval – tohle se mi v Javě nestávalo ani na začátku.
jsou mezí vámi tací, kteří postupovali směrem Java → C++, nebo jste se všichni učili nejdřív céčko a pak až Javu?To jsem třeba já. Nejdřív jsem se učil Javu. C a C++ jen v rozsahu nezbytně nutném k tomu, abych dokončil FEL. Prakticky to bylo jen C, to C++ jsem snad vůbec nepotřeboval. Teprve až o pár let později jsem se učil C++, a to především tvorbou aplikací postavených na MFC. Tehdy jsem v tom neustále hledal "javismy" a nadával jako špaček, že je tam všechno nějak horší. Nebylo to ale jazykem, byl to problém MFC
Ono už fakt že v 6-7. tříde na ZŠ jsme v tom byl schopen vytvořit multimediální přehrávač lepší než WM player, naznačuje snadnost programování v tomto jazyce.
Spíše to ukazuje na kvality toho WM playeru. ^_^
Mně zase přijde, že lidi, co k němu přičuchli hned zdrhli k něčemu lepšímu, nebo … jsou to zaměstnanci MS
Tehdy se mi to Visual Studio líbilo, jenže napovídání v kódu nebo tvorbu GUI klikáním má dneska kdejaké IDE a jako jazyk mě VB nějak nezaujal.
BTW: už si někdo stáhl ten můj zdroják? Ještě jsem neslyšel žádnou kritiku (a že je určitě co kritizovat)
No tak proto se pak uci programovat v C++, ne? Co je na tom spatneho, ja to spis povazuji za pozitivni krok. Ja se ucil prvni (Spectrum) BASIC, a to o nem Dijkstra prohlasil, ze "cripples your mind".
Jinak, dnes v praci pouzivam mainframe assembler a C, a doma Python a zkousim Lisp.
Hm, zda se, ze to rikal o obou:
nejak jsem nevyrozumnel, jestli mel Dijkstra pravdu ...
A funguje to i naopak – Bůh existuje už jen tím, že v něj někdo věří
To u nás na škole (VŠE) se programování moc neučí, přestože studuji informatiku. Což je možná ten důvod proč se rád učím nový jazyk, když mě do toho nikdo nenutí Sice se programováním v C++ asi nikdy živit nebudu (to spíš tou Javou), ale přijde mi dobré mít alespoň základy.
for( integer i:=pole.length; 1; downto) begin (x (y (z (q (o (u )))))) }Tak začíná být něco špatně.
No, nevim. Muj otec vzdycky rikal, ze matematiku se clovek musi naucit v mladi, jinak to uz nejde. Dal jsem na jeho radu, a ted je mi 30, a vidim, ze mel pravdu. Dnes by se mi do toho uz asi nechtelo.
Proč? Píšu to tak schválně
Například proto, že čeština vyžaduje diakritiku. Bez diakritiky získáš hnusný zprasený jazyk neandrtálců, což není čeština.
Ani kompilátor s podporou UTF-8 identifikátorů by nebyl dost dobrý důvod k použití češtiny. Velmi to ztěžuje sdílení toho kódu s ostatními. Drtivá větěšina dnešních zdrojových kódů je založená na angličtině. Netvrdím, že je to dobré nebo správné, ale je to prostě tak. Programátorů, kteří hovoří anglicky, je nesrovnatelně víc než těch, kteří hovoří česky.
Přesně... stačí si představit třeba zdrojovej kód řekněme ve francouzštině.
Já si to bohužel představovat nemusím
Francouzština je přece krásný jazyk
Fantastic language especially to curse with. You see? It's like wiping your ass with silk. I love it.
Normální by to bylo, kdyby tam nechyběla diakritika. Bez diakritiky nejde o češtinu, nýbrž o jakýsi nedefinovaný a těžko čitelný jazyk. Protože kompilátory zatím UTF-8 moc nemusí, taky bych se rozhodně přimlouval za angličtinu.
tak ja si rejpnu :)
program.h je naprosto zbytecny, extern "C" uplne zbytecne...
oteviraci zavorku bloku { davej v c++ na novy radek(toto je ale hodne o zvyku a konvenci)
argumetny metod a konstruktoru ktere mas char* by meli byt const char*
zbytecne globalni promene
co kdyz funkce mq_open() selze?
program.h je naprosto zbytecny, extern "C" uplne zbytecne...
Jako že bych tam neměl psát tu příponu? Četl jsem, že se nepoužívají, ale soubor bez přípony mi prostě přijde divný A taky je fakt, že by tam nemusel být vůbec, protože ten program.h asi sotva bude někdo používat jako knihovnu (to leda fronta.h).
oteviraci zavorku bloku { davej v c++ na novy radek(toto je ale hodne o zvyku a konvenci)
njn, zvyk z Javy, asi to nechám jak to je.
argumetny metod a konstruktoru ktere mas char* by meli byt const char*
Na to se podívám...
Zbytecne globalni promene
To je asi pravda, původně jsem to psal bez tříd a ten program vůbec vypadal trochu jinak. Třeba ta fronta nemusí být globální.
co kdyz funkce mq_open() selze?
Tak se to nepozná hned, ale odeslání zprávy nebo pokus o příjem vrátí chybu. Co s tím -- vyhazovat výjimku při vytváření fronty?
BTW: je nutný ten bezparametrický konstruktor? Asi jo Bez něj mi to nefungovalo (nešlo přeložit).
Tak se to nepozná hned, ale odeslání zprávy nebo pokus o příjem vrátí chybu. Co s tím -- vyhazovat výjimku při vytváření fronty?Návratové hodnoty funkcí, které mohou selhat, je potřeba vždy testovat. Zrovna
mq_open()
může vracet až 9 různých chybových kódů. V C++ je dobrým zvykem v takovém případě vyhodit výjimku.
To by se asi neřeklo, protože v tom programu jsou dost rutinní věci. Taky pochybuji, že by se vůbec někdo dostal do pokušení porušit GPL, protože ten program moc užitečný není, resp. určitě není užitečný v tom, abys ho vzal a začlenil do svého systému. Slouží spíš pro inspiraci a ukázku, jak ty fronty zpráv fungují. Takže je celkem jedno, pod jakou licencí to je – ale GPL používám z principu
char * text = "neco";
. Důvod je ten, že se nemohli někteří lidi dohodnout zda ta hvězdička pokud je blíž k typu, zanmená že daný identifikátor je typu například int ukazatel, nebo zda pokud je blíž k identifikátoru, tak identifikátor je ukaztel na daný typ Pro mé skromné účely úplně postačí PHP v kombinaci s MySQL, větší ambice v této oblasti nemám, programováním se neživím (naštěstí)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.