Tema: SharedMemory sinchronizavimas
Autorius: Andrius Samuolis
Data: 2010-04-01 15:17:12
   Sveiki,

   Dabartinis sprendimas yra veikiantis, tachiau iskilo klausimas, kaip
sinchronizavima padaryti optimalesni. Zhodzhiu, situacija tokia: yra
programa-serveris ir >10 programu-klientu, veikianchiu tame pachiame kompe
(naudojama Windows OS). Visi jie naudoja bendra masyva (duomenu struktura),
patalpinta i SharedMemory, be to, klientu kiekis nera fiksuotas ir, laikui
begant, gali kisti. Serveris duomenis i masyva gali rashyti ir skaityti, o
klientai - tik skaityti. Kad klientai nenuskaitytu klaidingu duomenu tuo
metu, kai serveris juos modifikuoja, butina organizuoti sinchronizavima.
   Dabar apie esama sinchronizavimo realizacija ir kas man joje nepatinka.
Shiuo metu sinchronizavimui yra naudojamas mutex'as - kai kuri nors viena
programa gauna mutex'a, ji turi priejima prie duomenu, o priejimas kitoms
programoms (tiek serveriui, tiek klientams) yra uzhdraustas, kol nebus
atlaisvintas mutex'as. Kaip minejau, shis sprendimas veikia pakenchiamai,
tachiau man nepatinka tai, kad klientai tik po viena gali prieiti prie
duomenu. Kadangi klientai neatlieka duomenu rashymo, nera reikalo riboti
priejimo kitiems klientams, kai vienas ish klientu jau turi priejima prie
duomenu. Be to, labai noretusi, kad serveris turetu tam tikra prioriteta
priesh klientus, nes dabartiniame sprendime, esant didesniam klientu
kiekiui, labai ishauga tikimybe, kad serveris nesulauks progos pateikti
duomenis (nesulauks tokio momento, kad nei vienas ish klientu neturetu
priejimo prie duomenu). Ish tiesu, shioje sistemoje nieko ypatingai
tragishko neivyksta, jei tam tikra duomenu porcija yra "prazhiopsoma",
tachiau reikia, kad tokiu situaciju susidarytu kuo mazhiau. Del to ir
norechiau tobulinti shi sinchronizavimo mechanizma.
   Shis projektas yra vystomas su Delphi, tachiau tema patalpinu bendroje
shakoje, nes man nera reikalingas tikslus sprendimo kodas, o tik pati ideja,
kaip geriau suorganizuoti sinchronizavima. O ideja daugiau priklauso nuo
naudojamos operacines sistemos (naudojamos Windows API funkcijos), nei nuo
programavimo kalbos, kuria vystomas projektas. Pats svarschiau galimybes
naudoti kitas sinchronizavimo priemones (Semaphore'us, InterlockedIncrement,
InterlockedDecrement), tachiau gero sprendimo dar nesugalvojau, todel
kviechiu pasidalinti savo mintimis.