PB173 - Ovladače jádra - Linux XI. Komunikace mezi procesy Jiri Slabý Fakulta informatiky Masarykova univerzita 2. 12. 2014 Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 1/13 Komunikace mezi procesy LDD3 část kap. 6 (zastaralá) Čekání na událost • Completion • Wait event a ostatní • Scheduler a probouzení procesů 0 Vlákna Jiri Slabý (Fakulta informatiky, MU) Sekce 1 Čekání na událost Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 3/ 13 Jednoduchá komunikace a 2 procesy (producent-konzument) a 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 9 DECLARE_COMPLETIONs, 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; wait_for_completion(&my_comp); pr_info("%s\n", str); B střepy (str, "Ahoj"); complete(&my_comp); Jiri Slabý (Fakulta informatiky, MU) Úkol Použití completion O Doplnit do pbl73/ll/events completion O číst se bude, až někdo dokončí zápis • Čekání v read bude možné přerušit signálem (wait_for_completion_interruptible) O Spustit 2 instance cat /dev/my_name O Spustit několikrát echo XXX > /dev/my_name 0 Pozorovat, co se děje při použití • complete • complete_all Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 5/ 13 Složitější komunikace • Čekání na více místech na jinou událost « 3 procesy • A: plní buffer • B: čeká na 100 B • C: čeká na 200 B 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 • completion je obalená wait_queue Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 6/ 13 Složitější komunikace Příklad static DECLARE_WAIT_QUEUE_HEAD(my_wait); static atomicj my_cnt = ATOMICJNIT(O); static char *str; A while (1) { str[atomic_inc_return(&my_cnt) - 1] = 'A'; wake_up_all(&my_wait); msleep(10); } B wait_event(my_wait, atomic_read(&my_cnt) > 100); pr_info("%s\n", str); C if (wait_event_interruptible (my_wait, atomic_read(&my_cnt) > 200)) { pr_info("interrupted\n"); return; } pr_info("%s\n", str); Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 7/ 13 Úkol Použití wait_queue O Namísto completion, použít V pbl73/ll/events wait_queue O Číst se bude, až bude do bufferu zapsáno více než 5 znaků Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 8/ 13 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 O Popř. S Obsluhou Signálů: signal_pending 9 linux/sched.h • completion a wait_queue ulehčuje práci • Pamatováním si, koho vzbudit • Případnou kontrolou signálů • Případnou kontrolou vypršení timeoutu • completion navíc řeší předání čítače (kolik procesů vzbudit) Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 9/ 13 Ú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 „b" v poli Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 10/13 Sekce 2 Vlákna Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 11/13 kthread • Vytvoření vlákna (procesu) pro výpočty • Běží v jádře • Chování jako uživatelský proces • linux/kthread.h • Vytvoření, zrušení: kthread_run, kthread_stop • Ve vlákně: kthread_should_stop static int my_proc(void *data) { /* data = my_data */ while (1) { static int myjnit(void) struct task_struct *t; t = kthread_run(my_proc, my_data, "my_process"); if (IS_ERR(t)) return PTR_ERR(t); wait_event_interruptible (...) if (kthread_should_stop()) break; do_some_work(); return 0; kthread_stop(t); /* some time later */ Jiri Slabý (Fakulta informatiky, MU) PB173/02 2.12.2014 12/13 Úkol Vytvoření vlákna O Vytvořte vlákno O Vlákno počká, až někdo něco zapíše 0 Přepíše všechny znaky „a" na „b" O Vzbudí všechny, kteří čekají na data Jiri Slabý (Fakulta informatiky, MU)