Rad bych touto cestou autorovi poděkoval jelikož jsem se konečně dověděl neco co jsem ještě nevěděl. Že se tímto způsobem mohou chovat procesy na OS, který se dožil 21 století je tedy síla.
Moje sympatie k Windows NT rostou s každým dílem seriálu. Je sice pravda že lameřina kolem zombie je stylovým doplňkem lamerské funkce fork(), ale jinak naprosto nechápu, proč se něco takového
pietně oprašuje ještě 30 let poté co zmizel ze světa hardware, pro který to snad bylo účelně vymyšleno.
Zlatý Bill. Je to sice zloděj a lajdák, ale těch par dolarů si zaslouží. Programovat v něčem takovém jako je Linux by nas tedy on tedy nenechal, to se musi uznat.
Co se Vám nelíbí na forku? Řešení kdy proces čeká na požadavky a když nějaký přijde, tak se forkne a potomek ho vyřídí vůbec není špatné. Vytváření procesů pod WinNT je výrazně dražší operace. Proto to pod WinNT lze řešit thready ale tam zas nemáte oddělené paměťové prostory (jejich vytvoření pod Linuxem je levné protože Copy On Write) a tak chyba při vyřizování požadavku snadno odstření všechno.
Ad zombie - pokud se nepletu tak celá zombie je jen jedna malá struktura v jádře. Mělo by to být obdobné tomu, když po zavolání CreateProcess nezavoláte CloseHandle na hProcess a hThread z PROCESS_INFORMATION. Možnost říci, že mě potomek nezajímá (ony CloseHandle) je příjemné ale že by to byl tak kritický problém bych neřekl.
1. fork musi duplikovat stránkovací tabulky a seznamy handlu celého procesu a vsechny stranky přepnout do režimu copy on write. Živě si dovedu představit jak tohle asi pomáha takové aplikaci jako Mozilla. Přitom v 99% případu úplně zbytečně, protože v child procesu po forku obvykle následuje exec. To je tak težké doplnit do kernelu funkci, která by dělala něco jako spawn ? (nějaký náznak snad slibuje vfork).
2. posedlost forkem v Linuxové komunitě zašla tak daleko, že i theady se delaji s pomocí fork. Sice se tak nepodařilo splnit v plnem rozsahu ani gumové specifikace POSIXu, ale to vyvojaře Linuxu zas až tak natrápi. Hlavně že se Linus může tvářit že thread a proces je to same. Přestava že by existovalo neco jak PID procesu a PID threadu je zřejmě ďábelský vynalez zlého Billa a je třeba tomu odolávat do hořkého konce. (už nastal)
3. fork byl vymyšlený pro stroj s tak malým množstvim paměti, ze současně na něm běžel vždy jen jeden proces. Tam je to logické a správné dělat takhle. Tyhle mašinu už ale nejsou ani v bazarech, tak snad by se mohlo trošku pokročit ne ?
4. Proboha proč by systém měl držet v paměti popisovač procesu donekonečna jenom proto, že se nenašel někdo kdo na něj čekal. Na 90% všech procesů nikdo nikdy čekat nepotřebuje. Ani na konsole. Stači dočíst pipu. Copak je normální předpokládat, že ten čekající proces může býž právě jeden. Wait funce jako globální bez parametrů procesu (zřejmě čeká na poslední ?). To jsem moc zvědavý jak to funguje na Linuxových threadech. Uvidíme příští díl.
1) Ano musi. Ale ve srovnani s tim, co vsechno musi udelat exec to neni az zas tak strasne znat. BTW nema nekdo statistiku, jak casto se po forku vola exec? IMHO to zdaleka 99 % nebude. Ale vetsi pruser je to, ze pomoci fork a exec snadno nasimuluju CreateProcess ale naopak to jaksi moc nejde.
2) Pod WinNT mame procesy a thready. Pod Linuxem toto deleni je trochu jemnejsi (man clone). Pak je tak trochu problem rici pokud uz to je jenom thread a odkdy uz to je novy proces. Oddeleni cisel procesu a threadu je uz jen kosmetika ktera neni zajimava. Linus se nikdy prilis neohlizel na nejake specifikace a zda se ze se to na Linuxu projevilo spis kladne :-).
3) Pokud to nicemu nikde nevadi (nebo alespon ne prilis) tak proc to resit? Ze je to pro cloveka neznajiciho nic jineho nez Windows kulturni sok? To on prechod od UNIXu na Windows taky.
4) Umoznuje to necekat na potomka a elegantne tuto zalezitost prehodit na sveho predka. To se muze obcas hodit. V praxi s tim evidentne zadne problemy nikde nejsou. Proste ve Windoes je nutne doplnit CloseHandle(ProcessStruct.hProcess); CloseHandle(ProcessStruct.hThread); a pod Linuxem zaregistrovat obsluhu signalu. Kde je proboha problem?
Ale vzdyt "zombie" existujou i pod NT. Pokud neuvolnis handly tak existujou dokud se neukonci proces, prestoze uz je davno nepouzivas. V tomhle sou ty systemy stejny (na rozdil od Win9x ktery ty prostredky neuvolni ani pri ukonceni procesu).
Zkus si na NT vytvorit thread (cimz dostanes jeho handle), pak ho ukonci ale neuvolnis ten handle - prave si udelal Win verzi zombie. Pokud si myslis ze se handly automaticky uvolni pri ukonceni threadu tak prestan na par tydnu programovat a precti si neco o tom jak ty systemy (NT rada v tvym pripade) funguji.
No přesně, když vytvářím na NT proces/thread a návratový kod mě nezajímá, zavolám na vrácenem handlu CloseHandle() a tím to pro mě končí. Tohle na Linuxu težko půjde. Místo toho musím zavolat pro každý vytvořený proces potenciálně blokující funkci wait() jenom proto, abych ze systému vymetl zombie. Jestli vam tohle připadá jako lepší řešení tak už se nedivím ničemu.