abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 02:43 | Zajímavý článek
V květnu měla internetová aukční síň eBay bezpečnostní problém (zprávička). Po čtyřech měsících zveřejnil portál The Hacker News detaily útoku. Hesla uživatelů bylo možné resetovat bez jejich vědomí. [CSIRT.CZ]
Ladislav Hagara | Komentářů: 0
dnes 02:41 | Zajímavý projekt
V akci Humble Bundle for PC and Android 11, která potrvá do 7. října, si můžete za vlastní cenu koupit multiplatformní hry Thomas Was Alone, Bridge Constructor Playground, Cubemen 1 a 2 a při platbě vyšší než průměr Small World 2 s přístupem k DLC Days of Wonder, první tři díly série Blackwell – pokud to bude přes $11, dostanete navíc Surgeon Simulator a Anomaly Defenders; další hry přibudou později. Vše je k dispozici bez DRM, včetně OST a platbu můžete rozdělit mezi vývojáře, organizátory a charitu (Electronic Frontier Foundation nebo Child's Play).
davkol | Komentářů: 0
včera 20:39 | Pozvánky

Ostravská Python komunita úspěšně pořádá Pyvo již skoro rok. Za tu dobu jsme probrali spoustu zajímavých témat, pomohli mnoha nováčkům i studentům a několikrát nás navštívili i zahraniční hosté. Držíme se tradice prvních čtvrtků v měsíci, a tak bude naše následující setkání ve čtvrtek 2. října. Tématem tentokrát bude tvorba modulů a knihoven v Pythonu a jejich publikace v PyPI. Všechny předešlé i následující termíny můžete nalézt na portálech srazy.info či lanyrd.com, ten aktuální pak i na facebooku. Těšíme se na Vás.

frenzymadness | Komentářů: 0
včera 14:03 | Upozornění
Podoba programu 9. ročníku konference OpenAlt (dříve LinuxAlt) čeká do 1. října na vaši volbu. Hlasování vás bude stát chvíli času - sešlo se 62 témat. Spolek OpenAlt tímto za sebe i budoucí účastníky děkuje všem, co jsou připraveni se 1. a 2. listopadu 2014 podělit o své vědomosti a dovednosti s open source nadšenci. Program i registraci zveřejníme 8. října.
Ladislav Nešněra | Komentářů: 2
včera 10:35 | Nová verze
Komunita kolem Linuxu From Scratch (LFS) vydala Linux From Scratch 7.6. Nová verze knihy s návody na instalaci vlastního linuxového systému ze zdrojových kódů přichází především s Glibc 2.20 a GCC 4.9.1. Od verze 7.5 (zprávička) bylo aktualizováno 26 balíčků a přidáno 8 balíčků (Changelog). Vydána byla také verze Linuxu From Scratch se systemd. Současně bylo oznámeno vydání verze 7.6 knihy Beyond Linux From Scratch (BLFS). Ta obsahuje například LibreOffice 4.3.1, MesaLib 10.2.7 nebo KDE 4.14.1.
Ladislav Hagara | Komentářů: 10
22.9. 20:27 | Pozvánky
Ve středu 1. října se od 18.00 v místnosti A318 v prostorách Fakulty informatiky Masarykovy univerzity v Brně bude konat pravidelné setkání Czech JBoss User Group. Tentokrát bude mít Tadeáš Kříž přednášku na téma "UnifiedPush Server: Mobile Push Middlewar". Podrobné informace naleznete na stránce akce.
Vojtěch Trefný | Komentářů: 0
21.9. 19:50 | Zajímavý projekt
Na serveru boycott systemd přibyl odkaz na projekt uselessd (Bitbucket). Jedná se o fork systemd verze 208. Cílem projektu je ze systemd odstranit části, které nesouvisí s initem (journald, udevd, ...) a naopak přidat podporu standardních knihoven jazyka C jako musl a uClibc a také podporu BSD systémů. [Slashdot]
Ladislav Hagara | Komentářů: 238
21.9. 15:31 | Zajímavý software
WebUpd8 představuje AntiMicro 2.6, nejnovější verzi grafické utility pro nastavení tlačítek na gamepadu. Pomocí AntiMicra lze na tlačítka gamepadu namapovat stisky kláves a tlačítek myši a následně pomocí gamepadu ovládat hry, nebo libovolné aplikace, jež s podporou gamepadu vůbec nepočítají.
Ladislav Hagara | Komentářů: 0
19.9. 16:01 | Zajímavý software
Libre Graphics World informuje o aplikaci BirdFont, jež slouží k tvorbě fontů, které je možné exportovat ve formátech TTF, EOT a SVG. Program je dostupný pod licencí GNU/GPL a je navíc multiplatformní, neboť kromě Linuxu podporuje i Windows, Mac či OpenBSD.
xkomczax | Komentářů: 31
19.9. 13:02 | Komunita
Na zítra připadá letošní Software Freedom Day (Wikipedia). Kolik podpůrných akcí se koná v Česku a na Slovensku? Dle aktuální mapy akcí žádná.
Ladislav Hagara | Komentářů: 5
Hlasuji z:
 (82%)
 (13%)
 (3%)
 (2%)
 (0%)
 (0%)
Celkem 3696 hlasů
 Komentářů: 45, poslední 21.9. 11:10
Rozcestník
Reklama
Autoškola testy online Levný benzín

Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)

