Serwery współbieżne c.d.



Podobne dokumenty
Współbieżność, tunelowanie i kapsułkowanie, XDR i RPC

Podstawowe typy serwerów

Serwer współbieżny połączeniowy

Klient-Serwer Komunikacja przy pomocy gniazd

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła

4. Procesy pojęcia podstawowe

Programowanie współbieżne i rozproszone

Podstawowe typy serwerów

Architektura komputerów

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Sieci komputerowe. Wykład 5: Warstwa transportowa: TCP i UDP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Instytut Teleinformatyki

4. Procesy pojęcia podstawowe

Wybrane działy Informatyki Stosowanej

Gniazda surowe. Bartłomiej Świercz. Łódź,9maja2006. Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda surowe

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Komunikacja sieciowa - interfejs gniazd

5. Algorytmy serwera

Uniwersalny Konwerter Protokołów

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Serwery multimedialne RealNetworks

Systemy Operacyjne 1 Laboratorium 2 Procesy i sygnały w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

5. Model komunikujących się procesów, komunikaty

Tworzenie aplikacji rozproszonej w Sun RPC

Mechanizmy pracy równoległej. Jarosław Kuchta

Sieci komputerowe Warstwa transportowa

Programowanie współbieżne Wykład 2. Iwona Kochańska

Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu

4.2 Sposób korzystania z l acza

Działanie systemu operacyjnego

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

Twisted. Silnik Twojego Internetu. Jan Urbański Ducksboard. PyWaw #25, Warszawa, 10 czerwca 2013

Proces y i y w i ąt ą ki

1. Model klient-serwer

Podstawy programowania komputerów

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Czujniki obiektowe Sterowniki przemysłowe

Działanie systemu operacyjnego

Zdalne wywoływanie procedur RPC 27. października 2010

Laboratorium Sieci Komputerowych - 2

Iteracyjny serwer TCP i aplikacja UDP

Sieci komputerowe. Zajęcia 3 c.d. Warstwa transportu, protokoły UDP, ICMP

Programowanie Proceduralne

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

4. Procesy pojęcia podstawowe

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

Działanie systemu operacyjnego

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

TCP - receive buffer (queue), send buffer (queue)

Akademia Techniczno-Humanistyczna w Bielsku-Białej

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Stan procesu. gotowy - czeka na przydział procesora, zakończony - zakończył działanie.

SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)

Programowanie Sieciowe 1

Tunelowanie, kapsułkowanie, XDR. 1. Transmisja tunelowa i kapsułkowanie serwery proxy. 2. Zewnętrzna reprezentacja danych XDR.

Zwielokrotnianie wejścia wyjścia

76.Struktura oprogramowania rozproszonego.

Relacyjne, a obiektowe bazy danych. Bazy rozproszone

Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998

Działanie komputera i sieci komputerowej.

Gniazda BSD. komunikacja bezpołączeniowa

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Programowanie współbieżne i rozproszone

Integracja komunikatora opartego o protokół XMPP z dużym portalem internetowym

Przesyłania danych przez protokół TCP/IP

Pobieranie argumentów wiersza polecenia

IPC: Kolejki komunikatów

Win Admin Replikator Instrukcja Obsługi

Program jest więc strukturą statyczną zapisaną na jakimś nośniku. Natomiast proces jest wykonującym się programem.

Wykład 3 / Wykład 4. Na podstawie CCNA Exploration Moduł 3 streszczenie Dr inż. Robert Banasiak

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Etapy życia oprogramowania

Wykład 4: Protokoły TCP/UDP i usługi sieciowe. A. Kisiel,Protokoły TCP/UDP i usługi sieciowe

PhysX Visual Debugger. Tomasz Gańko

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu. Blok kontrolny procesu

Wprowadzenie do programowania rozproszonego

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Pamięć współdzielona

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Etapy życia oprogramowania. Modele cyklu życia projektu. Etapy życia oprogramowania. Etapy życia oprogramowania

Systemy operacyjne System sieciowy UNIX-a

Transkrypt:

Serwery współbieżne c.d. 1. Serwery wielousługowe i wieloprotokołowe. 2. Sterowanie współbieżnością w serwerze współbieżność sterowana zapotrzebowaniem, alokacja wstępna procesów podporządkowanych. 3. Współbieżność w programach klienckich. 1

