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 13:22 | IT novinky

    Společnost ARM představila platformu Arm Lumex s Arm C1 CPU Cluster a Arm Mali G1-Ultra GPU pro vlajkové chytré telefony a počítače nové generace.

    Ladislav Hagara | Komentářů: 0
    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ářů: 6
    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ářů: 6
    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ářů: 20
    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ářů: 3
    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ářů: 21
    Pro otevření více webových stránek ve webovém prohlížečí používám
     (83%)
     (7%)
     (2%)
     (3%)
     (4%)
     (2%)
    Celkem 160 hlasů
     Komentářů: 12, poslední dnes 13:00
    Rozcestník

    Dotaz: Plánovač periodických tasků v C

    8.3.2022 19:44 MilanC | skóre: 16
    Plánovač periodických tasků v C
    Přečteno: 1135×
    Ahoj,

    potřebuji vytvořit jakýsi jednoduchý periodický plánovač několika samostatných úloh v Cčku. Každá úloha se bude spouštět nekonečně krát v nějakém intervalu od několika sekund po hodiny. Na přesnosti až tak nezáleží. Hned jsem dostal nápad, udělat to pomocí vláken, kdy vždy 1 úloha = 1 vlákno a periodu řešit sleepem vlákna na daný čas. Trochu jsem ale narazil při ukončování programu/vláken, což mě napadlo řešit rozložením dlouhého intervalu na smyčku 1s sleepů s testem na ukončení vlákna. Má otázka zní, jestli to koncepčně nelze v Cčku udělat ještě nějak lépe?

    Tady je nástřel pro 2 vlákna... https://pastebin.com/5e4KPgjR

    Díky.

    Odpovědi

    8.3.2022 19:52 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Ten problém s ukončováním jsem myslel tak, že jsem tam měl původně sleep(args->delay), což se pak samozřejmě při nastavení sRunning na 0 nevykoná bezprostředně, ale při delší periodě až po jejím uplynutí. Toto jsem tedy řešil tím for cyklem, asi je to patrné.
    8.3.2022 20:27 MarV | skóre: 11
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Použil bych systémový časovač https://man7.org/linux/man-pages/man2/timer_create.2.html. V hlavním vlákně čekat na ukončovací podmínku a pak časovače zabít.
    9.3.2022 15:27 jiwopene | skóre: 31 | blog: Od každého trochu…
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Viz #2, nebo je také možné pro ukončitelné čekání použít poll(2) s timeoutem a pipe(2). (Vytvořím rouru, pollem v jednom procesu/vlákně čekám na příchozí data a ve druhém vlákně nebo třeba handleru signálu pro ukončení pošlu data.) Takové řešení se hodí, pokud už rourou (nebo soketem apod.) posíláme nějaký příkaz pro ukončení.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
    11.3.2022 10:41 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Díky, díval jsem se na obě varianty a přijde mi to nějaké složité. :-) Zkusím to nějak blíž nastudovat. Ta varianta s timery by mohla být schůdná.
    11.3.2022 15:45 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    debian.plus@protonmail.com
    15.3.2022 09:50 Mayhem
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Kdyz uz to tedy musi byt v cecku, na vlakna se vykasli, to je overkill. Normalne naforkuj potrebny pocet procesu, v childu pouzij bud ohandlovany alarm nebo sleep a udelej, co potrebujes. V pripade potreby cekajici childy ukoncis zaslanim sigtermu. A zombie si v parentu uklidis zachycenim sigchld.
    15.3.2022 13:33 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Ahoj, šlo by to krapet více pro lamu případně odkázat na nějaký příklad? A ano v C to musí být, bohužel. :(
    15.3.2022 15:34 kvr
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Prostě místo pthread_create() použiješ fork() a pustíš ten child tam. Zbytek řešení by měl zůstat víceméně stejný. ... ne, že bych s tím souhlasil, pthread bude rozhodně efektivnější, na druhé straně chyba v pouštěné funkci shodí celý proces, zatímco v případě fork() jenom ten child.

    Jako to původní řešení fungovat bude, pominu-li to, že nebude pouštět každých n vteřin, ale n vteřin + doba operace té funkce. A samozřejmě neefektivní využití threadů, které nejspíš budou převážnou dobu jenom spát (což bude v rámci stovek threadů asi ok). Ideální by bylo použití nějakého threadpool, nejlépe který umí rovnou schedulovat podle času, něco jako Java https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit) . Letmým pohledem nedokážu nic najít pro čisté C. Něco naimplementovat asi nebude extra složité (buď timer_create nebo poll a schedulovat ručně, a k tomu normální threadpool), ale pořád složitější než původní řešení - otázkou je, stojí to za to?
    16.3.2022 09:38 Mayhem
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    ne, že bych s tím souhlasil, pthread bude rozhodně efektivnější, na druhé straně chyba v pouštěné funkci shodí celý proces, zatímco v případě fork() jenom ten child.
    Efektivnejsi? Mozna ano, ale uvedom si, ze novy proces se udela jen na zacatku. Pak se stejne ceka. A v jakych poctech se vlastne pohybujeme? Myslim, ze v takovych, kde vytvoreni child procesu opravdu nebude problem s rezii. ;-)
    16.3.2022 15:11 kvr
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Efektivnejsi? Mozna ano, ale uvedom si, ze novy proces se udela jen na zacatku. Pak se stejne ceka. A v jakych poctech se vlastne pohybujeme?
    Efektivnější neznamená jen vytvoření procesu, ale celou dobu údržbu těch procesů (vlastní tabulka virtuální paměti - i když z velké části samotná paměť asi sdílená, taky, kdo ty child procesy bude sestřelovat). Pokud se pohybujeme v rámci desítek funkcí - pak je fork ok, stovky, možná nízké tisíce - threads jsou ok, u víc by to chtělo ten threadpool. Počítám, že tady půjde o jednotky až desítky, proto jsem psal, zda to stojí za ty komplikace (respektive komplikace je to, že pro čisté C takové knihovny moc nejsou, jinak by to bylo naopak jednodušší).
    17.3.2022 09:11 Mayhem
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Efektivnější neznamená jen vytvoření procesu, ale celou dobu údržbu těch procesů (vlastní tabulka virtuální paměti - i když z velké části samotná paměť asi sdílená, taky, kdo ty child procesy bude sestřelovat).
    Proc bude vetsinu dobu sveho zivota pouze spinkat, nebal bych se tedy teto rezie.
    Pokud se pohybujeme v rámci desítek funkcí - pak je fork ok, stovky, možná nízké tisíce - threads jsou ok, u víc by to chtělo ten threadpool.
    Jiste, ThreadPool a napsat to treba v jave by bylo nejlepsi, ale to tazatel nechtel. Pro jeho ucel naprosto postacuje model s forkem a signal. A garantuji vam, ze pro tento ucel nejsou i radove stovky na prumernem zeleze problem.
    Počítám, že tady půjde o jednotky až desítky, proto jsem psal, zda to stojí za ty komplikace (respektive komplikace je to, že pro čisté C takové knihovny moc nejsou, jinak by to bylo naopak jednodušší).
    +1

    Take mi prijde, ze pro zacatecnika jsou veci okolo forku a signalu daleko pochopitelnejsi nez prace s pthreads, ktere v C maji vylozene hnusne api.
    21.3.2022 09:47 Zm
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Signály jsou problematické, při jejich použítí se musí kontrolovat všechna sys. volání, zda nedošlo k přerušení signálem.
    22.3.2022 09:53 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Ahoj, postupně si hraji s těmi vlákny a tak mě napadlo, nebylo by snadné řešení pomocí pthread_cond_timedwait? Myslím nahradit jím ten sleep. Mělo by to řešit problém rychlým ukončením a požadovaným čekáním zároveň. Bylo by to řešení?

    Nicméně se mi to nějak nedaří naimplementovat pro více vláken.

    Tady jsem se pokusil o malé demo, "tasky" to periodicky spouští, ale mám tam nějaký problém s ukončením při CTRL+C. Někdy to zůstane viset na nějakém joinu, nevím proč. :(
    Mmain(): sending cancellation request
    Joining thread 0
    main(): thread wasn't canceled (shouldn't happen!)
    main(): sending cancellation request
    Joining thread 1
    main(): thread wasn't canceled (shouldn't happen!)
    main(): sending cancellation request
    Joining thread 2
    main(): thread was canceled
    main(): sending cancellation request
    Joining thread 3
    main(): thread wasn't canceled (shouldn't happen!)
    main(): sending cancellation request
    Joining thread 4
    main(): thread wasn't canceled (shouldn't happen!)
    main(): sending cancellation request
    Joining thread 5
    _
    
    https://pastebin.com/BmECNELD

    K čemu je tam nutný prosím ten fakeMutex? PS: Zkusil jsem i ně které zde zzmíněné další varianty, ale přišlo mi to až zbytečně složité.
    22.3.2022 13:26 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Tak už jsem na to asi přišel. Pokud program signalizuje ukončení, tak je třeba přerušit to čekání v jednotlivých vláknech na dané podmínce. Takže stačí poslat pthread_cond_broadcast(&fakeCond); a pak pro jistotu ještě počkat na dokončení vláken přes join().
    22.3.2022 22:15 kvr
    Rozbalit Rozbalit vše Re: Plánovač periodických tasků v C
    Fake mutex je tam proto, že tak funguje condition:

    - Producer by měl zamknout stav, nastavit indikátor a udělat broadcast na podmínku asociovanou s mutex, a odemknout mutex.

    - Consumer zamkne stav, zkontroluje indikátor, rozhodne se co dál. Pouze pokud potřebuje čekat na indikátor, udělá wait na condition, který zároveň dočasně odemkne mutex, aby ho producer mohl přenastavit.

    Pokud by tam ten mutex nebyl, tak přístup k indikátoru bude neizolovaný a může dojít k race condition, když producer pustí broadcast v mezičase kdy consumer kontroluje indikátor a než udělá wait na condition.

    (indikátor může být cokoliv - zde asi exit, ale typicky to bývá prázdná nebo plná fronta apod)

    Založit nové vláknoNahoru

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

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.