Replicirana tečajna lista stranih valuta pohranjuje se u istom obliku na N
poslužiteljskih računala. Za svaku valutu zadužen je posebni proces koji radi na jednom od tih računala. Da bi promijenio podatke za svoju valutu, zaduženi proces ulazi u kritičnu sekciju i vrši iste promjene na svim kopijama liste. Napišite i testirajte distribuiranu aplikaciju za održavanje replicirane tečajne liste. Ispravan rad aplikacije prilikom ažuriranja podataka treba osigurati nekim od mehanizama za međusobno isključivanje. Uvod Naš je cilj bio izraditi distribuiranu aplikaciju za održavanje replicirane tečajne liste. Replicirana tečajna lista pohranjuje se u istom obliku na N poslužiteljskih računala te je za svaku valutu zaslužan posebni proces koji radi na jednom od tih računala. Tablica valuta i njihovih vrijednosti je primjer dijeljenog resursa tj. resursa koji trebaju biti dostupni raznim procesima, ali ih samo jedan proces smije koristiti u jednom trenutku. U ovom konkretnom slučaju, to znači da proces ne smije čitati vrijednost valute za koju je zadužen neki drugi proces u trenutku u kojem taj proces mijenja njezinu vrijednost.
Takva vrsta problema svodi se na problem međusobnog isključivanja.
Kod problema međusobnog isključivanja rad procesa s resursom predstavlja kritičnu sekciju, pri čemu je osnovno svojstvo kritične sekcije da se dva procesa ne smiju istovremeno nalaziti u njoj.
Postoje razni algoritimi kojima se mogu rješavati takvi problemi, a dvije
osnovne skupine su algoritmi zasnovani na vremenskim žigovima i algoritmi zasnovani na žetonima. Mi smo odabrali jedan od algoritama zasnovanih na vremenskim žigovima - Lamportov algoritam. Opis algoritma Lamportov algoritam spada među algoritme za međusobno isključivanje koji su zasnovani na vremenskim žigovima. Svaki proces održava logički sat (za vremenski žig) i red (za spremanje zahtjeva za resurom – tablicom valuta). Algoritam osigurava da procesi ulaze u kritičnu sekciju, odnosno pristupaju vrijednosti pojedine valute u redoslijedu vremenskih žigova njihovih zahtjeva. Da bi postavio zahtjev za kritičnom sekcijom, proces šalje žigosanu poruku request svim drugim procesima, te dodaje taj zahtjev i žig u svoj red. Kad primi poruku request, proces sprema taj zahtjev i žig u svoj red, te šalje pošiljaocu žigosanu poruku ack. Da bi oslobodio kritičnu sekciju, proces šalje žigosanu poruku release svim drugim procesima. Kad primi poruku release, proces briše odgovarajući zahtjev iz svog reda. Proces ulazi u kritičnu sekciju ako:
Njegov zahtjev se nalazi u redu i ima žig t
Njegov žig i je manji od svih ostalih žigova u redu Primljena je barem po jedna poruka od svakog od preostalih procesa sa žigom većim od t
U algoritmu se pretpostavlja FIFO uređaj poruka po komunikacijskim
kanalima. Implementacija
Koristili smo klase NameTable.java i NameServer.java za održavanje tablice s
procesima te pomoćne klase Symbols.java i PortAddr.java. Također smo koristili Topology.java i Util.java, dok smo klasu Connector.java prilagodili svojim potrebama, dodavši da procesi razmjenjuju imena valuta prilikom početnog slanja poruka.
Connector.java
Naravno, uz to smo morali promjeniti i klasu Linker.java dodavši joj metode
vezane uz valute te polje s imenima valutima koje se šalje Connectoru. Linker.java
Sukladno ranijim promjenama, u klasu koja definira sučelje Lock.java smo
dodali metode za dohvaćanje vrijednosti valuta i provjeru je li vrijednost primljena. . Lock.java