Serwery wieloprotokołowe (TCP i UDP) Serwery wieloprotokołowe udostępniają jedną usługę za pośrednictwem kilku protokołów warstwy transportowej. Podstawową zaletą tego rozwiązania jest łatwiejsze zarządzanie kodem realizującym usługę, np. przy zmianie wersji oprogramowania czy systemu operacyjnego, niezależnie od obsługiwanego protokołu (TCP lub UDP). Dodatkowo, serwer wieloprotokołowy zwykle potrzebuje mniej zasobów systemowych niż kilka serwerów jednoprotokołowych. 2

Serwery wieloprotokołowe Schemat struktury serwera wieloprotokołowego (TCP i UDP). proces główny obsługa UDP oczekiwanie na połączenia TCP obsługa połączenia TCP Proces główny przyjmuje zgłoszenia połączeń TCP; do obsługi połączenia wykorzystywane jest osobne. Niezależnie obsługiwane są zgłoszenia UDP. 3

Serwery wieloprotokołowe Poniższy przykład nie zawiera obsługi błędów zwracanych przez funkcje wykorzystywane do transmisji TCP/IP. svr_echo_tcpudp(){ int stcp, sudp, maxs, s; struct sockaddr_in sin; char buf[linelen]; fd_set afds, //zbiór aktywnych deskryptorów stcp = passivesock(testport, "tcp", 10); sudp = passivesock(testport, "udp", 0); maxs = MAX(sTCP, sudp); FD_ZERO(&afds); while(1){ FD_SET(sTCP, &afds); FD_SET(sUDP, &afds); 4

Serwery wieloprotokołowe } select(maxs+1, &afds, NULL, NULL, 0); alen = sizeof(sin); if(fd_isset(stcp, &afds)){ // obsługa TCP s = accept(stcp, struct sockaddr*)&sin, &alen); daytimed(buf); write(s, buf, strlen(buf)); close(s); } if(fd_isset(sudp, &afds)){ // obsługa UDP recvfrom(sudp, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &alen); daytimed(buf); sendto(sudp, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin)); } }//while 5

Serwery wieloprotokołowe (TCP i UDP) Serwer wieloprotokołowy stanowi rozwiązanie pozwalające skupić cały kod, realizujący określoną usługę, w jednym programie. Dzięki temu nie ma problemów z koordynacją zmian w przeciwieństwie do sytuacji gdy kod ten jest powielony w różnych programach. Serwer tego typu jest realizowany przez jeden proces, który tworzy główne dla każdego z protokołów (TCP, UDP) po czym wywołuje funkcje select() w oczekiwaniu na gotowość jednego lub obydwu gniazd. Gdy gotowe jest TCP, serwer nawiązuje połączenie z klientem i za jego pośrednictwem odpowiada na nadsyłane zapytania. Gdy gotowość zgłosi UDP, serwer odczytuje zapytanie i wysyła odpowiedź 6

Serwery wielousługowe Dla rodziny protokołów TCP/IP zdefniowano duży zbiór tzw. prostych usług, pomocnych w administrowaniu, testowaniu i wykrywaniu błędów (np. DAYTIME, ECHO, TIME). W systemie, w którym dla każdej standartowej usługi istnieje oddzielny serwer, będą działać dziesiątki procesów, mimo że większość z nich zapewne nigdy nie otrzyma zgłoszenia. Dlatego połączenie wielu serwerów dla wielu różnych usług w jeden proces może radykalnie zmniejszyć liczbę aktywnych procesów. UWAGA: system operacyjny może ograniczać maksymalną liczbę gniazd używanych w jednym procesie. 7

Budowa wielousługowego serwera połączeniowego Schemat struktury iteracyjnego, połączeniowego serwera wielousługowego. serwer Gniazdo obsługujące określone połączenie. Gniazda dla poszczególnych usług realizowanych przez serwer. Serwer ma otwarte dla każdej z usług i co najwyżej jedno do obsługi określonego połączenia. 8

Budowa wielousługowego serwera bezpołączeniowego Schemat struktury bezpołączeniowego serwera wielousługowego. serwer... Gniazda dla poszczególnych usług realizowanych przez serwer. Serwer czeka na nadejście datagramu do któregokolwiek z gniazd (select()). Każde jest przypisane określonej usłudze. 9

Wspólbieżny połączeniowy serwer wielousługowy Schemat struktury współbieżnego, połączeniowego serwera wielousługowego. Proces główny Proces potomny Proces potomny Gniazda dla poszczególnych usług realizowanych przez serwer. Gniazda dla poszczególnych połączeń obsługiwanych przez procesy potomne. 10

Serwery wielousługowe Jedną z głównych wad dotychczas omówionych rozwiązań jest trudność wprowadzania zmian. Każda modyfkacja kodu realizującego jedną usługę wymaga ponownej kompilacji całego serwera, zatrzymania jego działania i uruchomienia nowej wersji. W serwerze wielousługowym można oddzielić części kodu realizujące poszczególne usługi od kodu obsługującego wstępne zgłoszenia połączeń. Zabieg taki jest możliwy dzięki funkcji systemowej execve(). 11

Serwery wielousługowe int execve(const char *filename, const char *argv[], const char *env[]); filename nazwa pliku z programem lub skryptem, który zostanie uruchomiony w miejsce istniejącego procesu, argv tablica argumentów, env zmienne środowiska Wartość zwracana: w przypadku sukcesu nie ma powrotu, w przypadku błędu -1 (errno). 12

Wspólbieżny połączeniowy serwer wielousługowy Schemat struktury połączeniowego, który korzysta z funkcji execve(), aby wywołać odzielny program do obsługi każdego połączenia. Proces główny Proces potomny Proces potomny program program Gniazda dla poszczególnych usług realizowanych przez serwer. Gniazda dla poszczególnych połączeń obsługiwanych przez procesy potomne. 13

Wybór między rozwiązaniem iteracyjnym i współbieżnym Wybór typu serwera iteracyjnego albo współbieżnego może być sprawą trudną, zważywszy jak szybki jest zarówno wzrost popytu użytkowników na usługi, jak i rozwój możliwości komunikacyjnych oraz wzrost szybkości przetwarzania danych. Projektanci przeważnie podejmują odpowiednie decyzje na podstawie ekstrapolacji dotychczasowych tendencji rozwojowych. 14

Poziom współbieżności Poziom współbieżności działania serwera defniujemy jako liczbę procesów serwera działających w danej chwili. Współbieżny serwer połączeniowy zazwyczaj tworzy nowy proces dla każdego nawiązywanego połączenia z klientem. W praktyce liczba tych połączeń nie może być dowolnie duża. Każda implementacja protokołu TCP narzuca ograniczenie liczby jednocześnie aktywnych połączeń. Każdy system operacyjny ogranicza liczbę działających procesów. Gdy serwer wyczerpie jeden lub drugi limit, system będzie odmawiał tworzenia nowych procesów. 15

Współbieżność sterowana zapotrzebowaniem Współbieżność sterowana zapotrzebowaniem (demand driven concurency) to technika polegająca na tworzeniu nowych procesów przy wzroście liczby jednocześnie obsługiwanych połączeń. Serwer zajmuje zasoby systemu tylko wtedy, gdy ich rzeczywiście używa. Jednocześnie takie serwery zapewniają krótki obserwowany czas odpowiedzi, dlatego że kolejne zgłoszenia nie muszą czekać na zakończenie obsługi zgłoszeń wcześniejszych. 16

Narzut czasowy operacji systemowych Zarówno operacja odebrania zgłoszenia z sieci, jak i utworzenie nowego procesu zajmują zauważalną ilość czasu. Powoduje to opóźnienie rozpoczęcia obsługi zgłoszenia. Jest to szczególnie odczuwalne, gdy czas obsługi zgłoszenia jest krótszy niż czas utworzenia procesu potomnego. serwer współbieżny utworzenie procesu podporządkowanego 1 obsługa zgłoszenia 1 utworzenie procesu podporządkowanego 2 obsługa zgłoszenia 2 serwer iteracyjny obsługa zgłoszenia 1 obsługa zgłoszenia 2 17

Narzut czasowy operacji systemowych W praktyce obciążenie serwerów zgłoszeniami rzadko osiąga poziom bliski ich maksymalnej przepustowości. Ponadto niewielu projektantów decyduje się na współbieżną realizację serwera w sytuacji, gdy koszt tworzenia nowego procesu przewyższa czas przetwarzania zgłoszenia. Dlatego przypadki nadmiernych opóźnień obsługi lub odrzucania zgłoszeń nie zdarzają się często. Jednak projektując serwer, któremu stawia się wymaganie możliwie krótkiego czasu odpowiedzi przy dużym obciążeniu, trzeba rozważyć rozwiązania inne niż współbieżność sterowana zapotrzebowaniem. 18

Alokacja wstępna procesów podporządkowanych Wstępna alokacja procesów polega na tworzeniu współbieżnych procesów przy rozpoczęciu pracy przez proces główny serwera. Każdy z tych procesów czeka na nadejście zgłoszenia wywołując odpowiednią funkcję systemową. Po jego nadejściu jeden z procesów potomnych rozpoczyna obsługę klienta. Po zakończeniu obsługi proces potomny oczekuje na kolejne zgłoszenie. Dzięki temu skraca się czas obsługi zgłoszeń ponieważ serwer nie traci go na tworzenie dodatkowych procesów potomnych. Obsługa zgłoszenia może też przebiegać jednocześnie z operacją wejścia wyjścia związaną z innym zgłoszeniem. 19

Alokacja wstępna procesów podporządkowanych Schemat serwera połączeniowego korzystającego z wstępnej alokacji procesów. proces główny proces potomny proces potomny proces potomny dla zgłoszeń połączeń gniazda używane do obsługi poszczególnych połączeń. 20

Alokacja wstępna procesów podporządkowanych Schemat serwera bezpołączeniowego korzystającego z wstępnej alokacji procesów. proces główny proces potomny proces potomny proces potomny związane z portem o powszechnie znanym numerze 21

Systemy wieloprocesorowe W systemach wieloprocesorowych alokacja wstępna pozwala powiązać poziom współbieżności z możliwościami serwera. W komputerze wieloprocesorowym system operacyjny przydziela każdemu procesowi oddzielny procesor. Dzięki temu, podczas nasilonego napływu zgłoszeń, każde z nich będzie obsługiwane przez inny procesor. W ten sposób osiągnięta zostanie maksymalna możliwa szybkość obsługi. 22

Odraczanie alokacji procesów Koszty alokacji wstępnej nie ograniczają się jedynie do utworzenia procesu. Każdy nowy proces działający w systemie zwiększa ilość czasu procesora zużywaną przez podsystem zarządzający procesami. Oprogramowanie sieciowe także może zużywać więcej czasu w sytuacji, gdy obsługuje wiele alokowanych wstępnie procesów usiłujących odbierać zgłoszenia napływające z sieci. Te dodatkowe koszty są uzasadnione tylko wtedy, gdy dzięki alokacji wstępnej procesów można zwiększyć całkowitą przepustowość serwera lub skrócić czas oczekiwania na obsługę. W przeciwnym razie należy rozważyć wykorzystanie techniki tzw. Odroczonej alokacji procesów (delayed process allocation). 23

Odraczanie alokacji procesów Serwer działający według metody odroczonej alokacji procesów rozpoczyna przetwarzanie każdego zgłoszenia w trybie iteracyjnym. Oddzielny, współbieżnie działający proces przeznaczony tylko do obsługi tego połączenia jest tworzony wtedy, gdy okazuje się, że jego przetwarzanie zajmie (zajmuje) zbyt dużo czasu. Proces główny może więc przykładowo sprawdzić poprawność zgłoszenia, a jeśli przetwarzane zgłoszenie jest mało czasochłonne także je obsłużyć, bez tworzenia w tym celu nowego procesu i przełączania kontekstu. W celu realizacji tej techniki w środowisku UNIX można wykorzystać systemową funkcję alarm(). 24

Odraczanie alokacji procesów Funkcja alarm() powoduje wysłanie do procesu, w którym została użyta, sygnału SIGALARM po upływie określonego czasu. Użycie funkcji alarm() kasuje wszystkie wcześniej ustawione alarmy. unsigned int alarm(unsigned int seconds); seconds liczba sekund, po której zostanie wysłany sygnał. W przypadku gdy seconds zostanie ustawione na zero, nie zostanie wysłany sygnał. Wartość zwracana: liczba sekund pozostała do wywołania wcześniej zdefniowanego alarmu lub zero. 25

Jednoczesne stosowanie kilku technik alokacji Techniki wstępnej i odroczonej alokacji są oparte na tej samej zasadzie uniezależnienia poziomu współbieżności działania serwera w danej chwili od liczby obsługiwanych zgłoszeń. Przyjęcie tej zasady umożliwia elastyczne dostosowanie poziomu współbieżności do potrzeb i w konsekwencji pozwala osiągnąć lepszą wydajność serwera. 26

Jednoczesne stosowanie kilku technik alokacji Omówione techniki można stosować łącznie. Serwer na początku działa zgodnie z metodą odroczonej alokacji (nie tworzy nowych procesów). Gdy jednak już powstanie taki proces to po zakończeniu obsługi klienta może on istnieć nadal i czekać na następne zgłoszenia. Największym problemem w tym wypadku jest stworzenie efektywnego mechanizmu ograniczenia poziomu współbieżności. Nie jest łatwo ocenić, kiedy istniejący proces potomny powinien zakończyć działanie i zwolnić zasoby. Jedna z metod polega na kończeniu procesów jeśli przez określony czas są one bezczynne np. nie otrzymały zgłoszenia połączenia. 27

Współbieżność w programach klienckich Współbieżna realizacja programów klienckich ma następujące zalety: łatwość implementacji poszczególne funkcje mogą być realizowane przez odrębne części programu, ułatwiona konserwacja i rozbudowa programu odrębne moduły mogą być rozwijane niezależnie, możliwość połączenia z wieloma serwerami jednocześnie może znacznie skrócić czas oczekiwania na uzyskanie kompletnej obsługi, dynamiczne sterowanie przetwarzaniem danych zmiana parametrów działania programu, uzyskanie informacji o stanie połączeń itp. Zasadniczą zaletą współbieżnej realizacji programów klienckich jest asynchronizm. Program może jednocześnie wykonywać wiele zadań. Kolejność ich wykonywania nie jest przez program zdeterminowana. 28

Współbieżność w programach klienckich - przykłady Schemat jednej z możliwych struktur wieloprocesowego, połączeniowego programu klienta. proces sterujący proces obsługi wejścia proces obsługi wyjścia polecenia sterujące wejście wyjście TCP Jeden z procesów obsługuje wejście i wysyła zgłoszenia do serwera, a drugi odbiera odpowiedzi i obsługuje wyjście. 29

Współbieżność w programach klienckich - przykłady Schemat jednej z możliwych struktur jednoprocesowego, połączeniowego programu klienta. polecenia sterujące proces klienta wejście wyjście TCP TCP TCP Jeden proces za pomocą funkcji select() obsługuje wiele połączeń TCP oraz wejście danych sterujących. 30

Współbieżność w programach klienckich - przykłady int cli_con_echo_tcp(int argc, char **argv){ long t; int ccount, scount, i, j; char *buf; scount = 0; ccount = 1024; for(i=0; i<argc; i++){ if(strcmp(argv[i], "-c")==0){ if (++i<argc && (ccount = atoi(argv[i]))){ continue; }else{ printf("nieprawidlowe wywolanie programu\n"); return -1; } }else{ 31

Współbieżność w programach klienckich - przykłady switch(fork()){ case 0: // proces potomny if ((buf=(char *)calloc(ccount+1, sizeof(char)))==null){ fprintf(stderr, "calloc: %s\n", strerror(errno)); exit(0); } for(j=0; j<ccount; j++) buf[j] = 'a'; buf[j]='\0'; t = cli_echo_tcp(argv[i], TESTPORT, buf, 0); printf("%s\t%.6f\n", argv[i], (double)t/1000000.0); free(buf); exit(1); 32

Współbieżność w programach klienckich - przykłady } default: scount++; continue; case -1: fprintf(stderr, "fork: %s\n", strerror(errno)); return -1; } } } for(i=0; i<scount; i++) waitpid(-1, NULL, 0); return 1; 33 33

Podsumowanie Współbieżna organizacja programów to bardzo mocne narzędzie, użyteczne zarówno w odniesieniu do serwerów, jak i klientów. Współbieżność w programach klienckich umożliwia szybsze dostarczenie odpowiedzi użytkownikowi, pozwala uniknąć ryzyka zakleszczenia a także ułatwia oddzielenie operacji sterujących działaniem klienta od operacji przesyłania danych. 34