5. 3. 2012 | Luboš Doležel | Jaderné noviny | 4009×

Aktuální verze jádra: 3.3-rc4. Citát týdne: David Miller. Náprava ABI sys_poll(). dma-buf a proprietární moduly. Oracle nabízí DTrace pro Linux. Co dělat se sleep(0).

Obsah

Aktuální verze jádra: 3.3-rc4

link

Aktuální vývojová verze jádra je 3.3-rc4 vydaná 18. února, což je o pár dnů později, než se čekalo. Tentokrát je důvodem pro zpoždění to, že nám trvalo několik dnů, než jsme vystopovali narušování stavu plovoucích čísel, ke kterému docházelo na 32bitovém x86 – ale jen pokud jste měli moderní CPU (proč pak používáte 32bitová jádra?) s podporou instrukcí AES-NI. A pak jste museli zapnout podporu těchto instrukcí *a* použít bezdrátový ovladač, který jich využívá. Nejpravděpodobnějším důvodem je používání infrastruktury mac80211 s WPA se šifrováním AES (tedy typicky WPA2). Dále se dostalo i na řadu dalších oprav; krátký seznam změn najdete v oznámení.

Stabilní aktualizace: verze 3.0.22 a 3.2.7 byly vydány 20. února; obsahují obvyklý výčet důležitých oprav.

Citát týdne: David Miller

link

Když napíšete

if (ret) {
        one_line_statement();
}
tak někde umře štěňátko. A lidi od DRM právě odrovnali celý útulek.

-- David Miller

Náprava ABI sys_poll()

link

Systémové volání poll() má tři parametry, jedním z nich je hodnota časového limitu (timeout), která určuje horní mez (v milisekundách) toho, jak dlouho bude proces čekat. Manuálová stránka říká, že typem této hodnoty je int. Z důvodů, které už dávno zapadly v historii, interní jaderná implementace poll() vždy očekávala hodnotu časového limitu v podobě long. A to bylo zdrojem občasných bugů.

Většinou to funguje, jak má. Typy int a long jsou na většině architektur shodné a pokud už se liší, tak se glibc postará o příslušnou změnu se zachováním znaménka. Pokazí se to ale právě tehdy, když 32bitový proces běží na systému x86-64. V tomto případě 32bitová funkce sys_poll() předá hodnotu nativnímu jadernému protějšku jen tak, aniž by docházelo ke znaménkové úpravě. Takže pokud je hodnota záporná (značící, že poll() může klidně čekat donekonečna), jádro místo ní uvidí velkou kladnou hodnotu.

Problém se dá opravit několika způsoby. Linus se rozhodl pro změnu parametru časového limitu na int v jádře. Díky tomu, že teď je timeout 32bitovou hodnotou na všech systémech, je hned o jednu příčinu zmatků méně. Tento přístup má ale jedno drobné riziko: nelze vyloučit, že existuje nějaká aplikace, která skutečně používala 64bitové timeouty. Aby taková aplikace mohla fungovat, znamenalo by to obcházení glibc (protože její operace se znaménky používání 64bitových hodnot znemožňuje), tudíž je nepravděpodobné, že se s tím někdo někdy obtěžoval, ale kdo ví. Pokud by tato změna nějakou skutečnou aplikaci porouchala, musel by se patch zase odstranit a muselo by se najít nějaké komplikovanější řešení.

Linusův patch byl začleněn do verze 3.3-rc5, takže máte několik týdnů na vyjádření svých obav.

dma-buf a proprietární moduly

link

Mechanismus pro sdílení bufferů DMA byl zařazen do jádra verze 3.3; jde o možnost, jak pod taktovkou uživatelského prostoru umožnit sdílení bufferů DMA mezi nezávislými ovladači zařízení. Patche dma-buf v podobě, v jaké byly začleněny do verze 3.3, obsahují řadu funkcí, které ovladače používají pro přístup k takovým bufferům; tyto funkce jsou exportovány jako „pouze pro GPL“. Kvůli tomu se ozval Robert Morell z NVIDIA, kterému se pochopitelně nelíbilo, že by toto rozhraní nebylo přístupné proprietárnímu ovladači z dílny jeho firmy.

Moc čtenářů asi nepřekvapí, že reakce na Robertovu stížnost nebyly zrovna plné pochopení. Po chvíli diskuze utichla bez jakéhokoliv řešení. Nedávno ale Rob Clark zpravil svět o debatě, která proběhla na Embedded Linux Conference:

V reakci na proběhlou debatu musím souhlasit, že infrastruktura dma-buf je zamýšlena jako rozhraní mezi subsystémy ovladačů. A protože (prozatím) veškerá podpora pro ARM SoC GL bohužel znamená používání uzavřeného kódu v uživatelském prostoru a protože považuji uživatelský prostor a jádro v oblasti grafických ovladačů za úzce provázané, nemyslím si, že se zde můžeme odvolávat na nějaký zavedený morální standard. Tudíž nemohu namítat proti tomu, aby se místo EXPORT_SYMBOL_GPL() objevilo EXPORT_SYMBOL().

