Sunteți pe pagina 1din 32

Tema 1 Multi-platform Development

Dat publicare: 27 Februarie 2014


Deadline: 12 Martie 2014, ora 23:55

Deadline hard: 19 Martie 2014, ora 23:55

Scopul temei

Recapitularea lucrului cu funciile ANSI C:

lucrul cu fiiere

alocare dinamic de memorie

Folosirea pointerilor

Enun

S se implementeze n C o tabel de dispersie (hashtable) ce va con ine cuvinte. Opera iile ce trebuie implementate pentru tabel sunt
urmtoarele:

add <cuvnt> adauga cuvntul la hashtable (nu se permit dubluri)

remove <cuvnt> terge cuvntul din hashtable (nu e obligatoriu s existe cuvntul)

clear golete tabela

find <cuvnt> [<fiier_ieire>] caut cuvntul n hashtable scrie True sau False pe o linie nou n fiierul specificat sau la

consol dac acest parametru lipsete

print_bucket <index_bucket> [<fiier_ieire>] scrie cuvintele din bucketul respectiv, pe o singur linie i separate de spa iu

n fiierul specificat sau la consol dac acest parametru lipsete, index_bucket este valid

print [<fiier_ieire>] printeaza toate bucket-urile pe linii diferite, ncepnd cu bucketul 0, n fi ierul specificat sau la consol

dac acest parametru lipsete

resize double dubleaz dimensiunea hash-ului (bucket-urile vor fi parcuse n ordine i cuvintele sunt redistribuite)

resize halve njumtete dimensiunea hash-ului (bucket-urile vor fi parcuse n ordine i cuvintele sunt

redistribuite, memoria n surplus va fi dealocat)


Aceste comenzi se vor regsi una per linie.

Programul va primi o serie de parametri:

Primul parametru este lungimea iniiala a hashului

Urmtorii parametri sunt opionali i reprezint o list de fi iere de intrare din care se face citirea. Dac ace tia lipsesc citirea

se face de la STDIN. Atenie, n cazul n care sunt specificate mai multe fi iere de intrare, toate opera iile se

aplic aceluiai hash.


Exemplu:

./tema1 256 hash1.in hash2.in

./tema1 100 < hash1.in


hash1.in:

add tema

add hash

print hash.out

find tema hash.out

remove tema

find tema hash.out

print hash.out

resize double

print

print_bucket 185 hash2.out

Hashtable-ul implementat va con ine SIZE bucketuri. Fiecare bucket va con ine cuvintele n ordinea n care ele au fost introduse. Pentru
operaia de resize bucketurile vor fi parcurse n ordine i redistribuite. Cuvintele din bucket vor fi parcurse ncepnd cu cel mai vechi i
terminand cu cel mai recent.

Precizri generale

Valorile introduse n hashtable sunt cuvinte [A-Za-z].

Un tablou nu poate conine duplicate.

Nu exist limitri pentru lungimea unui bucket.

Inserarea ntr-un tablou (bucket) se face la finalul acestuia.

Funcia de hash ce trebuie folosit (n ntreaga tem) este definit in hash.c. Nu poate fi folosita alt funcie.

Programul trebuie s execute comenzile n ordine, aa cum au fost primite citite din fi ier(e).

Liniile goale din fiierul de intrare trebuie ignorate (programul nu face nimic i trece la linia urmtoare)

n fiiere se va scrie n modul append.

Dac dimensiunea hash-ului este impar (2k+1), dup njumtaire dimensiunea lui va fi k.

Lungimea hash-ului i a unui cuvnt vor fi reprezentate pe un numr pe 32 de bi i (fr semn) .

irul vid nu este valid.

Dimensiunea hash-ului va fi ntotdeauna pozitiv.

Executabilul generat va purta numele tema1 pe Linux i tema1.exe pe Windows.

Dimensiunea maxim a unei comenzi (operaia i cuvntul asociat) este de 20000 de caractere.

Bufferul folosit pentru citirea comenzilor poate fi declarat cu dimensiune static.

Comportamentul dorit la resize este unul echivalent cu urmatorul: se creeaza un nou hash, se itereaza prin bucketurile din

vechiul hash si se adauga in noul hash.


Precizri VMChecker
Arhiva temei va fi ncrcat de doua ori pe vmchecker (Linux i Windows). Arhiva trimis trebuie s fie aceeai pe ambele platforme (se vor
compara cele dou trimise). Arhivele trebuie s con ina sursele temei, README i dou fiiere Makefile care conin target-urile build i clean:

Fiierul Makefile de Linux se va numi GNUmakefile.

ATENIE: GNUmakefile (cu m mic).

Fiierul Makefile de Windows se va numi Makefile.


Executabilul rezultat din operaia de compilare i linking se va numi tema1.

Punctare

Tema va fi punctat cu minimul punctajelor obinute pe cele dou platforme. Nu avei voie s folosii directive de preprocesare

de forma:

#ifdef __linux__
[...]
#ifdef _WIN32
[...]

Nota mai poate fi modificat prin depunctri suplimentare:

Lista generala de depunctari

-0.1 diverse alte probleme constatate n implementare

-4 alocare static hash

Materiale ajuttoare

Arhiva cu funcia de hash.

Teste:

Linux

Windows

Referine:

ANSI C reference

Hash table

Maini virtuale:

Link (Important: folosii 7zip pentru dezarhivarea mainilor, este posibil s apar probleme cu alte programe de

dezarhivare)
FAQ

Q: Tema 1 se poate face n C++?

A: Nu.

Q: Valorile introduse n hastable sunt cuvinte [A-Za-z] - trebuie verificate cuvintele la introducere?

A: Nu.

Q: Se pot folosi directive de preprocesare de tipul #define?

A: Da.

Q: Pentru citire/scriere din fiier/consol putem folosi freopen?

A: Da, e ok. Putei folosi orice funcie din categoria fopen, fread, fwrite, fclose.
Lista de discuii

Pentru ntrebri sau nelmuriri legate de tem putei cuta, consulta sau trimite un mail pe lista de discuii (trebuie s fii nregistrai).
Tema 2 Mini-shell

Dat publicare: 13 Martie 2014

Deadline: 26 Martie 2014, ora 23:55

Deadline hard: 2 Aprilie 2014, ora 23:55

Enun

S se implementeze un shell simplu, care suport execu ia de comenzi externe cu argumente multiple, comenzi interne, redirectri, pipe-uri.
Shell-ul trebuie s suporte execu ia de comenzi compuse, cu oric i operatori.

Shell-ul trebuie s suporte urmtorii operatori de execuie:

operatorul de secveniere ;

va fi folosit pentru a executa comenzile pe rnd;

de exemplu, expr1; expr2 va avea ca efect mai nti execu ia comenzilor expr1 i, dup terminarea execuiei acestora,

execuia comenzilor expr2;

operatorul de paralelism &

va fi folosit pentru a executa comenzile n paralel;

de exemplu, expr1 & expr2 va avea ca efect execuia comenzilor expr1 i a comenzilor expr2 n paralel;

In implementarea NU aveti voie sa va reapelati singuri executabilul.

execv("./my_homework", "command");

operatorul | (pipe)

va fi folosit pentru nlnuirea comenzilor;

de exemplu, expr1 | expr2 va avea ca efect execuia comezilor expr1 cu stdout-ul redirectat n stdin-ul

comenzilor expr2;

operatorii de execuie condiionat && i ||

vor fi folosii pentru a executa comenzile n funcie de codul de eroare;

expr1 && expr2 va avea ca efect execuia comenzilor expr2 doar n cazul n care comenzile expr1 au ca rezultat un cod

de eroare 0;

expr1 || expr2 va avea ca efect execuia comenzilor expr2 doar n cazul n care comenzile expr1 au ca rezultat un cod

