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.