This shows you the differences between two versions of the page.
so:laboratoare:laborator-11 [2021/02/28 09:15] teodor_stefan.dutu [Linux] Utilizare Git |
so:laboratoare:laborator-11 [2022/05/19 16:54] (current) liza_elena.babu [Înainte de laborator: Feedback] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laborator 11 - Operații IO avansate - Linux ====== | ====== Laborator 11 - Operații IO avansate - Linux ====== | ||
- | |||
- | ===== Materiale Ajutătoare ===== | ||
- | |||
- | * [[http://elf.cs.pub.ro/so/res/laboratoare/lab11-slides.pdf | lab11-slides.pdf]] | ||
- | * [[http://elf.cs.pub.ro/so/res/laboratoare/lab11-refcard.pdf | lab11-refcard.pdf]] | ||
Line 25: | Line 20: | ||
* [[#vectored_io|Vectored I/O]] | * [[#vectored_io|Vectored I/O]] | ||
+ | <hidden> | ||
===== Înainte de laborator: Feedback ===== | ===== Înainte de laborator: Feedback ===== | ||
Line 40: | 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 86: | 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 454: | Line 451: | ||
==== Linux AIO ==== | ==== Linux AIO ==== | ||
- | Standardul ''POSIX.1b'' definește un nou set de operații I/O care pot reduce semnificativ timpul pe care o aplicație îl petrece așteptând pentru I/O. Noile funcții permit unui program să inițieze una sau mai multe operații de I/O și să-și continue lucrul normal în timp ce operațiile de I/O sunt executate în paralel. | + | Începând cu versiunea 2.5.32, kernelul Linux expune un set de operații I/O care pot reduce semnificativ timpul pe care o aplicație îl petrece așteptând pentru I/O. Noile funcții permit unui program să inițieze una sau mai multe operații de I/O și să-și continue lucrul normal în timp ce operațiile de I/O sunt executate în paralel. |
Această funcționalitate este disponibilă dacă se instalează biblioteca ''libaio'': <code bash> | Această funcționalitate este disponibilă dacă se instalează biblioteca ''libaio'': <code bash> | ||
Line 801: | Line 798: | ||
</code> | </code> | ||
- | ===== Linux ===== | + | ===== Exerciții ===== |
<note important> | <note important> | ||
În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://github.com/systems-cs-pub-ro/so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''git clone https://github.com/systems-cs-pub-ro/so''. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''git clone https://github.com/systems-cs-pub-ro/so ${target}''. | În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://github.com/systems-cs-pub-ro/so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''git clone https://github.com/systems-cs-pub-ro/so''. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''git clone https://github.com/systems-cs-pub-ro/so ${target}''. | ||
- | Pentru a actualiza repository-ul, folosiți comanda ''git pull origin master'' din interiorul directorului în care se află repository-ul. Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. | + | Pentru a actualiza repository-ul, folosiți comanda ''git pull origin master'' din interiorul directorului în care se află repository-ul. Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. În cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările: |
+ | <code> | ||
+ | git stash | ||
+ | git pull origin master | ||
+ | git stash pop | ||
+ | </code> | ||
Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://gitimmersion.com. | Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://gitimmersion.com. | ||
</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]] |