41-45

Transkrypt

41-45
*41. Schemat funkcjonowania mechanizmu gniazdek.
- przekazywanie danych na maszynach z pamięcią rozproszną DM
- kaŜdy proces ma własne gniazdo
- schemat typu klient serwer
- brak konieczności synchrnonizacji
- komunikacja przez sieć za pomocą tcp/ip
- równieŜ moŜliwość komunikacji międzyprocesowej w dziedzinie UNIX-a
- 2 rodzaje transmisji: połączeniowa i bezpołączeniowa wg schematów:
W kaŜdym z trybów naleŜy wykonać funkcje socket() oraz bind().
Utworzenie i otworzenie gniazda oraz otrzymanie jego deskryptora umoŜliwia funkcja
systemowa socket().
- naleŜy wyspecyfikować tryb komunikacji (połączeniowy lub bezpołączeniowy) oraz protokół
transmisji danych (TCP lub UDP).
int socket(int addrfamily, int sockettype, int protocol);
- addrfamily - nazwa dziedziny (rodziny protokołów), forma adresowa
+ AF_INET, AF_UNIX …
- sockettype - sposób przesyłania danych, typ komunikacji np.
+ SOCK_STREAM - połączeniowy,
+ SOCK_DGRAM - bezpołączeniowy,
- protocol
– protokół uŜywany przez gniazdko
+ IPPROTO_TCP,
+ IPPROTO_UDP
+ jesli 0 – domyslny dla formy adresowej i typukomunikacji
- return :int Funkcja zwraca deskryptor utworzonego gniazda (pliku) lub -1 w
wypadku
błędu.
Przydzielanie adresu
- określenie adresata
- adres gniazda składa się z : adresu węzła i numeru portu.
- związywanie adresu z gniazdem lub nazywanie gniazda.
int bind(SOCKET socket, const struct sockaddr *myaddr,int
addrlen);
- socket deskryptor gniazda, utworzony przez funkcję socket(),
- myaddr wskaźnik do struktury zawierającej adres własny
- addrlen rozmiar struktury zawierającej adres
Zamiast wskaźnika na strukturę sockaddr przekazuje się najczęściej wskaźnik na strukturę
odpowiednią do rodziny aktualnie uŜywanych protokołów, wykonując przy przekazaniu
wskaźnika rzutowanie typu na (struct sockaddr*). W dziedzinie Internetu uŜywa się
struktury sockaddr_in o następującej definicji:
struct sockaddr_in {
sa_family_t sin_family; /* AF_INET */
u_init_16 sin_port; /* numer portu */
struct in_addr sin_addr; /* 32-bitowy adres węzła */
char sin_zero[8]; /* nie uŜywane */
}
Struktura in_addr zawiera jedno pole typu long:
struct in_addr{
u_int32_t s_addr; /* 32-bitowy adres właściwy węzła lub INADDR_ANY
*/
}
+ *42. Elementy i ograniczenia przesyłania bezpołączeniowego za pomocą gniazdek.
- obsługiwany przez protokół UDP/IP
- przesyłanie datagramów bez gwarancji niezawodnego doręczenia
- dopuszcza duplikację całego datagramu lub zmianę kolejności doręczenia dwóch kolejno
wysłanych datagramów.
- kontrola poprawności naleŜy do aplikacji
- ograniczony rozmiar porcji danych limitowany własnościami protokołu i sieci.
Schemat jak w pkt 41
Po wykonaniu funkcji socjet() oraz bind() następuje: …
a) sendto()
Działanie funkcji jest podobne do działania funkcji write() moŜna jednak w dodatkowym polu
flags przekazać pewne opcje związane z wysłaniem komunikatu. Funkcja sendto() umoŜliwia
podanie adresu docelowego .
int sendto(SOCKET socket, const char *buf, int nbytes, int
flags,const struct sockaddr *toaddr, int addrlen);
- socket - deskryptor gniazda, utworzony przez funkcję socket() lub accept(),
- buf
- adres (wskaźnik) bufora, zawierającego dane do wysłania,
- nbytes - liczba bajtów do wysłania, znajdująca się w buforze,
- flags - znaczniki:
- toaddr - wskaznik na strukture odpowiadajaca własciwej formie adresowej(adres
odbiorcy),
- addrlen - rozmiar struktury zawierającej adres.
b) recvfrom()
Działanie funkcji jest podobne do działania funkcji read() moŜna jednak w dodatkowym polu
flags przekazać pewne opcje związane z dobieraniem komunikatu. Funkcja recvfrom() umoŜliwia
uzyskanie adresu nadawcy .
int recvfrom(SOCKET socket, char *buf, int nbytes, int flags,
struct sockaddr *fromaddr, int *addrlen);
- socket - deskryptor gniazda, utworzony przez funkcję socket() lub accept(),
- buf - adres (wskaźnik) bufora, który będzie zawierał dane po ich odebraniu,(pierwszy
pakiet z kolejki)
- nbytes - rozmiar bufora (maksymalna liczba bajtów, którą moŜna jednorazowo odebrać
pozostałe dane >nbytes są tracone.)
- flags - znaczniki:
- fromaddr - wskaźnik do struktury, w której zapisany zostanie adres nadawcy danych.
- addrlen - wskaźnik do zmiennej, przez którą zwrócony zostanie rozmiar struktury
zawierającej adres.
+ *43. Elementy i właściwości przesyłania połączeniowego za pomocą gniazdek.
tryb połączeniowy,
- obsługiwany przez protokół TCP/IP
- gwarantujący przesyłanie danych w postaci strumienia, w sposób niezawodny
- bez duplikowania danych i bez zmiany ich kolejności
- nawiązanie połączenia asymetryczne,
- wymiana danych symetryczna
- do funkcji nie trzeba przekazywać adresów(są one ustalane podczas nawiązywania połączenia)
Schemat jak w pkt 41
Po wykonaniu funkcji socjet() oraz bind() następuje: …
Ustanawianie połączenia : connect() , listen() accept()
a) Funkcja connect()
- uŜywana przez klienta
- zgłoszenie Ŝądania nawiązania połączenia z serwerem.
- gniazdu klienta przypisywany jest adres wybrany przez system.
- Proces klienta jest blokowany do momentu ustanowienia połączenia(funkcja czeka na
potwierdzenie).
- Klient połączeniowy moŜe zrealizować tylko jedno pomyślne połączenie.
int connect(SOCKET socket, const struct sockaddr *servaddr,
int addrlen);
- socket - deskryptor gniazda, utworzony przez funkcję socket(),
- servaddr - wskaźnik do struktury zawierającej adres serwera (struktura ta moŜe być
róŜna dla róŜnych rodzin protokołów),
- addrlen - rozmiar struktury zawierającej adres.
b) Funkcja systemowa listen()
- Serwer zgłasza w systemie gotowość przyjmowania połączeń i ustala maksymalną liczbę
połączeń oczekujących na obsłuŜenie.
int listen(SOCKET socket, int backlog);
- socket - deskryptor gniazda, utworzony przez funkcję socket(),
- backlog - parametr określający maksymalną liczbę Ŝądań oczekujących w kolejce na
wykonanie funkcji accept().
c) Funkcja systemowa accept()
- serwer przyjmuje Ŝądanie nawiązania połączenia, zgłoszonego wcześniej
- serwer jest blokowany do momentu otrzymania Ŝądania (funkcja czeka na Ŝądanie ).
- Po przyjęciu Ŝądania funkcja pod adres addr. wpisuje adres klienta i informuje aplikację, który
klient został podłączony.
- Tworzy nowy deskryptor dla danego gniazda socket, który moŜe być następnie
wykorzystywany przez proces obsługi zgłoszenia.
- Stare gniazdko nadal czeka na kolejne Ŝądania. (w zaleŜności od parametru funkcji listen())
SOCKET accept(SOCKET socket,
struct sockaddr * addr, int
*addrlen);
- socket - deskryptor gniazda, utworzony przez funkcję socket(),
- addr - wskaźnik do struktury zawierającej adres klienta (struktura ta moŜe być róŜna
dla róŜnych rodzin protokołów),
- addrlen - rozmiar struktury zawierającej adres.
Przesyłanie danych
a) Wysyłanie: Działanie funkcji jest podobne do działania funkcji write() moŜna jednak w
dodatkowym polu flags przekazać pewne opcje związane z wysłaniem komunikatu.
int
send(SOCKET socket, const char *buf, int nbytes, int
flags);
- socket
- buf
- nbytes
- flags
- deskryptor gniazda, utworzony przez funkcję socket() lub accept(),
- adres (wskaźnik) bufora, zawierającego dane do wysłania,
- liczba bajtów do wysłania, znajdująca się w buforze,
- znaczniki:
b) Odbieranie: Działanie funkcji jest podobne do działania funkcji read() moŜna jednak w
dodatkowym polu flags przekazać pewne opcje związane z dobieraniem komunikatu.
int recv(SOCKET socket, char *buf, int nbytes, int flags);
- socket - deskryptor gniazda, utworzony przez funkcję socket() lub accept(),
- buf - adres (wskaźnik) bufora, który będzie zawierał dane po ich odebraniu,(pierwszy
pakiet z kolejki)
- nbytes - rozmiar bufora (maksymalna liczba bajtów, którą moŜna jednorazowo odebrać
pozostałe dane >nbytes są tracone.)
- flags - znaczniki:
*44. Elementy i implementacje standardu MPI.
1 Interfejs MPI
- Message Passing Interface (Interfejs Transmisji Wiadomości) – standard interfejsu do przesyłania
komunikatów w rzeczywistych i wirtualnych maszynach równoległych z pamiecią rozproszona
(DM).
- Biblioteka procedur i funkcji wywoływanych z programów napisanych w jezykach Fortran,
C/C++ słuŜących do obsługi komunikatów i synchronizacji zadań wykonujących najczęściej
ten sam program .
- Transfer danych pomiędzy poszczególnymi procesami programu wykonywanymi na
procesorach maszyn będących węzłami klastra odbywa się za pośrednictwem sieci.
- Procesy są identyfikowane poprzez ich numer w grupie w zakresie 0 .. groupsize - 1.
2 Implementacje MPI
- MPI-1 był gotowy w maju 1994 roku
- Drugi standard MPI-2 ukończono w 1998 roku.
- MPICH i LAM MPI to najczęściej stosowane implementacje standardu MPI.
- W standardzie MPI-2 zdefiniowano równoległe operacje wejścia/wyjścia, które pierwotnie
zostały zawarte w pakiecie MPI-IO rozwijanym specjalnie na potrzeby NASA, a następnie
zmodyfikowane i przeniesione do nowego MPI-2.
- Implementacje producentów sprzętu SA optymalizowane pod katem sprzętowych rozwiązań
(sieci) komunikacyjnych i architektury (topologii) danego systemu.
*45. Sposoby wywołania funkcji MPI.
Prawie wszystkie funkcje MPI zwracają kod błędu:
– w C jako wartość funkcji,
– w Fortranie jako wartość ostatniego argumentu.
Przed zwróceniem wartości wywoływana jest bieŜąca procedura obsługi błędu:
– standardowo powoduje przerwanie zadania,
– ustawienie uchwytu MPI_ERRORS_RETURN spowoduje zwracanie kodu błędu.
MPI nie gwarantuje dalszego działania.
W razie powodzenia zwracany jest MPI_SUCCESS
Include
Postac bibliotek załączanych dla języka:
C
: #include ``mpi.h``
Fortran
: include `mpif.h`
Format funkcji MPI
C:
int error;
error = MPI_Xxxxx(parametr, ...);
MPI_Xxxxx(parametr, ...);
Fortran:
INTEGER IERROR
CALL MPI_XXXXX(parametr, ..., IERROR)
Przykład : Inicjacja biblioteki MPI
• Funkcja MPI_Init:
////////////////////////// C //////////////////////
int error = MPI_Init(int *argc, char **argv[])
c
/////////Fortran
INTEGER ierror
CALL MPI_INIT(ierror)
– jak większość funkcji MPI zwraca stała int o wartości MPI_SUCCESS w przypadku
pomyślnego wykonania.
– Wersja Fortran zwraca tylko argument ierror.

Podobne dokumenty