Od té doby se o tom už nemluvilo; stejně tak se ani v jádře nic ohledně těchto funkcí nezměnilo. Změna tónu ve výše citovaných větách může znamenat, že se snad postoje lidí obměkčují a že API pro sdílení bufferů bude nakonec dostupné i pro proprietární moduly.

Oracle nabízí DTrace pro Linux

link

Oracle oznámil dostupnost betaverze trasovacího frameworku DTrace, který byl přeportován na jejich „Unbreakable Enterprise Kernel“. Ohledně toho, jak port funguje nebo jak se používá, se tohoto teď moc neví; linuxové fórum DTrace zatím zeje dost prázdnotou. Ukázka použití je ale k mání v blogovém zápisku od Wima Coekaertse.

Co dělat se sleep(0)

link

Obecně platným pravidlem vývojářů jádra je vyhýbat se rozbíjení kódu v uživatelském prostoru, i když je takový kód často vnímán jako principiálně špatný. Ale jsou tu i výjimky; nedávná debata týkající se chování časovače může být ukázkou, jak k takovým výjimkám může dojít.

Standardní céčková funkce sleep() má tu definici, že uspí volající proces na alespoň tolik sekund, kolik bylo určeno. Člověk by si mohl myslet, že volání sleep() s argumentem nula asi moc nedává smysl; proč uspávat procesor na 0 sekund? Jenže se ukázalo, že někteří vývojáři dělají taková volání, aby se CPU na chvilku vzdali. Smyslem je chovat se slušně a před pokračováním v práci nechat krátce běžet i jiné procesy. Aplikace, které dělají polling nebo jsou z jiného důvodu náchylné k přílišnému vytěžování CPU, jsou často „napravovány“ voláním nulových sleepů.

Bylo nebylo za horami v zemi Linuxu, sleep(0) vždy uspával volající proces na alespoň jeden ti(c)k hodin. S příchodem časovačů o vysokém rozlišení do jádra se toto chování změnilo; pokud proces požádal o uspání na vypršeném časovači (což je situace sleepu na nula sekund), volání se jednoduše vrátilo zpět do volajícího procesu. Pak bylo přidáno polevování časovačů [timer slack], které může protáhnout čekání s cílem probouzet najednou hned několik procesorů. Toto chování způsobuje to, že časovače běží o trochu déle, než se žádalo, ale výsledkem je méně probouzení procesorů a tudíž úspora energie. V případě sleepu na nula sekund přidání polevování časovačů mění vypršený časovač na nevypršený časovač, takže volající proces je opět uspáván.

Výchozí polevování trvá 50 µs, takže je nepravděpodobné, že by to ve většině aplikací způsobovalo viditelné změny. Ale zdá se, že na některých systémech je tato hodnota nastavena trochu moc vysoko – v řádu sekund – aby se dosáhlo největších úspor energie. To pak odpovídajícím způsobem může prodloužit sleep a tedy aplikace trochu porouchat.

Matthew Garrett, který zastává názor, že není dobré aplikace rozbíjet, zaslal patch, který sleepy na nula sekund speciálně ošetřuje. Myšlenka je prostá: pokud je požadovaný čas nulový, polevování se mu vyhne a proces nebude uspáván po neurčitou dobu. Problémem tohoto přístupu k věci je to, že proces stále nedocílí kýženého výsledku: namísto vzdání se procesoru jen dojde ke zbytečnému systémovému volání a proces bude zase pokračovat v tom, co dělal doposud. Bez polevování časovačů se požadavek na uspání nad vypršeným časovačem vrátí hned zpátky do uživatelského prostoru, aniž by jakkoliv prošel plánovačem.

Alternativou by bylo přeměnit volání sleep(0) na volání sched_yield(). Jenže tento nápad se netěší popularitě mezi vývojáři plánovače, kteří si myslí, že volání sched_yield() jsou téměř vždy špatný nápad. Říkají, že je lepší opravit aplikace tak, aby přestaly dělat polling nebo obecně to, o čem si vývojáři myslí, že je dobrým důvodem k explicitnímu vzdávání se procesoru.

Podle Matthewa se to týká nemalého množství aplikací:

Testování na Fedoře odhalilo přibližně 125 balíčků z 11000 nebo tak nějak, takže přibližně 1 % uživatelského prostoru v některých situacích používá sleep(0). Všechno v distribuci asi opravit můžeme, ale i tak to znamená, že je na světě znatelné množství kódu, které je porouchaný.

Obvyklým přístupem při vývoji jádra by bylo vyhnout se rozbíjení těchto aplikací. I když aplikace závisí na nedefinovaném nebo nedokumentovaném chování – což je rozhodně tato situace – je stále lepší, když aktualizace jádra nepromění funkční kód v rozbitý. Někteří účastníci se vyjádřili v tom smyslu, že by se tak mělo postupovat i tentokrát.

Situace kolem sleep(0) se ale od jiných trochu liší. Vývojáři aplikací se v tomto případě nemohou odvolávat na dlouhodobě funkční chování, protože během poslední desítky let se reakce jádra na sleep(0) několikrát změnila. A podle Thomase Gleixnera je těžké poznat, kdy by se k takovému volání mělo přistupovat jinak nebo co by se mělo dělat:

