Komunikacija v porazdeljenih sistemih


Klic oddaljenih procedur

Pri uvedbi pojma klica oddaljenih procedur (RPC, remote procedure call) je potrebno predvsem razumeti delovanje klasičnih sistemskih klicev. Za primer vzemimo sistemski klic read( ), ki ima naslednjo splošno obliko:
count = read (fd, buffer, numBytes);
Kot je znano, pri takem klicu naloži kličoča funkcija parametre na sklad, vključno s povratnim naslovom (return address). Če so parametri kazalci, pomeni, da bo klicana funkcija spreminjala podatke naslovnem prostoru kličoče funkcije (oziroma programskega procesa). Pri povratku iz klicane funkcije se kličoča funkcija lahko nadaljuje zaradi restavracije povratnega naslova, ki je bil na skladu. Vse se dogaja v istem naslovnem prostoru danega procesa. To pa ne more veljati v primeru, ko so klicane funkcije locirane na drugem računalniku. Želimo pa, da so tudi taki klici čimbolj podobni klasičnim. Uporabimo lahko idejo "klica oddaljene procedure" (RPC), ki je ponazorjena s spodnjo sliko:

Vzemimo za primer klic oddaljene funkcije read( ). Pri centraliziranih sistemih bi klic potekal v okviru istega procesa in s tem istega naslovnega prostora. Pri decentraliziranem sistemu potrebujemo na oddaljenem računalniku dodaten proces, strežnik. Oddaljena procedura read( ) bo delovala v naslovnem prostoru strežnika. V naslovnem prostoru kličočega procesa (odjemalca) moramo imeti na voljo malo drugačno proceduro, ki ji rečemo štrcelj odjemalca (client stub), ki igra vlogo nekakąnega vmesnika. Analogno proceduro, štrcelj strežnika (server stub) imamo na strani strežnika. Oddaljen klic procedure poteka nato na naslednji način:

Proces-odjemalec pokliče svoj štrcelj na normalni način (prenos parametrov in povratnega naslova na lastni sklad).
Štrcelj odjemalca formira obvestilo (message) tako, da vanj pakira parametre in s primernim sistemskim klicem pokliče jedro.
Jedro pošlje obvestilo oddaljenemu jedru.
Oddaljeno jedro posreduje obvestilo štrclju strežnika.
Štrcelj strežnika razpakira parametre v sprejetem obvestilu in kliče strežnik.
Strežnik opravi zahtevano nalogo in vrne rezultat svojemu štrclju.
Štrcelj strežnika zapakira rezultate v obvestilo in s sistemskim klicom pade v (svoje, oddaljeno) jedro.
Oddaljeno jedro posreduje obvestilo z rezultati jedru odjemalca.
Jedro odjemalca poąlje obvestilo štrclju odjemalca.
Štrcelj odjemalca razpakira rezultat in ga vrne odjemalcu.

Pakiranju parametrov v obvestilo pravijo po angleško marshalling (urejanje, pakiranje), obratni operaciji pa unmarshaling (razpakiranje).

Interaktivni primer RPC
Java in RMI