de eroare diferit de zero.

Prioritatea operatorilor de execuie este, de la cel mai prioritar la cel mai pu in prioritar:

1. operatorul |

2. operatorii de execuie condiionat


3. operatorul de paralelism

4. operatorul de secveniere

Shell-ul trebuie, de asemenea, s suporte i urmtorii operatori de redirectare:

< nume_fisier pentru redirectarea intrrii din fiierul nume_fisier;

> nume_fiser pentru redirectarea ieirii standard n fiierul nume_fisier;

2> nume_fisier pentru redirectarea ieirii de eroare standard n fiierul nume_fisier;

&> nume_fisier pentru redirectarea ieirii standard i ieirii de eroare standard n fi ierul nume_fisier;

nume_fisier pentru redirectarea ieirii standard n fiierul nume_fisier n modul append;

2 nume_fisier pentru redirectarea ieirii de eroare standard n fiierul nume_fisier n modul append.

n fine, shell-ul trebuie s suporte urmtoarele comenzi interne:

exit i quit pentru terminarea shell-ului;

cd director pentru schimbarea directorului curent.

Shell-ul trebuie s suporte variabile de mediu:

formatul de utilizare este $VARIABILA_DE_MEDIU identic pe Linux i pe Windows;

variabilele de mediu sunt motenite de la shell-ul printe (Bash) sau sunt definite n mini-shell;

definirea variabilelor se face sub forma NUME_VARIABILA=valoare;

nu trebuie tratat cazul n care valoare conine referiri la alte variabile de mediu.

Daca variabila de mediu nu exista aceasta are valoarea sirul vid (Atentie sirul vid este diferit de NULL)

Precizri generale

Pentru a simplifica implementarea temei, pute i folosi parserul implementat de noi. Pentru detalii despre parser, citi i

fiierul README din arhiv.

Promptul afiat de shell este impus pentru a facilita testarea automata i este > (adic se va afi a caracterul > urmat de un

spaiu).

Numele executabilului temei trebuie s fie mini-shell pe Linux, respectiv mini-shell.exe pe Windows.

Din cauza diferenei ntre Windows i Linux la crearea de noi procese ( CreateProcess vs. fork + exec) s-ar putea s nu putei

folosi acelai tip de parcurgere a arborelui sintactic i pe Windows i pe Linux. Daca vre i s reutiliza i concepte/cod de pe Linux

pe Windows, concepei parcurgerea s funcioneze i cu funcia CreateProcess de pe Windows.

n rezolvarea temei putei porni de la exemplul de utilizare a parserului (UseParser.cpp sau CUseParser.c).

Recomandm rezolvarea i testarea din aproape n aproape a temei dupa pa i:

rularea de comenzi simple

rularea de comenzi interne (cd, exit, quit)


implementarea redirectrilor (operatorii >, <, 2>, &>, , 2)

variabile de mediu

secvenierea comenzilor (operatorii &&, ||, ;)

implementarea operatorilor & (paralel) i | (pipe)

Avei mai jos cteva exemple de comenzi i rezultatul generat de acestea:

> ls
Makefile README.checker mini-shell mini-shell.o parser
Makefile.checker inputs mini-shell.c outputs tags

> uname -a ; ps
Linux bogdan-desktop 2.6.31-19-generic #56-Ubuntu SMP Thu Jan 28 02:39:34 UTC 2010 x86_64 GNU/Linux
PID TTY TIME CMD
6078 pts/0 00:00:00 bash
6190 pts/0 00:00:00 mini-shell
6200 pts/0 00:00:00 ps

> date && sleep 1 ; echo date


Mon Feb 8 13:40:25 EET 2010
date

> date && sleep 1; date


Mon Feb 8 13:40:49 EET 2010
Mon Feb 8 13:40:50 EET 2010

> true && date


Mon Feb 8 13:41:16 EET 2010

> false && cat mini-shell.c

> false || date


Mon Feb 8 13:42:36 EET 2010

> cat /et/services


cat: /et/services: No such file or directory

> cta /etc/services


Execution failed for 'cta'

> cat /etc/services | grep telnet


telnet 23/tcp
rtelnet 107/tcp # Remote Telnet
rtelnet 107/udp
telnets 992/tcp # Telnet over SSL
telnets 992/udp
tfido 60177/tcp # fidonet EMSI over telnet

> gcc > tmp; echo sep; cat tmp


gcc: no input files
sep

> strace -e trace=read ls 2> strace.out


Makefile README.checker mini-shell mini-shell.o parser tags
Makefile.checker inputs mini-shell.c outputs strace.out tmp

> head -1 strace.out


read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@#\0\0\0\0\0\0@"..., 832) = 832

> pwd; cd ~; pwd


/home/bogdan/Documents/SO/Solutii
/home/bogdan

> LETTER=alfa && echo $LETTER


alfa

> echo a > test ; echo b >> test && cat test
a
b

> exit

Precizri Windows

Tema se va rezolva folosind doar funcii Win32. Se pot folosi, de asemenea, i func iile de formatare printf, scanf, funciile de

alocare de memorie malloc, free i funciile de lucru cu iruri de caractere ( strcat, strdup, etc.)

Pentru partea de I/O i procese se vor folosi doar func ii Win32. De exemplu, funciile open, read, write,close nu trebuie folosite,

n locul acestor trebuind s folosii CreateFile, ReadFile, WriteFile, CloseHandle.

Pentru a permite transmiterea de caractere speciale n argumente (spre exemplu echo int main() { return 0; })

recomandm s ngrdii argumentele liniei de comand a CreateProcess cu ghilimele.

Dac folosii Visual Studio dezactivai Unicode (clic dreapta pe proiect Properties Character Set Not Set)

ATENIE: Pentru testarea temei cu testele publice se va folosi cygwin, compilarea sursei se face cu compilatorul specific Windows,

cl (n Visual Studio console).


Instalare Cygwin

Putei descrca Cygwin de aici

Asigurai-v c la instalare ai selectat pachetele make i gcc

Precizri Linux

Tema se va rezolva folosind doar funcii POSIX. Se pot folosi de asemenea i func iile de formatare printf, scanf, funciile de

alocare de memorie malloc, free i funciile de de lucru cu iruri de caractere ( strcat, strdup, etc.)

Pentru partea de I/O i procese se vor folosi doar func ii POSIX. De exemplu, funciile fopen, fread, fwrite,fclose nu trebuie

folosite, n locul acestor trebuind s folosi i open, read, write, close.

Testare

Pentru simplificarea procesului de corectare a temelor, dar i pentru a reduce gre elile temelor trimise, corectarea se va realiza

automat cu ajutorul unor test publice disponibile in sectiunea de materiale ajutatoare.

Exist 18 teste. Se pot obine maxim 9 puncte prin trecerea testelor. Se acord 1 punct din oficiu.

Pentru a trece testul 18, este obligatoriu s respecta i formatul mesajului de eroare impus. Mesajul de eroare trebuie scris

la stderr i trebuie s fie identic cu cel ateptat de teste (vezi test_18_ref.txt din teste).

O tem care trece cele 18 teste automate va ob ine 10 puncte din 10 (daca nu tri eaz folosind APIinterzis, cum ar fi

funcia system(), caz n care nu va fi punctat).


Din punctajul temei se vor scdea automat puncte pentru ntrzieri i pentru warning-uri. La revizia temei, se poate scdea

suplimentar pentru nerespectrea criteriilor scrise la sec iunea reguli. Astfel:

-0.1 pentru fiier Makefile incorect (de exemplu compileaz de fiecare dat totul)

-0.2 pentru fiier README necorespunzator

-0.2 surse necorespunztor comentate

-0.3 neverificarea condiiilor de eroare sau/i neeliberarea de resurse

