To je IT hantýrka. Stack je viceznacny pojem ktery je nutno holt kontextově uchopit :-/
Uplne bych moc nezral ty hyperkorektne presné přednášky od kakademiku na českých VŠ. Jsou i přednášející kteří toho maji taky dost. Realita tam venku v oboru je trochu jiná.
22. 7. 2021, 17:04 editováno autorem komentáře
Je to jako programový stack - běží nějaký program (systemd-init) a ten má nějaký stack na kterém si program může alokovat paměť (většinou se to používá pro lokální proměnné funkcí - řeší se to pouze pointerem na stack (E)SP). Alternativou je pak ještě heap, kde si také může alokovat paměť - většinou přes systémová volání malloc().
Pro lepší popis např:
http://www.c-jump.com/CIS77/ASM/Stack/lecture.html
To je hodně krátkozraký pohled. V podstatě jakákoli deklarace lokální proměnné je svým způsobem zároveň alokace, protože se příslušná část zásobníku vyhradí pro tuto proměnnou. A totéž pak můžu udělat i dynamicky pomocí zmíněného makra alloca()
. Je to rychlé, jednoduché a pohodlné, dokonce se ani nemusím starat o uvolnění (s trochou nadsázky by se to dalo označit za RIIA). A bohužel je až příliš snadné zapomenout na to, kde vlastně se ten blok alokuje a jak a že zásobník může být poměrně malý (u jednoho programu, kde používám hodně threadů jsem šel až na 16KB).
Když před dávnými lety Ulrich Drepper použil v resolveru alloca()
s parametrem, který byl efektivně něco jako 56 krát počet lokálních IPv6 adres, dalo se ještě chápat, že si v době, kdy to psal, neuvědomil, že by IPv6 adres mohlo být víc než pár. To, že někdo použil v systemd alloca()
s parametrem ovlivnitelným zvenku ještě v roce 2015, je alarmující.
prekvapuje me ne-znalost IT mladochu..
STACK je zasobnik - pamet ktera slouzi k predavani argumentu, dale to slouzi jako lokalni pracovni prostor pro aktualne bezici funkci. Po navratu z funkce je (E)SP registr obnoven, a kontext (co se promennych tyce) je vracen volajici funkci.
8 MB limit stacku je to, na co natrefite po chvilce behu nekonecne rekurze - protoze je prostor fixni, a kazde volani uklada par systemovych registru, tato pamet po mnoha iteracich dojde a chovani systemu je sestrelit danej proces, protoze se ma za to, ze se zblaznil.
Alternativne na to muzete natrefit, kdyz si udelate ve funkci velkou lokalni alokaci:
funkce () { int velkepole[2500000]; ... }