Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki
|
|
- Jan Sobolewski
- 9 lat temu
- Przeglądów:
Transkrypt
1 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1 1 Informacje wstępne Rodzaje wątków...7 poziomu jądra...7 poziomu użytkownika...8 Rozwiązania mieszane Biblioteka pthreads...12 Tworzenie i kończenie wątków...12 Przekazywanie danych do wątku i pobieranie wyników...20 Dostęp do wspólnych danych...24 Zmienne warunkowe Blokady czytelników i pisarzy Bariery Wirujące blokady w środowisku wieloprocesorowym...49
2 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Informacje wstępne Wiele aplikacji ma do wykonania czynności które mogą być wykonane współbieżnie ale muszą dzielić dane i inne zasoby. Można zastosować procesy ale koszt komunikacji będzie znaczny. Lepszym rozwiązaniem jest abstrakcja wątku. Tradycyjna implementacja procesu ma jeden wątek sterowania. W nowszych systemach pojęcie procesu zostało rozszerzone dopuszcza się istnienie wielu wątków sterowania. Proces można podzielić na zbiór wątków i zestaw zasobów. Proces pojemnik na zasoby w ramach którego wykonują się watki. Wątek elementarna jednostka szeregowania korzystająca z zasobów procesu. - wykonywane w ramach jednego procesu dzielą jego przestrzeń adresową i inne zasoby procesu. - W ramach jednego procesu może się wykonywać wiele wątków 1 proces, 1 wątek 1 proces, wiele wątków wiele procesów, 1 wątkowych wiele procesów wielowątkowych Rys. 1-1 Podstawowe modele przetwarzania
3 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 3 Atrybuty i zasoby własne wątku 1. Identyfikator wątka TID (ang.thread Identifier) - każdy watek ma unikalny w ramach procesu identyfikator. Jest to liczba całkowita. Pierwszy wątek ma TID 1, następny 2 itd. 2. Zestaw rejestrów (ang. Register set) - każdy wątek posiada własny obszar pamięci w którym pamiętany jest zestaw rejestrów procesora (tak zwany kontekst procesora). Gdy watek jest wywłaszczany lub blokowany w obszarze tym pamiętane są rejestry procesora. Gdy watek będzie wznowiony obszar ten jest kopiowany do rejestrów procesora. 3. Stos (ang. Stack) - każdy wątek ma swój własny stos umieszczony w przestrzeni adresowej zawierającego go procesu. Na stosie tym pamiętane są zmienne lokalne wątku. 4. Maska sygnałów (ang. Signal mask) - każdy wątek ma swą własną maskę sygnałów. Maska sygnałów specyfikuje które sygnały mają być obsługiwane a które blokowane. Początkowa maska jest dziedziczona z procesu macierzystego. 5. Obszar TLS wątku (ang. Thread Local Storage) każdy wątek ma pewien obszar pamięci przeznaczony na utrzymywanie różnych danych administracyjnych takich jak TID, PID, początek stosu, kod ewentualnego błędu errno i inne dane. Obszar TLS jest odpowiednikiem deskryptora procesu. 6. Procedura zakończenia (ang. Cancellation Handler) - gdy wątek się kończy wykonywana jest procedura zakończenia w ramach której zwalniane są zasoby wątku.
4 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 4 Deskryptor procesu P1 TLS 1 Licznik rozk. 1 Wątek W1 TLS 2 Licznik rozk. 2 Wątek W2 Kod Dane Stos 1 Stos 2 Pamięć RAM Rys i 2 wykonywane w ramach procesu P1 Wątek dzieli ze swym procesem macierzystym następujące zasoby: Dane statyczne (segment danych) Deskryptory otwartych plików, blokady plików Maskę tworzenia plików (umask) Środowisko Katalog macierzysty i główny Limity zasobów (setrlimit) Timery Sesję, użytkownika, grupę, terminal sterujący Zasoby własne wątku: Identyfikator wątka (thread ID) Maska sygnałów Zmienna errno Priorytet i strategię szeregowania
5 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 5 Rzeczywista równoległość mogą być wykonywane na oddzielnych procesorach. Stąd model procesów wielowątkowych nadaje się do wykorzystania na multiprocesorach ze wspólną pamięcią (SMP Shared Memory Processors) i zapewnia rzeczywistą równoległość przetwarzania. Procesor 1 Procesor 2 Procesor 3 Procesor 4 Szeregowanie W11 W13 W12 W21 W22 Dane Zasoby Dane Zasoby Proces 1 Proces 2 Rys. 1-3 Procesy wielowątkowe wykonywane na wielu procesorach
6 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 6 Własności wątków Koszt utworzenia i przełączania wątku jest mniejszy niż procesu. Dane statyczne procesu są dla wątków działających w ramach jednego procesu wzajemnie widoczne. Wykonanie każdego wątku przebiega sekwencyjnie, każdy wątek ma swój licznik rozkazów. mogą być wykonywane na oddzielnych procesorach co umożliwia przyspieszenie obliczeń. Ponieważ wątki dzielą wspólne dane konieczna jest synchronizacja dostępu do tych wspólnych danych. Zalety modelu wielowątkowego: Szybsza komunikacja pomiędzy wątkami wynikająca z mniej rygorystycznych mechanizmów kontroli. Mniejszy koszt tworzenia / kończenia wątku niż procesu Zwykle szybszy czas przełączania wątków niż procesów. Możliwość przetwarzania wieloprocesorowego SMP w systemach ze wspólną pamięcią (ang. Symetrical Multi Procesing). Wobec szybko malejących kosztów komputerów wieloprocesorowych ta ostatnia cecha nabiera szczególnie dużego znaczenia. Zdefiniowanie działania wątków wymaga rozstrzygnięcia wielu kwestii. Problem dzielenia dostępu do plików przez wiele wątków (wskaźnik bieżącej pozycji pliku, zamknięcie). Problem obsługi sygnałów trafiających do procesu (który wątek ma je obsługiwać) Problem widoczności wątków procesu przez inny proces (zwykle widoczność tylko w ramach procesu).
7 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 7 Rodzaje wątków Klasyfikacja Wyróżniane są następujące typy wątków: poziomu jądra KLT - (ang. Kernel Level Tthreads). poziomu użytkownika ULT - (ang. User Level Threads). Rozwiązania mieszane przestrzeń użytkownika szeregowanie wewnętrzne szeregowanie poziomu jądra Proces przestrzeń jądra Proces wątki poziomu użytkownika wątki poziomu jądra poziomu jądra Jądro jest świadome istnienia wątków i szereguje je niezależnie. Proces używający tych wątków w środowisku wieloprocesorowym może osiągnąć rzeczywistą równoległość.
8 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 8 poziomu użytkownika poziomu użytkownika są tworzone bez wsparcia jądra. Kwanty czasu przydzielane danemu procesowi, są dzielone pomiędzy zawarte w nim wątki. Każdy taki wątek ma swój własny stos, miejsce do pamiętania rejestrów i innych elementów kontekstu. Przełączanie kontekstów pomiędzy wątkami procesu odbywa się bez udziału jądra przez specjalne biblioteki (np. pthreads). W22 P2 P2 W12 P1 P1 W21 Jądro przełącza procesy P1 i P2 Czas W11 W11, W12 - wątki procesu P1 W21, W22 - wątki procesu P2 Czas Przypadek 1 Przypadek 2 Przypadek 1 Jądro przydziela czas procesora procesom P1 i P2 Przypadek 2 W11 i W12 wykonywane w ramach czasu przydzielonego procesowi P1 przez jądro. Podobnie W21 i W22. W ramach jednego procesu przełączanie wykonywane jest przez bibliotekę użytkownika. Rozwiązania mieszane Istnieją także rozwiązania pośrednie pomiędzy wątkami jądra a wątkami użytkownika. Są to procesy lekkie (ang. Lightweighted processes) systemu Solaris. W rozwiązaniu tym w jednym wątku poziomu jądra może istnieć kilka wątków poziomu użytkownika.
9 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 9 przestrzeń użytkownika wątki poziomu użytkownika SU SU SU szeregowanie poziomu użytkownika szeregowanie poziomu jądra wątki poziomu jądra przestrzeń jądra Proces Zalety wątków użytkownika: Szybkość działania Zwiększenie stopnia współbieżności aplikacji. Wady wątków użytkownika: Wywołanie funkcji blokującej proces wewnątrz wątku, wstrzymuje inne wątki. Brak możliwości zrównoleglenia (wykonania na wielu procesorach). Mniejsza szybkość wątków jądra wynika z konieczności przełączenia trybu user / kernel w przypadku wykonania funkcji systemowych. Wyniki testów: Zastosowanie wątków poziomu użytkownika przyspiesza przełączanie o ok. rząd wielkości. Null fork utworzenie i zakończenie pustego procesu Signal Wait wysłanie sygnału do innego wątku i oczekiwanie na odpowiedź. poziomu poziomu Procesy użytkownika jądra Null fork Signal Wait Czasy w MS maszyna VAX system UNIX
10 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 10 Kiedy opłacalne jest stosowanie wątków zależy od udziału operacji przełączania kontekstu w całości. Zależy od natury aplikacji. Zestaw funkcji interfejsowych niezbędnych do operowanie na wątkach: Aby umożliwić operowanie na wątkach niezbędny jest pewien zestaw funkcji interfejsowych. Powinny być udostępnione następujące grupy funkcji: Tworzenie wątków i ich kasowanie. Synchronizacja dostępu do wspólnych danych (muteksy). Synchronizacja działania wątków (zmienne warunkowe, bariery). Operowanie atrybutami wątków (priorytet, protokół unikania inwersji priorytetów, maska sygnałów).
11 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 11 Kanoniczne stany wątku Wykonywany Właśnie wykonywany przez procesor Gotowy Posiadający wszyskie zasoby oprócz procesora Zablokowany Brak pewnych zasobów Zombie Zakończony ale nie dołączony do wątku macierzystego (wątek dołączalny) Nieistniejący Nie utworzony lub zakończony wake-up preempt gotowy dispatch wykonywany block zabloko wany create exit exit nie istniejący join zombie Rys. 0-1 Diagram stanów kanonicznych wątków
12 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Biblioteka pthreads Zestaw funkcji dotyczący wątków zdefiniowany został przez normę POSIX P1003.4a i nosi nazwę pthreads (skrót od POSIX threads). Implementacja pakietu istnieje między innymi w systemie Linux, QNX6, DEC OSF1. Obecnie wątki są elementem biblioteki glibc (Od wersji 2). W systemie Linux występuja dwie biblioteki dotyczące wątków: LinuxThreads poczatkowa biblioteka wątków Linuxa NPTL (Native POSIX Threads Library) - bardziej zgodna ze standardem POSIX, wspierana od jądra 2.6 Podstawowe operacje na wątkach: Tworzenie i kończenie Tworzenie i kasowanie wątków, czekanie na zakończenie, inicjowanie zakończenia. Testowanie i ustawianie atrybutów wątków Operowanie na muteksach Operowanie na zmiennych warunkowych Operowanie na barierach Priorytet, strategia szeregowania, wielkość stosu, maska skojarzeń, protokół unikanie inwersji priorytetów Zabezpieczenie dostępu do wspólnych danych. Tworzenie i kasowanie muteksów, zajmowanie i zwalnianie muteksów. Używane do synchronizacji wątków. Tworzenie i kasowanie zmiennych warunkowych, zawieszanie i wznawianie wątków. Używane do synchronizacji wątków. Tworzenie bariery, czekanie na barierze 2.1 Tworzenie i kończenie wątków pthread_create pthread_exit pthread_join pthread_attr_init pthread_self pthread_yield pthread_cancel Tworzenie wątku Zakończenie wątku bieżącego Czekanie na zakończenie wątku Inicjacja atrybutów wątku Pobranie identyfikatora wątku Zwolnienie procesora Kasowanie innego wątku
13 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 13 Tworzenie wątku Nowy wątek tworzy się przy pomocy funkcji pthread_create. Funkcja ta tworzy wątek, którego kod znajduje się w funkcji podanej jako argument func. Wątek jest uruchamiany z parametrem arg, a informacja o nim jest umieszczana w strukturze thread. int pthread_create( pthread_t *thread, pthread_attr_t *attr,void (* func)(void *), void *arg) thread attr func arg identyfikator wątku wartość nadawana przez funkcję atrybuty wątku, gdy NULL przyjęte domyślne procedura zawierająca kod wątku argument przekazywany do wątku Funkcja zwraca: 0 sukces, -1 błąd. #include <pthread.h> #include <stdio.h> void * kod(void *arg) { while(1) { putc('w',stderr); sleep(1); return (NULL); int main(int argc, char *argv[]) { int tid; pthread_create(&tid, NULL, kod,null); while(1) { putc('m',stderr); sleep(1); return 0; Przykład 2-1 Tworzenie wątku za pomocą funkcji pthread_create
14 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 14 $./thread1 MWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMW Wynik 2-1 Działanie programu thread1 Kończenie wątku Wątek może być zakończony w następujące sposoby: Następuje powrót z procedury określającej kod wątku. Wątek wykonuje funkcję pthread_exit(). Wątek jest kasowany przez inny wątek. Następuje zakończenie procesu macierzystego wątku. Jawne zakończenie wątku następuje poprzez wywołanie procedury: pthread_exit(void * status) status Kod powrotu wątku Możliwe są dwa sposoby postępowania z kończonymi wątkami: 1. Z chwilą zakończenia się wątku zwalniane są wszystkie jego zasoby. 2. Zasoby zwalniane są z chwilą dołączenia wątku bieżącego do innego wątku (wykonującego funkcję pthread_join). Postępowanie to uzależnione jest od ustawienia atrybutu PTHREAD_CREATE_JOINABLE który ustalany jest podczas tworzenia wątku. 1. Gdy atrybut ten nie jest ustawiony, wątek zwalnia swe zasoby zaraz po zakończeniu. 2. Gdy atrybut jest ustawiony, wątek zwalnia zasoby po dołączeniu do innego wątku. Oczekiwanie na zakończenie wątku. Proces bieżący może czekać na zakończenie innego wątku poprzez wywołanie funkcji pthread_join. int pthread_join( pthread_t *thread, void *status) thread status identyfikator wątku wartość nadawana przez funkcję Kod powrotu zwracany przez zakończony wątek
15 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 15 Gdy wskazany jako parametr wątek nie zakończył się jeszcze, wątek bieżący jest wstrzymywany. Funkcja zwraca: 0 sukces, -1 błąd. W1 W1 pthread_create( ) pthread_create( ) W2 pthread_join( ) pthread_exit( ) W2 pthread_join( ) pthread_exit( ) W2 czeka na W1 Rys. 2-1 Zakończenia wątków W1 czeka na W2 Sposób kończenia wątku zależny jest od atrybutu PTHREAD_CREATE_JOINABLE. Według standardu POSIX nowo tworzone wątki domyślnie mają ustawiony ten atrybut a więc są dołączalne. W1 i W2 ustawiony atrybut PTHREAD_CREATE_JOINABLE W3 i W4 ustawiony atrybut PTHREAD_CREATE_DETACHED pthread_create(...) Zakończenie pthread_exit(...) pthread_join(...) Zakończenie i zwolnienie zasobów Zwolnienie zasobów Rys. 2-2 dołączalne i nie dołączalne
16 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 16 Atrybuty wątku Atrybuty wątku są to jego dodatkowe własności jak dołączalność, priorytet, strategia szeregowania, strategia unikania inwersji priorytetów, rozmiar stosu. Atrybuty są przekazywane do wątku w chwili jego tworzenia jako wartość parametru attr funkcji pthread_create. Aby zmienić atrybuty wątku należy: 1. Zadeklarować zmienną attr typu pthread_attr_t. 2. Zainicjować zmienną za pomocą funkcji pthread_attr_init(&attr) 3. Zmodyfikować strukturę zawierającą atrybuty tak aby atrybuty miały pożądaną wartość. 4. Wywołać funkcję pthread_create(,&attr) tworzącą nowy wątek i przekazać jej wskaźnik na strukturę zawierającą atrybuty. 5. Zwolnić pamięć zajmowaną przez atrybut poprzez wykonanie funkcji pthread_attr_destroy (&attr). pthread_init inicjacja atrybutów wątku int pthread_init(pthread_attr_t *attr) attr Wskaźnik do inicjowanych atrybutów Funkcja przydziela pamięć na atrybuty i nadaje im wartości domyślne. Struktura zawierająca atrybuty może być wykorzystana przy tworzeniu wielu wątków. Ważniejsze atrybuty wątku są następujące: 1. Dołączalność informacja czy po zakończeniu wątek ma zwolnić zasoby natychmiast czy dopiero gdy wątek macierzysty wykona funkcję pthread_join(). 2. Strategia szeregowania SCHED_FIFO, SCHED_RR, SCHED_OTHER, SCHED_NOCHANGE, SCHED_SPORADIC. 3. Parametry szeregowania różne informację (między innymi priorytet) używanie do szeregowania wątku.
17 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Rozmiar stosu informacja jaki ma być rozmiar stosu. Domyślna wartość wynosi 4 KB (może być zmieniona przez funkcję pthread_attr_setstacksize). 5. Adres stosu początkowy adres stosu lub wartość NULL. Gdy parametr ma wartość NULL adres stosu będzie ustalany automatycznie przez system. Pamięć na stos może być przydzielona przez programistę (musi wtedy sam go zwolnić). Atrybut Wartość domyślna Dołączalność PTHREAD_CREATE_JOINABLE Strategia szeregowania PTHREAD_INHERID_SCHED Parametry szeregowania Dziedziczone z procesu macierzystego Rozmiar stosu 4 KB Adres stosu NULL Tabela 2-1 Atrybuty wątku i ich wartości domyślne Atrybut Funkcja testowania Funkcja ustawiania Dołączalność attr_getdetachstate() attr_settdetachstate() attr_getschedpolicy() attr_setschedpolicy() Strategia szeregowania Parametry attr_getschedparam() szeregowania Rozmiar stosu attr_getstacksize(), attr_getstacklazy() attr_setschedparam() attr_setstacksize(), attr_setstacklazy() Adres stosu attr_getstackaddr() attr_setstackaddr() Tabela 2-2 Ważniejsze funkcje do ustalania atrybutów wątku
18 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 18 void *kod(void *data){... return (void *) cos; main(void) { pthread_t thr; pthread_attr_t attr; int status; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&thr, &attr, kod,0);... pthread_join(thr,(void *) &status); pthread_attr_destroy(&attr) Przykład 2-2 Ustawiania atrybutów wątku, utworzenia i oczekiwania na zakończenie Uzyskanie własnego identyfikatora Wątek może uzyskać własny identyfikator poprzez wywołanie funkcji: pthread_t pthread_self(void) Zwolnienie procesora Wywołanie funkcji pthread_yield powoduje przekazanie sterowania do procedury szeregującej która wybierze następny wątek do wykonania. int pthread_yield(void)
19 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 19 /* Kompilacja: cc thread1.c -o thread1 -lpthread */ #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 6 #define KROKOW 16 pthread_t tid[num_threads]; // Tablica identyfik. watkow void * kod(void *arg); int main(int argc, char *argv[]) { int i; // Tworzenie watkow for (i = 0; i < NUM_THREADS; i++) pthread_create(&tid[i], NULL, kod,(void *)(i+1)); // Czekanie na zakonczenie for (i = 0; i < NUM_THREADS; i++) pthread_join(tid[i], NULL); printf("watki zakonczone \n"); return 0; void * kod(void *arg) { int numer = (int)arg; int i; printf("watek: %d numer: %d \n", getpid(), numer); for(i=0;i<krokow;i++) { printf("watek %d krok %d \n",numer,i); sleep(1); return (NULL); Przykład 2-3 Tworzenie, wykonanie i kończenie wątków
20 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 20 Przekazywanie danych do wątku i pobieranie wyników Parametry wątku Funkcja realizująca wątek ma tylko jeden parametr będący wskaźnikiem do typu void. void * kod(void *arg) Aby przekazać do wątku większą niż jeden liczbę parametrów należy się posłużyć: strukturą tablicą. typedef struct { int pocz; int kon; int numer; param_t; Wyniki wątku Wątek powinien zwracać wskaźnik na void poprzez: Wykonanie return res Wykonanie funkcji pthread_exit(void *res) Wartość ta może być odczytana w funkcji: int pthread_join( pthread_t *thread, void *status)
21 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 21 pthread_create((&tid, NULL, kod,null) pthread_exit((void *) res) pthread_join(tid,&status)
22 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 22 typedef struct { int pocz; int kon; int numer; param_t; int main(int argc, char *argv[]){ param_t arg; int wynik;... for (i = 0; i < NUM_THREADS; i++) { arg.pocz =...; arg.kon =...; arg.numer = i; pthread_create(&tid[i], NULL, znajdz,&arg);... // Czekanie na zakonczenie for (i = 0; i < NUM_THREADS; i++) { pthread_join(tid[i], (void*)&wynik); printf( Watek: %d wynik: %d\n,i,wynik); void *znajdz(void *arg) { int x1,x2,num,res; param_t *par; par = (param_t *)arg; x1 = par->pocz; x2 = par->kon; num = par->numer; printf("watek: %d pocz: %d kon: %d \n",num,x1,x2);... res =...; return((void *) res); Przykład 2-4 Przekazywanie parametrów do wątku i uzyskiwania wyników
23 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 23 Anulowanie wątku Normalnym sposobem zakończenia się wątku jest: 1. wykonanie instrukcji return lub 2. funkcji pthread_exit. Wtedy wątek sam podejmuje decyzję o swym zakończeniu. Możliwe jest jednak aby jeden wątek zakończył inny. Używana jest do tego celu funkcja pthread_cancel. int pthread_cancel(pthread_t *thread) thread Identyfikator kasowanego wątku Należy unikać anulowania wątków przez inne watki. Powodem jest fakt że wątek mógł pobrać pewne zasoby systemowe (pamięć, pliki) i rozpocząć pewne akcje synchronizacyjne (np. zająć muteks). Gdy zostanie on zakończony w przypadkowym punkcie wykonania może nie zwrócić pobranych zasobów ani też nie zakończyć rozpoczętych akcji synchronizacyjnych. Skutkować to może wyciekaniem zasobów lub wręcz blokadą aplikacji. Procedura czyszcząca - funkcja która będzie wykonana automatycznie gdy wątek będzie anulowany i jej zadaniem jest zwolnienie pobranych przez wątek zasobów. Funkcja czyszcząca jest aktywowana poprzez wykonanie funkcji pthread_cleanup_push(...) Funkcja czyszcząca jest deaktywowana poprzez funkcję pthread_cleanup_pop(...) lub poprzez normalne zakończenie się wątku.
24 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Dostęp do wspólnych danych dzielą wspólny obszar danych. Stąd współbieżny dostęp do danych może naruszyć ich integralność. Należy zapewnić synchronizację dostępu do wspólnych danych. W bibliotece pthreads do zapewnienia wyłączności dostępu do danych stosuje się mechanizm muteksu (ang. mutex). Nazwa ta pochodzi od słów Mutual exclusion czyli wzajemne wykluczanie. pthread_mutex_init Inicjacja muteksu pthread_mutex_lock Zajęcie muteksu Pthread_mutex_timedlock Zajęcie muteksu czekanie ograniczone czasowo pthread_mutex_unlock Zwolnienie muteksu pthread_mutex_destroy Skasowanie muteksu Deklaracja muteksu Muteks jest obiektem abstrakcyjnym który może być w dwu stanach: wolny i zajęty. Na muteksie wykonuje się dwie podstawowe operacje: zajęcie i zwolnienie. Biblioteka pthreads definiuje muteks jako typ pthread_mutex_t. Przed użyciem obiekt typu muteks musi być zadeklarowany. Przykładowo muteks o nazwie blokada deklaruje się jak poniżej. pthread_mutex_t blokada; Inicjacja muteksu Przed użyciem muteks musi być zainicjowany. Inicjacja następuje poprzez wykonanie funkcji: int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr) mutex attr Zadeklarowana wcześniej zmienna typu pthread_mutex_t. Atrybuty muteksu. Gdy attr jest równe NULL przyjęte będą wartości domyślne. Funkcja zwraca: 0 sukces, -1 błąd. Zainicjowany muteks pozostaje w stanie odblokowania.
25 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 25 Zablokowanie dostępu do zasobu Przed dostępem do zasobu należy zapewnić sobie wyłączność w korzystaniu z tego zasobu. W tym celu wątek wykonuje funkcję: int pthread_mutex_lock(pthread_mutex_t *mutex); mutex Zadeklarowana wcześniej i zainicjowana zmienna typu pthread_mutex_t Działanie funkcji zależy od stanu w jakim znajduje się muteks. 1. Gdy muteks jest wolny, następuje jego zablokowanie. 2. Gdy muteks jest zajęty, próba jego powtórnego zajęcia powoduje zablokowanie się wątku który tę próbę podejmuje. Ograniczone czasowo blokowanie zasobu int pthread mutex timedlock(pthread mutex t * mutex, struct timespec * timeout ); mutex timeout Zadeklarowana wcześniej i zainicjowana zmienna typu pthread_mutex_t Okres oczekiwania struct timespec { time_t tv_sec; time_t tv_nsec; Gdy muteks nie jest wolny watek się blokuje ale po upływie zadanego okresu ulega odblokowaniu. Odblokowanie dostępu do zasobu Użyty i zablokowany wcześniej zasób powinien być zwolniony. Zwolnienie zasobu odbywa się poprzez wywołanie funkcji: int pthread_mutex_unlock(pthread_mutex_t *mutex) mutex Zadeklarowana wcześniej i zainicjowana zmienna typu pthread_mutex_t
26 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 26 Działanie funkcji zależy od tego czy inne wątki czekają zablokowane na muteksie. 1. Brak wątków zablokowanych na muteksie stan muteksu zostaje zmieniony na wolny. 2. Są wątki zablokowane na muteksie jeden z czekających wątków zostaje odblokowany. Thread 1 Thread 2 mutex_lock(mutex) użycie zasobu mutex_unlock(mutex) mutex_lock(mutex) użycie zasobu blokada odblokowanie mutex_unlock(mutex) Rys. 2-3 Dwa wątki używają wspólnego zasobu chronionego przez mutex. Kasowanie muteksu Kasowanie muteksu odbywa się poprzez wywołanie funkcji: int pthread_mutex_destroy(pthread_mutex_t *mutex) System zwalnia zasoby zajęte przez muteks. Muteks musi być wolny gdyż w przeciwnym razie nie będzie skasowany i funkcja zwróci kod błedu.
27 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 27 pthread_t wri; int bufor[size]; int new_item = 0; int step = 0; void *writer(void *arg); void reader(void ); pthread_mutex_t mutex; int main(int argc, char *argv[]) { int i; pthread_mutex_init(&mutex,null); pthread_create(&wri, NULL, writer,null); reader(); pthread_join(wri, NULL); printf("watki zakonczone \n"); return 0; /* main */ // Watek piszacy do bufora void * writer(void *arg){ int i; while(1) { pthread_mutex_lock(&mutex); // while(new_item == 1); if(new_item == 0) { pisz(bufor); new_item = 1; pthread_mutex_unlock(&mutex); return (NULL); // Wątek czytający z bufora
28 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 28 void reader(void ) { int i; while(1) { pthread_mutex_lock(&mutex); // while(new_item == 0); if(new_item == 1) { czytaj(bufor) new_item = 0; pthread_mutex_unlock(&mutex); Przykład 2-5 Problem producenta / konsumenta rozwiązanie z odpytywaniem
29 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Zmienne warunkowe Muteksy są narzędziem zapewniającym ochronę sekcji krytycznej. Jak postąpić gdy wewnątrz sekcji krytycznej wymagane jest oczekiwanie na spełnienie pewnego warunku a więc synchronizacja z innym wątkiem. Podobny problem występuje w monitorze gdzie używa się funkcji wait(...) i signal(...). Biblioteka wątków dostarcza narzędzia do rozwiązania takiego problemu synchronizacji. Narzędzie to nazywa się zmienną warunkową (ang. condition variable). Zmienna warunkowa jest narzędziem do blokowania wątku wewnątrz sekcji krytycznej aż do momentu gdy pewien warunek zostanie spełniony. Warunek ten może być dowolny i niezależny od zmiennej warunkowej. Zmienna warunkowa musi być użyta w połączeniu z muteksem o ile konstrukcja ma zapewnić własności monitora. Przed użyciem zmienna warunkowa musi być zadeklarowana jako zmienna typu pthreads_cond_t. Najważniejsze operacje związane ze zmiennymi warunkowymi są dane poniżej. pthread_cond_init Inicjacja zmiennej warunkowej. pthread_cond_wait Czekanie na zmiennej warunkowej pthread_cond_timedwait Czekanie na zmiennej warunkowej z przeterminowaniem pthread_cond_signal Wznowienie wątku zawieszonego na zmiennej warunkowej. pthread_cond_brodcast Wznowienie wszystkich wątków zawieszonych w kolejce danej zmiennej warunkowej. pthread_cond_destroy Skasowanie zmiennej warunkowej z zwolniene jej zasobów.
30 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 30 Inicjacja zmiennej warunkowej int pthread_cond_init(pthreads_cond_t *zw, pthreads_condattr_t attr) zw attr Zadeklarowana wcześniej zmienna typu pthread_cond_t. Atrybuty zmiennej warunkowej. Gdy attr jest równe NULL przyjęte będą wartości domyślne. Zawieszenie wątku w oczekiwaniu na sygnalizację int pthread_cond_wait(pthreads_cond_t *zw, pthread_mutex_t *mutex) zw mutex Zadeklarowana i zainicjowana zmienna typu pthread_cond_t. Zadeklarowana i zainicjowana zmienna typu pthread_mutex_t. Funkcja powoduje zawieszenie bieżącego wątku w kolejce związanej ze zmienną warunkową zw. Jednocześnie blokada mutex zostaje zwolniona. Obie operacje są wykonane w sposób atomowy. Gdy inny wątek wykona operację pthreads_cond_signal(&zw) zablokowany wątek zostanie odblokowany a blokada mutex zwolniona. Ograniczone czasowo zawieszenie wątku int pthread_cond_timedwait(pthreads_cond_t *zw, pthread_mutex_t *mutex, struct timespec *abstime) zw mutex abstime Zadeklarowana i zainicjowana zmienna typu pthread_cond_t. Zadeklarowana i zainicjowana zmienna typu pthread_mutex_t. Czas absolutny po którym nastąpi odblokowanie wątku Działanie funkcji jak powyżej. Gdy po czasie abstime nie nastapi odblokowanie wątku, uczyni to system operacyjny. Funkcja zwróci wtedy kod błędu ETIMEDOUT.
31 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 31 Wznowienie zawieszonego wątku int pthread_cond_signal(pthreads_cond_t *zw) zw Zadeklarowana i zainicjowana zmienna typu pthread_cond_t. Jeden z wątków zablokowanych na zmiennej warunkowej zw zostanie zwolniony. Wznowienie wszystkich zawieszonych wątków int pthread_cond_brodcast(pthreads_cond_t *zw) zw Zadeklarowana i zainicjowana zmienna typu pthread_cond_t. Wszystkie wątki zablokowane na zmiennej warunkowej zw zostaną zwolnione. Typowa sekwencja użycia zmiennej warunkowej: pthread_mutex_lock(&m)... while(! warunek ) pthread_cond_wait( &cond, &m)... pthread_mutex_unlock(&m) Wątek oczekujący na warunek pthread_mutex_lock(&m)... ustawienie_warunku pthread_cond_signal( &cond)... pthread_mutex_unlock(&m) Wątek ustawiający warunek i sygnalizujący jego spełnienie
32 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 32 blokada wątku na zmiennej Wątek 1 blokada muteksu Wątek 2 warunkowej mutex_lock(&mutex) mutex_lock(&mutex) cond_wait(c,&mutex) odblokowanie wątku wznowienie wątku cond_signal(c) mutex_unlock(&mutex) blokada wątku odblokowanie wątku sygnalizacja na zmiennej warunkowej odblokowanie muteksu użycie zasobu mutex_unlock(&mutex) odblokowanie muteksu Rys. 2-4 Wątek 1 czeka na warunek ustawiany przez wątek 2
33 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 33 // Problem czytelników i pisarzy rozw. poprawne pthread_mutex_t mutex; // Ochrona zmiennej count pthread_cond_t cond; // Kolejka czekających // Liczba czyt. w czytelni, -1 gdy jest tam pisarz int count; read_lock(void) { mutex_lock(&mutex); // Czytelnik czeka gdy w czytelni jest pisarz while(count < 0) pthread_cond_wait(&cond,&mutex); count++; mutex_unlock(&mutex); write_lock(void) { mutex_lock(&mutex); // Pisarz czeka na wolną czytelnie while(count!= 0) pthread_cond_wait(&cond,&mutex); count--; mutex_unlock(&mutex); rw_unlock(void) { mutex_lock(&mutex); // Pisarz czeka na wolną czytelnie if(count < 0) count = 0 else count --; if(count == 0) cond_brodcast(&cond); mutex_unlock(&mutex); void pisarz(void) { while(1) { rw_rdlock(); czytanie(...); rw_unlock();
34 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 34 void czytelnik(void) { while(1) { rw_wrlock(); pisanie(...); rw_unlock(); Przykład 2-6 Rozwiązanie problemu czytelników i pisarzy
35 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 35 Rozwiązanie problemu producenta - konsumenta #include <stdio.h> #include <pthread.h> #define N 4 int pocz,kon,licznik = 0; int bufor[n]; pthread_mutex_t mutex; pthread_cond_t puste, pelne; void* producent( void* arg ) { int num = 0; int cnt = 1; num = (int) arg; printf("start producent: %d\n",num); while( 1 ) { pthread_mutex_lock( &mutex ); while(licznik >= N) pthread_cond_wait(&puste,&mutex); bufor[kon] = cnt++; kon = (kon+1) %N; licznik++; pthread_cond_signal(&pelne); pthread_mutex_unlock( &mutex ); printf("prod%d kon: %d wst: %d\n", num, kon,cnt, licznik ); sleep( 1 ); void* konsument( void* arg ) { int num,x = 0; num = (int) arg; printf("start konsument: %d\n",num); while( 1 ) { pthread_mutex_lock( &mutex ); while(licznik <=0 ) pthread_cond_wait(&pelne,&mutex); x = bufor[pocz]; pocz = (pocz+1) %N; licznik--; pthread_cond_signal(&puste); pthread_mutex_unlock( &mutex ); printf("kons%d pocz: %d pobral: %d licz: %d\n", num, pocz, x,licznik ); sleep( 1 );
36 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 36 int main( void ) { pthread_t p1,p2,k1,k2; pthread_mutex_init(&mutex,null); pthread_cond_init(&puste,null); pthread_cond_init(&pelne,null); pthread_create(&p1, NULL, &producent, (void *)1 ); pthread_create(&k1, NULL, &konsument, (void *)1 ); pthread_join(p1,null); pthread_join(k1,null); return 0; Przykład 2-7 Problem producenta i konsumenta - rozwiązanie za pomocą zmiennych warunkowych Przykład Znajdowanie liczb pierwszych // // Znajdowanie liczb pierwszych program wielowatkowy // Uruchomienie:./pierwsze zakres_od zakres_do watkow // #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 8 pthread_t tid[num_threads]; // Tablica identyfik. watkow typedef struct { int pocz; // poczatek zakresu int kon; // koniec zakresu int numer; // numer watku par_t; pthread_mutex_t mutex; void *znajdz(par_t * m); int main(int argc, char *argv[]) { int i,zakres,delta,sum = 0; int from, to, nproc,licz,t1,t2; par_t msg; if(argc <4) { printf("uzycie: pierwsze od do watkow\n"); exit(0); from = atoi(argv[1]); to = atoi(argv[2]); nproc = atoi(argv[3]);
37 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 37 if(nproc > NUM_THREADS) nproc = NUM_THREADS; printf("zakres od: %d do: %d watkow: %d\n",from,to,nproc); zakres = to - from; delta = zakres / nproc; printf("zakres: %d delta: %d\n",zakres,delta); t1 = time(null); pthread_mutex_init(&mutex,null); // Tworzenie watkow for (i = 0; i < nproc; i++) { pthread_mutex_lock( &mutex ); msg.pocz = from + delta *i; msg.kon = from + delta * (i+1) -1; msg.numer = i; pthread_mutex_unlock( &mutex ); printf("start: %d pocz: %d kon: %d\n",i,msg.pocz,msg.kon); pthread_create(&tid[i], NULL, (void *)znajdz, (void *)&msg); // Czekanie na zakonczenie for (i = 0; i < nproc; i++){ pthread_join(tid[i],(void *)&licz); printf("koniec watku: %d, liczb: %d\n",i,licz); sum = sum + licz; t2 = time(null); printf("watki zak., wynik:%d czas: %d s \n",sum,t2-t1); return 0; void *znajdz(par_t* m) { int j,x1,x2; int lpierw = 0; int num ; pthread_mutex_lock( &mutex ); x1 = m->pocz; x2 = m->kon; num = m->numer; pthread_mutex_unlock( &mutex ); // printf("watek: %d pocz: %d kon: %d \n",num,x1,x2); for(j=x1;j<=x2;j++) { if(isprime(j)) lpierw++; // printf("watek: %d, liczb: %d \n",num,lpierw); return(( void *) lpierw); int isprime(int n) {
38 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 38 int i; for(i=2; i*i <= n; i++) { if((n%i) == 0) return 0; return 1; Przykład 2-8 Znajdowanie liczb pierwszych w przedziale // // Znajdowanie liczb pierwszych program wielowatkowy // Ta wersja programu rownowazy obciazenia // Uruchomienie:./pierwsze zakres_od zakres_do watkow // #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 8 pthread_t tid[num_threads]; // Tablica identyfik. watkow typedef struct { int pocz; // poczatek zakresu int kon; // koniec zakresu int numer; // numer watku int stop; // zatrzymaj; par_t; void *znajdz(int * num); pthread_mutex_t mutex; pthread_cond_t gotowy; pthread_cond_t start; par_t msg; int gotowych = 0; // Ile watkow gotowych do obliczen int stop = 0; int main(int argc, char *argv[]) { int i,zakres,delta,krok,sum = 0; int from, to, nproc,licz,t1,t2,res; if(argc <5) { printf("uzycie: pierwsze od do watkow krok\n"); exit(0); from = atoi(argv[1]); to = atoi(argv[2]); nproc = atoi(argv[3]); krok = atoi(argv[4]); if(nproc > NUM_THREADS) nproc = NUM_THREADS; printf("zakres od: %d do: %d watkow: %d krok:
39 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 39 %d\n",from,to,nproc,krok); zakres = to - from; delta = zakres / nproc; printf("zakres: %d delta: %d\n",zakres,delta); t1 = time(null); pthread_mutex_init(&mutex,null); pthread_cond_init(&gotowy,null); pthread_cond_init(&start,null); // Tworzenie watkow for (i = 0; i < nproc; i++) { res = pthread_create(&tid[i], NULL, znajdz,(void *) i); printf("glowny - utworz watku: %d wynik %d\n",i,res); // Obliczenia for(i=from; i< to; i = i+ krok) { printf("glowny - przedzial od: %d do: %d\n",i,i+krok-1); printf("glowny - czekam\n"); pthread_mutex_lock( &mutex ); if(gotowych <= 0) pthread_cond_wait(&gotowy,&mutex); printf("glowny - gotowy watek: %d\n",msg.numer); msg.pocz = i; msg.kon = i+krok-1; msg. stop = 0 pthread_mutex_unlock( &mutex ); pthread_cond_signal(&start); printf("glowny - stop=1\n"); stop = 1; sleep(1); // Czekanie na zakonczenie for (i = 0; i < nproc; i++) { pthread_join(tid[i],(void *)&licz); printf("glowny - koniec watku: %d, liczb: %d\n",i,licz); sum = sum + licz; t2 = time(null); printf("watki zak., wynik:%d czas: %d s \n",sum,t2-t1); return 0; void *znajdz(int * num) { int j,x1,x2; int lpierw = 0; printf("start watku: %d \n",num); do {
40 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 40 pthread_mutex_lock( &mutex ); gotowych++; printf("watek: %d wysyla gotowosc\n"); pthread_cond_signal(&gotowy); printf("watek: %d czeka na start\n"); pthread_cond_wait(&start,&mutex); x1 = msg.pocz; x2 = msg.kon; pthread_mutex_unlock( &mutex ); printf("watek: %d, zakres od %d do %d \n",num,x1,x2); if(stop == 1) break; for(j=x1;j<=x2;j++) { if(isprime(j)) lpierw++; printf("watek: %d, od:%d do:%d liczb: %d \n",num,x1,x2,lpierw); while(stop!= 1); printf("watek: %d koniec\n",num); return(( void *) lpierw); int isprime(int n) { int i; for(i=2; i*i <= n; i++) { if((n%i) == 0) return 0; return 1; Przykład 2-9 Szukanie liczb pierwszych wersja równoważąca obciążenia
41 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Blokady czytelników i pisarzy Blokady typu wzajemne wykluczanie są zbyt restrykcyjne co prowadzi do ograniczenia równoległości i spadku efektywności aplikacji. Można je osłabić wiedząc czy przeprowadzana jest operacja odczytu czy zapisu. Implementują to blokady czytelników i pisarzy (ang. Readers writers locks). Zasada działania blokad czytelników i pisarzy: Odczyt może być wykonywany współbieżnie do innych odczytów Zapis musi być wykonywany w trybie wyłącznym względem innych zapisów lub odczytów. Stan blokady: Wolna Zajęta do odczytu być może przez wiele wątków czytających Zajęta do zapisu Thread 1 Thread 2 Thread 3 mutex_lock(mutex) odczyt mutex_unlock(mutex) mutex_lock(mutex) blokada odczyt mutex_unlock(mutex) mutex_lock(mutex) blokada zapis mutex_unlock(mutex) Rys. 3-1 Dwa wątki uczytające i jeden piszący używają wspólnego zasobu chronionego przez mutex.
42 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 42 Thread 1 Thread 2 Thread 3 rwlock_rdlock(mutex) odczyt rwlock_unlock(mutex) rwlock_rdlock(mutex) odczyt rwlock_unlock(mutex) rwlock_wrlock(mutex) blokada zapis rwlock_unlock(mutex) Rys. 3-2 Dwa wątki uczytające i jeden piszący używają wspólnego zasobu chronionego przez blokady czytelników i pisarzy. Odczyty mogą być prowadzone współbieznie. Inicjacja blokady int pthread_rwlock_init(pthread_rwlock_t * rwlock, pthread_rwlockattr_t * attr) rwlock attr Zadeklarowana i zainicjowana zmienna typu pthread_rwlock_t Atrybuty blokady lub NULL gdy maja być domyslne Zajęcie blokady do odczytu int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) Wątek wykonujący funkcję blokuje się gdy blokada jest zajęta do zapisu. Gdy nie zajmuje blokadę do odczytu gdy nie została już wcześniej zajęta do odczytu. Zajęcie blokady do zapisu int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); Wątek wykonujący funkcję blokuje się gdy blokada jest zajęta do zapisu lub odczytu. Gdy nie zajmuje blokadę do zapisu. Zwolnienie blokady int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
43 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 43 Funkcja zdejmuje blokadę nałożoną jako ostatnią przez bieżący wątek. Jeżeli istnieją inne blokady założone na obiekt to pozostają. Jeżeli jest to ostatnia blokada i istnieją wątki czekające na jej zwolnienie to jeden z nich zostanie odblokowany. Który zależy to od implementacji. Nieblokujace zajęcie blokady do zapisu int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) Gdy blokada jest wolna nastepuje jej zajęcie do zapisu. Gdy jest zajeta funkcja nie blokuje wątku biezącego i zwraca kod błędu. Czasowo ograniczone zajęcie blokady do zapisu int pthread_rwlock_timedwrlock(pthread_rwlock_t * rwlock, struct timespec * abs_timeout); Jeżeli po upływie zadanego czasu abs_timeout blokada nie zostanie zdjęta funkcja odblokuje się zwracając kod błędu. Nieblokujace zajęcie blokady do odczytu int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) Gdy blokada jest wolna lub zajeta do odczytu nastepuje jej zajęcie do odczytu. Gdy jest zajeta funkcja nie blokuje wątku biezącego i zwraca kod błędu. Czasowo ograniczone zajęcie blokady do odczytu int pthread_rwlock_timedrdlock(pthread_rwlock_t * rwlock, struct timespec * abs_timeout); Jeżeli po upływie zadanego czasu abs_timeout blokada nie zostanie zdjęta funkcja odblokuje się zwracając kod błędu. Skasowanie blokady int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)
44 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Bariery Bariera jest narzędziem do synchronizacji procesów działających w ramach grup. Wywołanie funkcji pthread barrier wait(...) powoduje zablokowanie zadania bieżącego do chwili gdy zadana liczba watków zadań nie wywoła tej procedury. Wątek 1 Wątek 2 Wątek 3 bariera N=3 pthread_barier_wait bariera N=3 odblokowanie Wątek 3 Wątek 2 Wątek 1 czas Działanie bariery Inicjacja bariery int pthread_barrier_init( pthread_barrier_t * barrier, pthread_barrierattr_t * attr unsigned int count ) barrier attr count Zadeklarowana zmienna typu pthread_barierr_t. Atrybuty. Gdy NULL użyte są atrybuty domyślne Licznik bariery Funkcja powoduje zainicjowanie bariery z wartością licznika count.
45 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 45 Czekanie na barierze int pthread_barrier_wait( pthread barrier t * barrier ) barrier Zadeklarowana i zainicjowana zmienna typu pthread_barierr_t. Funkcja powoduje zablokowanie wątku bieżącego na barierze. Gdy count wątków zablokuje się na barierze to wszystkie zostaną odblokowane. Funkcja zwraca BARRIER_SERIAL_THREAD dla jednego z wątków (wybranego arbitralnie) i 0 dla wszystkich pozostałych wątków. Wartość licznika będzie taka jak przy ostatniej inicjacji bariery. Kasowanie bariery int pthread_barrier_destroy( pthread barrier t * barrier ) barrier Zadeklarowana i zainicjowana zmienna typu pthread_barierr_t. Funkcja powoduje skasowanie bariery.
46 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 46 #include <sys/types.h> #include <pthread.h> #include <malloc.h> pthread_barrier_t * my_barrier; void * thread1(void * arg){ printf("watek 1 przed bariera\n"); pthread_barrier_wait(my_barrier); printf("watek 1 po barierze \n"); void * thread2(void * arg){ printf("watek 2 przed bariera\n"); pthread_barrier_wait(my_barrier); printf("watek 2 po barierze \n"); int main(){ pthread_t w1,w2; my_barrier = (pthread_barrier_t*)malloc(sizeof(pthread_barrier_t)); pthread_barrier_init(my_barrier, NULL, 2); pthread_create(&w1, 0, thread1, 0); pthread_create(&w2, 0, thread2, 0); pthread_join(w1, 0); pthread_join(w2, 0); return 0; Przykład 4-1 Przykład użycia bariery
47 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str Wirujące blokady Wirujące blokady są środkiem zabezpieczania sekcji krytycznej. Wykorzystują jednak czekanie aktywne zamiast przełączenia kontekstu wątku tak jak się to dzieje w muteksach. Inicjacja wirującej blokady int pthread spin init( pthread spinlock t *blokada, int pshared ) blokada pshared Identyfikator wirującej blokady pthread spinlock t PTHREAD PROCESS SHARED na blokadzie mogą operować wątki należące do różnych procesów PTHREAD PROCESS PRIVATE na blokadzie mogą operować tylko wątki należące do tego samego procesu Funkcja inicjuje zasoby potrzebne wirującej blokadzie. Każdy proces, który może sięgnąć do zmiennej identyfikującej blokadę może jej używać. Blokada może być w dwóch stanach: Wolna Zajęta Zajęcie blokady int pthread_spin_lock( pthread spinlock t * blokada) blokada Identyfikator wirującej blokady zmienna typu pthread_spinlock_t Działanie funkcji zależy od stanu blokady. Gdy blokada jest wolna następuje jej zajęcie. Gdy blokada jest zajęta wątek wykonujący funkcję pthread_spin_lock(...) ulega zablokowaniu do czasu gdy inny wątek nie zwolni blokady wykonując funkcję pthread_spin_unlock(...).
48 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 48 Próba zajęcia blokady int pthread_spin_trylock( pthread spinlock t * blokada) blokada Identyfikator wirującej blokady zmienna typu pthread_spinlock_t Działanie funkcji zależy od stanu blokady. Gdy blokada jest wolna następuje jej zajęcie funkcja zwraca wartość EOK. Gdy blokada jest zajęta następuje natychmiastowy powrót i funkcja zwraca stałą EBUSY. Zwolnienie blokady int pthread_spin_unlock( pthread spinlock t * blokada) blokada Identyfikator wirującej blokady zmienna typu pthread_spinlock_t Działanie funkcji zależy od stanu blokady. Gdy są wątki czekające na zajęcie blokady to jeden z nich zajmie blokadę. Gdy żaden wątek nie czeka na zajęcie blokady będzie ona zwolniona. Skasowanie blokady int pthread_spin_destroy( pthread spinlock t * blokada) blokada Identyfikator wirującej blokady zmienna typu pthread_spinlock_t Funkcja zwalnia blokadę i zajmowane przez nią zasoby.
49 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str w środowisku wieloprocesorowym W systemie Linux począwszy od wersji 2.0 obsługiwana jest architektura wieloprzetwarzania symetrycznego (ang. Symmetric Multi Processing) SMP. W modelu tym zakłada się że wszystkie procesory mają takie same właściwości. Maska skojarzeń Być może w pewnych aplikacjach korzystne jest wskazanie mechanizmowi szeregowania na jakich procesorach mają się pewne wątki wykonywać. Mechanizm ten nosi nazwę maski skojarzeń (ang. affinity mask). Maska skojarzeń mapa bitowa gdzie każdy bit odpowiada pojedynczemu procesorowi. Maska skojarzeń utrzymywana jest dla każdego wątku. Gdy bit i zawiera 1 watek może się wykonywać na procesorze i. Gdy bit i zawiera 0 watek nie może się wykonywać na procesorze i. Zbiór procesorów na którym może się wykonywać dany wątek jest iloczynem bitowym maski skojarzeń i maski odpowiadającej procesorom rzeczywiście zainstalowanym w systemie procesory maska skojażeń Rys. 6-1 Przykład maski skojarzeń - wątek może się wykonywać na procesorze 0, 4, 5 Ustawianie maski skojarzeń: int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,cpu_set_t *cpuset); Testowanie maski skojarzeń int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,cpu_set_t *cpuset); gdzie: thread Identyfikator wątku cpusetsize Długość maski skojarzeń w bajtach cpuset Maska skojarzeń
50 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 50 Typ cpu_set_t maska bitowa długości do 1024 void CPU_ZERO(cpu_set_t *set) Zerowanie maski void CPU_SET(int cpu,cpu_set_t *set) Ustawianie bitu cpu void CPU_CLR(int cpu,cpu_set_t *set) Zerowanie bitu cpu int CPU_ISSET(int cpu,cpu_set_t *set) Testowanie bitu cpu int CPU_COUNT(cpu_set_t *set) Liczenie ustawionych bitów Tabela 6-1 Funkcje operujące na maskach skojarzeń Zastosowanie maski skojarzeń ma sens wtedy gdy skierujemy intensywnie komunikujące się wątki na jeden procesor. Spowoduje to ograniczenie liczby chybień w pamięci podręcznej i do przyspieszenia działania. Wątkom można przypisać procesory jeszcze przed ich uruchomieniem ustawiając odpowiednio ich atrybuty za pomocą funkcji. int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset) int pthread_attr_getaffinity_np(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset) Znaczenie argumentów takie jak poprzednio.
51 Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 51 int main(int argc, char *argv[]) { int s, j; cpu_set_t cpuset; pthread_t thread; thread = pthread_self(); /* Ustaw maske skojarzeń włączając CPU 0 do 7 */ CPU_ZERO(&cpuset); for (j = 0; j < 8; j++) CPU_SET(j, &cpuset); s = thread_setaffinity_np(thread,sizeof(cpu_set_t), &cpuset); /* Testuj maske skojarzeń */ s = thread_getaffinity_np(thread,sizeof(cpu_set_t), &cpuset); printf("wynik:\n"); for (j = 0; j < CPU_SETSIZE; j++) if (CPU_ISSET(j, &cpuset)) printf(" CPU %d\n", j); exit(exit_success); Przykład 6-1 Ustawianie i testowanie maski skojarzeń dozwolone procesory 0 do 7
Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki
Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1 1. Własności wątków...2 1.1. Informacje wstępne...2 1.2. Atrybuty i zasoby wątków...6 1.3. i procesy porównanie...9 2. Biblioteka pthreads...10
Temat zajęć: Tworzenie i obsługa wątków.
Temat zajęć: Tworzenie i obsługa wątków. Czas realizacji zajęć: 180 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: Tworzenie wątków, przekazywanie parametrów do funkcji wątków i pobieranie
Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1
Programowanie równoległe i rozproszone Monitory i zmienne warunku Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności Problem producentów i konsumentów: jedna grupa procesów
Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki
Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1 1. Własności wątków...2 1.1. Informacje wstępne...2 1.2. Atrybuty i zasoby wątków...7 1.3. i procesy porównanie...9 2. Biblioteka pthreads...10
w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych
mechanizmy posix Wątki w odróżnieniu od procesów współdzielą przestrzeń adresową należą do tego samego użytkownika są tańsze od procesów: wystarczy pamiętać tylko wartości rejestrów, nie trzeba czyścić
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
9. Problem wzajemnego wykluczania i sekcji krytycznej
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 9. Problem wzajemnego wykluczania i sekcji krytycznej 9.1 Przeplot i współużywalność zasobów Wyróżniamy dwa rodzaje zasobów: 1. Zasoby współużywalne
Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1
Programowanie równoległe i rozproszone W1. Wielowątkowość Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np.
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Plan wykładu. Obliczenia równoległe w zagadnieniach inżynierskich. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne
Plan wykładu Obliczenia równoległe w zagadnieniach inżynierskich Wykład 1 Podstawowe pojęcia i model programowania Sposoby realizacji watków w systemach operacyjnych Tworzenie watów i zarzadzanie nimi
1. Uruchom poniższy program tworzący pojedynczy wątek:
9 Wątki 1. Uruchom poniższy program tworzący pojedynczy wątek: #include #include #include void* worker(void* info) int i; for(i=0; i
7. Szeregowanie procesów w systemie QNX6 Neutrino
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 7. Szeregowanie procesów w systemie QNX6 Neutrino 7.1 PRIORYTETY Każdy z procesów wykonywanych w systemie RTS ma przyporządkowany priorytet. W systemie
Programowanie Współbieżne
Programowanie Współbieżne Pthread http://www.unix.org/version2/whatsnew/threadsref.html Oraz strony podręcznika systemowego man 1 Wątki W tradycyjnym modelu w systemie Unix, jeżeli proces wymaga, by część
Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1
Procesy i wątki Krzysztof Banaś Obliczenia równoległe 1 Procesy i wątki Proces: ciąg rozkazów (wątek główny) i ewentualnie inne wątki stos (wątku głównego) przestrzeń adresowa dodatkowe elementy tworzące
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB
Wykład 3 Procesy i wątki Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Pojęcie procesu Program = plik wykonywalny na dysku Proces = uruchomiony i wykonywany program w pamięci
1.1 Definicja procesu
1 Procesy pojęcia podstawowe 1 1.1 Definicja procesu Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.
Procesy Proces (zwany też zadaniem) jest jednostką aktywną, kontrolowaną przez system operacyjny i związaną z wykonywanym programem. Proces ma przydzielone zasoby typu pamięć (segment kodu, segment danych,
Programowanie aplikacji równoległych i rozproszonych. Wykład 1
Wykład 1 p. 1/52 Programowanie aplikacji równoległych i rozproszonych Wykład 1 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Plan wykładu
Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne
Plan wykładu Programowanie aplikacji równoległych i rozproszonych Wykład 1 Podstawowe pojęcia i model programowania Sposoby realizacji watków w systemach operacyjnych Tworzenie watów i zarzadzanie nimi
Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1
Przetwarzanie wielowątkowe przetwarzanie współbieżne Krzysztof Banaś Obliczenia równoległe 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe)
5. Model komunikujących się procesów, komunikaty
Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć
9. Problem wzajemnego wykluczania i sekcji krytycznej
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 9. Problem wzajemnego wykluczania i sekcji krytycznej 9.1 Przeplot i współużywalność zasobów Aplikacja składa się z wielu procesów P1,P2,...,Pn operujących
Jedrzej Ułasiewicz Komputerowe systemy sterowania 1
Jedrzej Ułasiewicz Komputerowe systemy sterowania 1 1 Przerwania 1.1 Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.
Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1
Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie
Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1
Wątki 1. Wątki - wprowadzenie Wątkiem nazywamy sekwencyjny przepływ sterowania w procesie, który wykonuje dany program np. odczytywanie i zapisywanie plików Program Javy jest wykonywany w obrębie jednego
Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 11 11.1 abstrakcyjne Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post
Problemy współbieżności
Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe) realizowana programowo (bariera, sekcja krytyczna, operacje atomowe) wzajemne wykluczanie
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
Modele programowania równoległego. Pamięć współdzielona Rafał Walkowiak dla III roku Informatyki PP
Modele programowania równoległego Pamięć współdzielona Rafał Walkowiak dla III roku Informatyki PP Procesy a wątki [1] Model 1: oparty o procesy - Jednostka tworzona przez system operacyjny realizująca
Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1 Metodologia programowania równoległego Przykłady podziałów zadania na podzadania: Podział ze względu na funkcje (functional
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Procesy, wątki i zasoby
Procesy, wątki i zasoby Koncepcja procesu i zasobu, Obsługa procesów i zasobów, Cykl zmian stanów procesu i kolejkowanie, Klasyfikacja zasobów, Wątki, Procesy i wątki we współczesnych systemach operacyjnych.
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
Wielozadaniowość w systemie Microsoft Windows
Wielozadaniowość w systemie Microsoft Windows mgr inż. Tomasz Jaworski tjaworski@kis.p.lodz.pl http://tjaworski.kis.p.lodz.pl/ Idea wielozadaniowości Proces główny Wątki Algorytm szeregowania ustala kolejność
Systemy operacyjne III
Systemy operacyjne III WYKŁAD 2 Jan Kazimirski 1 Procesy w systemie operacyjnym 2 Proces Współczesne SO w większości są systemami wielozadaniowymi. W tym samym czasie SO obsługuje pewną liczbę zadań procesów
1. Kolejki komunikatów POSIX
Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 1. Kolejki komunikatów POSIX 1.1 Podstawowe własności Kolejki FIFO maja następujące wady: Komunikaty pozbawione struktury Nie można testować stanu kolejki
Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot
Systemy Operacyjne 2: Wątki pthreads dr inż. Arkadiusz Chrobot 18 kwietnia 2013 1. Wprowadzenie Wątki podobnie jak procesy umożliwiają współbieżną realizację czynności w wykonywanym programie. Domyślnie
Język Java wątki (streszczenie)
Programowanie współbieżna Język Java wątki (streszczenie) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Języka Java wątki Autor:
Podstawy programowania współbieżnego. 1. Wprowadzenie. 2. Podstawowe pojęcia
Podstawy programowania współbieżnego Opracowanie: Sławomir Samolej, Tomasz Krzeszowski Politechnika Rzeszowska, Katedra Informatyki i Automatyki, Rzeszów, 2010 1. Wprowadzenie Programowanie współbieżne
Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 11 Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: QNX Neutrino Interrupts Mariusz Rudnicki 2016 Wstęp W QNX Neutrino wszystkie przerwania sprzętowe przechwytywane są przez jądro systemu. Obsługę
Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB
Wykład 5 Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Wady semaforów Jeden z pierwszych mechanizmów synchronizacji Generalnie jest to mechanizm bardzo
Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego
Wątki Wątek - definicja Ciąg instrukcji (podprogram) który może być wykonywane współbieżnie (równolegle) z innymi programami, Wątki działają w ramach tego samego procesu Współdzielą dane (mogą operować
13. Kolejki komunikatów POSIX
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 13. POSIX 13.1 Wstęp (mailboxy, bufory) są bardzo popularnym mechanizmem komunikacji międzyprocesowej. Występują w prawie każdym systemie operacyjnym.
procesy odrębne dzielone
procesy odrębne Unikatowy PID (2-32000) Zmienne Zbiory deskryptorów plików Przestrzeń stosu (lokalne zmienne, wywołania funkcji) Środowisko Licznik rozkazów dzielone Kod programu brak możliwości zapisu
Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011
Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Uruchomienie programu powoduje stworzenie nowego procesu przez system operacyjny. Proces wykonywany program wraz
Problemy czytelników i pisarzy oraz 5 ucztujących filozofów
Problemy czytelników i pisarzy oraz 5 dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/
Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011
Procesy Systemy Operacyjne 2 laboratorium Mateusz Hołenko 9 października 2011 Plan zajęć 1 Procesy w systemie Linux proces procesy macierzyste i potomne procesy zombie i sieroty 2 Funkcje systemowe pobieranie
Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003
Obliczenia równoległe i rozproszone w JAVIE Michał Kozłowski 30 listopada 2003 Wątki w JAVIE Reprezentacja wątków jako obiektów Uruchamianie i zatrzymywanie wątków Realizacja wątków Ograniczenia Mechanizmy
Problemy czytelników i pisarzy oraz 5 ucztujących filozofów
Problemy czytelników i pisarzy oraz 5 dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/
Problem producentakonsumenta
Problem producentakonsumenta dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/
Wskaźniki. Informatyka
Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces
Procesy pojęcia podstawowe 1 1.1 Jak kod źródłowy przekształca się w proces W języku wysokiego poziomu tworzy się tak zwany kod źródłowy który po zapisaniu będzie plikiem z programem źródłowym. Plik źródłowy
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
SYSTEMY CZASU RZECZYWISTEGO - VxWorks
WZAJEMNE WYKLUCZANIE Wiele metod. Np. wyłączanie przerwań: funkcja() //... Int blokada = intlock(); // Obszar krytyczny, któremu nie możemy przerwać intunlock(blokada); wyłączanie wywłaszczania: funkcja()
Implementacje zgodne z tym standardem są nazywane wątkami POSIX lub Pthreads.
pthreads (POSIX) implementacji równoległości poprzez wątki w architekturach wieloprocesorowych z pamięcią współdzieloną przenośność problem programistyczny, gdy dostawcy sprzętu wdrażali własne wersje
Kolejki komunikatów POSIX
Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 Kolejki komunikatów POSIX 1 Wstęp Kolejka komunikatów Q posiada następujące własności: - Posiada określoną pojemność N komunikatów (długość bufora komunikatów).
1. Kolejki komunikatów POSIX
Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 1. Kolejki komunikatów POSIX 1.1 Podstawowe własności Kolejki FIFO maja następujące wady: Komunikaty pozbawione struktury Nie można testować stanu kolejki
Kompilator języka C na procesor 8051 RC51 implementacja
Kompilator języka C na procesor 8051 RC51 implementacja Implementowane typy danych bit 1 bit char lub char signed 8 bitów char unsigned 8 bitów int lub signed int 16 bitów unsigned int 16 bitów long lub
7. Szeregowanie procesów w systemie QNX6 Neutrino
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 7. Szeregowanie procesów w systemie QNX6 Neutrino 7.1 Priorytety Każdy z procesów wykonywanych w systemie RTS ma przyporządkowany priorytet. W systemie
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Monitory. Jarosław Kuchta
Monitory Jarosław Kuchta Co to jest monitor Monitor to zebrane w jednej konstrukcji programowej zmienne i operacje na tych zmiennych. Część tych operacji jest udostępnianych na zewnątrz monitora. Tylko
Wielowątkowy serwer TCP
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(),
Mariusz Rudnicki PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4
Mariusz Rudnicki mariusz.rudnicki@eti.pg.gda.pl PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4 Synchronizacja wątków Omawiane zagadnienia Czym jest synchronizacja wątków? W jakim celu stosuje
Zaawansowane programowanie w C++ (PCP)
Wykład 10 - boost Thread. 8 czerwca 2007 Równoległość bardzo wolna reakcja człowieka wolne urządzenia wejścia - wyjścia (np. drukarki) bardzo szybkie procesory można przeprowadzać obliczenia podczas obsługi
Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4
Mariusz Rudnicki mariusz.rudnicki@eti.pg.gda.pl PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4 Synchronizacja wątków Omawiane zagadnienia Czym jest synchronizacja wątków? W jakim celu stosuje się mechanizmy
Model procesu w systemie Linux. Tomasz Borzyszkowski
Model procesu w systemie Linux Tomasz Borzyszkowski Definicja procesu klasyka Definicja [M.Bach WNT95] Proces jest wykonaniem programu i składa się ze zbiorowości bajtów, które CPU interpretuje jako instrukcje
1. Timery i zdarzenia
Sygnały 1 1. Timery i zdarzenia 1.1 Funkcje i programowanie timerów Jedną z najczęściej spotykanych funkcji systemu jest generowanie zdarzeń które w ustalonym czasie uruchomić mają określone akcje systemu.
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska
Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów Iwona Kochańska Mechanizm synchronizacji wątków/procesów Wykorzystanie semaforów zapobiega niedozwolonemu wykonaniu
Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2
Mariusz Rudnicki mariusz.rudnicki@eti.pg.gda.pl PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2 Architektura - Procesy Proces program załadowany do pamięci; identyfikowany przez id procesu, zwykle nazywany
Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu
Proces Procesy i wątki Proces jest wykonywanym programem. Wykonanie procesu musi przebiegać w sposób sekwencyjny ( w dowolnej chwili na zamówienie naszego procesu może być wykonany co najwyżej jeden rozkaz
Struktura i funkcjonowanie komputera pamięć komputerowa, hierarchia pamięci pamięć podręczna. System operacyjny. Zarządzanie procesami
Rok akademicki 2015/2016, Wykład nr 6 2/21 Plan wykładu nr 6 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 2015/2016
Programowanie współbieżne Wykład 2. Iwona Kochańska
Programowanie współbieżne Wykład 2 Iwona Kochańska Miary skalowalności algorytmu równoległego Przyspieszenie Stały rozmiar danych N T(1) - czas obliczeń dla najlepszego algorytmu sekwencyjnego T(p) - czas
POSIX: IEEE Std 1003.1 2001 (Issue 6, 2004 edition)
POSIX: IEEE Std 1003.1 2001 (Issue 6, 2004 edition) Podstawowe rekomendacje przejęte z UNIXa wielodostęp wielozadaniowość system plików terminal gniazda Rekomendacje dla obszaru czasu rzeczywistego strategie
Synchronizacja procesów i wątków
SOE Systemy Operacyjne Wykład 12 Synchronizacja procesów i wątków dr inŝ. Andrzej Wielgus Instytut Mikroelektroniki i Optoelektroniki WEiTI PW Problem sekcji krytycznej Podstawowy problem synchronizacji
J. Ułasiewicz Programowanie aplikacji współbieżnych 1
J. Ułasiewicz Programowanie aplikacji współbieżnych 1 9. Komunikacja przez pamięć dzieloną Metoda komunikacji przez wspólną pamięć może być użyta gdy procesy wykonywane są na maszynie jednoprocesorowej
Współbieżność w środowisku Java
Współbieżność w środowisku Java Wątki i ich synchronizacja Zagadnienia Tworzenie wątków Stany wątków i ich zmiana Demony Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: THREADS Mariusz Rudnicki 2016 1. Przygotowanie platformy i środowiska IDE. Przed uruchomieniem własnego kodu zwiększ priorytet procesu qconn
1. Procesy i współbieżność
1. Procesy i współbieżność Opracował: Sławomir Samolej Politechnika Rzeszowska, Katedra Informatyki i Automatyki, Rzeszów, 2013. 1.1. Wprowadzenie Proces to przestrzeń adresowa i pojedynczy wątek sterujący,
Proces y i y w i ąt ą ki
Procesy i wątki Proces Proces jest wykonywanym programem. Wykonanie procesu musi przebiegać w sposób sekwencyjny ( w dowolnej chwili na zamówienie naszego procesu może być wykonany co najwyżej jeden rozkaz
Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.
Przykład: $ ls more Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi. Tworzenie łącza #include int pipe(int filedes[2]); Przykład: int
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
1. Timery i zdarzenia
J. Ułasiewicz Komputerowe systemy sterowania 1 1. Timery i zdarzenia 1.1 Funkcje i programowanie timerów Jedną z najczęściej spotykanych funkcji systemu czasu rzeczywistego jest generowanie zdarzeń które
Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.
Struktura programu Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem. W ostatnich latach najbardziej używanym stylem oprogramowania
Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) Ćwiczenie drugie (jedne zajęcia) Temat: Procesy i sygnały w Linuksie. Opracowanie: mgr in ż. Arkadiusz Chrobot Wprowadzenie 1. Budowa procesu
Komunikacja za pomocą potoków. Tomasz Borzyszkowski
Komunikacja za pomocą potoków Tomasz Borzyszkowski Wstęp Sygnały, omówione wcześniej, są użyteczne w sytuacjach błędnych lub innych wyjątkowych stanach programu, jednak nie nadają się do przekazywania
UŻYCIE I ZARZĄDZANIE WĄTKAMI
Proces jako pewna instancja programu, w trakcie wykonania, ze swej natury w każdym systemie operacyjnym wyróżniają: prawa własności zasobu a jednym z fundamentalnych zadań systemu jest ochrona przed jednoczesnym
Szablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
Systemy operacyjne. Zajęcia 11. Monitory
Systemy operacyjne. Zajęcia 11. Monitory 1. Monitor to mechanizm zamykający całą pamięć wspólną i synchronizację w pojedynczym module. 2. Monitor posiada całą pamięć wspólną jako część 'prywatną': dostępu
Futex (Fast Userspace Mutex) Łukasz Białek
Futex (Fast Userspace Mutex) Łukasz Białek Futex informacje podstawowe Stworzony w 2002 roku przez Hubertusa Franke, Matthew Kirkwooda, Ingo Molnára i Rustiego Russella. Jest mechanizmem w Linuxie, który
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
1 Timery i zdarzenia
J. Ułasiewicz Komputerowe systemy sterowania 1 1 Timery i zdarzenia 1.1 Funkcje i programowanie timerów Jedną z najczęściej spotykanych funkcji systemu czasu rzeczywistego jest generowanie zdarzeń które
W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :
Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Tablice, funkcje - wprowadzenie
Tablice, funkcje - wprowadzenie Przemysław Gawroński D-10, p. 234 Wykład 5 25 marca 2019 (Wykład 5) Tablice, funkcje - wprowadzenie 25 marca 2019 1 / 12 Outline 1 Tablice jednowymiarowe 2 Funkcje (Wykład
System operacyjny MACH
Emulacja w systemie MCH System operacyjny MCH 4. SD Systemu V HP/UX MS-DOS VMS inne Mikrojądro Zbigniew Suski Zbigniew Suski Podstawowe cele projektu MCH! Dostarczenie podstawy do budowy innych systemów