-0.2 diverse alte probleme constatate n implementare

n cazuri excepionale se poate scdea mai mult dect este men ionat mai sus.

Not

La corectarea temei nu se va ine cont de warning-urile sau leak-urile cauzate de parser. De exemplu:

cl /nologo /W3 /EHsc /Za /c parser.yy.c


parser.yy.c
parser.yy.c(1302) : warning C4018: '<' : signed/unsigned mismatch

Materiale ajutatoare

Cursuri utile:

Curs 1

Curs 2

Curs 3

Laboratoare utile:

Laborator 1

Laborator 2

Laborator 3

Arhiva cu parserul pentru comenzi:

Parser

Schelet de cod:

Schelet cod Linux

Schelet cod Windows

Teste:

teste Linux
teste Windows

Pagina de Upload:

upload

FAQ

Q: Cum pot s citesc arhivele listei de discuii?

A: O variant este cu Opera: File Import and export Import mail Import generic mbox file alegei fiierele

respective.

Q: Am voie sa folosesc funcii POSIX pe Windows?

A: La toate temele de SO pe Windows se va folosi Win32 API, nu POSIX. Oricum, fork i exec nu sunt suportate pe

Windows XP dect dup instalarea Unix Services for Windows.

Q: La temele de Windows trebuie s folosesc funciile de API n versiunea Unicode, ANSI, sau generic?

A: Nu este impus s folosii o versiune anume. Avei, totui, grij s folosi i corect func iile (acestea primesc parametri

de tip CHAR pentru versiunea ANSI, WCHAR pentru Unicode i TCHAR n versiunea generic). Pentru detalii

consultai Unicode in the Windows API.

Q: Ce fac dac am intlnit un caz limit al carui comportament nu este precizat n enun ?

A: n general la temele de SO, pentru cazuri limit ce nu apar n testele publice sau n enunt, se accept orice

comportament documentat n README. Un exemplu este comportamentul pentru command | cd /something. Daca nu

suntei siguri, ntrebai pe lista de discuii.

Q: Trebuie optimizat numrul de fork-uri? Spre exemplu, n cazul comenzii a|b|c trebuie sa am 3 forkuri sau pot s am 4 sau 5?

A: Nu este obligatoriu s optimizai numrul de fork-uri. Totu i, n general este bine s ave i n vedere eficientizarea

consumului de resurse.

Q: Shell-ul trebuie s se comporte ca un shell adevrat (sh, bash) n situa ia ?

A: Funcionalitatea minim necesar este cea din enunul temei. Daca implementa i ceva n plus, preciza i n README.

Exemple de funcionalitate care nu este cerut: updatarea unor variabile de mediu (gen $OLDPWD i $PWD), history, multe

altele (vezi man bash pentru o idee despre funcionalitatea unui shell complet )

Q: Am voie s nu folosesc parserul din enun dac doresc s scriu eu altul echivalent?

A: Da.

Q: Avem voie sa folosim:

const char *argv[] = {"/bin/bash", "-c", command, NULL};

execv("/bin/bash", (char *const *)argv);


A: Nu.

Q: Am voie s fac execv pe tema mea pentru a executa o parte din arbore independent?

A: Nu.

Lista de discuii

Dac avei ntrebri sau nelmuriri legate teme, laboratoare sau curs, pute i cuta, consulta sau trimite un mail pe lista de discuii (trebuie s
fii nregistrai).
Tema 3 Memorie virtual

Dat publicare: 3 Aprilie 2014


Deadline: 16 Aprilie 2014, ora 23:55

Deadline hard: 26 Aprilie 2014, ora 23:55

Zile n care NU se depuncteaz: 19,20,21 Aprilie 2014 (Srbtoarea Patelui)

Obiectivele temei

Aprofundarea conceptelor legate de mecanismele memoriei virtuale.

Obinerea de deprinderi pentru lucrul cu excep ii de memorie pe sistemele Linux i Windows.

Aprofundarea API-ului Linux i Windows de lucru cu spaiul de adrese i memoria virtual.

Recomandri

nainte de a ncepe implementarea temei este recomandat acomodarea cu no iunile i conceptele specifice, precum:

memorie virtual

memorie fizic (RAM)

spaiu de adres

pagini virtuale pages

pagini fizice frames

tabel de pagini

maparea unei pagini virtuale peste o pagin fizic

page fault

drepturi de acces la pagin

demand paging

spaiu de swap

swap in

swap out (evacuare)

nlocuirea unei pagini page replacement

maparea fiierelor file mapping

Urmrii resursele descrise n seciunea Resurse de suport.

Enun

S se implementeze sub forma unei biblioteci partajate/dinamice un swapper & demand pager. Biblioteca va permite alocarea de multiple
zone de memorie virtual pentru care va simula operaii specifice memoriei virtuale: page fault, demand paging, swap in, swap out.
Pentru fiecare zon alocat diversele componente se vor simula n felul urmtor:

Memoria virtual va fi reprezentat de o zon de memorie din spa iul de adres al procesului. Vei folosi funciile din

familia mmap (Linux) i VirtualAlloc (Windows).


Memoria fizic (memoria RAM) va fi simulat de un fi ier. Simularea maprii unei pagini de memorie virtual (alocarea unei

pagini fizice aferente) se va realiza prin maparea acesteia peste o zon asociat din fi ierul RAM. Ve i folosi

funciile mmap (Linux) i MapViewOfFileEx (Windows) pentru maparea paginilor virtuale peste pagina aferent din cadrul

fiierului RAM.

Spaiul de swap va fi simulat de un alt fiier cu dimensiunea egal cu a spa iului virtual de adres. Fiecrei pagini virtuale i va

corespunde o pagin n cadrul fiierului ce simuleaz spaiul de swap.


Exprimarea pagin n cadrul unui fiier se refer la o regiune de dimensiunea unei pagini din cadrul fi ierului. Fi ierul RAM are dimensiunea
a num_frames pagini (num_frames este numrul de pagini fizice) iar fiierul aferent spaiului de swap are dimensiunea a num_pages pagini.
Simulatorul va oferi urmtoarele funcionaliti:

Alocarea de multiple zone de memorie virtual; fiecare zon va fi asociat cu un fi ier care simuleaz memoria RAM i un

fiier care simuleaz spaiul de swap.

Pentru fiecare zon, spaiul de swap are dimensiunea spaiului de memorie virtual. Dimensiunea spa iului de memorie

virtual (numrul de pagini virtuale pages) trebuie s fie mai mare sau egal cu dimensiunea memoriei RAM (numrul de

pagini fizice frames).

La un acces la o pagin de memorie virtual alocat dar nemapat peste RAM, se genereaz un page fault, corespunztor

procesului de demand paging. n urma page fault-ului, pagina de memorie virtual este mapat peste o pagin din RAM

(peste fiierul aferent).

n momentul n care o pagin virtual este mapat peste o pagin fizic n urma procesului de demand paging pagina fizic

trebuie curat (adic umplut cu valori de zero).

Paginile virtuale se consider iniial fr protecie. n momentul generrii unui page fault i a alocrii unei pagini fizice, pagina

virtual este marcat read-only. Dac accesul a fost de scriere, se va genera un nou page fault se va marca pagina read-write.

Astfel, un acces de citire la o pagin nemapat va genera unpage fault, iar pagina va fi mapat i marcat read-only. Un

acces de scriere la o pagin nemapat va genera dou page fault-uri, iar pagina va fi mapat i marcat read-write. Un acces

de scriere la o pagin mapat i marcat read-only va genera un page fault, iar pagina va fi marcat read-write. O pagin

marcat read-write este marcat i dirty (a fost modificat).

Dac n urma unui page fault este nevoie de o pagin fizic iar memoria RAM este ocupat, o pagin fizic trebuie evacuat