Krucinál, nemůžeme přece dát dohromady rozumnou definici, jak takovou věc odlišně ošetřit, protože prostě není ani možné udělat jasnou hranici, co je zvláštní případ a co ne. A neexistuje žádná rozumná definice, co dělat – hned se vrátit nebo projít přes schedule() nebo něco jiného.

Thomas má obavy, že by se pak lidé mohli dovolávat zvláštního ošetřování u podobných volání – například u nanosekundové obdoby nanosleep() – a výsledkem by pak bylo hromadění nepořádku v hlavním kódu časovače. Takže než abychom se snažili tyto případy definovat a donekonečna museli výsledek tohoto snažení udržovat, si myslí, že bychom měli v případech, kdy je polevování časovače nastaveno na velkou hodnotu, nechat postižený kód svému osudu. A v tomto bodě diskuze odezněla, což znamená, že se ohledně omezení dopadu polevování časovače asi nebude nic dělat.

       

Hodnocení: 100 %

        špatnédobré        

Nástroje: Tisk bez diskuse

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

5.3.2012 01:36 aaaaaaaaaaaaaaaa
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)

Preco je sched_yield() spatny napad? Ja som ho napriklad pouzil vo viacvlaknovom programe, ked mi pri specifickej datovej strukture (kt. si konzistenciu zarucovala sama) nastala kolizia a nechcel som, nech sa 1 vlakno so "spinlockom" toci dlhu dobu (toto tocenie v cykle program viditelne spomalovalo). "Klasicke" zamykanie a semafory som nemohol pouzit, lebo ich obsluha bola pomerne draha v pripade, ze kolizia nenastala. sched_yield() nielenze zabranilo vytazovaniu CPU tocenim sa v cykle, ale zaroven to zrychlilo aj vykonavanie programu - pravdepodobne preto, lebo sa dostalo druhe vlakno na radu skor.

Pravdupovediac, veci ako sleep(0) by ma nikdy nenapadli, lebo sa mi zdaju byt nelogicke, uz pri precitani nazvu. Na prvy pohlad ide o nahodne side efekty a teda sa na ne neda spolahnut. Urcite by som sa s tym netrapil, ako opisani vyvojari.

5.3.2012 05:14 bflmpsvz
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
sched_yield() je špatné proto, že když ten proces má realtimovou prioritu, tak ho neuspí, prostě bude dál provádět realtimový proces s nejvyšší prioritou. Čili když budeš pomocí sched_yield() synchronizovat realtimový a nerealtimový proces nebo dva realtimové procesy s různou prioritou, tak to může vytuhnout. Může se stát, že proces s vyšší prioritou bude pořád dokola volat sched_yield(), čekat na uvolnění zámeku, zatímco proces s nižší prioritou (který by eventuálně mohl ten zámek uvolnit) nebude nikdy spuštěn.

Pokud čekáš na událost opakovaným testováním, je lepší tam dát sleep třeba na tisícinu sekundy. To bude fungovat i když uživatel nastaví realtimovou prioritu těch procesů.
6.3.2012 09:27 Atom321 | skóre: 20
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Pokud se zámek volá 100000x za sekundu a v 1% dojde ke kolizi, bude takový program jen čekat.

Na synchronizaci přístupu jsou funkce pthread_mutex_lock()/pthread_mutex_unlock().
6.3.2012 11:42 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
pthread_mutex funkce jsou systémově velice náročné, u míst, kde se nepředpokládají časté kolize, ale je potřeba často zamykat (typicky u konfigurace aktualizované přes RCU), se používají user-space spinlocky + pthread_yield, když už to selže. Nicméně mnoho vývojářů jaksi zapomíná, že na to musí mít všechna vlákna stejnou prioritu. No alespoň že na Linuxu jsou futexy.
6.3.2012 12:37 Atom321 | skóre: 20
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Spinlock má smysl, jen pokud kolidující thready běží na různých CPU. S pthread_yield() nijak nezaručíte, že scheduler přepne právě na thread držící zámek. Nebo ještě hůře, druhý thread může zámek pustit, chvíli něco dělat, pak znovu zamknout. V tu chvíli vyprší čas a scheduler znovu přepne ...

Na Linuxu tohle všechno řeší novější implementace pthread_mutex_lock() knihovny NPTL, která nejprv zkouší rychlou cestu v userspace (test&set), při kolizi použije čekací frontu přes syscall futex().
6.3.2012 14:02 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
U RCU se spinlock exkluzivně zamyká jenom ve chvíli, kdy se dělá update, takže tam by s tím problém nebyl, update je výjimečný a pravděpodobnost, že nastane dvakrát za sebou ve stejném vlákně, je prakticky nulová.

