2015-05-17 21:59 GMT+03:00 Alin Radulescu via so <[email protected]>: > Testul 15 are urmatorul flow: > Create thread initial ( 0 ): cuanta 1 > so_end() > > In paralel cu so_end (care ramane blocat pana cand termina toate > threadurile): > > Threadul 0 este creat. (cuanta 1) > Threadul 0 creaza threadul 1 cu prioritate 4, care il preempteaza pe t0. > > Threadul 1 creaza threadul 2 (cu prioritate 3, este plasat in 'ready') > Threadul 1 observa ca i-a ajuns la cuanta 0 si cedeaza CPU threadului > 2.
Nu se întâmplă asta pentru că thread-ul 1 are prioritate mai mare decât thread-ul 2. Din enunț: "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." > > Threadul 2 verifica ca inaintea sa a fost threadul 1, si noteaza > faptul ca si el a prins timp pe procesor (folosind define-ul > SO_FAIL_IF_NOT_PRIO). Aceasta actiune nu consuma cuanta, asa ca merge mai > departe. (cuanta = 1) > Threadul 2 creaza threadul 3 (cu prioritate 1, este plasat in > 'ready') > Threadul 2 observa ca i-a ajuns cuanta la 0 si cedeaza CPU > threadului 1 > > Threadul 1 acum verifica ca ultima prioritate setata a fost 4, dar > threadul 2 a prins timp pe procesor si astfel a setat prioritatea '3'. > > > Acest comportament nu s-ar fi reprodus daca threadurile ar fi avut cuanta > cel putin 2, sau daca un thread ar continua sa incerce sa execute sarcini > care nu consuma cuanta atunci cand are cuanta 0. > > > Aici este de vina checkerul, sau trebuie sa modific programul atfel: > - un thread sa execute sarcini in continu, inclusiv cand are cuanta 0 > - daca o sarcina de executat este consumatoare de cuanta, iar threadul are > 0, atunci cedeaza CPU > > > Testul 17: > Se face fork primului thread > Handler: asteapta dupa evenimentul X, signal evenimentul X > (cum va reusi sa dea el signal cand defapt asteapta evenimentul, si astfel > nu mai prinde timp pe procesor) Thread-ul nu așteaptă, dispozitivul IO fiind invalid. Se testează un caz de eroare pentru so_wait(). > > Testul 19: > Se face fork primului thread, > Handler: asteapta evenimentul SO_DEV3, dupa care face fork unor threaduri > care se presupune ca eventual ii vor da signal pe acest eveniment. Threadul > sta blocat in wait. > La fel, thread-ul nu așteaptă, dispozitivul IO fiind invalid. Adrian _______________________________________________ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