(swap out).

Nu se impune nici o costrngere asupra algoritmului de nlocuire a paginii (se poate substitui aceea i pagin, o pagin

aleatoare, FIFO, LRU etc.).

Paginile virtuale mapate pot fi dirty sau nu. O pagin dirty este o pagin care a fost modificat din momentul prezen ei

acesteia n RAM.

Paginile curate (non-dirty) selectate pentru a fi nlocuite nu vor fi evacuate ( swap out). Adic vor fi nlocuite n RAM dar

coninutul lor nu va fi copiat n swap, eliminnd astfel overhead-ul de copiere.

Excepie: dac o pagin este curat (non-dirty) dar nu a fost niciodat evacuat (a fost alocat prindemand paging),

atunci va fi evacuat (swap out).


Dac o pagin virtual (P) are coninutul n spaiul de swap, la accesarea acesteia se genereaz page faulti pagina trebuie

adus n RAM (swap in). n general, page fault-ul va genera eliberarea unei pagini fizice din RAM (F) (rularea unui algoritm de

nlocuire de pagin i swap out); peste pagina fizic (F) astfel eliberat se va mapa pagina (P) la accesul creia s-a

generat page fault-ul.


Interfaa bibliotecii

Interfaa de utilizare a bibliotecii este prezentat n cadrul fiierul header vmsim.h. Acesta conine funcii de iniializare i cleanup a bibliotecii
(vmsim_init/vmsim_cleanup) i funcii de alocare i eliberare a zonelor de memorie (vm_alloc/vm_free).

#include "common.h"

/* virtual memory mapping encapsulation; initialized by vm_alloc */


typedef struct vm_map {
w_ptr_t start;
w_handle_t ram_handle;
w_handle_t swap_handle;
} vm_map_t;

/* initialize and cleanup library -- consider exception handler */


w_boolean_t vmsim_init(void);
w_boolean_t vmsim_cleanup(void);

/*
* allocate physical pages in RAM mapped by virt_pages in swap
* map is to be filled with start address and handle to RAM and swap
* files
*/

w_boolean_t vm_alloc(w_size_t num_pages, w_size_t num_frames, vm_map_t *map);

/*
* free space previously allocated with vm_alloc
* start is the start address of the previously allocated area
*
* implementation has to also close handles corresponding to RAM and
* swap files
*/

w_boolean_t vm_free(w_ptr_t start);

Funcia vmsim_init realizeaz iniializarea bibliotecii. n cadrul func iei se va realiza, n general, nregistrarea page

fault handler-ului n forma unui handler de excepie sau rutin pentru tratarea semnalului SIGSEGV.

Funcia vmsim_cleanup realizeaz nchiderea bibliotecii. n cadrul funciei se va realiza, n general, denregistrarea page

fault handler-ului.

Funcia vm_alloc va aloca o zon de memorie virtual nemapat i va crea fi ierele de suport (fi ierul RAM i fi ierul pentru

spaiul de swap). Funcia primete ca argument numrul de pagini virtuale ( num_pages) i numrul de pagini fizice

(num_frames) pentru alocarea spaiului virtual i trunchierea fiierelor la dimensiunea necesar. Func ia ntoarce pointer-ul din

spaiul de adres ctre zona de memorie virtual alocat i handler-ele celor dou fi iere n cadrul unei structuri struct

vm_map. Handler-ele fiierelor vor fi folosite n cadrul suitei de test.

Funcia vm_free elibereaz zona de memorie virtual mapat cu vm_alloc i nchide i terge fiierele asociate acesteia.

Funcia primete ca argument pointer-ul ctre zona de memorie virtual alocat anterior din spa iul de adres al procesului.
Implementarea trebuie s realizeze intern maparea ntre acest pointer i fi ierele aferente pentru ca toate resursele s fie

nchise la apelul vm_free.

Imagine

Imaginea de mai jos prezint fluxul paginilor prin memorie i o posibil stare la un moment dat pentru o zon dat.

Aceast imagine este doar principial; starea descris nu este o stare precis n care se poate gsi o zon de memorie n timpul sau ca
urmare a execuiei testelor.

Precizri/recomandri pentru implementare

Implementarea page fault handler-ului se realizeaz prin intermediul vectorilor de excepie (Windows) sau a unei rutine de

tratare a semnalului SIGSEGV (Linux).

Pentru a implementa logica de demand paging i cea de swapping trebuie s interceptai page-fault-urile produse n

momentul unui acces nevalid la o zon de memorie. La interceptarea page-fault-urilor, folosii modificri succesive ale

drepturilor paginilor pentru a implementa logica temei. La nceput, paginile nu au nici un drept (PROTECTION_NONE).

Modificrile realizate asupra memoriei virtuale nu se reflect imediat n fi ierul asociat memoriei RAM (memoria RAM fiind

mapat peste acest fiier). De aceea, atunci cnd se dorete verificarea memoriei RAM (n teste), trebuie realizat
sincronizarea paginilor din memorie cu fiierul. Nu este nevoie s realizai sincronizarea ntre memorie i fi ier. Testul va

realiza acest lucru, la nevoie printr-un apel la funciile de sincronizare a datelor n fi ierele mapate.

Nu se impune nici o restricie de nume asupra fi ierelor ce reprezint memoria RAM, respectiv spa iul de swap. Recomandm

s folosii API-ul specific de generare a numelor de fiiere ( mkstemp,GetTempFileName).

Consultai header-ele i fiierele din cadrul fiierelor de test pentru macro-uri i funcii utile.

Pentru a determina dimensiunea unei pagini, folosii funcia w_get_page_size definit n fiierul headercommon.h.

Pentru implementare, putei pleca de la urmtorul set de enumerri/structuri:


helpers.h

enum page_state {
STATE_IN_RAM,
STATE_IN_SWAP,
STATE_NOT_ALLOC
};

struct frame;

/* handle pages (virtual pages) */


struct page_table_entry {
enum page_state state;
enum page_state prev_state;
w_boolean_t dirty;
w_prot_t protection;
w_ptr_t start;
struct frame *frame; /* NULL in case page is not mapped */
};

/* handle frames (physical pages) */


struct frame {
w_size_t index;
/* "backlink" to page_table_entry; NULL in case of free frame */
struct page_table_entry *pte;
};

Structurile de mai sus reprezint doar un punct de pornire. Se pot aduga alte cmpuri sau structuri specifice modului n care

biblioteca va gestiona zonele de memorie.


Precizri pentru Linux

Pentru gestiunea memoriei virtuale folosii funciile mmap/ munmap/ mprotect.

Pentru interceptarea accesului invalid la o zon de memorie va trebui s intercepta i semnalul SIGSEGVfolosind apeluri din

familia sigaction.

Vei nregistra un handler n cmpul sa_sigaction al structurii struct sigaction.

Pentru a determina adresa care a generat page fault-ul folosii cmpul si_addr din cadrul structuriisiginfo_t.

Pentru eliberarea/evacuarea unei pagini, demapai acea pagin (pagina este mapat peste o pagin din fi erul RAM) i

remapai-o la aceeai adres dar ca mapare anonim (MAP_ANONYMOUS) i fr protecie (PROT_NONE).

Pentru generarea de fiiere temporare, putei folosi apelul mkstemp.

Putei folosi funciile wrapper declarate i implementate n common.h i common_lin.c.

Putei extinde fiierele cu funcii wrapper proprii.


Tema se va rezolva folosind doar funcii POSIX. Se pot folosi de asemenea i func iile de formatare printf, funciile de alocare

de memorie malloc, free i funciile de lucru cu iruri de caractere ( strcat,strdup etc.)

Pentru partea de I/O i procese se vor folosi doar func ii POSIX. De exemplu, funciile fopen, fread, fwrite,fclose nu

