Wielowątkowy serwer TCP

Podobne dokumenty
w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Temat zajęć: Tworzenie i obsługa wątków.

Mariusz Rudnicki PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4

Problemy współbieżności

Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

Programowanie aplikacji równoległych i rozproszonych. Wykład 1

Plan wykładu. Obliczenia równoległe w zagadnieniach inżynierskich. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

Modele programowania równoległego. Pamięć współdzielona Rafał Walkowiak dla III roku Informatyki PP

Programowanie Współbieżne

1. Uruchom poniższy program tworzący pojedynczy wątek:

Tworzenie wątków. #include <pthread.h> pthread_t thread;

Implementacje zgodne z tym standardem są nazywane wątkami POSIX lub Pthreads.

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

POSIX: IEEE Std (Issue 6, 2004 edition)

Podstawy programowania współbieżnego. 1. Wprowadzenie. 2. Podstawowe pojęcia

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

synchronizacji procesów

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

synchronizacji procesów

Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

ZAJECIA Z SYSTEMÓW OPERACYJNYCH 2 (Programowanie): funkcje POSIX

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Architektury systemów równoległych

Problemy czytelników i pisarzy oraz 5 ucztujących filozofów

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO. Mariusz RUDNICKI: pok. 753 tel.:

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Problem producentakonsumenta

Unix: programowanie z użyciem w atków

Unix: programowanie z użyciem w atków

Synchronizacja procesów

Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki

Serwer współbieżny połączeniowy

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki

Gdy kilka procesów czyta a przynajmniej jeden dokonuje zapisu wynik odczytu zależeć może od sposobu realizacji przeplotu.

Wątki. S. Samolej: Wątki 1

Systemy operacyjne. Studia podyplomowe Wydział Informatyki PB

WĄTKI W SYSTEMIE LINUX

Klient-Serwer Komunikacja przy pomocy gniazd

Systemowe mechanizmy synchronizacji procesów

Gniazda BSD implementacja w C#

Przykłady interfejsu TCP i UDP w Javie

Systemy operacyjne. Studia podyplomowe Wydział Informatyki PB

Podstawowe typy serwerów

POSIX Threads. Wojciech Muła. marzec 2010 z późniejszymi poprawkami (plik utworzony 21 marca 2011)

9. Problem wzajemnego wykluczania i sekcji krytycznej

GLIWICE Kontakt. Dokumentacja z projektu PROGRAMOWANIA OBIEKTOWEGO

UŻYCIE I ZARZĄDZANIE WĄTKAMI

Platformy Programistyczne Zagadnienia sieciowe i wątki

Aplikacja wielowątkowa prosty komunikator

procesy odrębne dzielone

5. Algorytmy serwera

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

UŻYCIE I ZARZĄDZANIE WĄTKAMI

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

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Gniazda BSD. Procesy w środowisku sieciowym. Gniazda podstawowe funkcje dla serwera. Gniazda podstawowe funkcje dla klienta

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Aplikacje w Javie- wykład 11 Wątki-podstawy

