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í
×
    včera 19:44 | Nová verze

    Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 12.0. Přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    včera 17:33 | Nová verze

    Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2025-05-06. Přehled novinek v příspěvku na blogu Raspberry Pi a poznámkách k vydání. Pravděpodobně se jedná o poslední verzi postavenou na Debianu 12 Bookworm. Následující verze by již měla být postavena na Debianu 13 Trixie.

    Ladislav Hagara | Komentářů: 0
    včera 05:33 | Komunita

    Richard Stallman dnes v Liberci přednáší o svobodném softwaru a svobodě v digitální společnosti. Od 16:30 v aule budovy G na Technické univerzitě v Liberci. V anglickém jazyce s automaticky generovanými českými titulky. Vstup je zdarma i pro širokou veřejnost.

    Ladislav Hagara | Komentářů: 13
    včera 03:55 | Komunita

    sudo-rs, tj. sudo a su přepsáné do programovacího jazyka Rust, nahradí v Ubuntu 25.10 klasické sudo. V plánu je také přechod od klasických coreutils k uutils coreutils napsaných v Rustu.

    Ladislav Hagara | Komentářů: 0
    6.5. 22:11 | Nasazení Linuxu

    Fedora se stala oficiální distribucí WSL (Windows Subsystem for Linux).

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

    Společnost IBM představila server IBM LinuxONE Emperor 5 poháněný procesorem IBM Telum II.

    Ladislav Hagara | Komentářů: 1
    6.5. 04:55 | Nová verze

    Byla vydána verze 4.0 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Přehled novinek v poznámkách k vydání. Využíván je Free Pascal Compiler (FPC) 3.2.2.

    Ladislav Hagara | Komentářů: 1
    6.5. 00:33 | Komunita

    Podpora Windows 10 končí 14. října 2025. Připravovaná kampaň Konec desítek (End of 10) může uživatelům pomoci s přechodem na Linux.

    Ladislav Hagara | Komentářů: 32
    5.5. 23:22 | Pozvánky

    Již tuto středu proběhne 50. Virtuální Bastlírna, tedy dle římského číslování L. Bude L značit velikost, tedy více diskutujících než obvykle, či délku, neboť díky svátku lze diskutovat dlouho do noci? Bude i příští Virtuální Bastlírna virtuální nebo reálná? Nejen to se dozvíte, když dorazíte na diskuzní večer o elektronice, softwaru, ale technice obecně, který si můžete představit jako virtuální posezení u piva spojené s učenou

    … více »
    bkralik | Komentářů: 0
    5.5. 22:33 | IT novinky

    Dle plánu dnes končí služba Skype. Uživatelé mohou pokračovat v Microsoft Teams.

    Ladislav Hagara | Komentářů: 1
    Jaký filesystém primárně používáte?
     (57%)
     (1%)
     (8%)
     (22%)
     (4%)
     (2%)
     (3%)
     (1%)
     (1%)
     (3%)
    Celkem 549 hlasů
     Komentářů: 25, poslední včera 20:12
    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: 1132×
    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.