trebuie folosite; n locul acestora folosii open, read, write, close.

Precizri pentru Windows

API-ul oferit de Windows difer de cel oferit de Linux; exist func ii dedicate de gestiune a memoriei virtuale

( VirtualAlloc, VirtualFree) i alte funcii de gestiunea a fiierelor mapate

(CreateFileMapping, MapViewOfFile, MapViewOfFileEx, UnmapViewOfFile).

Alocarea spaiului de memorie virtual pentru o zon se realizeaz folosind VirtualAlloc. ntruct operaiile de

alocare/dezalocare au loc la nivel de pagin, recomandm urmtoarea secven de ac iuni:

alocarea ntregului spaiului necesar folosind VirtualAlloc;

eliberarea spaiului ocupat folosind VirtualFree;

alocarea a N pagini consecutive, la adrese fixe, ncepnd cu adresa de start, folosind VirtualAlloc.

Funcia de sincronizare din cadrul testului apeleaz, pentru fiecare pagin, FlushViewOfFile.

Exemplu de utilizare a mai multor apeluri VirtualAlloc pentru pagini consecutive gsii aici.

Pentru maparea unei pagini/zone de memorie virtual de la o adres fix peste un fiier (fiierul RAM), folosii

funcia MapViewOfFileEx.

Va trebui s demapai pagina de memorie virtual (folosind VirtualFree sau UnmapViewOfFile) i s realizai noua

mapare.

Un exemplu de utilizarea a MapViewOfFileEx gsii aici.

Pentru interceptarea acceselor invalide la zone de memorie (general protection fault), va trebui s folosi i vectori de excep ie;

acetia permit nregistrarea, respectiv denregistrarea unui handler care s fie rulat la apari ia unei excep ii (acces nevalid).

Folosii apelurile AddVectoredExceptionHandler/RemoveVectoredExceptionHandler.

Pentru obinerea adresei care a generat excep ia (fault-ul, accessul nevalid), folosi i

valoareaExceptionInformation[1], cmp al structurii ExceptionRecord.

Pentru generarea de fiiere temporare, putei folosi apelul GetTempFileName.

Putei folosi funciile wrapper declarate i implementate n common.h i common_win.c.

Putei extinde fiierele cu funcii wrapper proprii.

Tema se va rezolva folosind doar funcii Win32. Se pot folosi de asemenea i func iile de formatare printf, scanf, funciile de

alocare de memorie malloc, free i funciile de manipulare a irurilor de caractere ( strcat, strdup etc.).

Pentru partea de I/O i procese se vor folosi doar func ii Win32. De exemplu, functiile open, read, write,close nu trebuie

folosite; n locul acestora folosii CreateFile, ReadFile, WriteFile, CloseHandle.

Testare

Corectarea temelor se va realiza automat cu ajutorul unor suite de teste publice:

teste Linux tema3-checker-lin.zip


teste Windows tema3-checker-win.zip

Indicaii despre utilizarea suitei de teste se gsesc n fiierul README din cadrul arhivei.

Pentru evaluare i corectare tema va fi uploadat folosind interfaa vmchecker.

n urma compilrii temei trebuie s rezulte o bibliotec shared-object (Linux) denumit libvmsim.so sau o bibliotec

dinamic (Windows) denumit libvmsim.dll.

Suita de teste conine un set de teste. Trecerea unui test conduce la ob inerea punctajului aferent acestuia.

n urma rulrii testelor, se va acorda, n mod automat, un punctaj total. Punctajul total maxim este de 100 de puncte,

pentru o tem care trece toate testele.

Cele 100 de puncte corespund la 10 puncte din cadrul notei finale.

Pot exista penalizri n caz de ntrzieri sau pentru neajunsuri de implementare sau de stil.

Penalizrile pentru neajunsuri de implementare pot constitui maxim 1 punct din nota final a temei.

Pe lng penalizrile precizate n cadrul listei de depunctri, se vor avea n vedere urmtoarele elemente:

-0.5 folosirea unei structuri de dimensiune static pentru lista zonelor de memorie alocate

folosindvm_alloc.

Resurse de suport

Cursuri

Curs 5 - Gestiunea memoriei

Curs 6 - Memoria virtual

Laboratoare

Laborator 4 - Semnale

Laborator 6 - Memoria virtual

Operating System Concepts Chapter 8 Main Memory

Operating System Concepts Chapter 9 Virtual Memory

Header-ul cu interfaa bibliotecii

Teste

Teste Linux

Teste Windows

Interfaa de upload vmchecker

Lista de discuii a cursului

Utilizarea vectorilor de excepie (Windows)

FAQ

Q: Tema se poate face n C++?

A: Nu.

Q: Avem voie s folosim fiiere (surs, header) prezente n arhiva de test?

A: Da, v ncurajm s facei acest lucru.


Q: Avem voie s modificm header-ul temei (vmsim.h) sau alte headere prezente?

A: Da, dac aceste modificri v sunt utile n realizarea temei. Dar aceste modificri nu vor fi vizibile n cadrul testului

sursele testului sunt cele prezente n arhiva de test.

Q: Exist cazuri n care funcia FlushViewOfFile, apelat din w_sync_mapping iese cu eroare. Este acest lucru o problem?

A: Situaia nu constituie neaprat o problem.

Funcia w_sync_mapping parcurge ntregul spaiu de adrese virtuale (pagini virtuale) i execut flush/sync pe

fiecare pagin fr a ine cont dac sunt mapate sau nu peste fi ierul de RAM.

Paginile mapate peste fiierul de RAM vor fi synced/flushed, n timp ce, pentru paginile nemapate,

funcia FlushViewOfFile se ntoarce cu eroare.

Q: n cadrul rulrii testelor de Windows pe consola Cygwin nu apar mesajele de debug. Care este problema?

A: n consola Cygwin, buffering-ul se face ciudat ( adic nu tim cum ). Recomandm folosirea consolei Windows

(Command Prompt).
Suport, ntrebri i clarificri

Pentru ntrebri sau nelmuriri legate de tem putei consulta lista de discuii sau putei trimite un e-mail.

Trebuie s fii nregistrai pe list pentru a putea trimite mesaje.

V rugm s urmrii i s respectai indicaiile de utilizare a listei.

Putei edita aceast pagin pentru a clarifica/mbunti enun ul.


Tema 4 Planificator de threaduri

Dat publicare: 17 Aprilie 2014

Deadline: 7 Mai 2014, ora 23:55

Deadline hard: 14 Mai 2014, ora 23:55

Obiectivele temei

Aprofundarea urmtoarelor noiuni:

threaduri POSIX i WINDOWS

planificarea proceselor/threadurilor

mecanisme de sincronizare ntre threaduri

Enun

S se implementeze un planificator de threaduri care va controla execu ia acestora n user-space. Acesta va simula un scheduler de procese
preemptiv, ntr-un sistem uniprocesor, care utilizeaz un algoritm de planificare Round Robin cu priorit i.

Implementarea planificatorului de threaduri se va face ntr-o bibliotec partajat dinamic, pe care o vor ncrca thread-urile ce urmeaz s
fie planificate. Aceasta va trebui s exporte urmtoarele funcii:

INIT - iniializeaz structurile interne ale planificatorului.

FORK - pornete un nou thread.

EXEC - simuleaz execuia unei instruciuni.

WAIT - ateapt un eveniment/operaie I/O.

SIGNAL - semnaleaz threadurile care ateapt un eveniment/operaie I/O.

END - distruge planificatorul i elibereaz structurile alocate.

Pe lng implementarea propriu-zis a funciilor de mai sus, va trebui s asigurai i planificarea/execu ia corect a threadurilor, conform
algoritmului Round Robin cu prioriti. Fiecare thread trebuie s ruleze n contextul unui thread real din sistem. Fiind un planificator pentru
sisteme uniprocesor, un singur thread va putea rula la un moment dat.

