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 05:44 | Nová verze

    Unicode Consortium, nezisková organizace koordinující rozvoj standardu Unicode, oznámila vydání Unicode 17.0. Přidáno bylo 4 803 nových znaků. Celkově jich je 159 801. Přibylo 7 nových Emoji.

    Ladislav Hagara | Komentářů: 0
    včera 21:00 | IT novinky Ladislav Hagara | Komentářů: 0
    včera 18:33 | Nová verze

    Realtimová strategie Warzone 2100 (Wikipedie) byla vydána ve verzi 4.6.0. Podrobný přehled novinek, změn a oprav v ChangeLogu na GitHubu. Nejnovější verzi Warzone 2100 lze již instalovat také ze Snapcraftu a Flathubu.

    Ladislav Hagara | Komentářů: 2
    včera 12:22 | IT novinky

    Polské vývojářské studio CD Projekt Red publikovalo na Printables.com 3D modely z počítačové hry Cyberpunk 2077.

    Ladislav Hagara | Komentářů: 0
    včera 11:44 | Pozvánky

    Organizátoři konference LinuxDays 2025 vydali program a zároveň otevřeli registrace. Akce se uskuteční 4. a 5. října na FIT ČVUT v pražských Dejvicích, kde vás čekají přednášky, workshopy, stánky a spousta šikovných lidí. Vstup na akci je zdarma.

    Petr Krčmář | Komentářů: 4
    8.9. 22:00 | IT novinky

    Uživatelé komunikátoru Signal si mohou svá data přímo v Signalu bezpečně zálohovat a v případě rozbití nebo ztráty telefonu následně na novém telefonu obnovit. Zálohování posledních 45 dnů je zdarma. Nad 45 dnů je zpoplatněno částkou 1,99 dolaru měsíčně.

    Ladislav Hagara | Komentářů: 0
    8.9. 18:44 | Zajímavý článek

    Server Groklaw, zaměřený na kauzy jako právní spory SCO týkající se Linuxu, skončil před 12 lety, resp. doména stále existuje, ale web obsahuje spam propagující hazardní hry. LWN.net proto v úvodníku připomíná důležitost zachovávání komunitních zdrojů a upozorňuje, že Internet Archive je také jen jeden.

    🇵🇸 | Komentářů: 7
    8.9. 14:22 | Nová verze

    Jakub Vrána vydal Adminer ve verzi 5.4.0: "Delší dobu se v Admineru neobjevila žádná závažná chyba, tak jsem nemusel vydávat novou verzi, až počet změn hodně nabobtnal."

    Ladislav Hagara | Komentářů: 2
    8.9. 13:22 | IT novinky

    V Německu slavnostně uvedli do provozu (en) nejrychlejší počítač v Evropě. Superpočítač Jupiter se nachází ve výzkumném ústavu v Jülichu na západě země, podle německého kancléře Friedricha Merze otevírá nové možnosti pro trénování modelů umělé inteligence (AI) i pro vědecké simulace. Superpočítač Jupiter je nejrychlejší v Evropě a čtvrtý nejrychlejší na světě (TOP500). „Chceme, aby se z Německa stal národ umělé inteligence,“ uvedl na

    … více »
    Ladislav Hagara | Komentářů: 18
    7.9. 04:11 | Komunita

    V Berlíně probíhá konference vývojářů a uživatelů desktopového prostředí KDE Plasma Akademy 2025. Při té příležitosti byla oznámena alfa verze nové linuxové distribuce KDE Linux.

    Ladislav Hagara | Komentářů: 1
    Pro otevření více webových stránek ve webovém prohlížečí používám
     (83%)
     (7%)
     (2%)
     (3%)
     (3%)
     (2%)
    Celkem 157 hlasů
     Komentářů: 11, poslední 4.9. 16:12
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    16.7.2010 16:53 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Příloha:
    Ten cyklus ma spravny v pripade, ze nebude mit cekani delsi nez 1s (v pripade, ze mu to nekdo preplanuje a ono to pretece, tak uz na tom vlastne nezalezi a casem se mu to vzbudi stejne).

    Ne, zatuhne to. Dejme tomu: ts.tv_usec == 999999 a usecond == 3: bude se čekat až te.tv_usec >= 1000002, což nemůže nikdy nastat. Doporučuji alespoň následující, s tím, že nemůžete zadat usecond > 999999.
    void __usleep_test02(int usecond) {
            struct timeval tv;
            time_t target_sec;
            suseconds_t target_usec;
    
            gettimeofday(&tv, NULL);
            target_sec = tv.tv_sec;
            target_usec = tv.tv_usec + usecond;
            if (target_usec >= 1000000) {
                    target_sec++;
                    target_usec -= 1000000;
            }
    
            while ((tv.tv_usec < target_usec) || (tv.tv_sec < target_sec)) {
                    gettimeofday(&tv, NULL);
            }
    }
    
    Ta pasaz s casovacem mne velmi zaujala a poprosil bych o rozvedeni. Mikrosekunda je z puhledu systemu cca 1000-2000 instrukci CPU a to neni az tak mnoho.
    No, základem všeho je si zajistit RT prioritu procesoru (SCHED_FIFO), jinak se můžete jít koulet - jádro do Vaší čekačky přepne jiný proces a místo 2 us čekáte třeba 20 ms. Pokud máte RT prioritu, tak se to nestane, na druhou stranu jelikož standardní jádro není hard-RT, tak stejně nemáte 100% jistotu, ale už máte aspoň něco, s čím se dá rámcově počítat.

    Samotné čekání pak můžete udělat metodou busy wait - tj. tak jak to je naznačeno výše, čekáním v úzké smyčce na ten správný okamžik. Zablokujete tím kompletně jedno jádro procesoru, proto je potřeba vážit kdy a jak se tento postup nasadí. V defaultním nastavení linuxu je proti kompletnímu zablokování pojistka:
    $ cat /proc/sys/kernel/sched_rt_period_us
    1000000
    $ cat /proc/sys/kernel/sched_rt_runtime_us
    950000
    
    ... což znamená, že i přes RT prioritu bude váš proces donucen ke spánku pokud sežere více než 950000 us z 1000000 us okna (hodnoty v proc lze samozřejmě upravovat). To znamená že na jednoprocesorovém stroji budete mít šanci odladit tu chybně napsanou funkci na čekání :)

    Otázkou může být jak je jádro schopné říct kolik je přesně gettimeofday(). V linuxu jsou 2 časovače - clock source a event source. První lze jen číst a druhý lze i programovat na odeslání interruptu za nějakou dobu. Event source je obvykle podstatně méně přesný. Klasický časovač má 1000 Hz, HPETy mají v řádu MHz. Clock source má v optimálním případě přesnost 1 cyklu procesoru. Funkce gettimeofday() funguje tak, že se podívá na globální proměnnou kde je informace o čase posledního eventu a přičte k ní aktuální offset z clock source. Samozřejmě než se poté vyšaší přepnutí z kernel režimu do userspace atd. tak ještě nějaký čas uteče ale obvykle je to o dost méně než ta 1 us která nás zajímá. (Pro ultra přesné časování nesmíte volat funkce kernelu, ale vystačit si třeba s čtením TSC přímo v programu, což je zdroj dalšího opruzu...)

    Na druhou stranu pokud zavoláte nanosleep() tak si jádro dá určitou práci s tím, aby nastavilo event source jak nejlépe to jde (tam je toho dost, je potřeba váš časovač zařadit do RB stromu a kdovíco ještě) a pak si dá CPU voraz, takže skutečně tu mikrosekundu spíte. Bohužel kvůli různým overheadům a granularitě event sourcu budete mít trochu horší výsledky než u busy wait, na druhou stranu šetříte lesy :)

    Udělal jsem nějaké rychlé testy (viz přiložený program) a zdá se, že se výše popsané potvrzuje. Busy wait sežere 100% cpu a do 2ms okna se netrefí třeba 200x ze 100 000 pokusů. Na druhou stranu nanosleep nežere skoro nic, ale má overhead, se kterým musíte dopředu počítat a díky tomu trochu větší rozptyl.

    In Ada the typical infinite loop would normally be terminated by detonation.

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.