Zmenki


Osnovni koncepti
Naslednja tehnika, ki naj zagotovi medsebojno sinhronizacijo, je tehnika
zmenkov,
ki so jo najprej uvedli v programskem jeziku ADA. Srečamo se s pojmoma
strežnik
in klijent (kličoči in servisni proces). V
razliko od monitorjev je to aktiven mehanizem.
Tudi strežnik je namreč aktiven proces, ne
le neka pasivna procedura. Servisni proces vsebuje več takoimenovanih
vhodov
(entry), ki jim ustrezajo stavki "accept".
Take vhode pa lahko kliče proces, ki potrebuje zmenek s servisnim programom.
Ne pozabimo, da je tudi strežnik proces, ki "živi". Če pride strežnik do
nekega stavka "accept", tu počaka, da bo nek paralelni proces zahteval
zmenek pri tem vhodu. Če pa nek paralelni proces kliče vhod strežnika,
ko ta še ni prišel do stavka "accept", mora prav tako počakati.
Ko pride do zmenka, kličoči proces posreduje strežniku morebitne parametre
in počaka, da strežnik izvede stavke znotraj telesa "accept". Strežnik
še posreduje kličočemu programu morebitne rezultate in zmenek je končan.
Oba procesa se nato odvijata naprej neodvisno.
Zanimivo je, da morajo kličoči programski procesi poznati vstopne točke
v strežnik, slednji pa lahko "servisira" klic kateregakoli kličočega procesa
(takih procesov pa je lahko tudi več). V tem smislu je tehnika zmenkov
asimetrična.
Zmenki in problem proizvajalec - porabnik
Demonstracijski primer spet obravnava problem proizvajalec- porabnik.
Komunikacija med procesom- proizvajalcem in procesom- porabnikom tu poteka
posredno preko strežnega procesa. Proizvajalec pošilja zaporedje znakov
ASCII, ki jih nato porabnik prevzema. To tehniko lahko praktično uporabimo
pri programiranju komunikacije računalnika z nekim terminalom ali oddaljenim
računalnikom. Primer predstavlja izvleček iz programa, kodiranega v Adi.
Posameznim programskim procesom utstrezajo tu posli (tasks). Imamo strežni
posel simpleBuffer in dva posla - klijenta: consumer
in producer. Posel producer
generira znake, posel consumer jih sprejema. Sinhronizirana komunikacija
poteka preko strežnega posla simpleBuffer.
task simpleBuffer is
entry write(ch:in character);
entry read(ch:out character);
end simpleBuffer;
task body simpleBuffer is
char:character;
begin
loop
accept write(ch:in character); do
char:=ch;
end write;
accept read(ch:out character); do
ch:=char;
end read;
end loop;
- - - - - - - - - - - - - - -
task producer;
task body producer is c1:character;
begin
-- loop
-- produce c1;
simpleBuffer.write(c1);
-- end loop
end producer;
- - - - - - - - - - - - - - - -
task consumer;
task body consumer is c2:character;
begin
-- loop
simpleBuffer.read(c2);
-- use c2;
-- end loop
end consumer;
Primer koncepta klijent_strežnik
Zmenki
in Java
Praktično implementacijo ideje zmenkov zasledimo
tudi pri danes običajnem medprocesnem komuniciranju s pomočjo vtičnic
(sockets). Najprej so to tehniko uvedli pri BSD verziji UNIX,
kasneje pa so jo osvojila tudi druga okolja za podporo porazdeljenih
računalniških sistemov, med njimi tudi Java.