Descriere detaliat a funcionrii planificatorului

Timp execuie:

ntr-un sistem real, pentru controlul execu iei, contorizarea timpului de rulare a unui proces se realizeaz la fiecare ntrerupere de ceas.

Pentru facilitarea implementrii, modelul temei va simula un sistem real astfel:

1. sistemul simulat va folosi un timp virtual (logic), independent de cel real pentru a contoriza timpul de rulare pe procesor.

2. vei considera c o instructiune dureaz o singur perioad de ceas (unitate de timp logic).

3. fiecare din funciile prezentate mai sus reprezint o singur instructiune ce poate fi executat de un thread la un moment dat.
Evenimente i I/O

Threadurile din sistem se pot bloca n ateptarea unui eveniment sau a unei opera ii de I/O. Un astfel de eveniment va fi identificat printr-un
id (0 - nr_events). Numrul total de evenimente (care pot aprea la un moment dat n sistem) va fi dat ca parametru la ini ializarea
planificatorului.

Un thread se blocheaz n urma apelului func iei wait (ce primete ca parametru id-ul/indexul evenimentului/dispozitivului) i este eliberat
atunci cnd un alt thread apeleaz funcia signal pe acelai eveniment/dispozitiv. Signal trezete toate threadurile care a teapta un anumit
eveniment.

Atenie, un thread care a apelat funcia wait, indiferent de prioritate, nu poate fi planificat dect dup ce este trezit de un alt thread.

Round Robin cu prioriti

fiecare task are asociat o prioritate static, care este specificat la pornirea threadului.

ntotdeauna va fi planificat threadul cu cea mai mare prioritate.

la expirarea cuantei de timp, threadul care ruleaz este preemptat i se alege un nou task.

dac un thread este preemptat i revine n starea READY (ex: cazul n care i expir cuanta), iar n sistem nu mai exist un alt

thread READY de prioritate mai mare sau egal cu al lui, va fi replanificat acela i thread.

threadurile cu aceeai prioritate vor fi planificate dup modelul Round Robin (ex: pute i folosi cozi de priorit i ce vor fi parcurse

circular).

dac un thread proaspt creat (sau care doar ce a ie it din starea de waiting) are prioritate mai mare dect threadul care ruleaz,

cel din urm va fi preemptat i va rula thread-ul cu prioritatea mai mare.

la replanificarea unui thread, cuanta acestuia de rulare pe procesor va fi resetat la valoarea maxim.

preempia: odat ce o funcie/instruciune a fost planificat, ea nu poate fi preemptat dect dup ce i-a terminat treaba (do

work n exemplul de mai jos). Pentru a simula preemp ia, pute i bloca func ia curent folosind mecanisme de sincronizare. De

exemplu, o instruciune se poate abstractiza astfel:

instruction()

do work

check scheduler

if (preempted)

block();

return;

Prin urmare, cazurile n care threadul curent este preemptat i un alt thread ncepe rularea sunt:

un task cu o prioritate mai mare intr n sistem.

un task cu o prioritate mai mare este semnalat printr-o opera ie de tipul signal.
task-ului curent i-a expirat cuanta de timp.

ateapt la un eveniment cu ajutorul unei operaii de tipul wait.

nu mai are instruciuni de executat.

Pentru mai multe detalii despre algoritmi de planificare pute i consulta cursul 4.

Stri threaduri:

Strile prin care poate trece un thread sunt:

New - thread nou creat n urma unui apel de tipul fork.

Ready - ateapt s fie planificat.

Running - planificat - un singur thread poate rula la un moment dat.

Waiting - ateapt dup un eveniment sau o operaie I/O. Un thread se va bloca n starea de wait n urma

apelului so_wait(event/io).

Terminated - i-a ncheiat execuia.

Pentru o mai bun ntelegere a algoritmilor de planificare, se recomand urmrirea tranzi iilor dintre stri ca n desenul de mai jos.

Detalii implementare instruciuni

Funciile care trebuie exportate de planificator, alturi de parametrii fiecruia, sunt detaliate mai jos:

int so_init(cuant, io) - iniializeaz planificatorul. Primete ca argumente cuanta de timp dup care un proces trebuie

preemptat i numrul de evenimente (dispozitive I/O) suportate. ntoarce 0 dac planificatorul a fost ini ializat cu succes, sau

negativ n caz de eroare. Numrul maxim de dispozitive I/O suportate este 256.

void so_end() - elibereaz resursele planificatorului i ateapt terminarea tuturor threadurilor nainte de prsirea sistemului.

void so_exec() - simuleaz execuia unei instruciuni generice. Practic, doar consum timp pe procesor.

int so_wait(event/io) - threadul curent se blocheaz n ateptarea unui eveniment sau a unei opera ii de I/O. ntoarce 0 dac

evenimentul exist (id-ul acestuia este valid) sau negativ n caz de eroare.
int so_signal(event/io) - trezete unul sau mai multe threaduri care ateapt un anumit eveniment. ntoarce numrul total de

threaduri deblocate, sau negativ n caz de eroare (evenimentul nu este valid).

tid_t so_fork(handler, prioritate) - pornete i introduce n planificator un nou thread. Primete ca parametru o rutin pe

care threadul o va executa dup ce va fi planificat i prioritatea cu care acesta va rula i ntoarce un id unic corespunztor

threadului. Handlerul executat de thread va primi ca parametru prioritatea acestuia.

n mod normal, so_fork va fi apelat din contextul unui alt thread din sistem. Se garanteaz faptul c va exista ntotdeauna cel pu in un
thread ce poate fi planificat, pe ntreg parcursul rulrii planificatorului. Excep ie face cazul primului so_fork ce va crea primul thread din sistem
i va fi apelat din contextul testelor, neavnd ca parinte un thread din sistemul simulat.

Un exemplu de model de implementare a funciei fork, ar putea fi folosirea unei func ii suplimentare (ex start_thread) care s determine
contextul n care se va executa noul thread (handlerul primit ca parametru) ca n descrierea de mai jos:

so_fork(handler, prio)

-> initializare thread struct

-> creare thread nou ce va executa functia start_thread

-> asteapt ca threadul s intre n starea READY/RUN

-> returneaz id-ul noului thread

start_thread(params)

-> asteapt s fie planificat

-> call handler(prio)

-> iesire thread

Atenie: Funcia se va ntoarce abia dup ce noul thread creat fie a fost planificat fie a intrat n starea READY.

Exemplu execuie

= Thread 0 = = Thread 1 = = Thread 2 = = Thread 3 =

exec exec exec exec

fork(thr2, 2) signal(3) wait(3) exec

fork(thr1, 1) fork(thr3, 1) exec

exec exec

exec

exec
n exemplul de mai sus, threadul 0 are prioritatea 0. Acesta porne te threadurile 1 i 2 cu priorit ile asociate. Threadul 2 se blocheaz
ateptnd evenimentul cu id-ul 3, eveniment ce va fi semnalat de threadul 1. Cuanta de rulare pe procesor este 3. n final, instruciunile se
vor executa n urmtoarea ordine:

T0 exec

T0 forks T2, prio 2

--> T2 preempts T0 (prio(T2) > prio(T0))

T2 exec

T2 waits for event 3

--> T2 blocks and is preempted

T0 forks T1, prio 1

--> T1 preempts T0

T1 exec

T1 signals event 3

--> T2 is woken up and preempts T1

T2 exec

--> T2 finished

T1 forks T3, prio 1

T1 exec

T1 exec

--> T1 is preempted, its CPU quantum expired

T3 exec

T3 exec

--> T3 finished

T1 exec

--> T1 finished

T0 exec

