PB173 - Ovladače jádra - Linux XI. Jiří Slabý ITI, Fakulta Informatiky 6. 12. 2011 J. Slabý (ITI) PB173/02 6. 12. 2011 1/11 Komunikace mezi procesy LDD3 část kap. 6 (zastaralá) • Čekání na událost a Buzení procesů J. Slabý (ITI) PB173/02 6.12.2011 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 • DECLARE_COMPLETIONs, init_completionD a Cekání: wait_f or.completion, wait.f or.completion.interruptible (retval) • Dokončení: complete, complete_all static DECLARE.COMPLETION(my.comp) ; static char *str ; A B wait.for.completion (&my.comp) ; strcpy(str, "Ahoj"); printk (KERN.DEBUG "%s\n" , str); complete(&my.comp) ; J. Slabý (ITI) PB173/02 6.12.2011 3/ 11 Úkol Použití completion O Doplnit do pb173/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_f or_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) PB173/02 6. 12. 2011 4/11 Složitější komunikace • Čekání na více místech na jinou událost « 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_heado • Cekání: wait-event, wait_event_interruptible • Dokončení: wake.up, wake_up_all • completion je obalená wait.queue J. Slabý (ITI) PB173/02 6. 12. 2011 5/11 Složitější komunikace - příklad static DECLARE_WAIT_QUEUE_HEAD( my.wait) ; static atomic.t my.cnt = ATOMIC.INIT(O) ; static char *str ; A while (1) { str [ atomic.inc.return (&my.cnt) - 1] = 'A'; wake.up.all (&my.wait) ; msleep(1 0) ; } B wait-event ( my.wait , atomic.read(&my.cnt) > 100); p r i n t k (KERN JDEBUG "%s\n", str); C if ( wait .event J nterru pti ble ( my.wait , atomic, read (&my_cnt) > 200)) { printk (KERN.WARNING " interrupted \n") ; return ; } p r i n t k (KERN JDEBUG "%s\n", str); J. Slabý (ITI) PB173/02 6. 12. 2011 6/11 Úkol Použití wait_queue O MÍStO completion, použít V pb173/11/events wait_queue O číst se bude, až bude v bufferu více než 5 znaků J. Slabý (ITI) PB173/02 6. 12. 2011 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 • linux/sched.h • completion a wait_queue ulehčuje práci o 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) J. Slabý (ITI) PB173/02 6. 12. 2011 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 tak, že se bude čekat alespoň na 2 a a 1 b v poli J. Slabý (ITI) PB173/02 6. 12. 2011 9/11 kthread a Vytvoření vlákna (procesu) pro výpočty o Běží v jádře • Chování jako uživatelský proces • linux/kthread. h • kthreacLrun, kthreacLstop • kthreacLshoulcLstop Příklad static int my.proc(void *data) { /* data = my.data */ while (1) { wait.event (...) ; if ( kthread.should.stop () ) break; do.some.work () ; } return 0; } static int my.init (void) { struct task.struct *t ; t = kthread.run ( my.proc , my.data, " my.process") ; if (MS.ERR(t)) { ssleep (1 0) ; kthread.stop (t) ; } J. Slabý (ITI) PB173/02 6. 12. 2011 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 6. 12. 2011 11/11