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.