Documente Academic
Documente Profesional
Documente Cultură
Scopul temei
lucrul cu fiiere
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:
remove <cuvnt> terge cuvntul din hashtable (nu e obligatoriu s existe cuvntul)
find <cuvnt> [<fiier_ieire>] caut cuvntul n hashtable scrie True sau False pe o linie nou n fiierul specificat sau la
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
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
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
add tema
add hash
print hash.out
remove tema
print hash.out
resize double
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
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)
Dac dimensiunea hash-ului este impar (2k+1), dup njumtaire dimensiunea lui va fi k.
Dimensiunea maxim a unei comenzi (operaia i cuvntul asociat) este de 20000 de caractere.
Comportamentul dorit la resize este unul echivalent cu urmatorul: se creeaza un nou hash, se itereaza prin bucketurile din
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
[...]
Materiale ajuttoare
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
A: Nu.
Q: Valorile introduse n hastable sunt cuvinte [A-Za-z] - trebuie verificate cuvintele la introducere?
A: Nu.
A: Da.
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
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.
operatorul de secveniere ;
de exemplu, expr1; expr2 va avea ca efect mai nti execu ia comenzilor expr1 i, dup terminarea execuiei acestora,
de exemplu, expr1 & expr2 va avea ca efect execuia comenzilor expr1 i a comenzilor expr2 n paralel;
execv("./my_homework", "command");
operatorul | (pipe)
de exemplu, expr1 | expr2 va avea ca efect execuia comezilor expr1 cu stdout-ul redirectat n stdin-ul
comenzilor expr2;
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
Prioritatea operatorilor de execuie este, de la cel mai prioritar la cel mai pu in prioritar:
1. operatorul |
4. operatorul de secveniere
&> nume_fisier pentru redirectarea ieirii standard i ieirii de eroare standard n fi ierul nume_fisier;
2 nume_fisier pentru redirectarea ieirii de eroare standard n fiierul nume_fisier n modul append.
variabilele de mediu sunt motenite de la shell-ul printe (Bash) sau sunt definite n mini-shell;
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
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
n rezolvarea temei putei porni de la exemplul de utilizare a parserului (UseParser.cpp sau CUseParser.c).
variabile de mediu
> 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
> 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,
Pentru a permite transmiterea de caractere speciale n argumente (spre exemplu echo int main() { return 0; })
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,
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
Testare
Pentru simplificarea procesului de corectare a temelor, dar i pentru a reduce gre elile temelor trimise, corectarea se va realiza
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
-0.1 pentru fiier Makefile incorect (de exemplu compileaz de fiecare dat totul)
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:
Materiale ajutatoare
Cursuri utile:
Curs 1
Curs 2
Curs 3
Laboratoare utile:
Laborator 1
Laborator 2
Laborator 3
Parser
Schelet de cod:
Teste:
teste Linux
teste Windows
Pagina de Upload:
upload
FAQ
A: O variant este cu Opera: File Import and export Import mail Import generic mbox file alegei fiierele
respective.
A: La toate temele de SO pe Windows se va folosi Win32 API, nu POSIX. Oricum, fork i exec nu sunt suportate pe
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
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
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.
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: 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
Obiectivele temei
Recomandri
nainte de a ncepe implementarea temei este recomandat acomodarea cu no iunile i conceptele specifice, precum:
memorie virtual
spaiu de adres
tabel de pagini
page fault
demand paging
spaiu de swap
swap in
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
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
Alocarea de multiple zone de memorie virtual; fiecare zon va fi asociat cu un fi ier care simuleaz memoria RAM i un
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
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
n momentul n care o pagin virtual este mapat peste o pagin fizic n urma procesului de demand paging pagina fizic
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
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
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
Excepie: dac o pagin este curat (non-dirty) dar nu a fost niciodat evacuat (a fost alocat prindemand paging),
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
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"
/*
* 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
*/
/*
* 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
*/
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
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
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.
Implementarea page fault handler-ului se realizeaz prin intermediul vectorilor de excepie (Windows) sau a unei rutine de
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
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.
enum page_state {
STATE_IN_RAM,
STATE_IN_SWAP,
STATE_NOT_ALLOC
};
struct frame;
Structurile de mai sus reprezint doar un punct de pornire. Se pot aduga alte cmpuri sau structuri specifice modului n care
Pentru interceptarea accesului invalid la o zon de memorie va trebui s intercepta i semnalul SIGSEGVfolosind apeluri din
familia 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
Pentru partea de I/O i procese se vor folosi doar func ii POSIX. De exemplu, funciile fopen, fread, fwrite,fclose nu
API-ul oferit de Windows difer de cel oferit de Linux; exist func ii dedicate de gestiune a memoriei virtuale
Alocarea spaiului de memorie virtual pentru o zon se realizeaz folosind VirtualAlloc. ntruct operaiile de
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.
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).
Pentru obinerea adresei care a generat excep ia (fault-ul, accessul nevalid), folosi i
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
Testare
Indicaii despre utilizarea suitei de teste se gsesc n fiierul README din cadrul arhivei.
n urma compilrii temei trebuie s rezulte o bibliotec shared-object (Linux) denumit libvmsim.so sau o bibliotec
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,
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
Laboratoare
Laborator 4 - Semnale
Teste
Teste Linux
Teste Windows
FAQ
A: Nu.
A: Da, dac aceste modificri v sunt utile n realizarea temei. Dar aceste modificri nu vor fi vizibile n cadrul testului
Q: Exist cazuri n care funcia FlushViewOfFile, apelat din w_sync_mapping iese cu eroare. Este acest lucru 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,
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.
Obiectivele temei
planificarea proceselor/threadurilor
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:
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.
Timp execuie:
ntr-un sistem real, pentru controlul execu iei, contorizarea timpului de rulare a unui proces se realizeaz la fiecare ntrerupere de ceas.
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.
fiecare task are asociat o prioritate static, care este specificat la pornirea threadului.
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,
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
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 este semnalat printr-o opera ie de tipul signal.
task-ului curent i-a expirat cuanta de timp.
Pentru mai multe detalii despre algoritmi de planificare pute i consulta cursul 4.
Stri threaduri:
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).
Pentru o mai bun ntelegere a algoritmilor de planificare, se recomand urmrirea tranzi iilor dintre stri ca n desenul de mai jos.
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
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
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)
start_thread(params)
Atenie: Funcia se va ntoarce abia dup ce noul thread creat fie a fost planificat fie a intrat n starea READY.
Exemplu execuie
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
T2 exec
--> T1 preempts T0
T1 exec
T1 signals event 3
T2 exec
--> T2 finished
T1 exec
T1 exec
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
Testare
n urma compilrii temei trebuie s rezulte o bibliotec shared-object (Linux) denumit libscheduler.sosau o bibliotec dinamic
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
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
Notare
Depunctri suplimentare:
Cursuri:
Laboratoare:
Laborator 8
Laborator 9
FAQ
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
Obiectivele temei
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
zero-copying;
Pentru implementare se va folosi API-ul de operaii I/O avansate specific sistemelor de operare Linux i Windows:
sendfile/ TransmitFile
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.
Dup transmiterea unui fiier, conform protocolului HTTP, conexiunea este nchis.
Implementarea temei presupune existena unei maini de stri pentru fiecare conexiune, pe care s o interoga i i actualiza i
Recomandm crearea unei structuri care s gestioneze o conexiune, starea acesteia, con inutul bufferelor.
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
Exemple de rspunsuri gsii n fiierul de test al parser-ului sau n sample-ul pus la dispoziie.
Directiva Content-Length trebuie s precizeze dimensiunea con inutului HTTP (datelor efective) la nivel de
octei.
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.
Un exemplu specific de folosire a parser-ului pentru ob inerea request path-ului este disponibil nsubdirectorul samples/.
Folosii subdirectorul samples/ din directorul aferent fiecrui sistem de operare pentru exemple de utilizare a API-ului pe sockei.
Pentru netcat, dac dorii s comunicai folosind HTTP, va trebui s transmite i o cerere specific (spre exemplu GET
GET / HTTP/1.0
Sau:
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.
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
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),
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;
Att citirea ct i scrierea peste socke i se realizeaz doar la notificarea dat de API-ul specific sistemului de operare,
folosind. epoll.
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
Pentru configurarea unui socket ca non-blocant putei folosi fcntl (flag-ul O_NONBLOCK).
Pentru utilizarea funciilor va trebui s realizai link-area cu biblioteca libaio i includerea header-ului<libaio.h>.
Recomandm folosirea unei variabile globale de tipul io_context_t i a unui descriptor eventfd pentru fiecare
conexiune.
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
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.
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
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
-2p pe Linux, operaiile I/O asincrone pe fiiere nu sunt ateptate integrat folosind eventfd iepoll.
Nu se puncteaz o tem care nu folosete operaii I/O asincrone pe fiiere: io_* (din libaio) pe Linux, respectiv
Resurse de suport
Cursuri
Laboratoare
Tutorial HTTP
Resurse tema 5
Sample-uri Linux
Sample-uri Windows
Teste
Teste Linux
Teste Windows
FAQ
A: Nu.
Suport, ntrebri i clarificri
Pentru ntrebri sau nelmuriri legate de tem putei consulta lista de discuii sau putei trimite un e-mail.