[so] [Tema 4]Test3

Alex Gorunescu algorunescu at yahoo.com
Fri May 6 21:42:22 EEST 2011






________________________________
>From: VLAD TUDOSE <vlad_tudose at yahoo.com>
>To: Sisteme de Operare <so at cursuri.cs.pub.ro>
>Sent: Fri, May 6, 2011 4:42:27 PM
>Subject: Re: [so] [Tema 4]Test3

>Salut,

>Am urmatoarea problema la testul 3:  am un deadlock si am intels de ce imi 
apare
>dar nu reusesc sa imi dau seama care ar trebui sa fie comportamentul normal.

>Testul 3 porneste 4 threaduri care executa operatiile de mai jos,
>thread-urile sunt pornite in ordinea 1,2,3,4.

>Thread 1: Enter, Wait(1), sleep(1), ...
>Thread 2: Enter, Wait(0), sleep(1), ...
>Thread 3: sleep(1), Enter, sleep(2), Signal(1)...
>Thread 4: sleep(2), Enter, sleep(1), ...

>Comporamentul programului meu este urmatorul(in ordine cronologica a 
>evenimentelor):

>Thread-ul 1 intra in monitor il marcheaza ca fiind ocupat ,intra in Wait
>nu are pe cine sa planifice declara monitorul liber si asteapta dupa variabila 
>de cond 1.

>Thread-ul 2 intra in monitor il gaseste liber , intra in Wait , nu are pe cine 
>sa planifice
>declara monitorul liber si asteapta dupa variabila de  cond 2.

>Thread-ul 3 intra in monitor il gaseste liber si intra in sleep(2).

>Thread-ul 4 gaseste monitorul ocupat este pus in coada Entry unde asteapta sa 
>fie planificat.

>Thread-ul 3 iese din sleep face Signal(1) -> trece Thread-ul 1 in coada Waiting 
>dupa care asteapta
>in coada Signaler.

>In acest moment toate thread-urile imi sunt blocate.

>Poate sa ma lamureasca cineva ce e gresit in rationamentul meu ?

>Multumesc,
>Vlad

>Eu am facut un thread intern care se ocupa cu managementul monitorului. In cazul 
>tau, de exemplu, o sa gaseasca thread-ul 1 in wait si il porneste, dupa care 
>thread-ul 3 din signaller si tot asa. Threadurile nu se planifica unul pe altul 
>ca ajungi in situatii din astea. >Monitorul (threadul intern) se ocupa cu 
>managementul lor intern. Nu stiu daca este solutia perfecta dar tema trece toate  
>testele.

>Alex.

Hai ca revin asupra parerii de mai sus :).Acum lucrez la varianta in windows si 
mi-am dat seama ca m-am complicat aiurea pe linux. In cazul ala comportamentul 
cel mai simplu este altul. Thread-ul 3 face signal, trece thread-ul 1 in waiting 
si inainte sa se blocheze in signal porneste threadul al carui rand este (in 
cazul asta chiar thread-ul 1 din wait). In cazul asta nu mai ai nevoie de un 
thread intern si ar trebui sa se rezolve si deadlock-ul.

Alex
_______________________________________________
http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20110506/55b73fd8/attachment.htm>


More information about the so mailing list