--> T0 finished

Precizri Linux

Identificatorul ntors de funcia so_fork trebuie s fie structura pthread_t populat de funcia POSIXpthread_create().

Tema se va rezolva folosind doar funcii POSIX. Se pot folosi de asemenea i func iile de formatare printf, scanf, func iile de alocare de
memorie malloc, free, i funciile de manipulare a irurilor de caractere (strcat, strdup, etc.)
Tema se va rezolva folosind fire de execuie POSIX i exclusiv mecanisme de sincronizare a firelor de execu ie POSIX (mutex, variabile de
condiie).

Precizri Windows

Pe lng mecanismele de sincronizare nvate la laborator, avei voie s folosi i i variabile de condiie.

Identificatorul ntors de funcia so_fork trebuie s fie cel ntors de funcia GetCurrentThreadId() apelat n contextul threadului nou creat.

Tema se va rezolva folosind doar funcii Win32. Se pot folosi de asemenea i func iile de formatare printf, scanf, func iile de alocare de
memorie malloc, free i funciile de manipulare a irurilor de caractere (strcat, strdup, etc.)

Utile

Header - conine semnturile funciilor exportate.

Testare

Corectarea temelor se va realiza automat cu ajutorul unor suite de teste publice:

teste Linux tema4-checker-lin.zip

teste Windows tema4-checker-win.zip

Pentru evaluare i corectare tema va fi uploadat folosind interfaa vmchecker.

n urma compilrii temei trebuie s rezulte o bibliotec shared-object (Linux) denumit libscheduler.sosau o bibliotec dinamic

(Windows) denumit libscheduler.dll.

Suita de teste conine un set de teste. Trecerea unui test conduce la ob inerea punctajului aferent acestuia.

n urma rulrii 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 ctre

asistentul care o corecteaz.

Cele 100 de puncte corespund la 10 puncte din cadrul notei finale.

Pot exista penalizri n caz de ntrzieri sau pentru neajunsuri de implementare sau de stil. Ca excep ie, pot aprea depunctri mai

mari de 1 pct, n cazul n care tema trece teste prin hackuri n implementare (ex: sincronizri cu sleep, threadurile nu ruleaz

peste threaduri reale din sistem, etc).

Notare

Nota maxim este de 100p.

Depunctri suplimentare:

-0.6 erori de sincronizare (deadlock, race condition, etc.).

nerespectarea regulilor de aici.

alte depunctri pentru implementri greite, ce nu respect cerin a general a temei.


Materiale ajuttoare

Cursuri:

Curs 4 - Planificarea execuiei

Curs 8 - Fire de execuie

Laboratoare:

Laborator 8

Laborator 9

FAQ

Q: Tema se poate face n C++?

A: Nu.

Lista de discuii

Pentru ntrebri sau nelmuriri legate de tem putei cuta, consulta sau trimite un mail pe lista de discuii (trebuie s fii nregistrai).
Tema 5 Server web asincron

Dat publicare: 8 Mai 2014

Deadline hard: 21 Mai 2014, ora 23:55

Obiectivele temei

Aprofundarea noiunilor legate de lucrul cu sockei.

Deprinderi de implementare i proiectare a aplicaiilor care folosesc opera ii asincrone i alte opera ii I/O avansate.

Aprofundarea utilizrii API-ului pentru operaii I/O avansate la nivelul sistemelor de operare Linux i Windows.

Enun

S se implementeze un server web care s foloseasc operaii avansate de intrare/ie ire:

operaii asincrone pe fiiere;

operaii non-blocante pe sockei;

zero-copying;

multiplexarea operaiilor I/O.

Pentru implementare se va folosi API-ul de operaii I/O avansate specific sistemelor de operare Linux i Windows:

sendfile/ TransmitFile

io_setup & friends/ Overlapped I/O

epoll/ Completion Ports.

Serverul web va utiliza API-ul modern de multiplexare pentru a atepta conexiuni din partea clien ilor: epoll(Linux) i Completion Ports pe
Windows. Pe conexiunile realizate se vor recepiona cereri din partea clienilor i apoi se vor distribui rspunsurile ctre ace tia.

Clienii i serverul vor comunica folosind protocolul HTTP. Pentru parsarea cererilor HTTP din partea clien ilor recomandm folosirea acestui
parser HTTP, disponibil i n cadrul directorului de resurse ale temei. Va trebui s folosii un callback pentru ob inerea cii ctre resursa local
solicitat de client. Tot n directorul de resurse, gsi i un exemplu simplificat de folosire a parser-ului.

Serverul implementeaz o funcionalitate limitat a protocolului HTTP, aceea de a transmite fiiere clienilor. Serverul va furniza fiiere
din directorul AWS_DOCUMENT_ROOT, definit n cadrul antetului temei. Fiiere se gsesc doar n subdirectoarele AWS_DOCUMENT_ROOT/static/,
respectiv AWS_DOCUMENT_ROOT/dynamic/, iar request path-uri corespunztoare vor fi, de exemplu, AWS_DOCUMENT_ROOT/static/test.dat,
respectivAWS_DOCUMENT_ROOT/dynamic/test.dat. Prelucrarea fiierelor va fi urmtoarea:

Fiierele din directorul AWS_DOCUMENT_ROOT/static/ sunt fiiere statice care vor fi transmise clienilor folosind API de zero-copying

( sendfile/ TransmitFile).

Fiierele din directorul AWS_DOCUMENT_ROOT/dynamic/ sunt fiiere pentru care se presupune c este necesar o faz de post-

procesare din partea serverului. Aceste fiiere vor fi citite de pe disc folosind API asincron i apoi vor fi transmise ctre clieni.

Transmiterea va folosi sockei non-blocani (Linux) i Overlapped I/O pe socke i (Windows).


Pentru request path-uri nevalide se va transmite un mesaj HTTP 404.

Dup transmiterea unui fiier, conform protocolului HTTP, conexiunea este nchis.

Precizri/recomandri pentru implementare

Implementarea temei presupune existena unei maini de stri pentru fiecare conexiune, pe care s o interoga i i actualiza i

periodic pe msura desfurrii transferului.

Recomandm crearea unei structuri care s gestioneze o conexiune, starea acesteia, con inutul bufferelor.

Definiiile macro-urilor i structurilor utile se gsesc n header-ul temei.

Rspunsurile HTTP vor avea codul 200 pentru fiiere existente i 404 pentru fi iere inexistente.