NPTL používá test&set? Hmm, tak to by stálo za to pthread mutexy opět začít používat :-)
6.3.2012 15:39 Jindřich Makovička | skóre: 9
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Někdy je ale potřeba dát pozor na to, že se NPTL mutexy chovají trochu nevyzpytatelně. Třeba zkoušíte přidávat klienty vašeho serverového procesu, proces v pohodě běží a zabírá 50% cpu, načež přihodíte jednoho dalšího klienta, server se úplně zastaví a cpu load je 100%. To proto, že převážily kolize a veškerý CPU čas se najednou tráví ve futex_wake().
6.3.2012 18:48 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Stejný problém mají spinlocky, snadno se může stát, že vláken je příliš mnoho a procesorů málo, a pak to tráví hodně času přepínáním kontextů (nebo čekáním na změnu hodnoty, pokud je to pure user-space spinlock), takže s tím problém nemám, to si zvládne ohlídat thread pool.
6.3.2012 15:55 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
U RCU se spinlock exkluzivně zamyká jenom ve chvíli, kdy se dělá update, takže tam by s tím problém nebyl, update je výjimečný a pravděpodobnost, že nastane dvakrát za sebou ve stejném vlákně, je prakticky nulová.

Moc nerozumím tomu, k čemu je na RCU potřeba zamykat čtení. Na to by přeci měla stačit atomická proměnná.
6.3.2012 18:44 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Pokud je paměť uvolňována asynchronně, tedy uvolňuje ten, kdo čte, tak stačí atomická proměnná, pokud ji ale chcete uvolňovat synchronně (tj. vědět, kdy už všichni používají novou verzi), tak je potřeba zamykat.
6.3.2012 18:49 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Btwe. spinlocky jsou implementované pomocí atomických proměnných
6.3.2012 23:56 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Otázka je, zda synchronní uvolňování má jakoukoliv zajímavou výhodu, speciálně takovou, která by vyvážila cenu zamykání.
7.3.2012 11:51 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Zamykání pro čtení je u spinlocku velice levné, protože to je jen inkrementace atomické proměnné, což u RCU musíte dělat stejně. Výhodou může být třeba to, že víte, že nějaký logovací nebo dumpovací soubor už nemůže být otevřený, a tak ho můžete odeslat přes síť nebo zagzipovat, nebo že můžete smazat nějakou tabulku v databázi, kterou už nebudete potřebovat. U samotné aplikace by to vyřešil destruktor té sdílené struktury, ale když to třeba chcete provázat se shellem nebo nějakou webovkou, tak se taková možnost synchronizace hodí.
7.3.2012 19:31 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Zamykání pro čtení je u spinlocku velice levné, protože to je jen inkrementace atomické proměnné,
Jen? Inkrementace atomické proměnné je docela drahá operace, protože zpusobuje, že si procesory příslušný cacheový řádek pinkají mezi sebou po poměrně pomalé sběrnici.
což u RCU musíte dělat stejně.
Opravdu? Nestačí mi atomickou proměnnou číst?
7.3.2012 20:14 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Jen? Inkrementace atomické proměnné je docela drahá operace, protože zpusobuje, že si procesory příslušný cacheový řádek pinkají mezi sebou po poměrně pomalé sběrnici.
Ve srovnání s voláním jádra, co dělají semafory a dělaly mutexy, je to velmi levné.
Opravdu? Nestačí mi atomickou proměnnou číst?
A kdo bude uklízet?
7.3.2012 22:58 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Ve srovnání s voláním jádra, co dělají semafory a dělaly mutexy, je to velmi levné.
To ano, ale dá se obejít i bez toho.

(Mimochodem, pod Linuxem by ani semafory neměly v případě, že nečekají, volat jádro.)
A kdo bude uklízet?
Dá se to udělat například tak, že každé vlákno jednou za čas projde nějakým synchronizačním bodem, ve kterém je jisté, že zrovna do žádné datové struktury nekouká, a přitom zvýší per-thread čítač. Uklízecí vlákno pak po čase podle čítačů zjistí, že do staré verze struktury už dávno nikdo nekouká, a uvolní ji.
8.3.2012 14:35 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny - 23. 2. 2012: Co dělat se sleep(0)
Takže garbage collector? To je ale výkonově o dost pomalejší, ne? Ten čítač čtenářů se, když je dobře udělaný, zvyšuje jenom jednou na každý update.
5.3.2012 10:09 Ivan
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
kdysi probihala dodobna debata na openldap devel. Tam si nekdo stezoval na "usleep(0)" a chtel to nahradit za pthread_yield. Kdyz shrnu tu debatu tak odpoved byla "Protoze Solaris".
6.3.2012 17:08 Michal Kubeček | skóre: 69 | Luštěnice
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
S těmi složenými závorkami kolem jednořádkových větví bych to neviděl tak jednoznačně. Některé projekty je v coding style naopak nařizují - a docela chápu proč. Komu se ještě nikdy nestalo, že z nepozornosti přidal druhý příkaz a zapomněl na složené závorky, ať hodí kamenem (netýká se neprogramujících).
6.3.2012 17:26 Radovan Garabík
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Komu se ještě nikdy nestalo, že z nepozornosti přidal druhý příkaz a zapomněl na složené závorky, ať hodí kamenem.
Možno kedysi veľmi dávno, ale odkedy používam počítačový jazyk so syntaxou pre normálnych ľudí, tak sa mi to nestalo :-)
6.3.2012 17:33 Michal Kubeček | skóre: 69 | Luštěnice
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Přejít kvůli tomu na jazyk se syntakticky významným formátováním mi připadá jako řešit mírně slanější polévku tím, že do ní nakapu tabasco…
6.3.2012 18:49 Lol Phirae | skóre: 21
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
A o tom, že syntakticky "významné" je odsazování, je pak raději taktně pomlčet. :-(
msk avatar 8.3.2012 15:04 msk | skóre: 26 | blog: msk
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
No, to si si teda fakt pomohol ... :-)
Luboš Doležel (Doli) avatar 6.3.2012 21:34 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Mně. Závorky, když tam jsou, dávám na samostatný řádek a opravdu jsem se nepřehlédl. Mám vizuálně naučené tam v případě více příkazů čekat jakési odsazení...

