This shows you the differences between two versions of the page.
so:teme:tema-5 [2022/05/20 21:39] ionut.mihalache1506 |
so:teme:tema-5 [2023/01/15 23:45] (current) ionut.mihalache1506 |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tema 5 Server web asincron ====== | + | ====== Server web asincron ====== |
<note important> | <note important> | ||
- | * Dată publicare: **20.05.2022** | + | * <html><b>Deadline hard</b></html>: **17.01.2023, ora 23:59** |
- | * <html><b><span style="color:red;">Deadline hard</span></b></html>: **31.05.2022, ora 23:55** | + | |
</note> | </note> | ||
===== Obiectivele temei ===== | ===== Obiectivele temei ===== | ||
Line 10: | Line 9: | ||
*Aprofundarea noțiunilor legate de lucrul cu sockeți. | *Aprofundarea noțiunilor legate de lucrul cu sockeți. | ||
*Deprinderi de implementare și proiectare a aplicațiilor care folosesc operații asincrone și alte operații I/O avansate. | *Deprinderi de implementare și proiectare a aplicațiilor care folosesc operații asincrone și alte operații I/O avansate. | ||
- | *Aprofundarea utilizării API-ului pentru operații I/O avansate la nivelul sistemelor de operare Linux și Windows. | + | *Aprofundarea utilizării API-ului pentru operații I/O avansate la nivelul sistemelui de operare Linux. |
===== Enunț ===== | ===== Enunț ===== | ||
Line 20: | Line 19: | ||
*multiplexarea operațiilor I/O. | *multiplexarea operațiilor I/O. | ||
- | Pentru implementare se va folosi API-ul de operații I/O avansate specific sistemelor de operare Linux și Windows: | + | Pentru implementare se va folosi API-ul de operații I/O avansate specific sistemelui de operare Linux: |
- | *[[http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2.html | sendfile]]/[[http://msdn.microsoft.com/en-us/library/ms740565(VS.85).aspx | TransmitFile]] | + | *[[http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2.html | sendfile]] |
- | *[[http://www.kernel.org/doc/man-pages/online/pages/man2/io_setup.2.html | io_setup & friends]]/[[http://msdn.microsoft.com/en-us/library/aa365683(v=VS.85).aspx | Overlapped I/O]] | + | *[[http://www.kernel.org/doc/man-pages/online/pages/man2/io_setup.2.html | io_setup & friends]] |
- | *[[http://man7.org/linux/man-pages/man7/epoll.7.html | epoll]]/[[http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx | Completion Ports]]. | + | *[[http://man7.org/linux/man-pages/man7/epoll.7.html | epoll]] |
- | Serverul web va utiliza API-ul modern de multiplexare pentru a aștepta conexiuni din partea clienților: [[http://man7.org/linux/man-pages/man7/epoll.7.html | epoll]] (Linux) și [[http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx | Completion Ports]] pe Windows. Pe conexiunile realizate se vor recepționa cereri din partea clienților și apoi se vor distribui răspunsurile către aceștia. | + | Serverul web va utiliza API-ul modern de multiplexare pentru a aștepta conexiuni din partea clienților: [[http://man7.org/linux/man-pages/man7/epoll.7.html | epoll]] (Linux). Pe conexiunile realizate se vor recepționa cereri din partea clienților și apoi se vor distribui răspunsurile către aceștia. |
Clienții și serverul vor comunica folosind protocolul HTTP. Pentru parsarea cererilor HTTP din partea clienților recomandăm folosirea [[http://github.com/joyent/http-parser | acestui parser HTTP]], disponibil și în cadrul [[http://elf.cs.pub.ro/so/res/teme/tema5-util/ | directorului de resurse ale temei]]. Va trebui să folosiți un callback pentru obținerea căii către resursa locală solicitată de client. Tot în directorul de resurse, găsiți un exemplu simplificat de folosire a parser-ului. | Clienții și serverul vor comunica folosind protocolul HTTP. Pentru parsarea cererilor HTTP din partea clienților recomandăm folosirea [[http://github.com/joyent/http-parser | acestui parser HTTP]], disponibil și în cadrul [[http://elf.cs.pub.ro/so/res/teme/tema5-util/ | directorului de resurse ale temei]]. Va trebui să folosiți un callback pentru obținerea căii către resursa locală solicitată de client. Tot în directorul de resurse, găsiți un exemplu simplificat de folosire a parser-ului. | ||
Line 31: | Line 30: | ||
Serverul implementează o **funcționalitate limitată** a protocolului HTTP, aceea de a **transmite fișiere clienților**. Serverul va furniza fișiere din directorul ''AWS_DOCUMENT_ROOT'', definit în cadrul antetului temei. Fișiere se găsesc doar în subdirectoarele ''AWS_DOCUMENT_ROOT/static/'', respectiv ''AWS_DOCUMENT_ROOT/dynamic/'', iar //request path//-uri corespunzătoare vor fi, de exemplu, ''AWS_DOCUMENT_ROOT/static/test.dat'', respectiv ''AWS_DOCUMENT_ROOT/dynamic/test.dat''. Prelucrarea fișierelor va fi următoarea: | Serverul implementează o **funcționalitate limitată** a protocolului HTTP, aceea de a **transmite fișiere clienților**. Serverul va furniza fișiere din directorul ''AWS_DOCUMENT_ROOT'', definit în cadrul antetului temei. Fișiere se găsesc doar în subdirectoarele ''AWS_DOCUMENT_ROOT/static/'', respectiv ''AWS_DOCUMENT_ROOT/dynamic/'', iar //request path//-uri corespunzătoare vor fi, de exemplu, ''AWS_DOCUMENT_ROOT/static/test.dat'', respectiv ''AWS_DOCUMENT_ROOT/dynamic/test.dat''. Prelucrarea fișierelor va fi următoarea: | ||
*Fișierele din directorul ''AWS_DOCUMENT_ROOT/static/'' sunt fișiere statice care vor fi transmise clienților folosind API de zero-copying ([[http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2.html | sendfile]]/[[http://msdn.microsoft.com/en-us/library/ms740565(VS.85).aspx | TransmitFile]]). | *Fișierele din directorul ''AWS_DOCUMENT_ROOT/static/'' sunt fișiere statice care vor fi transmise clienților folosind API de zero-copying ([[http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2.html | sendfile]]/[[http://msdn.microsoft.com/en-us/library/ms740565(VS.85).aspx | TransmitFile]]). | ||
- | *Fișierele din directorul ''AWS_DOCUMENT_ROOT/dynamic/'' sunt fișiere pentru care se presupune că este necesară o fază de post-procesare din partea serverului. Aceste fișiere vor fi citite de pe disc folosind API asincron și apoi vor fi transmise către clienți. Transmiterea va folosi sockeți non-blocanți (Linux) și Overlapped I/O pe sockeți (Windows). | + | *Fișierele din directorul ''AWS_DOCUMENT_ROOT/dynamic/'' sunt fișiere pentru care se presupune că este necesară o fază de post-procesare din partea serverului. Aceste fișiere vor fi citite de pe disc folosind API asincron și apoi vor fi transmise către clienți. Transmiterea va folosi sockeți non-blocanți (Linux). |
*Pentru //request path//-uri nevalide se va transmite un mesaj [[http://en.wikipedia.org/wiki/HTTP_404 | HTTP 404]]. | *Pentru //request path//-uri nevalide se va transmite un mesaj [[http://en.wikipedia.org/wiki/HTTP_404 | HTTP 404]]. | ||
După transmiterea unui fișier, conform protocolului HTTP, conexiunea este închisă. | După transmiterea unui fișier, conform protocolului HTTP, conexiunea este închisă. | ||
Line 73: | Line 72: | ||
*Exemple de utilizare găsiți în [[#testare | teste]]. | *Exemple de utilizare găsiți în [[#testare | teste]]. | ||
- | + | ===== Precizări ===== | |
- | ===== Precizări pentru Windows ===== | + | |
- | + | ||
- | *Operațiile pe sockeți și fișiere ([[http://msdn.microsoft.com/en-us/library/aa365467(v=vs.85).aspx | ReadFile]], [[http://msdn.microsoft.com/en-us/library/ms742203(v=vs.85).aspx | WSASend]], [[http://msdn.microsoft.com/en-us/library/ms742203(v=vs.85).aspx | TransmitFile]]) vor fi operații asincrone realizate folosind [[http://msdn.microsoft.com/en-us/library/aa365683(v=VS.85).aspx | Overlapped I/O]]. | + | |
- | *Așteptarea încheierii operațiilor asincrone (atât pe fișiere cât și pe sockeți) se va realiza unificat, folosind [[http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx | I/O Completion Ports]]. | + | |
- | *Pentru implementare, recomandăm să porniți de la [[http://elf.cs.pub.ro/so/res/teme/tema5-util/win/samples/iocp_echo_server.c | exemplul de echo server]] pus la dispoziție. | + | |
- | *API-ul I/O Completion Ports este apelat prin intermediul wrapper-elor din cadrul header-ului [[http://elf.cs.pub.ro/so/res/teme/tema5-util/win/w_iocp.h | w_iocp.h]]. | + | |
- | *Sockeții creați folosind apelul [[http://msdn.microsoft.com/en-us/library/ms740506(v=vs.85).aspx | socket]] sunt sockeți ce pot fi folosiți pentru [[http://msdn.microsoft.com/en-us/library/aa365683(v=vs.85).aspx | operații asincrone]]. | + | |
- | *Pentru operații asincrone de comunicare pe sockeți folosiți funcțiile [[http://msdn.microsoft.com/en-us/library/ms742203(v=vs.85).aspx | WSASend]]. respectiv [[http://msdn.microsoft.com/en-us/library/ms741688(v=vs.85).aspx | WSARecv]]. | + | |
- | *Structura [[http://msdn.microsoft.com/en-us/library/ms741665(v=vs.85).aspx | WSAOVERLAPPED]] conține informațiile necesare pentru operațiile asincrone pe sockeți. Este echivalentă structurii [[http://msdn.microsoft.com/en-us/library/ms684342(v=vs.85).aspx | OVERLAPPED]]. | + | |
- | *Pentru adăugarea socket-ului listener în I/O Completion Port, va trebui să folosiți apelul [[http://msdn.microsoft.com/en-us/library/ms737524(v=vs.85).aspx | AcceptEx]], așa cum se observă și în [[http://elf.cs.pub.ro/so/res/teme/tema5-util/win/samples/iocp_echo_server.c | exemplul de echo server]]. | + | |
- | *[[http://msdn.microsoft.com/en-us/library/ms737524(v=vs.85).aspx | AcceptEx]] permite notificarea unei acțiuni în momentul în care aceasta are loc, împreună cu binding-ul socket-ului. | + | |
- | *Pentru operații asincrone cu sistemul de fișiere, folosiți funcțiile [[http://msdn.microsoft.com/en-us/library/aa365467(VS.85).aspx | ReadFile]] și [[http://msdn.microsoft.com/en-us/library/aa365747(v=VS.85).aspx | WriteFile]] cu argumentele de Overlapped I/O activate. | + | |
- | *Pentru obținerea de informații despre o operație asincronă încheiată (prin intermediul structurii [[http://msdn.microsoft.com/en-us/library/ms684342(v=vs.85).aspx | OVERLAPPED]]), folosiți [[http://msdn.microsoft.com/en-us/library/ms683209(v=vs.85).aspx | GetOverlappedResult]] (fișiere), respectiv [[http://msdn.microsoft.com/en-us/library/ms741582(v=vs.85).aspx | WSAGetOverlappedResult]] (sockeți). | + | |
- | *Transmiterea de fișiere statice se realizează folosind [[http://msdn.microsoft.com/en-us/library/ms740565(v=vs.85).aspx | TransmitFile]]. | + | |
- | *Tema se va rezolva folosind doar funcții Win32. Se pot folosi de asemenea și funcțiile de formatare ''printf'', ''scanf'', funcțiile de alocare de memorie ''malloc'', ''free'' și funcțiile de manipulare a șirurilor de caractere (''strcat'', ''strcmp'' etc.). | + | |
- | *Pentru partea de I/O și procese se vor folosi doar funcții Win32. De exemplu, funcțiile ''open'', ''read'', ''write'', ''close'' nu trebuie folosite; în locul acestora folosiți ''CreateFile'', ''ReadFile'', ''WriteFile'', ''CloseHandle''. | + | |
- | ===== Precizări pentru Linux ===== | + | |
*Atât citirea cât și scrierea peste sockeți se realizează doar la notificarea dată de API-ul specific sistemului de operare, folosind [[http://man7.org/linux/man-pages/man7/epoll.7.html | epoll]]. | *Atât citirea cât și scrierea peste sockeți se realizează doar la notificarea dată de API-ul specific sistemului de operare, folosind [[http://man7.org/linux/man-pages/man7/epoll.7.html | epoll]]. | ||
Line 111: | Line 93: | ||
*Corectarea temelor se va realiza automat cu ajutorul unor suite de teste publice: | *Corectarea temelor se va realiza automat cu ajutorul unor suite de teste publice: | ||
- | *teste Linux -- [[http://elf.cs.pub.ro/so/res/teme/tema5-checker-lin.zip | tema5-checker-lin.zip]] | + | *teste -- [[http://elf.cs.pub.ro/so/res/teme/tema5-checker-lin.zip | tema5-checker-lin.zip]] |
- | *teste Windows -- [[http://elf.cs.pub.ro/so/res/teme/tema5-checker-win.zip | tema5-checker-win]] | + | |
*Indicații despre utilizarea suitei de teste se găsesc în fișierul ''README'' din cadrul arhivei. | *Indicații despre utilizarea suitei de teste se găsesc în fișierul ''README'' din cadrul arhivei. | ||
- | *Pentru testare, pe Windows, se folosește o versiune a utilitarului ''netcat''; puteți descărca arhiva completă (inclusiv executabilul necesar) [[http://joncraton.org/media/files/nc111nt.zip | de aici]] (parola este ''nc''). | ||
*Pentru evaluare și corectare tema va fi uploadată folosind [[https://elf.cs.pub.ro/vmchecker/ui | interfața vmchecker]]. | *Pentru evaluare și corectare tema va fi uploadată folosind [[https://elf.cs.pub.ro/vmchecker/ui | interfața vmchecker]]. | ||
- | *În urma compilării temei trebuie să rezulte un executabil denumit ''aws'' (Linux), respectiv ''aws.exe'' (Windows). | + | *În urma compilării temei trebuie să rezulte un executabil denumit ''aws'' (Linux). |
- | *Pe Windows, va trebui ca, în urma compilării, să rezulte și fișierul obiect ''aws.obj'' (pentru verificările de simboluri folosind ''nm''). | + | |
*Suita de teste conține un set de teste. Trecerea unui test conduce la obținerea punctajului aferent acestuia. | *Suita de teste conține un set de teste. Trecerea unui test conduce la obținerea punctajului aferent acestuia. | ||
*În urma rulării testelor, se va acorda, în mod automat, un punctaj total. Punctajul total maxim este de 90 de puncte, pentru o temă care trece toate testele. La acest punctaj se adaugă 10 puncte care reprezintă aprecierea temei de către asistentul care o corectează. | *În urma rulării testelor, se va acorda, în mod automat, un punctaj total. Punctajul total maxim este de 90 de puncte, pentru o temă care trece toate testele. La acest punctaj se adaugă 10 puncte care reprezintă aprecierea temei de către asistentul care o corectează. | ||
Line 123: | Line 102: | ||
*Pot exista penalizări în caz de întârzieri sau pentru neajunsuri de implementare sau de stil. | *Pot exista penalizări în caz de întârzieri sau pentru neajunsuri de implementare sau de stil. | ||
*Pe lângă penalizările precizate în cadrul [[http://ocw.cs.pub.ro/courses/so/teme/general#lista_depunctari | listei de depunctări]], se vor avea în vedere următoarele elemente: | *Pe lângă penalizările precizate în cadrul [[http://ocw.cs.pub.ro/courses/so/teme/general#lista_depunctari | listei de depunctări]], se vor avea în vedere următoarele elemente: | ||
- | * <color red> **-2p** Linux și Windows -- fișierele statice nu sunt transmise prin mecanismul de zero-copy </color> | + | * <color red> **-2p** Linux -- fișierele statice nu sunt transmise prin mecanismul de zero-copy </color> |
- | * <color red> **-0.5p** Linux și Windows -- alocare statică a unui vector de conexiuni </color> | + | * <color red> **-0.5p** Linux -- alocare statică a unui vector de conexiuni </color> |
* <color red> **-4p** Linux -- nu se folosesc doar ''send'' și ''recv'' pentru operațiile cu sockeți </color> | * <color red> **-4p** Linux -- nu se folosesc doar ''send'' și ''recv'' pentru operațiile cu sockeți </color> | ||
* <color red> **-2p** Linux -- folosirea de operații blocante pe sockeți în locul operațiilor non-blocante </color> | * <color red> **-2p** Linux -- folosirea de operații blocante pe sockeți în locul operațiilor non-blocante </color> | ||
* <color red> **-1p** Linux -- recv/send/sendfile sunt apelate într-o buclă și nu pe baza evenimentelor semnalizate de epoll </color> | * <color red> **-1p** Linux -- recv/send/sendfile sunt apelate într-o buclă și nu pe baza evenimentelor semnalizate de epoll </color> | ||
* <color red> **-2p** Linux -- operațiile I/O asincrone pe fișiere nu sunt așteptate "integrat" folosind ''eventfd'' și ''epoll'' </color> | * <color red> **-2p** Linux -- operațiile I/O asincrone pe fișiere nu sunt așteptate "integrat" folosind ''eventfd'' și ''epoll'' </color> | ||
- | * <color red> **-2p** Windows -- așteptarea încheierii operațiilor asincrone (atât pe fișiere cât și pe sockeți) nu este realizată unificat, folosind I/O Completion Ports </color> | + | * <color red> **-1p** Linux -- alte implementări nevalide la nivelul sistemului asincron de comunicație </color> |
- | * <color red> **-1p** Linux și Windows -- alte implementări nevalide la nivelul sistemului asincron de comunicație </color> | + | * <color red> O temă care **nu** folosește operații I/O asincrone pe fișiere: ''io_*'' (din ''libaio'') pe Linux va pierde punctajul pentru testele cu fișiere dinamice (testele 26-35) </color> |
- | * <color red> O temă care **nu** folosește operații I/O asincrone pe fișiere: ''io_*'' (din ''libaio'') pe Linux, respectiv Overlapped I/O pe Windows va pierde punctajul pentru testele cu fișiere dinamice (testele 26-35) </color> | + | |
***Testul 0** din cadrul checker-ului temei verifică automat coding style-ul surselor voastre. Ca referință este folosit [[https://www.kernel.org/doc/Documentation/CodingStyle | stilul de coding din kernelul Linux]]. Acest test nu oferă sau scade puncte, dar poate fi folosit orientativ de către echipa de corectare pentru a penaliza problemele grave de coding style. Important este să vă definiți un stil și să-l folosiți consecvent. Pentru mai multe informații despre un cod de calitate citiți [[http://ocw.cs.pub.ro/courses/so/laboratoare/resurse/c_tips | pagina de recomandări]]. | ***Testul 0** din cadrul checker-ului temei verifică automat coding style-ul surselor voastre. Ca referință este folosit [[https://www.kernel.org/doc/Documentation/CodingStyle | stilul de coding din kernelul Linux]]. Acest test nu oferă sau scade puncte, dar poate fi folosit orientativ de către echipa de corectare pentru a penaliza problemele grave de coding style. Important este să vă definiți un stil și să-l folosiți consecvent. Pentru mai multe informații despre un cod de calitate citiți [[http://ocw.cs.pub.ro/courses/so/laboratoare/resurse/c_tips | pagina de recomandări]]. | ||
===== Resurse de suport ===== | ===== Resurse de suport ===== | ||
*Cursuri | *Cursuri | ||
- | *[[http://ocw.cs.pub.ro/courses/so/cursuri/curs-10 | Curs 10 - Dispozitive de intrare/ieșire]] | + | *[[http://ocw.cs.pub.ro/courses/so/cursuri/curs-10 | Curs 10 - Dispozitive de intrare/ieșire (Old but gold)]] |
- | *[[http://ocw.cs.pub.ro/courses/so/cursuri/curs-11 | Curs 11 - Networking în sistemul de operare]] | + | *[[http://ocw.cs.pub.ro/courses/so/cursuri/curs-11 | Curs 11 - Networking în sistemul de operare (Old but gold)]] |
*Laboratoare | *Laboratoare | ||
- | *[[http://ocw.cs.pub.ro/courses/so/laboratoare/laborator-10 | Laborator 10 - Operații I/O avansate -- Windows]] | + | *[[http://ocw.cs.pub.ro/courses/so/laboratoare/laborator-11 | Laborator 11 - Operații I/O avansate -- Linux (Old but gold)]] |
- | *[[http://ocw.cs.pub.ro/courses/so/laboratoare/laborator-11 | Laborator 11 - Operații I/O avansate -- Linux]] | + | |
*[[http://github.com/joyent/http-parser | Parser-ul HTTP]] recomandat pentru parsarea cererilor. | *[[http://github.com/joyent/http-parser | Parser-ul HTTP]] recomandat pentru parsarea cererilor. | ||
*[[http://www.jmarshall.com/easy/http/ | Tutorial HTTP]] | *[[http://www.jmarshall.com/easy/http/ | Tutorial HTTP]] | ||
- | *[[http://elf.cs.pub.ro/so/res/teme/tema5-util.zip | Resurse tema 5]] | + | *[[https://github.com/systems-cs-pub-ro/so/tree/2022-2023/teme/assignments/3-aws | Resurse tema 3]] |
*Sample-uri pentru lucru cu sockeți | *Sample-uri pentru lucru cu sockeți | ||
*[[http://elf.cs.pub.ro/so/res/teme/tema5-util/lin/samples/ | Sample-uri Linux]] | *[[http://elf.cs.pub.ro/so/res/teme/tema5-util/lin/samples/ | Sample-uri Linux]] | ||
- | *[[http://elf.cs.pub.ro/so/res/teme/tema5-util/win/samples/ | Sample-uri Windows]] | ||
*Teste | *Teste | ||
- | *[[http://elf.cs.pub.ro/so/res/teme/tema5-checker-lin.zip | Teste Linux]] | + | *[[https://github.com/systems-cs-pub-ro/so/tree/2022-2023/teme/assignments/3-aws/checker-lin | Teste Linux]] |
- | *[[http://elf.cs.pub.ro/so/res/teme/tema5-checker-win.zip | Teste Windows]] | + | |
*[[https://elf.cs.pub.ro/vmchecker/ui | Interfața de upload vmchecker]] | *[[https://elf.cs.pub.ro/vmchecker/ui | Interfața de upload vmchecker]] | ||
- | *[[http://news.gmane.org/gmane.education.region.romania.operating-systems | Lista de discuții a cursului]] | ||
<note important> | <note important> | ||
- | Resursele temei se găsesc în repo-ul [[https://github.com/systems-cs-pub-ro/so/tree/master/assignments/5-aws|temei]] de pe GitHub. | + | Resursele temei se găsesc în repo-ul [[https://github.com/systems-cs-pub-ro/so/tree/2022-2023/teme/assignments/3-aws|temei]] de pe GitHub. |
</note> | </note> | ||
===== FAQ ===== | ===== FAQ ===== | ||
Line 163: | Line 137: | ||
===== Suport, întrebări și clarificări ===== | ===== Suport, întrebări și clarificări ===== | ||
- | Pentru întrebări sau nelămuriri legate de temă folosiți [[https://curs.upb.ro/2021/mod/forum/view.php?id=232558|forumul temei]]. | + | Pentru întrebări sau nelămuriri legate de temă folosiți [[https://curs.upb.ro/2022/mod/forum/view.php?id=76309|forumul temei]]. |
<note important> | <note important> |