Un rspuns valid este format din antetul HTTP, coninnd directivele aferente, dou newline-uri ( \r\n\r\n, urmat de

coninutul efectiv (fiierul).

Exemple de rspunsuri gsii n fiierul de test al parser-ului sau n sample-ul pus la dispoziie.

Putei folosi directive de request predefinite, precum Date, Last-Modified etc.

Directiva Content-Length trebuie s precizeze dimensiunea con inutului HTTP (datelor efective) la nivel de

octei.

Directiva Connection trebuie iniializat la close.

Portul pe care serverul web ascult pentru conexiuni este definit n cadrul header-ului temei ca macro:AWS_LISTEN_PORT.

Directorul rdcin raportat la care se caut resursele/fiierele este definit n cadrul header-ului temeica

macro: AWS_DOCUMENT_ROOT.
Resurse utile

Pentru parsarea cererii HTTP i obinerea request path-ului putei folosi acest parser HTTP disponibil i n directorul de resurse ale

temei.

Pentru compilare, folosii fiierul Makefile.

Consultai fiierul README.md.

Un exemplu specific de folosire a parser-ului pentru ob inerea request path-ului este disponibil nsubdirectorul samples/.

Pentru aspecte de depanare i tratare a erorilor, folosii fiierele header disponibile.

Folosii subdirectorul samples/ din directorul aferent fiecrui sistem de operare pentru exemple de utilizare a API-ului pe sockei.

Gsii implementat ca exemplu un server echo bazat pe API avansat de multiplexare.

Gsii implementat ca exemplu un server care trimite un rspuns HTTP.


Depanare/troubleshooting

Pentru depanarea serverului, recomandm folosirea wget i a netcat.

Pentru netcat, dac dorii s comunicai folosind HTTP, va trebui s transmite i o cerere specific (spre exemplu GET

/path/to/resource HTTP/1.0). Exemplu de folosire:


$ nc localhost 8888

GET / HTTP/1.0

Sau:

echo -e "GET / HTTP/1.0\n" | nc -q 2 localhost 8888

Exemple de utilizare gsii n teste.

Precizri pentru Windows

Operaiile pe sockei i fiiere ( ReadFile, WSASend, TransmitFile) vor fi operaii asincrone realizate folosind Overlapped I/O.

Ateptarea ncheierii operaiilor asincrone (att pe fiiere ct i pe sockei) se va realiza unificat, folosind I/O Completion Ports.

Pentru implementare, recomandm s pornii de la exemplul de echo server pus la dispoziie.

API-ul I/O Completion Ports este apelat prin intermediul wrapper-elor din cadrul header-uluiw_iocp.h.

Sockei creai folosind apelul socket sunt sockei ce pot fi folosii pentru operaii asincrone.

Pentru operaii asincrone de comunicare pe sockei folosii func iile WSASend. respectiv WSARecv.

Structura WSAOVERLAPPED conine informaiile necesare pentru operaiile asincrone pe sockei. Este echivalent

structurii OVERLAPPED.

Pentru adugarea socket-ului listener n I/O Completion Port, va trebui s folosi i apelul AcceptEx, aa cum se observ i

n exemplul de echo server.

AcceptEx permite notificarea unei aciuni n momentul n care aceasta are loc, mpreun cu binding-ul socket-ului.

Pentru operaii asincrone cu sistemul de fiiere, folosii func iile ReadFile i WriteFile cu argumentele de Overlapped I/O activate.

Pentru obinerea de informaii despre o operaie asincron ncheiat (prin intermediul structurii OVERLAPPED),

folosii GetOverlappedResult (fiiere), respectiv WSAGetOverlappedResult (sockei).

Transmiterea de fiiere statice se realizeaz folosind TransmitFile.

Tema se va rezolva folosind doar funcii Win32. Se pot folosi de asemenea i func iile de formatare printf, scanf, funciile de

alocare de memorie malloc, free i funciile de manipulare a irurilor de caractere ( strcat, strdup 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 folosii CreateFile, ReadFile, WriteFile, CloseHandle.

Precizri pentru Linux

Att citirea ct i scrierea peste socke i se realizeaz doar la notificarea dat de API-ul specific sistemului de operare,

folosind. epoll.

Tot folosind epoll se va atepta notificarea ncheierii operaiilor asincrone pe fi iere.


Pentru implementare, recomandm s pornii de la exemplul de echo server pus la dispoziie.

API-ul epoll este apelat prin intermediul wrapper-elor din cadrul header-ului w_epoll.h.

Scrierea pe sockei, att n cazul fiierelor statice, ct i n cazul fi ierelor dinamice, se realizeaz non-blocant: socke ii sunt

marcai ca non-blocani, iar la un apel de scriere se scrie ct permite buffer-ul socketului. La urmtoarea notificare din

partea API-ului specific se va realiza o nou scriere i aa mai departe.

Pentru configurarea unui socket ca non-blocant putei folosi fcntl (flag-ul O_NONBLOCK).

Pentru implementarea operaiilor I/O, folosii funciile din familia io_setup.

Pentru utilizarea funciilor va trebui s realizai link-area cu biblioteca libaio i includerea header-ului<libaio.h>.

Pentru instalarea bibliotecii pe maina virtual folosii comanda

apt-get install libaio-dev

Recomandm folosirea unei variabile globale de tipul io_context_t i a unui descriptor eventfd pentru fiecare

conexiune.

Pentru ncheierea operaiilor asincrone, folosii io_getevents.

Putei consulta acest exemplu de integrare a operaiilor I/O asincrone cu eventfd.

Transmiterea de fiiere statice se realizeaz folosind sendfile.

Tema se va rezolva folosind doar funcii POSIX. Se pot folosi de asemenea i func iile de formatare din familia printf, funciile de

alocare de memorie malloc, free i funciile de lucru cu iruri de caractere ( strcat, strdup etc.)

Pentru partea de I/O se vor folosi doar funcii POSIX i func ii pentru operaii asincrone. De exemplu,

funciile fopen, fread, fwrite, fclose nu trebuie folosite; n locul acestora folosii open, io_setup, io_submit,close.

Testare

Corectarea temelor se va realiza automat cu ajutorul unor suite de teste publice:

teste Linux tema5-checker-lin.zip

teste Windows tema5-checker-win

Indicaii despre utilizarea suitei de teste se gsesc n fiierul README din cadrul arhivei.

Pentru testare, pe Windows, se folosete o versiune a utilitarului netcat; putei descrca arhiva complet (inclusiv executabilul

necesar) de aici.

Pentru evaluare i corectare tema va fi uploadat folosind interfaa vmchecker.

n urma compilrii temei trebuie s rezulte un executabil denumit aws (Linux), respectiv aws.exe(Windows).

Pe Windows, va trebui ca, n urma compilrii, s rezulte i fi ierul obiect aws.obj (pentru verificrile de simboluri

folosind nm).

Suita de teste conine un set de teste. Trecerea unui test conduce la ob inerea punctajului aferent acestuia.
n urma rulrii 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 ctre

asistentul care o corecteaz.

Cele 100 de puncte corespund la 10 puncte din cadrul notei finale.

Pot exista penalizri n caz de ntrzieri sau pentru neajunsuri de implementare sau de stil.

Penalizrile pentru neajunsuri de implementare pot constitui maxim 1 punct din nota final a temei.

Pe lng penalizrile precizate n cadrul listei de depunctri, se vor avea n vedere urmtoarele elemente:

-2p folosirea de operaii blocante pe sockei n locul opera iilor non-blocante (Linux), folosirea API-ului

sincron pe Windows n faa celui asincron (Overlapped I/O).

-2p pe Linux, operaiile I/O asincrone pe fiiere nu sunt ateptate integrat folosind eventfd iepoll.

-1p alte implementri nevalide la nivelul sistemului asincron de comunica ie.

Nu se puncteaz o tem care nu folosete operaii I/O asincrone pe fiiere: io_* (din libaio) pe Linux, respectiv

Overlapped I/O pe Windows.

Resurse de suport

Cursuri

Curs 9 - Dispozitive de intrare/ieire

Laboratoare

Laborator 10 - Operaii I/O avansate -- Windows

Laborator 11 - Operaii I/O avansate -- Linux

Parser-ul HTTP recomandat pentru parsarea cererilor.

Tutorial HTTP

Resurse tema 5

Sample-uri pentru lucru cu sockei

Sample-uri Linux

Sample-uri Windows

Teste

Teste Linux

Teste Windows

Interfaa de upload vmchecker

Lista de discuii a cursului

FAQ

Q: Tema se poate face n C++?

A: Nu.
Suport, ntrebri i clarificri

Pentru ntrebri sau nelmuriri legate de tem putei consulta lista de discuii sau putei trimite un e-mail.

Trebuie s fii nregistrai pe list pentru a putea trimite mesaje.

V rugm s urmrii i s respectai indicaiile de utilizare a listei.

Putei edita aceast pagin pentru a clarifica/mbunti enun ul.

Pentru a urmri actualizarea enunului temei, recomandm s v abonai la feed-ul de teme

S-ar putea să vă placă și