Samozřejmě, když se musím hrabat v cizím kódu, kde je if(...) {, tak to je jiné, ale v tom se radši ani nehrabu.
6.3.2012 21:48 Michal Kubeček | skóre: 69 | Luštěnice
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)

Myslel jsem spíš chyby typu

   if (cond)
     do_something();
+    do_something_else();
   go_on();

případně

   if (cond)
+    do_something_first();
     do_something();
   go_on();

Právě tomu používání složených závorek i u jednořádkových větví docela účinně předchází.

6.3.2012 22:29 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Závorky by měly být ze zákona, ehm, totiž ze syntaxe, povinné. Jako příjemný bonus to řeší gramatickou nejednoznačnost známou též jako dangling else :-)
Ještě na tom nejsem tak špatně, abych četl Viewegha.
Luboš Doležel (Doli) avatar 6.3.2012 23:31 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Psát kód jako
if (...)
{
    neco();
}
ten kód znatelně protáhne... Stačí jen pár takových ifů pod sebou.
7.3.2012 08:51 Atom321 | skóre: 20
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
A co je tak zásadně špatného na delším kódu?
7.3.2012 09:15 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Už delší dobu pozoruji, že má rychlost porozumění kódu rapidně klesá s klesající hustotou. Co se nevejde najednou na obrazovku, o tom se přemýšlí daleko hůř. Kompaktní Céčkové zdrojáky (tím nemyslím psané nesmyslně nahuštěně, ale prostě bez zbytečných děr) se čtou příjemně. Pokud přibude spousta celořádkových triviálních komentářů, je to znatelně horší. Vrcholem jsou programy v Javě rozdělené na desítky naprosto triviálních tříd plných triviálních metod, navíc každá třída v jiném souboru, ty se nedají číst vůbec.
7.3.2012 10:02 Atom321 | skóre: 20
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Možná máte jen malý monitor :-)

V zásadě s vámi souhlasím, jen některé "díry" nepovažuji za zbytečné. Pro snadnější čitelnost mi dost pomáhá zarovnání párových závorek pod sebou a jistá uniformita zdrojáku. Prostě pod každým if automaticky očekávám blok ve složených závorkách. Je to ale nejspíš jen síla zvyku.
Heron avatar 7.3.2012 10:28 Heron | skóre: 49 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Jenže právě proto, že jsou to triviální metody, je celá jejich funkce popsána jejich názvem, takže netřeba číst jejich kód. Takový zdroják se mi naopak dobře čte - metoda o 5 řádcích z toho 3 řádky jsou volání jiných metod a vše plyne už z jejich názvu.

Na jednu obrazovku? Metoda delší než pár řádků (5) si zaslouží minimálně zamyšlení nad možností refaktoringu. Někde to nejde, většinou jo.
7.3.2012 16:17 Gilhad | skóre: 19 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
S tim jsem se uz setkal a bylo to na zabiti - autor se zhlednul v 3 radkovych funkcich, kazdy funkcni kousicek kodu byl zanoreny minimalne v urovni 5 a nedalo se v tom absolutne vyznat. Navic, aby to dokazal takto udrzet, tak skoro vsechno melo nejake vedlejsi efekty. od vypadal uhledne, chyba v nem najit nesla, jenom nefungoval a nevyznal se v nem po par tydnech ani sam autor.

Takze jsem to pak prepsal do neceho, s cim uz se dalo pracovat, vetsina funkci se vesla na jednu obrazovku a delala nejaky rozumny kus prace. Kdyz to nekde vyhodilo chybu, byl zdroj chyby nejspis v okolnich 10 radcich, nikoli v jinem souboru. Zajimave je, ze se vtom dokazi orientovat i jini nez autor a ze je to i po nekolika letech citelne.
Heron avatar 7.3.2012 16:27 Heron | skóre: 49 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
tak skoro vsechno melo nejake vedlejsi efekty

Jestli má 3 řádková metoda vedlejší efekt, tak to už musel být skoro kouzelník :-D

Kdyz to nekde vyhodilo chybu, byl zdroj chyby nejspis v okolnich 10 radcich, nikoli v jinem souboru.

Jsem si vždy myslel, že výjimky vznikají v metodách a ne souborech. Zase jsem se něco naučil.

7.3.2012 17:37 Gilhad | skóre: 19 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Ja aspon povazuju u metody co patri do nejake tridy a ma vratit nejake datum za vedlejsi efekt, kdyz do globalni promenne priradi databazi, kterou otevre s hard-coded jmenem databaze, uzivatele a heslem. Nacez zcela jina metoda jine tridy se spolehne na to, ze prez tu globalni promennou se dostane k otevrene databazi

