dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 12 WSTĘP DO INFORMATYKI
Systemy operacyjne 2 System operacyjny jest zbiorem ręcznych i automatycznych procedur, które pozwalają grupie osób na efektywne współdzielenie urządzeń maszyny cyfrowej Per Brinch Hansen
Systemy operacyjne 3 System operacyjny (nadzorczy, nadrzędny, sterujący) jest to zorganizowany zespół programów, które pośredniczą między sprzętem a użytkownikami, dostarczając użytkownikom zestawu środków ułatwiających projektowanie, kodowanie, uruchamianie i eksploatację programów oraz w tym samym czasie sterują przydziałem zasobów dla zapewnienia efektywnego działania. Alen Shaw
Systemy operacyjne 4 System operacyjny jest programem, który działa jako pośrednik między użytkownikiem komputera a sprzętem komputerowym. Zadaniem systemu operacyjnego jest tworzenie środowiska, w którym użytkownik może wykonywać programy w sposób wygodny i wydajny. Abraham Silberschatz
Systemy operacyjne 5 System operacyjny jest warstwą oprogramowania operującą bezpośrednio na sprzęcie, której celem jest zarządzanie zasobami systemu komputerowego i stworzenie użytkownikowi środowiska łatwiejszego do zrozumienia i wykorzystania. Andrew Tanenbaum
Systemy operacyjne 6..zbiorem ręcznych i automatycznych procedur, które pozwalają grupie osób na efektywne współdzielenie urządzeń maszyny cyfrowej jest warstwą oprogramowania operującą bezpośrednio na sprzęcie, której celem jest zarządzanie zasobami systemu komputerowego i stworzenie użytkownikowi środowiska łatwiejszego do zrozumienia i wykorzystania. jest programem, który działa jako pośrednik między użytkownikiem komputera a sprzętem komputerowym. Zadaniem jest tworzenie środowiska, w którym użytkownik może wykonywać programy w sposób wygodny i wydajny. to zorganizowany zespół programów, które pośredniczą między sprzętem a użytkownikami, dostarczając użytkownikom zestawu środków ułatwiających projektowanie, kodowanie, uruchamianie i eksploatację programów oraz w tym samym czasie sterują przydziałem zasobów dla zapewnienia efektywnego działania.
Systemy operacyjne 7 Użytkownik 1 Użytkownik 2 Użytkownik 3 Użytkownik n Kompilator Odtwarzacz muzyki Edytor tekstu Baza danych Sprzęt komputerowy
Systemy operacyjne 8 Użytkownik 1 Użytkownik 2 Użytkownik 3 Użytkownik n Kompilator Odtwarzacz muzyki Edytor tekstu Baza danych Programy systemowe i użytkowe(powłoka, GUI) SYSTEM OPERACYJNY Sprzęt komputerowy
tryb jądra tryb użytkownika Systemy operacyjne 9 Użytkownik 1 Użytkownik 2 Użytkownik 3 Użytkownik n Kompilator Odtwarzacz muzyki Edytor tekstu Baza danych Programy systemowe i użytkowe(powłoka, GUI) SYSTEM OPERACYJNY Sprzęt komputerowy
Systemy operacyjne 10 Tryby działania komputera tryb jądra (nadzorcy) - uprzywilejowany tryb wykonywania kodu, w którym procesor zezwala na dostęp do całej pamięci systemu oraz do wszystkich instrukcji procesora; W trybie jądra działa kod systemu operacyjnego. tryb użytkownika nieuprzywilejowany tryb procesora, w którym dostępna jest ograniczona liczba interfejsów oraz ograniczony dostęp do zasobów systemowych. W trybie użytkownika działają aplikacje użytkownika. Dwa tryby pracy procesora wprowadzono w celu ochrony krytycznych dla systemu operacyjnego danych. Mechanizm uniemożliwiający błędnej aplikacji użytkownika naruszenie stabilności całego systemu
Zarządzanie zasobami Zadania systemu operacyjnego 11 Definicja interfejsu użytkownika Udostępnianie systemu plików Udostępnianie środowiska do wykonywania programów użytkownika mechanizm ładowania i uruchamiania programów mechanizmy synchronizacji i komunikacji procesów Sterowanie urządzeniami wejścia-wyjścia Obsługa podstawowej klasy błędów
Zarządzanie zasobami 12 Przydział zasobów Planowanie dostępu do zasobów Ochrona i autoryzacja dostępu do zasobów Odzyskiwanie zasobów Rozliczanie - gromadzenie danych o wykorzystaniu zasobów
Zarządzanie zasobami 13 Procesor przydział czasu procesora Pamięć alokacja przestrzeni adresowej dla procesów transformacja adresów Urządzenia zewnętrzne udostępnianie i sterowanie urządzeniami pamięci masowej alokacja przestrzeni dyskowej udostępnianie i sterownie drukarkami, skanerami itp. Informacja (system plików) organizacja i udostępnianie informacji ochrona i autoryzacja dostępu do informacji
14 Systemy operacyjne Systemy przetwarzania bezpośredniego systemy interakcyjne występuje bezpośrednia interakcja pomiędzy użytkownikiem a systemem operacyjnym, wykonywanie zadania użytkownika rozpoczyna się zaraz po przedłożeniu. Systemy przetwarzania pośredniego systemy wsadowe występuje zwłoka między przedłożeniem a rozpoczęciem wykonywania zadania, niemożliwa jest ingerencja użytkownika w wykonywanie zadania
Spooling 15 Spooling procesor pobiera kolejne zadania z dysku, wykonuje je i zapisuje wyniki na dysku wyniki zakończonych zadań są drukowane zadanie systemu operacyjnego - synchronizacja wczytywania zadań, wypisywania wyników oraz zarządzanie informacjami magazynowanymi na dysku.
Systemy operacyjne 16 Systemy jednozadaniowe niedopuszczalne jest rozpoczęcie wykonywania następnego zadania użytkownika przed zakończeniem poprzedniego. Systemy wielozadaniowe dopuszczalne jest istnienie jednocześnie wielu zadań (procesów), którym zgodnie z pewną strategią przydzielany jest procesor. Zwolnienie procesora następuje w wyniku żądania przydziału dodatkowego zasobu, zainicjowaniu operacji wejścia-wyjścia, przekroczenia ustalonego limitu czasu (kwantu czasu)
Systemy operacyjne 17 Zadania systemu operacyjnego zarządzanie pamięcią i pilnowanie, aby jeden proces nie ingerował w obszar pamięci przydzielonej innym procesom, przydzielanie urządzeń zewnętrznych procesom, jeśli procesor jest bezczynny, to należy wybrać jeden z procesów, które znajdują się w pamięci i są gotowe do wykonania; jest to tzw. szeregowanie krótkoterminowe, jeśli zwalnia się pamięć operacyjna i można wczytać z dysku kolejne zadanie oczekujące na wykonanie, to należy wybrać jedno z oczekujących zadań; jest to tzw. szeregowanie długoterminowe.
Systemy operacyjne 18 Systemy dla jednego użytkownika zasoby przeznaczone są dla jednego użytkownika, nie ma mechanizmów autoryzacji dostępu, a mechanizmy ochrony informacji są ograniczone. Systemy wielodostępne wielu użytkowników może korzystać z zasobów systemu komputerowego, a system operacyjny gwarantuje ich ochronę przed niepowołaną ingerencją. system plików indywidualizacja zasobów dyskowych
Systemy operacyjne 19 Systemy czasu rzeczywistego zorientowane na przetwarzanie z uwzględnieniem czasu zakończenie zadania, tzw. linii krytycznej. Systemy sieciowe i rozproszone umożliwiają zarządzanie zbiorem rozproszonych jednostek przetwarzających, które są zintegrowane siecią komputerową i nie współdzielą fizycznie zasobów. niezawodność współdzielenie zasobów zwiększenie mocy obliczeniowej nowe usługi
Systemy operacyjne 20 W typowym systemie operacyjnym wyróżniamy następujące podsystemy: podsystem zarządzania procesami podsystem zarządzania pamięcią podsystem systemu plików podsystem wejścia/wyjścia podsystem pamięci pomocniczej podsystem usług sieciowych podsystem ochrony interpreter poleceń i programy użytkowe
Funkcje systemowe 21 Programy użytkowników mają dostęp do usług systemu operacyjnego poprzez tzw. funkcje systemowe. operacje na procesach - tworzenie nowych procesów, przerwanie, zawieszanie, wznawianie działania procesu, pobranie informacji o procesie, oczekiwanie na określone zdarzenie, przydzielanie i zwalnianie pamięci. operacje na plikach - utworzenie pliku, usunięcie pliku, otwarcie pliku, odczyt z pliku, zapis do pliku, pobranie lub zmiana atrybutów pliku. operacje na urządzeniach - zamówienie i zwolnienie urządzenia, odczyt z i zapis do urządzenia, pobranie lub zmiana atrybutów urządzenia, (logiczne) przyłączenie lub odłączenie urządzenia. informacje systemowe - pobieranie i/lub ustawianie najrozmaitszych informacji systemowych, w tym: czasu i daty, wersji systemu operacyjnego, atrybutów użytkowników. komunikacja - przekazywanie informacji między procesami.
Jądro systemu (kernel) Struktura systemu Unix 22 Sygnały Obsługa terminali System znakowego I/O Moduły sterujące terminali Sterowniki terminali Terminale Użytkownicy Powłoki i polecenia Kompilatory i interpretery Biblioteki systemowe Interfejs funkcji systemowych jądra System plików Wymiana System blokowego I/O Moduły sterujące dysków i taśm Interfejs między jądrem a sprzętem Sterowniki urządzeń Dyski i taśmy Planowanie przydziału procesora Zastępowanie stron Stronicowanie na żądanie Pamięć Planowanie wirtualna przydziału procesora Zastępowanie stron Stronicowanie na żądanie Pamięć wirtualna Sterowniki pamięci Pamięć operacyjna
Koncepcja procesu 23 Proces (nazywany też czasem zadaniem) to wykonujący się program. Każdy proces ma własny licznik instrukcji, który wskazuje następną instrukcję do wykonania, oraz własny obszar przydzielonej mu pamięci operacyjnej. Proces jest elementarną jednostką pracy (aktywności) zarządzaną przez system operacyjny, która ubiega się o zasoby systemu komputerowego w celu wykonania programu. Procesem jest cały kontekst niezbędny do wykonania programu. program definiuje zachowanie procesu, dane zbiór wartości przetwarzanych oraz wyniki, zbiór zasobów tworzących środowisko wykonawcze, blok kontrolny procesu (PCB, deskryptor) opis bieżącego stanu procesu.
Koncepcja zasobu 24 Zasobem jest element sprzętowy lub programowy systemu komputerowego, którego brak może potencjalnie zablokować wykonywanie programu System operacyjny definiuje element systemu komputerowego jako zasób. Zasoby tworzone przez jądro systemu operacyjnego nazywamy wirtualnymi, np. plik. (pliki udostępnia system operacyjny; na poziomie maszynowym mamy sektory dysku, w których składowana są dane)
Procesy i zasoby 25 Ze względów pojęciowych lub projektowych fragmenty kodu jądra związane z obsługą procesów i zasobów wyodrębnia się w postaci zarządców. Zarządca procesów (ang. process manager) kontroluje stany procesów w celu efektywnego i bezpiecznego wykorzystania współdzielonych zasobów systemu. Zarządca zasobów (ang. resource manager) realizuje przydział zasobów stosownie do żądań procesów, aktualnego stanu systemu oraz ogólnosystemowej polityki przydziału.
Deskryptor procesu PCB 26 Informacje związane z każdym procesem : Identyfikator procesu Stan procesu Licznik rozkazów Rejestry procesora Informacje o planowaniu przydziału procesora Informacje o zarządzaniu pamięcią Informacje do rozliczeń Informacje o stanie wejścia-wyjścia
Stany procesu 27 nowy - właśnie utworzono. aktywny- jest właśnie wykonywany przez procesor. czekający - czeka na zajście jakiegoś zdarzenia gotowy - czeka na przydzielenie mu procesora. zakończony - zakończył działanie.
28 Diagram przejść stanu procesów nowy przyjęcie przerwanie - wywłaszczenie zakończony wyjście gotowy aktywny decyzja planisty obsłużenie zdarzenia lub operacji I/O czekający oczekiwanie na zdarzenie lub na wykonanie operacji I/O
Planowanie procesów 29 Planowanie procesów polega na wskazywaniu procesu, któremu ma być w danej chwili przydzielony procesor (gotowy aktywny) W systemie w każdej chwili może być aktywnych co tyle procesów, ile jest procesorów. Procesy nieaktywne czekają na przydział procesora w kolejkach. Kolejka zadań - wszystkie procesy w systemie Kolejka gotowych - gotowe do wykonania Kolejka do urządzenia - dla każdego urządzenia wejściawyjścia odrębna taka kolejka
Planowanie 30 Kolejka procesów gotowych CPU I/O Kolejka operacji I/O Proces potomny Wystąpienie przerwania Zamówienie operacji I/O Zużycie kwantu czasu Powołanie procesu potomnego Czekanie na przerwanie
31 Planista Selekcji procesu, który ma przejść do stanu aktywny, dokonuje odpowiedni proces systemowy planista. Planista długoterminowy (albo planista zadań) decyduje o tym, który z procesów ma być załadowany do pamięci i gotowy do wykonania. Kontroluje on poziom wieloprogramowości, czyli liczbę współbieżnie wykonywanych procesów. Planista krótkoterminowy (albo planista procesora) decyduje o tym, który z procesów gotowych ma być wykonywany przez procesor.
Planista 32 Planowanie opiera się na trzech elementach : 1. Tryb decyzji - zbiór wytycznych odnośnie momentu dokonywania analizy priorytetów procesów. 2. Funkcja priorytetu wyznacza aktualny priorytet procesu na podstawie parametrów procesu i stanu systemu. 3. Reguła arbitrażu reguła rozstrzygania konfliktu w przypadku procesów o tym samym priorytecie.
Planista 33 Decyzje planisty są podejmowane jedynie : przejście procesu aktywnego do stanu oczekiwania, zakończenie procesu, to planowanie nazywamy niewywłaszczeniowym Jeżeli decyzje planisty podejmowane są także: przejście procesu ze stanu oczekiwania do stanu gotowości, przejście procesu aktywnego do stanu gotowości. to planowanie nazywamy wywłaszczeniowym
Wywłaszczenie 34 Pojawienie się procesu o wyższym priorytecie może być następstwem: utworzenie i przyjęcia nowego procesu, zajścia zdarzenia, oczekiwanego przez proces (np. zakończenie operacji wejścia wyjścia, otrzymania sygnału synchronizacji) obudzenie procesu, upłynięcie kwantu czasu wzrostu priorytetu procesu gotowego, co może mieć miejsce wówczas, gdy priorytety procesów zmieniają się i przeliczane są częściej, niż to wynika z upływu kwantu czasu, czy opuszczenie procesora przez proces.
Komunikacja między procesami 35 1. W jaki sposób proces może przesłać komunikat do innego procesu? 2. Zapobieganie sytuacji, gdy procesy wchodzą sobie w drogę 3. Kolejkowanie procesów proces A generuje dane dla procesu B
36 Wyścig Procesy często dzielą obszary wspólnej pamięci, pliki lub inne zasoby. Warunkami wyścigu nazywamy sytuację, w której dwa lub więcej procesów wykonuje operacje na zasobach dzielonych, a ostateczny wynik tej operacji jest zależny od momentu jej realizacji. Przykład spooler drukarki 1. Drukowanie zapis pliku do katalogu spoolera 2. Demon drukarki sprawdza okresowo czy jest coś do wydrukowania 3. Drukowanie i usunięcie z katalogu 4. Rozmiar katalogu spoolera ograniczony
Wyścig 37 katalog spoolera zmienne współdzielone out = 4 in = 7 4 5 6 7 abc pragram1 pragram3 8
Wyścig 38 katalog spoolera zmienne współdzielone out = 4 in = 7 4 5 6 7 abc pragram1 pragram3 8
Wyścig 39 katalog spoolera zmienne współdzielone out = 4 in = 7 4 5 6 abc pragram1 pragram3 czytanie zm in next_free_slot = in //7 przerwanie zegarowe //przełaczenie na proces B................ 7 8
Wyścig 40 katalog spoolera zmienne współdzielone out = 4 in = 7 4 5 6 abc pragram1 pragram3 czytanie zm in next_free_slot = 7 przerwanie zegarowe //przełaczenie na proces B................ czytanie zm in next_free_slot = in //7 7 8
Wyścig 41 katalog spoolera zmienne współdzielone out = 4 in = 7 4 5 6 7 8 abc pragram1 pragram3 czytanie zm in next_free_slot = 7 przerwanie zegarowe //przełaczenie na proces B................ czytanie zm in next_free_slot = 7 wstawienie procesu B do katalogu spoolera
Wyścig 42 katalog spoolera zmienne współdzielone out = 4 in = 8 4 5 6 7 8 abc pragram1 pragram3 B czytanie zm in next_free_slot = 7 przerwanie zegarowe //przełaczenie na proces B................ czytanie zm in next_free_slot = 7 wstawienie procesu B do katalogu spoolera in = next_free_slot +1....
Wyścig 43 katalog spoolera zmienne współdzielone out = 4 in = 8 4 5 6 7 8 abc pragram1 pragram3 B czytanie zm in next_free_slot = 7 przerwanie zegarowe //przełaczenie na proces B................ czytanie zm in next_free_slot = 7 wstawienie procesu B do katalogu spoolera in = next_free_slot +1....
Wyścig 44 katalog spoolera zmienne współdzielone out = 4 in = 8 4 5 6 7 8 abc pragram1 pragram3 A czytanie zm in next_free_slot = 7 przerwanie zegarowe //przełaczenie na proces B in = next_free_slot +1............ czytanie zm in next_free_slot = 7 wstawienie procesu B do katalogu spoolera in = next_free_slot +1....
Wyścig 45 katalog spoolera zmienne współdzielone out = 4 in = 8 4 5 6 7 8 abc pragram1 pragram3 A czytanie zm in next_free_slot = 7 przerwanie zegarowe //przełaczenie na proces B in = next_free_slot +1............ czytanie zm in next_free_slot = 7 wstawienie procesu B do katalogu spoolera in = next_free_slot +1....
Komunikacja między procesami 46 Unikanie wyścigu oraz dostęp do współdzielonych zasobów. Unikanie sytuacji.gdy więcej niż jeden proces zapisywał/odczytywał zasób w tym samym czasie. Wzajemne wykluczanie
Komunikacja między procesami 47 Problem producenta-konsumenta Mamy dane dwa procesy: producenta i konsumenta. Oba procesy działają w nieskończonej pętli. Producent wytwarza jednostki jakiegoś produktu, a konsument konsumuje je. Jednostki wyprodukowane, ale jeszcze nie skonsumowane są umieszczane w buforze. Bufor może pomieścić maksymalnie n jednostek produktu. Jeżeli bufor jest pusty, to konsument musi zaczekać, aż producent wyprodukuje kolejną jednostkę produktu. Jeżeli bufor jest pełny, to producent musi zaczekać, aż konsument pobierze jednostkę produktu z bufora. Przykład : buforowanie znaków naciskanych na klawiaturze wysyłanie wydruków na drukarkę
Producent-konsument 48 PRODUCENT KONSUMENT repeat wyprodukuj jednostkę produktu; wstaw wyprodukowaną jednostkę do bufora until false repeat pobierz z bufora jednostkę produktu; skonsumuj pobraną jednostkę until false BUFOR var bufor: array [0..n-1] of produkt; pierwszy: 0..n-1; licznik: 0..n;
Producent-konsument 49 repeat wyprodukuj jednostkę produktu; while licznik < n do bufor [(pierwszy+licznik) mod n] := wyprodukowana jednostka; licznik := licznik + 1 until false repeat while licznik > 0 do pobrana jednostka := bufor [pierwszy]; pierwszy := (pierwszy + 1) mod n; licznik := licznik - 1; skonsumuj pobraną jednostkę until false rejestr1 := licznik; rejestr1 := rejestr1 + 1; licznik := rejestr1; rejestr1 := licznik; rejestr2 := licznik; rejestr2 := licznik; rejestr2 := rejestr2-1; licznik := rejestr2; rejestr2 := rejestr2-1; licznik := rejestr2; rejestr1 := rejestr1 + 1; licznik := rejestr1 ;
Producent-konsument 50 repeat wyprodukuj jednostkę produktu; while licznik < n do bufor [(pierwszy+licznik) mod n] := wyprodukowana jednostka; licznik := licznik + 1 until false repeat while licznik > 0 do pobrana jednostka := bufor [pierwszy]; pierwszy := (pierwszy + 1) mod n; licznik := licznik - 1; skonsumuj pobraną jednostkę until false rejestr1 := licznik; rejestr1 := rejestr1 + 1; licznik := rejestr1; rejestr2 := licznik; rejestr2 := rejestr2-1; licznik := rejestr2; rejestr1 := licznik; (5) rejestr2 := licznik; (5) rejestr2 := rejestr2-1; (4) licznik := rejestr2; (4) rejestr1 := rejestr1 + 1; (6) licznik := rejestr1 ; (6)
Sekcja krytyczna 51 Rozwiązaniem problemu jest "zatomizowanie" operacji pobierania i wkładania jednostek produktu z i do bufora. Należy zapewnić, aby w trakcie gdy jeden proces zmienia zawartość bufora drugi nie mógł robić tego równocześnie. Operacje wkładania i wyjmowania z bufora powinny tworzyć tzw. sekcję krytyczną.
Sekcja krytyczna 52 Sekcja krytyczna, to fragment(y) kodu lub operacje, które nie mogą być wykonywane współbieżnie. Sekcja krytyczna jest otoczona dodatkowym kodem synchronizującym przebywanie procesów wejściowych -- przed wejściem do sekcji krytycznej każdy proces musi przejść przez sekcję wejściową, a wychodząc przechodzi przez sekcję wyjściową. Wzajemne wykluczanie: tylko jeden proces na raz może przebywać w sekcji krytycznej.
Sekcja krytyczna 53 Sekcja krytyczna jest otoczona dodatkowym kodem synchronizującym przebywanie procesów wejściowych -- przed wejściem do sekcji krytycznej każdy proces musi przejść przez sekcję wejściową, a wychodząc przechodzi przez sekcję wyjściową. Wzajemne wykluczanie: tylko jeden proces na raz może przebywać w sekcji krytycznej.
Sekcja krytyczna 54 Rozwiązanie problemu sekcji krytycznej polega na podaniu implementacji sekcji wejściowej i wyjściowej. algorytmy z aktywnym oczekiwaniem algorytm Dekkera algorytm piekarniany mechanizmy synchronizacji Semafory Kolejki komunikatów Monitory Sprzętowe mechanizmy synchronizacji
Sekcja krytyczna 55 repeat wyprodukuj jednostkę produktu; while licznik = n do sekcja wejsciowa bufor [(pierwszy+licznik) mod n] := wyprodukowana jednostka; licznik := licznik + 1 sekcja wyjsciowa until false repeat while licznik = 0 do sekcja wejsciowa pobrana jednostka := bufor [pierwszy]; pierwszy := (pierwszy + 1) mod n; licznik := licznik - 1; sekcja wyjsciowa skonsumuj pobraną jednostkę until false
Algorytm Dekkera 56 var k: array [1..2] of 0..1; tablica procesów czyja_kolej: 1..2; zmienna rozstrzygająca p - numer procesu lokalnie k [p] := 0; while k [3 - p] = 0 do begin if czyja_kolej p then begin (* Ustąp drugiemu procesowi.*) k [p] := 1; while czyja_kolej p do; k [p] := 0 end end jest ograniczone do dwóch procesów, proces oczekujący oczekuje aktywnie, tzn. czekając na jakieś zdarzenie sprawdza ciągle warunek określający, czy dane zdarzenie już zaszło. k [p] := 1; czyja_kolej := 3 - p;
Algorytm piekarniany 57 var wybieranie: array [1..n] of boolean; numerek: array [0..n-1] of integer; p - numer procesu lokalnie wybieranie [p] := true; numerek [p] := max (numerek [1], numerek [2],..., numerek [n]) + 1; wybieranie [p] := false; for j := 1 to n do begin while wybieranie [j] do; while numerek [j] 0 and (numerek [j], j) < (numerek [p], p) do; end jest ograniczone do n procesów, proces oczekujący oczekuje aktywnie numerek [p] := 0;
58 Sekcja krytyczna Czekanie aktywne 1. Marnowany jest czas procesora - można by przeznaczyć na wykonanie innego procesu. 2. Uzasadnione gdy czas oczekiwania stosunkowo krótki (najlepiej krótszy od czasu przełączenia kontekstu) Liczba procesów Liczba procesorów 3. Alternatywą do czekania aktywnego jest przejście procesu w stan zablokowany Semafory Monitory
Semafory 59 Semafor jest obiektem abstrakcyjnym służącym do kontrolowania dostępu do ograniczonego zasobu. Semafory są szczególnie przydatne w środowisku gdzie wiele procesów lub wątków komunikuje się przez wspólną pamięć. Semafor S jest obiektem abstrakcyjnym, z którym związany jest licznik L zasobu przyjmujący wartości nieujemne. Na semaforze zdefiniowane są atomowe operacje sem_init, sem_wait, sem_post
Semafory 60 Definicja operacji wykonywanych na semaforze sem_init(s,n) Inicjacja Zajmowanie sem_wait(s) Sygnalizacja sem_post(s) Ustawienie licznika semafora S na początkową wartość N. Gdy licznik L semafora S jest dodatni (L > 0) zmniejsz go o 1 (L = L 1). Gdy licznik L semafora S jest równy zero (L==0) zablokuj proces bieżący. Gdy istnieje jakiś proces oczekujący na semaforze S to odblokuj jeden z czekających procesów. Gdy brak procesów oczekujących na semaforze S zwiększ jego licznik o 1 (L=L+1). Semafor binarny -wartość licznika przyjmuje tylko dwie wartości: 0 i 1.
Semafory 61 Implementacja wzajemnego wykluczania semaphore S; // Deklaracja semafora sem_init(s,1); // Inicjacja semafora Proces1 { do { Sekcja_lokalna; sem_wait(s); Sekcja_krytyczna; sem_post(s); } while(1); } Proces2 { do { Sekcja_lokalna; sem_wait(s); Sekcja_krytyczna; sem_post(s); } while(1); }
Semafory 62 L = 1 Proces 1 Proces 2 L = 0 sem_wait(s) użycie zasobu sem_wait(s) blokada L = 0 sem_post(s) odblokowanie użycie zasobu L = 1 sem_post(s)
Semafory 63 Mutex - mutually exclusive (wzajemnie wykluczający się). Mutex jest rodzajem semafora, którego stan jest ustawiony jako sygnalizowany kiedy żaden proces nie sprawuje nad nim kontroli oraz niesygnalizowany, kiedy jakiś proces sprawuje nad nim kontrolę. Synchronizację za pomocą mutexów realizuje się tak, że każdy proces czeka na objęcie mutexa w posiadanie, zaś po zakończeniu operacji wymagającej wyłączności, proces uwalnia mutexa.
Semafory 64 Problem producent-konsument z wykorzystaniem semaforów const int n; Semaphore empty(n),full(0),mutex(1); Item buffer[n]; Semafor mutex zapewnia wzajemne wykluczanie przy dostępie do zmiennych współdzielonych. Semafor full zlicza liczbę elementów w buforze (pełnych miejsc w tablicy). Wstrzymuje konsumenta, gdy w buforze nie ma żadnego elementu. Semafor empty zlicza liczby pustych miejsc w tablicy. Wstrzymuje producenta gdy w buforze nie ma wolnego miejsca.
Semafory 65 const int n; Semaphore empty(n),full(0),mutex(1); Item buffer[n]; int in = 0; Item pitem; while (1) { // produkujemy } empty.wait(); mutex.wait(); buffer[in] = pitem; in = (in+1) % n; mutex.signal(); full.signal(); int out = 0; Item citem; while (1) { full.wait(); mutex.wait(); citem = buffer[out]; out = (out+1) % n; mutex.signal(); empty.signal(); // konsumujemy }
Monitory 66 Monitory - strukturalny mechanizm synchronizacji wbudowanego w języki programowania wysokiego poziomu. Monitor to rodzaj klasy, której metody stanowią sekcję krytyczną. Atrybuty monitora są dostępne jedynie wewnątrz (metod) monitora. Konstrukcja monitora zapewnia, że tylko jeden proces na raz może znajdować się w monitorze. Pozostałe procesy oczekują w kolejce (FIFO). Jeśli jakiś proces chce wejść do monitora, który jest właśnie zajęty, to jest on wstawiany na koniec kolejki procesów oczekujących na wejście do monitora. Jeśli proces opuszcza monitor, a inne procesy czekają w kolejce na wejście do monitora, to pierwszy proces z kolejki wchodzi do monitora. W przypadku monitorów odpowiednie instrukcje synchronizujące są realizowane przez język programowania.