This shows you the differences between two versions of the page.
so:laboratoare:laborator-11 [2021/05/25 18:18] mihai_drosi.caju [Linux AIO] |
so:laboratoare:laborator-11 [2022/05/19 16:54] (current) liza_elena.babu [Înainte de laborator: Feedback] |
||
---|---|---|---|
Line 20: | Line 20: | ||
* [[#vectored_io|Vectored I/O]] | * [[#vectored_io|Vectored I/O]] | ||
+ | <hidden> | ||
===== Înainte de laborator: Feedback ===== | ===== Înainte de laborator: Feedback ===== | ||
Line 35: | Line 36: | ||
* De ce nu v-a plăcut și de ce credeți că nu a mers bine? | * De ce nu v-a plăcut și de ce credeți că nu a mers bine? | ||
* Ce ar trebuie să facem ca lucrurile să fie plăcute și să meargă bine? | * Ce ar trebuie să facem ca lucrurile să fie plăcute și să meargă bine? | ||
+ | </hidden> | ||
===== Linux - multiplexarea I/O ===== | ===== Linux - multiplexarea I/O ===== | ||
Line 81: | Line 83: | ||
Dezavantaje: | Dezavantaje: | ||
- | * lungimea setului de descriptori este definită cu ajutorul lui FD_SETSIZE, și implicit are valoarea 64; | + | * lungimea setului de descriptori este definită cu ajutorul lui ''FD_SETSIZE'', și implicit are valoarea 1024; |
* este necesar ca seturile de descriptori să fie reconstruite la fiecare apel ''select''; | * este necesar ca seturile de descriptori să fie reconstruite la fiecare apel ''select''; | ||
* la apariția unui eveniment pe unul dintre descriptori, toți descriptorii puși în set înainte de ''select'' trebuie testați pentru a vedea pe care dintre ei a apărut evenimentul; | * la apariția unui eveniment pe unul dintre descriptori, toți descriptorii puși în set înainte de ''select'' trebuie testați pentru a vedea pe care dintre ei a apărut evenimentul; | ||
Line 796: | Line 798: | ||
</code> | </code> | ||
- | ===== Linux ===== | + | ===== Exerciții ===== |
<note important> | <note important> | ||
Line 811: | Line 813: | ||
</note> | </note> | ||
- | <note important> | + | ==== Linux ==== |
- | Acest laborator se desfășoară în echipe. O echipă este formată din 2 studenți. În cazul în care numărul de studenți prezenți este impar, o singură echipă va avea dreptul de a avea 3 studenți. | + | |
- | + | ||
- | Discutați exercițiile și colaborați pe parcursul întregului laborator. Have fun! :-) | + | |
- | </note> | + | |
- | ==== Exercițiul 1 - poll ==== | + | === Exercițiul 1 - poll === |
Intrați în directorul ''1-pollpipe''. Parcurgeți fișierul ''poll.c'' pentru a vedea un exemplu de folosire al funcției ''poll''. | Intrați în directorul ''1-pollpipe''. Parcurgeți fișierul ''poll.c'' pentru a vedea un exemplu de folosire al funcției ''poll''. | ||
Line 836: | Line 834: | ||
- | ==== Exercițiul 2 - epoll ==== | + | === Exercițiul 2 - epoll === |
Intrați în directorul ''2-epollpipe'' și parcurgeți fișierul ''epoll.c''. Considerând cerința de la exercițiul anterior, în loc de ''poll'' folosiți ''epoll''. | Intrați în directorul ''2-epollpipe'' și parcurgeți fișierul ''epoll.c''. Considerând cerința de la exercițiul anterior, în loc de ''poll'' folosiți ''epoll''. | ||
Line 853: | Line 851: | ||
* Eliminați pipe-ul din multiplexor (folosind ''epoll_ctl'' cu opțiunea ''EPOLL_CTL_DEL'') și închideți-l folosind ''close''. | * Eliminați pipe-ul din multiplexor (folosind ''epoll_ctl'' cu opțiunea ''EPOLL_CTL_DEL'') și închideți-l folosind ''close''. | ||
* Incremenetați valoarea variabilei ''recv_msgs''. | * Incremenetați valoarea variabilei ''recv_msgs''. | ||
- | ==== Exercițiul 3 - eventfd ==== | + | |
+ | === Exercițiul 3 - eventfd === | ||
Pornind de la codul scris pentru execițiul anterior, notificați serverul de terminarea unui client utilizând ''eventfd''. Clientul transmite mesaje către server și, când dorește să închidă comunicația, va trimite un mesaj pe canalul de control reprezentat de ''eventfd''. Acum, ''epoll'' este folosit pentru a demultiplexa atât descriptorii de pipe, cât și descriptorul de ''eventfd''. | Pornind de la codul scris pentru execițiul anterior, notificați serverul de terminarea unui client utilizând ''eventfd''. Clientul transmite mesaje către server și, când dorește să închidă comunicația, va trimite un mesaj pe canalul de control reprezentat de ''eventfd''. Acum, ''epoll'' este folosit pentru a demultiplexa atât descriptorii de pipe, cât și descriptorul de ''eventfd''. | ||
Line 866: | Line 865: | ||
Dacă descriptorul întors în urma ''epoll_wait'' este descriptorul de ''eventfd'', atunci veți citi ''64'' de biți de pe acest descriptor (folosind ''read''). Dacă primii 32 biți sunt valoarea descrisă de macro-ul ''MAGIC_EXIT'', atunci **scoate** capătul pipe-ului corespunzător din ''epoll'' și închide acel capăt (adică folosește ''epoll_ctl'' cu opțiunea ''EPOLL_CTL_DEL'' și apoi ''close''). Pentru a extrage ultimii 32 de biți din mesajul de ''64'' de biți primit pe descriptorul de ''eventfd'', reprezentând indexul clientului, folosiți funcția ''get_index'' definită local în program. | Dacă descriptorul întors în urma ''epoll_wait'' este descriptorul de ''eventfd'', atunci veți citi ''64'' de biți de pe acest descriptor (folosind ''read''). Dacă primii 32 biți sunt valoarea descrisă de macro-ul ''MAGIC_EXIT'', atunci **scoate** capătul pipe-ului corespunzător din ''epoll'' și închide acel capăt (adică folosește ''epoll_ctl'' cu opțiunea ''EPOLL_CTL_DEL'' și apoi ''close''). Pentru a extrage ultimii 32 de biți din mesajul de ''64'' de biți primit pe descriptorul de ''eventfd'', reprezentând indexul clientului, folosiți funcția ''get_index'' definită local în program. | ||
| | ||
- | ==== Exercițiul 4 - async I/O (KAIO) ==== | + | === Exercițiul 4 - async I/O (KAIO) === |
Intrați în directorul ''4-kaio'' și parcurgeți fișierul ''kaio.c''. Completați zonele lipsă pentru a programa scrierea a 4 fișiere cu numele date de variabila ''files''. | Intrați în directorul ''4-kaio'' și parcurgeți fișierul ''kaio.c''. Completați zonele lipsă pentru a programa scrierea a 4 fișiere cu numele date de variabila ''files''. | ||
Line 881: | Line 880: | ||
- | ==== Exercițiul 5 - async I/O (KAIO) ==== | + | === Exercițiul 5 - async I/O (KAIO) === |
Folosiți ''eventfd'' pentru așteptarea operațiilor asincrone. Porniți de la codul scris pentru execițiul anterior. | Folosiți ''eventfd'' pentru așteptarea operațiilor asincrone. Porniți de la codul scris pentru execițiul anterior. | ||
Line 890: | Line 889: | ||
Parcurgeți secțiunea [[#linux_aio|Linux AIO]] și urmăriți comentariile cu // TODO 2 //. Consultați exemplul lui [[http://www.xmailserver.org/eventfd-aio-test.c | Davide Libenzi]]. | Parcurgeți secțiunea [[#linux_aio|Linux AIO]] și urmăriți comentariile cu // TODO 2 //. Consultați exemplul lui [[http://www.xmailserver.org/eventfd-aio-test.c | Davide Libenzi]]. | ||
- | Compilați și rulați programul. Va trebui să aveți 4 fișiere de dimensiune 8192 octeți create în ''/tmp''. | + | Compilați și rulați programul. Va trebui să aveți 4 fișiere de dimensiune 8192 octeți create în ''/tmp''. |
- | ===== BONUS ===== | + | |
+ | ==== BONUS ==== | ||
- ''signalfd'' | - ''signalfd'' | ||
Line 901: | Line 901: | ||
* Consultați secțiunea [[#signalfd|signalfd]] | * Consultați secțiunea [[#signalfd|signalfd]] | ||
* [[ http://linux.die.net/man/2/signalfd | man signalfd ]] | * [[ http://linux.die.net/man/2/signalfd | man signalfd ]] | ||
- | ===== Soluții ===== | ||
- | [[http://elf.cs.pub.ro/so/res/laboratoare/lab11-sol.zip | Soluţii laborator 11]] |