vyjimky vznikaji v metodach, chyby vznikaji v kodu, pad programu vypise chybu a udeje o tom, co se nepovedlo. Pokud se treba nepovede v jedne metode zvysit hodnotu promenne o jedna, protoze ona hodnota je nedefinovana a promenna dostane prirazenou hodnotu ve zcela jine metode, co je umistena ve zcela jinem souboru, ale dostane ji pouze v 9 pripadech z 10 protoze jedna vetev if-u je nedoresena, tak je zdroj chybu v tom souboru s nedomyslenou inicializaci, ale chyba se projevi v souboru, kde se ta hodnota zvysuje. Protoze vetsinou neni kod programu a vsech knihoven jen v jednom jedinem souboru.

v nove verzi, pokud to nekde spadlo, tak misto vzniku chybu (neosetreni cehosi) bylo vetsinou jen par radku od mista projevu chyby. Cimz se hledani dost usnadni, pokud clovek nemusi prolezt deset souboru, nez se dostane ke zdroji, ale zdroj je jen o par radku vys, nez to, kde se chyba projevi.
Heron avatar 7.3.2012 17:56 Heron | skóre: 49 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)

Ten původní kód psalo prase, bez ohledu na to, že dodržovalo nějaké doporučení. Délka metod nemá nic společného s tím, kdy metoda kromě návratu hodnoty také cosi nastaví (nebo naopak nenastaví). Metoda má dělat jen jednu věc a ta věc by měla odpovídat názvu.

promenna dostane prirazenou hodnotu ve zcela jine metode, co je umistena ve zcela jinem souboru

Já v Javě pojem "proměnná v jiném souboru" opravdu neznám. Proměnná je v nějakém objektu (tedy atribut; field), nebo může být v dané třídě statická. Nevím, který z těchto dvou případů to byl, zřejmě se jednalo o nějakou statickou nefinální proměnnou s přístupem public... Jak jsem psal, ten kód psalo prase.

pokud to nekde spadlo, tak misto vzniku chybu (neosetreni cehosi) bylo vetsinou jen par radku od mista projevu chyby

Podle stacktrace se to dá někdy snadno vypátrat (někdy samozřejmě ne), nez ohledu na počet tříd.

7.3.2012 21:51 petr_p | skóre: 58 | blog: pb
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Délka funkce vliv má. Čím je funkce kratší, tím roste potřeba předávat data mimo funkci (protože lexikální platnost proměnných). Data(lze, předávat, přes, parametry), schovat.do.struktury.v.objektu nebo odložit do globální proměnné, tedy způsobit vedlejší efekt. Jakýkoliv zápis přesahující rozumné meze je zrůdný.
7.3.2012 23:14 Gilhad | skóre: 19 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Samozrejme to byl pripad treti, slo o promennou nalezejici modulu, nikoli nejake tride ci objektu.

Nevim, kde jsi prisel na to, ze by to melo byt v jave. (Zvlast kdyz vlakno zacinalo Cckem). Objekty mely jazyky pred javou a maji jazyky i po jave a na spoustu veci java neni az tak vhodna.

Psat slusne se da v cemkoli, prasit taky.

Podle stacktracu vypatram, kde se inkrementovala promenna bez hodnoty, ale nikoli kde programator udelal chybu v uvaze a vynechal jednu moznou kombinaci pri ktere pak nedoslo k nastaveni dotycne hodnoty nekde zcela jinde, nez se ji pak pokousel inkrementovat.

---

Problem je ze spousta prasat se schovava za poucky, jak ma spravne kod vypadat, aniz by resili proc tomu tak ma byt. Argument "musim pouzivat globalni promenne, jinak by mi vychazely volani moc dlouha a funkce s prilis radky" asi mluvi za vse.

Nektere funkce na me pusobily dojmem, ze puvodne slo o jednu funkci, ktera byla moc dlouha tak proste rozdelil radky do skupin po peti a prohlasil to za funkce, dalsi vrstva volala tyto "funkce" po rade po peti a atd, atd. dokud nedosahl jedne funkce, ktera se vetvila na celou pyramidu. A ve skutecnosti slo o dlouhy flat-code o par urovni niz, jen umele rozdeleny do skatulek.
Heron avatar 8.3.2012 08:39 Heron | skóre: 49 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Nevim, kde jsi prisel na to, ze by to melo byt v jave.

Aha, za to se omlouvám, to poznámku o Javě a tomto způsobu psaní psal někdo jiný, ty jsi potom volně pokračoval o C.

Jinak v podstatě souhlas, pokud někdo používá poučky ad absurdum, k ničemu dobrému to nevede.

