<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Razvan Deaconescu wrote:
<blockquote cite="mid:1239571098.4849.150.camel@valhalla.cs.pub.ro"
type="cite">
<pre wrap="">On Sun, 2009-04-12 at 23:44 +0300, Bogdan Sass wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Razvan Deaconescu wrote:
</pre>
<blockquote type="cite">
<pre wrap="">On Sun, 2009-04-12 at 23:10 +0300, Bogdan Sass wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Continuand cu tema2, incerc sa imi dau seama exact unde si cum este
nevoie de sincronizare.
Fiind vorba de un singur server, operatiile server-side
(add/remove/clear) nu necesita sincronizare. In ceea ce priveste
operatiile print, am doua variante:
1) -iau semafoarele pe masura ce parcurg zona de memorie partajata,
si eliberez fiecare semafor imediat dupa afisarea unui bucket. Solutia
care imi blocheaza cel mai putin timp resursele, dar creez riscul unui
race-condition cu un client care modifica in acelasi timp un bucket.
</pre>
</blockquote>
<pre wrap="">Nu vad unde este race condition-ul.
</pre>
</blockquote>
<pre wrap=""> Eu afisez bucket-urile de la 0 la BUCKET_COUNT. In acelasi timp,
un alt client scrie in bucket-ul X. In functie de momentul in care se
produc cele 2 actiuni, eu pot sa afisez bucket-ul X asa cum arata
inainte, sau dupa modificarea realizata de celalalt client.
M-am exprimat eu gresit cand am considerat situatia respectiva un
"race condition"?
</pre>
</blockquote>
<pre wrap=""><!---->
Ceea ce spui tu aici este asa:
* se fac doua alocari de memorie:
alfa = malloc(...)
beta = malloc(...)
* thread-ul 1 acceseaza zona alfa
* thread-ul 2 acceseaza zona beta
* avem conditie de cursa
Nu exista nici o legatura directa intre cele doua zone (in cazul tau
bucket-uri) deci nu exista conditie de cursa. Elementele sunt disjuncte.
Functia de printare nu trebuie sa fie atomica la nivelul intregului set
de cuvinte. Daca ar fi asa ar insemna sa tii lock pe o regiune foarte
mare de memorie, ceea ce nu este eficient.
</pre>
</blockquote>
Citat din enuntul temei: "Din motive de eficienta, este obligatoriu
sa se foloseasca memorie
partajata pentru operatia de print: serverul va mentine tabela in
memoria partajata iar clientul va citi aceasta aceasta zona de memorie
de fiecare data cand are nevoie sa faca print."<br>
<br>
Cat timp serverul mentine tabela _in memoria partajata_, cele doua
zone sunt de fapt una si aceeasi. Atat accesele de citire, cat si cele
de scriere se fac pe aceeasi zona. De aici rezulta race condition-ul
mentionat de mine.<br>
<br>
<pre class="moz-signature" cols="72">--
Bogdan Sass
CCAI,CCSP,JNCIA-ER,CCIE #22221 (RS)
Information Systems Security Professional
"Curiosity was framed - ignorance killed the cat"</pre>
</body>
</html>