[so] Sincronizare

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Mon Apr 13 00:43:23 EEST 2009


On Mon, 2009-04-13 at 00:33 +0300, Bogdan Sass wrote:
> Razvan Deaconescu wrote: 
> > On Sun, 2009-04-12 at 23:44 +0300, Bogdan Sass wrote:
<snip>
> > 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.
> > 
> >   
>     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."
> 
>     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.

In exemplul dat de mine mai sus, alfa si beta sunt alocate in heap, deci
in aceeasi _zona_ din spatiul de adresa a procesului. Asta inseamna ca
trebuie sa se asigure acces exclusiv la tot heap-ul?

Cand vine vorba de acces exclusiv trebuie sincronizate _date_ (structuri
de date) - o data este un intreg, caracter, lista sau orice alta
structura care poate fi _separata_. In cazul de fata fiecare bucket
poate fi considerat o data din cauza ca nu exista interactiune directa
cu celelalte bucket-uri si ca nu se impune conditie de atomicitate pe
intregul vector de bucket-uri.

Razvan



More information about the so mailing list