8.3.2012 15:04 Gilhad | skóre: 19 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Ja ve skutecnosti volne navazal Pythonem :) Ale ono je to v podstate obecny, na jazyku nezavisly, problem.
8.3.2012 16:00 Jindřich Makovička | skóre: 9
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Dobře to popisuje ESR v The Art of Unix Programming. Když se problém rozdrobí moc, jednotlivé metody/třídy/moduly jsou sice triviálně jasné, ale složitost interakcí mezi nimi přeroste únosnou mez.
7.3.2012 19:38 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Jenže právě proto, že jsou to triviální metody, je celá jejich funkce popsána jejich názvem, takže netřeba číst jejich kód. Takový zdroják se mi naopak dobře čte - metoda o 5 řádcích z toho 3 řádky jsou volání jiných metod a vše plyne už z jejich názvu.
Pak její zápis měří o 4 řádky víc, než je zdrávo. Daleko lepší je napsat:
method catch() { .bark; .bite; .tail.wag; }
Věnovat takovému štěku víc než jeden řádek je nestoudné plýtvání elektrony, prostorem ve Vesmíru i čtenářovou pozorností.
Někde to nejde, většinou jo.
Jenže i když to jde, často je to na škodu celkové čitelnosti kódu.

Nedává smysl optimalizovat na čitelnost jedné metody (zvlášť když nic zajímavého nedělá). Daleko důležitější je, jak je snadné pochopit celou třídu.
7.3.2012 19:05 Michal Kubeček | skóre: 69 | Luštěnice
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Vrcholem jsou programy v Javě rozdělené na desítky naprosto triviálních tříd plných triviálních metod, navíc každá třída v jiném souboru, ty se nedají číst vůbec.

No tak zrovna v tomhle ohledu na tom některé části linuxového jádra nejsou o moc lépe. Běžně se mi stává, že abych zjistil, co vlastně dělá určitá funkce, musím postupně projít čtyři funkce, na střídačku z adresáře příslušného subsystému a include. Při troše smůly se do toho zamíchá ještě nějaké těžko dešifrovatelné makro a když je smůly víc, tak jako bonus arch a include/asm.

7.3.2012 09:12 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
S tím budou souhlasit tak leda Pythonisti ;-)

Takže +1
When your hammer is C++, everything begins to look like a thumb.
7.3.2012 11:00 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Proboha! Asi jsem Pythonista! :-D
Ještě na tom nejsem tak špatně, abych četl Viewegha.
pavlix avatar 7.3.2012 13:28 pavlix | skóre: 48 | blog: pavlix
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Já asi taky! :D
msk avatar 8.3.2012 15:05 msk | skóre: 26 | blog: msk
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Závorky by měly být ze zákona
Suhlasim.
Luboš Doležel (Doli) avatar 6.3.2012 23:29 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Já tomu rozumím. Ale první případ se mi nestane nikdy, protože auto indent to hned odhalí, a tak či tak mě oba ihned praští do očí. Fakt se mi to nestalo. Než něco připisuju, tak úplně automaticky připíšu závorky.
6.3.2012 22:40 Jindřich Makovička | skóre: 9
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Dělám v kódu nepochybně spoustu bot, ale zrovna tenhle druh si nevybavuju už hodně dlouho. Při zapnutém automatickém odsazování je taková chyba okamžitě vidět.
Heron avatar 7.3.2012 10:31 Heron | skóre: 49 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Souhlasím a rozšířil bych to i na SQL. Jeden příkaz se provede v autocommit režimu, takže mnozí jej zapomínají ohraničit BEGIN a COMMIT. Jenže potom tam někdo přidá další query (a nebejbože nějaký příkaz na změnu dat) a hnedle jsou z toho dvě nezávislé transakce místo zamýšlené jedné.
7.3.2012 15:08 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Dík za vysvětlení, já jsem furt nechápal proč má to štěně chcípnout.
A popravdě, už jsem tedy zabil hodně štěnat…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
Voty avatar 7.3.2012 15:37 Voty | skóre: 11 | blog: gemini
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Uff, doufám, že pokud píšu stylem
if(...) {
  on_line_statement();
}      
tak chcípně vždy je 1/2 štěňátka.
Jednu rozbil a tu druhou ztratil.
8.3.2012 21:06 pjoter
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
Hm, kdyz uz, tak bud konzistetni
if (...) {
:)
8.3.2012 21:04 pjoter
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
A dalsi vec proc tam ty zavorky radeji davam je ta, ze pokud totiz tu cast kodu bez tech zavorek upravim a pridam k tomu jednomu radku nejaky dalsi kod (+ ty dve zavorky), tak to zbytecne pridava bordel do patche/commitu (dva radky zbytecne navic). Jinymi slovy to usnadnuje review.
8.3.2012 23:16 Martin Mareš
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
To nedává smysl, protože celková velikost obou patchů (ten, který kód založil, a ten, který ho modifikuje), zůstává zachovaná. Leda byste víckrát příkazy přidával a odebíral :)

Ale tak jako tak, přítomnost prázdných řádků nebo řádků se závorkami review patche prakticky nijak neovlivňuje.
18.3.2012 15:31 m;)
Rozbalit Rozbalit vše Re: Jaderné noviny – 23. 2. 2012: Co dělat se sleep(0)
s dtrace pre linux to nie je take horuce ani slavne .. http://dtrace.org/blogs/ahl/2012/02/23/dtrace-oel-update/

Založit nové vláknoNahoru

ISSN 1214-1267   Powered by Hosting 90 Server hosting
© 1999-2013 Argonit s. r. o. Všechna práva vyhrazena.