PROGRAMOWANIE WSPÓŁBIEŻNE. eść I. Wprowadzenie. Wprowadzenie. Program przedmiotu. Dr inż. Wojciech Mikanik pokój 503 (V p.

Winsock. Sieci Komputerowe II Wyk ład 3

programowanie współbieżne

Procesy wielowatkowe. Watki. Wspólne dane watków. Prywatne dane watków. Programowanie z użyciem watków

Język Java wątki (streszczenie)

Programowanie równoległe w POSIX API. PRiR, wykład 3

Języki i metodyka programowania. Wskaźniki i tablice.

Programowanie współbieżne Wykład 7. Iwona Kochaoska

w zależności od wartości zmiennej operacja (dodatnia lub ujemna).

Programowanie w Ruby

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

KARTA PRZEDMIOTU. Systemy Rozproszone D1_3

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Programowanie wielowątkowe. Jarosław Kuchta

Watki. kod programu za ladowany do pami eci operacyjnej, wraz ze środowiskiem (zbiorem

Procesy, zasoby i wątki

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Procesy, zasoby i wątki

Procesy, zasoby i wątki

Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot

Architektura Systemów Wbudowanych

Aplikacja Sieciowa wątki po stronie klienta

Praktyczne poblemy projektowania aplikacji wielowątkowych w standardzie POSIX

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

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

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

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Zaawansowany kurs języka Python

# echo przykład przykład. echo przykład

Programowanie sieciowe

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Instytut Teleinformatyki

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

Podstawowe typy serwerów

Programowanie systemów z pamięcią wspólną specyfikacja OpenMP. Krzysztof Banaś Obliczenia równoległe 1

Transkrypt:

Wielowątkowy serwer TCP

Wątek współbieżne działanie współdzielenie danych wykonywanie tego samego programu tańsze tworzenie w porównaniu do fork() join(), a detach()

pthread - interesujące fragmenty pthread_create(), pthread_detach(), pthread_exit(), pthread_join() pthread_mutex_t PTHREAD_MUTEX_INITIALIZER pthread_mutex_init() / pthread_mutex_destroy() pthread_mutex_lock() / pthread_mutex_unlock() pthread_cond_t PTHREAD_COND_INITIALIZER pthread_cond_init() / pthread_cond_destroy() pthread_cond_wait() / pthread_cond_signal() / pthread_cond_broadcast()

Współbieżny serwer TCP - schemat socket() setsockopt() bind() listen() f_watku(args) { pthread_detach() while() { accept() args =... pthread_create(f_watku, args)

Problemy Poprawne wykonanie programu!= poprawny program (brak objawów!= brak choroby)

Problemy - zarządzanie pamięcią int *licznik = malloc(...); pthread_create(..., f_watku, licznik) f_watku(int *licznik) { printf( %d, *licznik) pthread_exit(...)

Problemy - zarządzanie pamięcią int *licznik = malloc(...); pthread_create(..., f_watku, licznik) f_watku(int *licznik) { printf( %d, *licznik) free(licznik); pthread_exit(...)

Problemy - warunek wyścigu int *liczba = malloc(...) *liczba = 0 pthread_create(..., f_watku, liczba) *liczba = 1 pthread_create(..., f_watku2, liczba) f_watku(int *liczba) { printf( f: %d, *liczba) f_watku2(int *liczba) { printf( f2: %d, *liczba)

Problemy - warunek wyścigu int *liczba = malloc(...) *liczba = 0 pthread_create(..., f_watku, liczba) int *liczba2 = malloc(...) *liczba2 = 1 pthread_create(..., f_watku2, liczba2) f_watku(int *liczba) { printf( f: %d, *liczba) f_watku2(int *liczba) { printf( f2: %d, *liczba)

Problemy - współbieżna modyfikacja int *liczba = malloc(...) *liczba = 0 pthread_create(..., f_watku, liczba) pthread_create(..., f_watku2, liczba) zwieksz(int *liczba, int wartosc) { *liczba = *liczba + wartosc f_watku(int *liczba) { zwieksz(liczba, 10) f_watku2(int *liczba) { zwieksz(liczba, 20)

Problemy - współbieżna modyfikacja (zamek) int *liczba = malloc(...) *liczba = 0 pthread_create(..., f_watku, liczba) pthread_create(..., f_watku2, liczba) zwieksz(int *liczba, int wartosc) { mutex_lock *liczba = *liczba + wartosc mutex_unlock f_watku(int *liczba) { zwieksz(liczba, 10) f_watku2(int *liczba) { zwieksz(liczba, 20)

Problemy - współbieżna modyfikacja (v. TCP) int *desc = malloc(...) *desc = socket() pthread_create(..., f_watku, desc) pthread_create(..., f_watku2, desc) wyslij(int *desc,...) { write(desc, ) f_watku(int *desc) { wyslij(desc, msg1; ) f_watku2(int *desc) { wyslij(desc, msg2; )

Problemy - współbieżna modyfikacja (v. TCP) int *desc = malloc(...) *desc = socket() pthread_create(..., f_watku, desc) pthread_create(..., f_watku2, desc) wyslij(int *desc,...) { mutex_lock write(desc, ) mutex_unlock f_watku(int *desc) { wyslij(desc, msg1; ) f_watku2(int *desc) { wyslij(desc, msg2; )

Problemy - granularność zamków pthread_mutex_t m = PTHREAD... int *liczba1 = malloc(...) *liczba1 = 10 int *liczba2 = malloc(...) *liczba2 = 20 pthread_create(..., f_watku, liczba1) pthread_create(..., f_watku, liczba1) pthread_create(..., f_watku2, liczba2) pthread_create(..., f_watku2, liczba2) f_watku(int *liczba1) { mutex_lock(&m) *liczba1 = *liczba1-12 mutex_unlock(&m) f_watku2(int *liczba2) { mutex_lock(&m) *liczba2 = *liczba2-7 mutex_unlock(&m)

Problemy - granularność zamków pthread_mutex_t m1 = PTHREAD... pthread_mutex_t m2 = PTHREAD... int *liczba1 = malloc(...) *liczba1 = 10 int *liczba2 = malloc(...) *liczba2 = 20 pthread_create(..., f_watku, liczba1) pthread_create(..., f_watku, liczba1) pthread_create(..., f_watku2, liczba2) pthread_create(..., f_watku2, liczba2) f_watku(int *liczba1) { mutex_lock(&m1) *liczba1 = *liczba1-12 mutex_unlock(&m1) f_watku2(int *liczba2) { mutex_lock(&m2) *liczba2 = *liczba2-7 mutex_unlock(&m2)

Problemy - aktywne czekanie pthread_mutex_t m = PTHREAD int *produkty = malloc(...) *produkty = 0 pthread_create(..., f_watku, produkty) pthread_create(..., f_watku2, produkty) f_watku(int *produkty) { while(1 == 1) { mutex_lock(&m) *produkty = *produkty + 1 mutex_unlock(&m) f_watku2(int *produkty) { while(1 == 1) { mutex_lock(&m) if (*produkty > 0) { *produkty = *produkty - 1 mutex_unlock(&m)

Problemy - aktywne czekanie (zmienna warunkowa) pthread_mutex_t m = PTHREAD pthread_cond_t c = PTHREAD... int *produkty = malloc(...) *produkty = 0 pthread_create(..., f_watku, produkty) pthread_create(..., f_watku2, produkty) f_watku(int *produkty) { while(1 == 1) { mutex_lock(&m) *produkty = *produkty + 1 mutex_unlock(&m) pthread_cond_signal(&c) f_watku2(int *produkty) { while(1 == 1) { mutex_lock(&m) while (*produkty <= 0) { pthread_cond_wait(&c, &m) *produkty = *produkty - 1 mutex_unlock(&m)