Oprogramowanie systemów równoległych i rozproszonych Wykład 6

Transkrypt

Oprogramowanie systemów równoległych i rozproszonych Wykład 6
Architektura typu klient - serwer
Oprogramowanie systemów równoległych
i rozproszonych
Klient - Serwer to asymetryczna architektura, w której pewna
funkcjonalność została rozdzielona i wyodbrebnione
˛
zostały dwa
elementy:
klient - potrzebujacy
˛ pewnej usługi, zlecajacy
˛ ja˛ serwerowi,
serwer - dostarczajacy
˛ usługi zlecanej przez klienta.
Wykład 6
Dr inż. Tomasz Olas
[email protected]
Instytut Informatyki Teoretycznej i Stosowanej
Politechnika Cz˛estochowska
Wykład 6 – p. 1/28
Cechy architektury klient - serwer
Wykład 6 – p
Architektury klient - serwer
Cechy charakterystyczne serwera:
Podział ze wzgledu
˛
na sposób obsługi żada
˛ ń od klientów:
pasywny,
serwer iteracyjny (sekwencyjne) (ang. iterative server ),
czeka na żadania
˛
od klientów,
serwer współbieżny (ang. concurrent server ).
w momencie otrzymania żadania,
˛
przetwarza je, a nastepnie
˛
wysyła odpowiedź.
Cechy charakterystyczne klienta:
Podział ze wzgledu
˛
na obsługe˛ stanów serwera:
serwer bezstanowy (ang. stateless server ),
serwer stanowy (ang. stateful server ).
aktywny,
Podział ze wzgledu
˛
na „rozdzielenie pracy”:
wysyła żadanie
˛
do serwera,
cienki klient (ang. thin client),
oczekuje na odpowiedź od serwera.
gruby (bogaty) klient (ang. fat/rich client).
Podział ze wzgledu
˛
na liczbe˛ warstw (modułów),
Podział ze wzgledu
˛
na sposób komunikacji (przy użyciu protokołu
połaczeniowego
˛
lub bezpołaczeniowego).
˛
Wykład 6 – p. 3/28
Wykład 6 – p
Warstwy aplikacji - model MVC
Architektura trójwarstwowa
MVC (ang. Model-View-Controller) - Model-Widok-Kontroler składa
sie˛ z trzech poziomów (warstw):
1. Poziom interfejsu użytkownika
np. dokument w przegladarce
˛
2. Poziom przetwarzania (logiki sterowania)
np. przetworzenie zapytania w przegladarce
˛
internetowej
3. Poziom danych (modelu danych)
np. informacje znajdujace
˛ sie˛ w bazie danych
Wykład 6 – p. 5/28
Zdalne wywołanie procedur - koncepcja
Zadaniem mechanizmu zdalnego wywołania procedur (ang. Remote
Procedure Call) jest zachowanie w możliwie maksymalnym stopniu
semantyki zwykłych wywołań procedur w środowisku sieciowym.
Wykład 6 – p
System Sun RPC (I)
Produkt Sun RPC został wprowadzony i wypromowany przez firme˛
Sun Microsystems jednocześnie z systemem NFS.
RPC umożliwia konstruowanie aplikacji rozproszonych według
modelu klient–serwer.
Aplikacje oparte na systemie RPC najcz˛eściej sa˛ tworzone przy
wykorzystaniu kompilatora protokołów, takiego jak rpcgen firmy Sun
Microsystems.
Wykład 6 – p. 7/28
Wykład 6 – p
System Sun RPC (II)
RPC - zasada działania
W skład Sun RPC wchodza:
˛
biblioteka funkcji,
narz˛edzie rpcgen służace
˛ do generowania dla aplikacji kodu
obsługi sieci na podstawie opisu interfejsu procedur.
Parametry wywołania funkcji i zwracane wyniki przesyłane sa˛ w
formacie XDR (eXternal Data Representation - zewnetrzna
˛
reprezentacja danych).
Działanie RPC jest synchroniczne: aplikacja klient wysyła do
serwera polecenie wykonania podprogramu wraz z argumentami
wywołania. Nastepnie
˛
klient przechodzi w stan oczekiwania na
zakończenie wykonania podprogramu, aby odebrać zwracane przez
podprogram wyniki.
Z mechanizmu Sun RPC można korzystać przy użyciu protokołu
transportu TCP lub UDP.
Serwer może udostepniać
˛
dla wywołań RPC wiele podprogramów.
Wykład 6 – p. 9/28
Wykład 6 – p.
Usługi RPC
Program rpcbind
Usługa˛ w RPC nazywa sie˛ zbiór funkcji przyjmujacych
˛
określone
rpcbind jest serwerem dokonujacym
˛
konwersji numerów
argumenty i zwracajacych
˛
określone wyniki.
programów RPC na numer portu tzw. portmapper (port 111)
Deklaracje argumentów i wyników to interfejs usługi.
Z punktu widzenia programisty usługa jest identyfikowana przez
numer programu i numer wersji.
Wykład 6 – p. 11/28
1.
serwer rejestruje sie˛ u demona portmap,
2.
klient żada
˛ numeru portu serwera,
3.
demon portmap odsyła klientowi numer portu serwera,
4.
klient wysyła żadanie
˛
do serwera,
5.
serwer wysyła odpowiedź do klienta.
Wykład 6 – p.
Specyfikacja usług RPC
Pieniek klienta i pieniek serwera
W RPC stosowane sa˛ pojecia
˛
pieńka klienta (interfejsu klienta) i
pieńka serwera (interfejsu serwera).
W RPC odległe usługi sa˛ zorganizowane i identyfikowane według
hierarchii
Pieniek klienta symuluje w aplikacji klienta lokalne działanie
procedury.
jeden serwer zawiera jeden program
Pieniek serwera czeka na żadanie
˛
nadchodzace
˛ od klienta.
każda z wersji zawiera jedna˛ lub kilka procedur
jeden program ma jedna˛ lub kilka wersji
Wykład 6 – p. 13/28
Wykład 6 – p.
Polecenie rpcinfo
Specyfikacje programów
Numer programu - liczba 32-bitowa
Zwraca informacje dotyczace
˛ usług zarejestrowanych w rpcbind
0000 0000 – 1fff ffff - SunRPC
Wyświetlenie wszystkich usług na wskazanym serwerze:
2000 0000 – 3fff ffff - definiowane przez użytkownika
rpcinfo -p [ host ]
Przykład:
4000 0000 – 5fff ffff - tymczasowe
program wer. proto
100000
2
tcp
100000
2
udp
391002
2
tcp
100024
1
udp
100024
1
tcp
6000 0000 – ffff ffff - zarezerwowane
Numer wersji - liczba 32-bitowa
Numer procedury - liczba 32-bitowa
Wykład 6 – p. 15/28
port
111
111
901
757
760
portmapper
portmapper
sgi_fam
status
status
Wykład 6 – p.
Program rpcgen
Plik /etc/rpc
Możliwe jest zdefiniowanie numerów programów w pliku /etc/rpc.
W takim wypadku, aby otrzymać numer odpowiadajacy
˛ nazwie
programu należy skorzystać z funkcji getrpcbyname().
Zostanie wygenerowany żadany
˛
kod jezyka
˛
C z implementacja˛
zdefiniowanego wywołania zdalnej procedury.
Przykład:
portmapper
rstatd
rusersd
nfs
ypserv
mountd
ypbind
walld
yppasswdd
etherstatd
...
Program rpcgen jako wejście pobiera plik specyfikacji usług w
formacie jezyka
˛
RPC IDL („C” z dodatkiem typów program i
version).
100000
100001
100002
100003
100004
100005
100007
100008
100009
100010
portmap sunrpc
rstat rstat_svc rup perfmeter
rusers
nfsprog
ypprog
mount showmount
rwall shutdown
yppasswd
etherstat
Wykład 6 – p. 17/28
Wykład 6 – p.
Jezyk
˛
RPC
Przekazywanie argumentów
Plik z definicja˛ protokołu może zawierać nastepuj
˛ ace
˛ elementy:
Standardowo RPC dopuszcza tylko jeden argument wywołania
odległej procedury i jeden zwracany wynik, podawane w formie
wskaźników.
obowiazkowa
˛
deklaracja programu serwera i przynajmniej jednej
dostarczonej przez niego funkcji,
deklaracje złożonych typów danych wykorzystywanych w
protokole,
Jeśli wystepuje
˛
kilka argumentów należy je umieścić w strukturze.
deklaracje stałych,
komentarze.
Wykład 6 – p. 19/28
Wykład 6 – p.
XDR - External Data Representation
Struktura CLIENT
XDR jest zdefiniowanym na potrzeby RPC formatem danych,
zapewniajacym
˛
ich pełna˛ przenośność w środowisku
heterogenicznym.
Konwersja danych znajdujacych
˛
sie˛ w pamieci
˛ do formatu XDR
(szeregowanie) i odwrotnie (deszeregowanie) odbywa sie˛ przy
użyciu specjalnych procedur zwanych filtrami.
Dla typów podstawowych zostały zdefiniowane odpowiednie filtry,
natomiast dla typów złożonych programista musi je utworzyć
samodzielnie.
XDR może być używany również poza RPC, np. do tworzenia w
pełni przenośnych plików binarnych.
struct CLIENT {
AUTH *cl_auth; /* authenticator */
struct clnt_ops {
enum clnt_stat (*cl_call) (CLIENT *, u_long, xdrproc_t, caddr_t, xdrproc_t,
caddr_t, struct timeval);
/* wywołanie procedury zdalnej */
void (*cl_abort) (void); /* anulowanie wywołania */
void (*cl_geterr) (CLIENT *, struct rpc_err *);
/* pobranie kodu bł˛
edu */
bool_t (*cl_freeres) (CLIENT *, xdrproc_t, caddr_t);
/* zwolnienie wyników */
void (*cl_destroy) (CLIENT *); /* zniszczenie tej struktury */
bool_t (*cl_control) (CLIENT *, int, char *);
/* ioctl() dla rpc */
} *cl_ops;
caddr_t cl_private; /* prywatne */
};
Wykład 6 – p. 21/28
Ważniejsze funkcje (I)
Wykład 6 – p.
Ważniejsze funkcje (II)
Do tworzenia uchwytu klienta służy funkcja clnt_create:
Do usuniecia
˛
utworzonej struktury klienta służy funkcja
clnt_destroy:
#include <rpc/rpc.h>
void clnt_destroy(CLIENT* clnt);
CLIENT* clnt_create(char* host, u_long prog, u_long vers,
char* protocol);
clnt - struktura klienta, która ma zostać usunieta
˛
Do obsługi błedów
˛
można wykorzystać funkcje
host - nazwa hosta na którym działa proces serwer,
prog - numer programu,
vers - numer wersji,
proto - określa klase˛ protokołu transportowego (może być miedzy
˛
innymi udp lub tcp).
void clnt_pcreateerror(char* s);
void clnt_perrno(clnt_stat stat);
void clnt_perror(CLIENT *clnt, char* s);
jeżeli wywołanie zakończy sie˛ sukcesem zostanie zwrócony poprawny identyfikator
(uchwyt) klienta, w przeciwnym wypadku funkcja zwróci NULL.
Wykład 6 – p. 23/28
Wykład 6 – p.
Przykład - plik ser.x
Przykład - kod klienta (I)
struct integers{
int x1;
int x2;
};
#include <iostream>
#include <rpc/rpc.h>
#include "ser.h"
int dodaj(int a, int b)
{
CLIENT *c1;
integers arg;
int *ret;
char* host = "localhost";
typedef struct integers intargs;
program PROGSERVICE{
version VERSERVICE{
int SPSERVRPC(intargs) = 1;
} = 1;
} = 0x21000000;
c1 = clnt_create(host, PROGSERVICE, VERSERVICE, "tcp");
if (c1 == NULL)
{
clnt_pcreateerror(host);
return -1;
}
Wykład 6 – p. 25/28
Wykład 6 – p.
Przykład - kod serwera
Przykład - kod klienta (II)
arg.x1 = a;
arg.x2 = b;
ret = (int*)spservrpc_1(&arg, c1);
#include <rpc/rpc.h>
#include "ser.h"
int spserv(int x1, int x2)
{
return x1+x2;
}
if (ret == NULL)
{
clnt_perror(c1, "blad wywolania odleglej procedury");
return -1;
}
clnt_destroy(c1);
return (*ret);
int *spservrpc_1_svc(intargs* arg, svc_req *)
{
int* result = new int;
*result = spserv(arg->x1, arg->x2);
return result;
}
}
int main()
{
int a = 1, b = 1;
std::cout << dodaj(a,b);
}
Wykład 6 – p. 27/28
Wykład 6 – p.