PB173 - Ovladače jádra - Linux XI. Komunikace mezi procesy Jiri Slabý ITI, Fakulta informatiky 3. 12. 2013 J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 1/11 Komunikace mezi procesy LDD3 část kap. 6 (zastaralá) • Čekání na událost a Buzení procesů J. Slabý (ITI, Fl) PB173/02 3.12.2013 2/ 11 Jednoduchá komunikace a 2 procesy (producent-konzument) » A: čeká na nějakou hotovou práci • B: udělá nějakou práci a oznámí A dokončení • A: pokračuje API • linux/completion.h, struct completion a DECLARE_CDMPLETIDNS, init_completionD • čekání: wait_f or_completion, wait_f or_completion_interruptible (retval) • Dokončení: complete, complete_all static DECLARE.COMPLETION(my.comp); static char *str; waitJor.completion(&my.comp); printk(KERN_DEBUG "%s\n", str); B strcpy(str, "Ahoj"); complete(&my_comp); J. Slabý (ITI, Fl) Úkol Použití completion O Doplnit do pb 173/11/events completion O Číst se bude, až někdo dokončí zápis • Čekání v read je možné přerušit signálem (wait_for_completion_interruptible) O Spustit 2 instance cat /dev/my_name O Pozorovat, co se děje O Spustit několikrát echo XXX > /dev/my_name J. Slabý (ITI, Fl) Složitější komunikace • Čekání na více místech na jinou událost a 3 procesy • A: plní buffer • B: čeká na 100B • C: čeká na200B API • linux/wait.h, wait_queue_head_t • DECLARE_WAIT_QUEUE_HEADS, init_waitqueue_headD • čekání: wait_event, wait_event_interruptible • Dokončení: wake_up, wake_up_all a completion je obalená wait_queue J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 5/ 11 Složitější komunikace - příklad static DECLARE.WAIT.QUEUE.HEAD(my.wait); static atomict my.cnt = ATOMICJNIT(O); static char *str; A while (1) { str[atomicJnc-retum(&my.cnt) - 1] = 'A'; wake.up.all(&my.wait); msleep(10); } B wait-event(my.wait, atomiC-read(&my.cnt) > 100); printk(KERN_DEBUG "%s\n", str); C if ( wait.event.interruptible (my.wait, atomic.read(&my.cnt) > 200)) { printk(KERN.WARNING "interrupted\n"); return; } printk(KERN.DEBUG "%s\n", str); J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 6/ 11 Úkol Použití wait_queue O Namísto completion, použít V pb 173/11/events wait_queue O číst se bude, až bude v bufferu více než 5 znaků J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 7/ 11 Scheduler • Celé je to instruování plánovače • Ve Skutečnosti je wait_event a wake_up: » Nastavení Stavu procesu: set_current_state • Uspání procesu:schedule • Probuzení procesu: wake_up_process • Popř. S Obsluhou Signálů: signal_pending 9 linux/sched.h • completion a wait_queue ulehčuje práci 0 Pamatováním si, koho vzbudit • Případnou kontrolou signálů • Případnou kontrolou vypršení timeoutu 1 completion navíc řeší předání čítače (kolik procesů vzbudit) J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 8/ 11 Úkol Explicitní čekání O Místo wait_event, použijte funkce z předchozího slidu • Prostudujte (a použijte) tělo makra__wait_event_interruptible O Pozměňte čekací podmínku • Bude se čekat alespoň na 2 „a" a 1 „t>" v poli J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 9/ 11 kthread • Vytvoření vlákna (procesu) pro výpočty • Běží v jádře « Chování jako uživatelský proces • linux/kthread.h 9 kthread_run, kthreacLstop 9 kthread_should_stop Příklad static int my.proc(void *data) { /* data = my.data */ while (1) { static int myjnit(void) { struct task.struct *t; wait.event (...) ; if (kthread-should-StopO) break; t = kthread-run(my-proc, my.data, "my.process"); if (IS-ERR(t)) return PTR.ERR(t); do_some_work(): } return 0: } kthread-stop(t); /* some time later */ J. Slabý (ITI, Fl) PB173/02 3. 12. 2013 10/11 Úkol Vytvoření vlákna O Vytvořte vlákno O Vlákno počká, až někdo něco zapíše O Přepíše všechny znaky „a" na „b" O Vzbudí všechny, kteří čekají na data J. Slabý (ITI, Fl)