Semafory według normy POSIX

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Mechanizmy pracy równoległej
Jarosław Kuchta Monitory.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Programowanie obiektowe
Programowanie obiektowe
Wskaźniki repetytorium Wskaźniki int Y = 1, X = 2; X = 5; int *p = &X; Y X p 4 4 p = &Y; *p = 4; 5.
Wzorce.
1 Wskaźniki w C Podstawy podstaw podstaw podstaw.....
Systemy rozproszone W. Bartkiewicz
Semafory Autorzy : Michał Winciorek Łukasz Jackowicz.
PROGRAMOWANIE STRUKTURALNE
Semafory Semafor w programowaniu jest abstrakcją o zastosowaniu zaczerpniętym z działalności kolei. Gdy zasobów jest na tyle mało, że trzeba ich użyciem.
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Programowanie wielowątkowe
Struktury.
Tablice.
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Systemy operacyjne Wykład nr 4: Procesy Piotr Bilski.
C++ wykład 2 ( ) Klasy i obiekty.
Dynamiczne struktury danych 1
ZARZĄDZANIE PROCESAMI
15. MECHANIZMY SYNCHRONIZACJI WĄTKÓW Większość koncepcji stworzonych na potrzeby synchronizacji procesów ciężkich została zastosowana też do synchronizacji.
Muteksy Muteksy (mutex – MUTual EXclusion) są prostymi obiektami synchronizacyjnymi pełniącymi rolę semaforów binarnych dla wątków (chroniącymi sekcje.
11. PAKIET IPC Narzędzia z pakietu IPC (InterProcess Communication) służą do koordynacji procesów wykonywa- nych na jednym komputerze (nie są przeznaczone.
14. WĄTKI Procesy w tradycyjnym sensie (tworzone przez wykonanie funkcji fork) mają przydzielaną oddzielną przestrzeń adresową. W przestrzeni tej jest.
10. PROSTE MECHANIZMY KOORDYNACJI DOSTĘPNE W JĘZYKU C W systemie Unix użytkownikowi (nie będącemu administratorem) nie wolno wykonywać bezpośrednio żadnych.
9. KOORDYNACJA PROCESÓW WSPÓŁBIEŻNYCH PRZY UŻYCIU INTERPRETATORA
ipcrm [ shm | msq | sem ] id
Procesy odrębne –Unikatowy PID ( ) –Zmienne –Zbiory deskryptorów plików –Przestrzeń stosu (lokalne zmienne, wywołania funkcji) –Środowisko –Licznik.
Wątki.
Pamięć wspólna Przegląd stosowanych rozwiązań Marcin Kamiński, Michał Kotra Wydział EAIiE Katedra Automatyki Kraków, 2008.
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
Podstawy programowania II
PROGRAMOWANIE SYSTEMOWE [2/3]
Procedury i funkcje.
Systemy operacyjne.
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Problem sekcji krytycznej
Przerwanie ang. interrupt.
zadania z synchronizacji
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe 2013/2014
Wykład 6b Wątki, mechanizmy IPC
Kurs języka C++ – wykład 3 ( )
Wykład 7 Synchronizacja procesów i wątków
W ą t e k (lekki proces) thread.
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Systemy operacyjne (wiosna 2014)
Bariery synchronizacyjne Bariery są obiektami synchronizacyjnymi pakietu pthread służącymi do wyrównywania czasów pracy wątków wykonujących wspólne zadanie.
Algorytmy i Struktury Danych
Kurs języka C++ – wykład 4 ( )
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Paweł Starzyk Obiektowe metody projektowania systemów
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Wątki, programowanie współbieżne
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Zapis prezentacji:

Semafory według normy POSIX Biblioteka funkcji operujących na semaforach POSIX powstała jeszcze przed utworzeniem pakietu pthread, w związku z czym posiada następujące cechy: - nazwy funkcji i struktur danych nie posiadają przedrostka pthread_ ; - nazwą włączanego pliku nagłówkowego jest <semaphore.h> ; - żadna z funkcji w swojej semantyce (swoimi argumentami) nie odwołuje się do pojęcia wątku (choć funkcje te nadają się do synchronizacji wątków – zarówno spokrewnionych, jak i niespokrewnionych); - w przypadku pomyślnego wykonania funkcje zwracają wartość 0, zaś w przypadku błędu zwracają -1 i ustawiają zmienną globalną errno. Semafory POSIX są semaforami wielowartościowymi (wartość maksymalna jest określona stałą SEM_VALUE_MAX i próba przekroczenia jej powoduje błąd), występującymi pojedynczo (nie w tablicach, na których można wykonywać niepodzielne operacje).

int sem_init (sem_t *semafor, int czy_dzielony, unsigned int wartość); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na inicjowany semafor czy_dzielony – 0, jeśli dla wątków spokrewnionych, 1, jeśli międzyprocesowy wartość – wartość początkowa semafora Działanie: inicjuje semafor daną wartością. int sem_wait (sem_t *semafor); semafor – wskaźnik na (zainicjowany) semafor

Działanie: jeśli semafor ma wartość 0, wstrzymuje wątek, zaś jeśli dodatnią, niepodzielnie zmniejsza ją o 1. int sem_trywait (sem_t *semafor); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na semafor Działanie: takie samo, jak funkcji sem_wait ( ), ale zamiast wstrzymać wątek, sygnalizuje błąd. int sem_post (sem_t *semafor);

semafor – wskaźnik na semafor Działanie: niepodzielnie zwiększa wartość semafora o 1 (jeśli żaden wątek nie czeka pod nim, a wartość nie jest zbyt duża) lub uwalnia (niedeterministycznie) jeden z zawieszonych wątków. Uwaga: w przeciwieństwie do muteksów semafory nie mają właścicieli (otworzyć semafor może inny wątek, niż go zamknął). int sem_getvalue (sem_t *semafor, int *zmienna); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu Działanie: zapamiętuje aktualną wartość semafora w zmiennej.

int sem_destroy (sem_t *semafor); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na semafor Działanie: jeśli pod semaforem nie czeka żaden wątek, likwiduje semafor i zwraca zajmowane przez niego zasoby (jeśli jakiś wątek czeka, funkcja sygnalizuje błąd). Uwaga: jeśli dana implementacja semaforów umożliwia jedynie ich statyczne tworzenie (nie umożliwia dynamicznej rezerwacji i zwalniania), niektóre z powyższych funkcji mogą zwracać zawsze 0.

Dane specyficzne wątków Dane specyficzne wątków (Thread Specific Data – TSD) służą do tego, żeby zróżnicować działanie wielu wątków wykonujących jedną, wspólną funkcję. Ze współdzieloną zmienną (kluczem) każdy z wątków może mieć skojarzoną inną wartość. Przykład Jeśli na parkingu kilka osób wypowiada zdanie „To jest mój samochód”, to dla każdej z tych osób znaczenie tego zdania może być inne (może dotyczyć innego przedmiotu). Maksymalna liczba kluczy dostępnych dla jednego wątku określona jest przez wartość stałej PTHREAD_KEYS_MAX . Zazwyczaj wartości danych specyficznych dla poszczególnych wątków umieszczane są we fragmentach pamięci uprzednio przydzielonych dynamicznie (na przykład przez wywołanie malloc ( ) ) dla tych wątków.

int pthread_key_create (pthread_key_t. klucz, void (. destruktor)(void int pthread_key_create (pthread_key_t *klucz, void (*destruktor)(void *argument)); Zwraca: 0 w przypadku sukcesu niezerowy kod w przypadku błędu klucz – wskaźnik na klucz destruktor- funkcja „sprzątająca” skojarzona z danym kluczem, jest wywoływana (w niedeterministycznej kolejności) w chwili kończenia działania (lub unieważnienia) wątku, otrzymuje wskaźnik na argument Działanie: przydziela wątkowi nowy klucz (początkowo skojarzony z wartością NULL w jego TSD) i ustanawia funkcję sprzątającą. Uwaga: wywoływanie destruktora w chwili zakończenia działania wątku może być iterowane w razie potrzeby.

int pthread_key_delete (pthread_key_t klucz); Zwraca: 0 w przypadku sukcesu niezerowy kod w przypadku błędu klucz – klucz (uwaga: nie wskaźnik) Działanie: cofa przydział klucza wątkowi (nie sprawdza przy tym, czy wartością skojarzoną z kluczem jest NULL, ani nie wywołuje destruktora). int pthread_setspecific (pthread_key_t klucz, const void *adres); klucz – klucz adres – adres lokaty w przestrzeni adresowej wątku (zwykle otrzymany przez wcześniejsze wywołanie malloc ( ) przez dany wątek)

Działanie: kojarzy z danym kluczem adres, który będzie znany tylko danemu wątkowi (będzie przechowywany w jego TSD). void *pthread_getspecific (pthread_key_t klucz); Zwraca: adres skojarzony z kluczem w przypadku sukcesu NULL w przypadku błędu klucz – klucz Działanie: zwraca adres aktualnie skojarzony z danym kluczem (przez wywołujący wątek).