Planowanie przydziału procesora Pojęcia podstawowe. Kryteria planowania. Algorytmy planowania. Planowanie wieloprocesorowe. Planowanie w czasie rzeczywistym. Ocena algorytmów. Wiesław Płaczek Systemy Operacyjne: Wykład 4 1
Pojęcia podstawowe Celem wieloprogramowania jest maksymalizowanie wykorzystania CPU przez utrzymywanie w działaniu pewnej liczby procesów (na jednym procesorze wykonywany jest tylko jeden proces, pozostałe czekają na swoją kolej). Dzięki przełączaniu procesora między różne procesy system operacyjny może zwiększyć wydajność komputera. Planowanie (scheduling) jest podstawową funkcją systemu operacyjnego podlega mu użytkowanie prawie wszystkich zasobów komputera. Planowanie przydziału procesora (CPU scheduling), który jest jednym a podstawowych zasobów komputera, leży u podstaw wieloprogramowych systemów operacyjnych. Sukces w planowaniu przydziału procesora zależy od obserwowalnej właściwości procesów: cykli działania procesora i oczekiwania na urządzenia WE/WY. Wiesław Płaczek Systemy Operacyjne: Wykład 4 2
Cykl faz procesora i WE/WY Procesy naprzemiennie przechodzą między fazą procesora (CPU burst) a fazą wejścia-wyjścia (I/O burst). załaduj do pamięci przechowaj dodaj do pamięci przechowaj czytaj zpliku czekaj na urządzenie WE/WY przechowaj przyrost indeksuj pisz do pliku czekaj na urządzenie WE/WY Faza procesora Faza WE/WY Faza procesora Faza WE/WY Częstość występowania fazy 160 140 120 100 80 60 40 20 0 0 8 16 24 32 40 Czas trwania fazy [milisekundy] Ciąg faz procesora i wejścia wyjścia Histogram czasów faz procesora (krzywa hiperwykładnicza) Wiesław Płaczek Systemy Operacyjne: Wykład 4 3
Planista przydziału procesora Planista przydziału procesora Planista przydziału procesora (CPU scheduler) wybiera jeden spośród gotowych do wykonania procesów w pamięci i przydziela mu procesor. Decyzje o przydziale procesora mogą zapadać kiedy proces: 1. przeszedł od stanu aktywności do stanu czekania; 2. przeszedł od stanu aktywności do stanu gotowości; 3. przeszedł od stanu czekania do stanu gotowości; 4. kończy działanie. Planowanie, które odbywa się tylko w sytuacjach 1 i 4 jest planowaniem niewywłaszczającym (nonpreemtive) lub inaczej: szeregowaniem bez wywłaszczania kandydatem do przydziału procesora musi być nowy proces (np. MS Windows 3.1). Każdy inny rodzaj planowania jest wywłaszczający (preemtive), zwany też szeregowaniem z wywłaszczaniem; kandydatem do przydziału jest również dany proces (np. UNIX). Wymaga wsparcia sprzętowego (np. czasomierz), a także ochrony danych (zwłaszcza danych jądra) i synchronizacji procesów. Wiesław Płaczek Systemy Operacyjne: Wykład 4 4
Program ekspediujący Ekspedytor lub dyspozytor (dispatcher) moduł, który faktycznie przekazuje procesor do dyspozycji procesu wybranego przez planistę krótkoterminowego. Obowiązki ekspedytora to: przełączanie kontekstu; przełączanie do trybu użytkownika; wykonanie skoku do odpowiedniej komórki w programie użytkownika w celu wznowienia działania programu. Czas zużywany przez ekspedytora na wstrzymanie jednego procesu i uaktywnienie innego nazywa się opóźnieniem ekspedycji (dispatch latency). Czas ten powinien być jak najkrótszy! Wiesław Płaczek Systemy Operacyjne: Wykład 4 5
Kryteria planowania Wykorzystanie procesora (CPU utilization) procesor powinien być możliwie jak najbardziej zajęty. Przepustowość (throughput) liczba procesów kończących się w jednostce czasu (np. 10 procesów na sekundę) Czas cyklu przetwarzania (turnaround time) czas potrzebny na wykonanie procesu (od momentu pojawienia się procesu w systemie do chwili jego zakończenia). Czas oczekiwania (waiting time) suma okresów czasu, które proces spędza czekając w kolejce procesów gotowych. Czas odpowiedzi (response time) czas między wysłaniem żądania (złożeniem zamówienia) a pojawieniem się pierwszej odpowiedzi; nie obejmuje czasu potrzebnego na wyprowadzenie odpowiedzi (zależny od urządzenia WY). Ważne kryterium planowania dla systemów interakcyjnych. Wiesław Płaczek Systemy Operacyjne: Wykład 4 6
Kryteria optymalizacji Maksymalne wykorzystanie procesora. Maksymalna przepustowość. Minimalny czas cyklu przetwarzania. Minimalny czas czekania. Minimalny czas odpowiedzi. Najczęściej optymalizuje się miarę średnią. Czasami bardziej pożądana jest optymalizacja wartości minimalnych lub maksymalnych, np. zmniejszenie maksymalnego czasu odpowiedzi w sprawiedliwych systemach interakcyjnych. Według niektórych analityków w systemach interakcyjnych ważniejsza jest minimalizacja wariancji czasu odpowiedzi niż jego średniej system z przewidywalnym czasem odpowiedzi może być bardziej pożądany niż system, który ma bardzo zmienny czas odpowiedzi, choć przeciętnie krótszy. Wiesław Płaczek Systemy Operacyjne: Wykład 4 7
Algorytmy planowania Algorytm FCFS: Najprostszy algorytm planowania przydziału procesora algorytm pierwszy zgłoszony pierwszy obsłużony (first-come, first-served FCFS). Implementacja za pomocą kolejek FIFO (first-in, first-out). Przykład: Proces Czas trwania fazy [ms] P1 24 P2 3 P3 3 Przypuśćmy, że procesy nadeszły w kolejności: P1, P2, P3 diagram Gantta (Gantt chart): P1 P2 P3 0 24 27 30 Czas oczekiwania: t1 = 0, t2 = 24, t3 = 27; Średni czas oczekiwania: tś = (0 + 24 + 27)/3 = 17 Wiesław Płaczek Systemy Operacyjne: Wykład 4 8
Algorytm FCFS c.d. Przypuśćmy, że procesy nadeszły w kolejności: Diagram Gantta: P2, P3, P1; P2 P3 P1 0 3 6 30 Czas oczekiwania: t1 = 6, t2 = 0, t3 = 3; Średni czas oczekiwania: tś = (6 + 0 + 3)/3 = 3 Znacznie krótszy niż poprzednio! Efekt konwoju (convoy effect) procesy krótkie czekają na zwolnienie procesora przez proces długi. Algorytm FCFS jest niewywłaszczający. Algorytm FCFS jest kłopotliwy w systemach z podziałem czasu. Wiesław Płaczek Systemy Operacyjne: Wykład 4 9
Algorytm SJF Algorytm SJF Algorytm najpierw najkrótsze zadanie (shortest-job-first SJF) przydziela CPU procesowi mającemu najkrótszą następną fazę procesora. Możliwe są dwa schematy: Niewywłaszczający: żaden proces nie jest wywłaszczany podczas wykonywania fazy procesora. Wywłaszczający: bieżący proces jest wywłaszczany przez nowy proces, którego następna faza procesora jest krótsza o pozostałej części fazy procesora bieżącego procesu. Schemat ten zwany jest planowaniem najpierw najkrótszy pozostały czas (shortest-remaining-time-first SRTF). Algorytm SJF jest optymalny daje minimalny średni czas oczekiwania dla danego zbioru procesów. Łatwiejszy do realizacji w planowaniu długoterminowym (np. w systemach wsadowych), trudniejszy w planowaniu krótkoterminowym brak sposobu na poznanie długości następnej fazy procesora (można jedynie zgadywać). Wiesław Płaczek Systemy Operacyjne: Wykład 4 10
Przykład zastosowania algorytmu SJF Proces Czas przybycia Czas trwania fazy P1 0 7 P2 2 4 P3 4 1 P4 5 4 Niewywłaszczający algorytm SJF: P1 P3 P2 P4 0 7 8 12 16 Średni czas oczekiwania: tś = (0 + 6 + 3 + 7)/4 = 4 Wywłaszczający algorytm SJF: P1 P2 P3 P2 P4 P1 0 2 4 5 7 11 16 Średni czas oczekiwania: tś = (9 + 1 + 0 + 2)/4 = 3 Wiesław Płaczek Systemy Operacyjne: Wykład 4 11
Długość następnej fazy procesora Długość następnej fazy procesora może być jedynie przewidywana, np. na podstawie jego wcześniejszych faz! Na ogół używa się metody średniej wykładniczej pomiarów długości poprzednich faz procesora: 1. t n faktyczna długość n-tej fazy procesora; 2. τ n +1 przewidywana wartość następnej fazy procesora; 3. α, 0 α 1; 4. Definiujemy: τ n+ 1 = αtn + (1 α) τ n. Przykłady: α = 0: τ n +1 = τ n niedawna historia nie ma wpływu na wynik. α = 1: τ n +1 = t n liczy się tylko najnowsza długość fazy. Rozwijając powyższą formułę otrzymujemy: τ n+ 1 = αtn n n j τ j n+ 1 + ( 1 α) αt 1 +... + (1 α) αt +... + (1 α) 0. Ponieważ: α, (1 α) < 1, to każdy następny składnik ma mniejszą wagę niż poprzednik; często przyjmuje się α = 0.5 ( τ 0 wartość początkowa: definiowana jako stała lub średnia z całego systemu). Wiesław Płaczek Systemy Operacyjne: Wykład 4 12
Planowanie priorytetowe Planowanie priorytetowe W algorytmie priorytetowym każdemu procesowi przypisuje się priorytet w postaci pewnej liczby całkowitej zazwyczaj: im mniejsza liczba tym wyższy priorytet, ale bywa też odwrotnie. Procesor jest przydzielany procesowi o najwyższym priorytecie. Priorytety mogą być definiowane wewnętrznie (na podstawie jakichś mierzalnych własności procesu) lub zewnętrznie (ważność procesu, czynniki polityczne itd.). Algorytm priorytetowy może być wywłaszczający lub niewywłaszczający. Algorytm SJF jest algorytmem priorytetowym, gdzie priorytet p jest proporcjonalny do przewidywanej długości następnej fazy procesora τ (im krótsza faza tym wyższy priorytet). Problem: (za)głodzenie (starvation) procesy o niskim priorytecie mogą nigdy nie zostać dopuszczone do procesora! Rozwiązanie: postarzanie (aging) procesów stopniowe podwyższanie priorytetów procesów długo oczekujących. Wiesław Płaczek Systemy Operacyjne: Wykład 4 13
Planowanie rotacyjne Planowanie rotacyjne Algorytm planowania rotacyjnego (round-robin RR) jest podobny do algorytmu FCFS, ale w celu przełączania procesów dodano w nim wywłaszczanie i cykliczną kolejkę. Każdy proces dostaje małą jednostkę czasu procesora, tzw. kwant czasu (time quantum) (zwykle 10 do 100 milisekund) po jej upływie proces jest wywłaszczany i wysyłany na koniec kolejki procesów gotowych, będącą kolejką typu FIFO. Dla n procesów w kolejce i kwantu czasu q, każdy proces dostaje 1/n czasu procesora porcjami, których wartość nie przekracza q żaden proces nie czeka dłużej niż (n-1)q jednostek czasu. Długość kwantu czasu: bardzo duża (nieskończona) algorytm FCFS. bardzo mała (np. 1 µs) dzielenie procesora (processor sharing). Kwant czasu powinien być długi w porównaniu z czasem przełączania kontekstu, w przeciwnym razie narzut związany z przełączaniem kontekstu jest zbyt wysoki! Typowa reguła: 80% faz procesora krótszych od kwantu czasu. Wiesław Płaczek Systemy Operacyjne: Wykład 4 14
Przykład użycia algorytmu rotacyjnego Niech kwant czasu: q = 4 ms. Weźmy trzy procesy: Proces Czas trwania fazy P1 24 P2 3 P3 3 Diagram Gantta: P1 P2 P3 P1 P1 P1 P1 P1 0 4 7 10 14 18 22 26 30 Średni czas oczekiwania: tś = (6 + 4 + 7)/3 = 5.66 ms Typowo dłuższy cykl przetwarzania niż w algorytmie SJF, ale krótszy czas odpowiedzi! Zaprojektowany specjalnie dla systemów z podziałem czasu Wiesław Płaczek Systemy Operacyjne: Wykład 4 15
Wielopoziomowe planowanie kolejek Wielopoziomowe planowanie kolejek Kolejka procesów gotowych jest podzielona na osobne kolejki: 1. Procesy pierwszoplanowe (foreground) interakcyjne; 2. Procesy drugoplanowe (background) wsadowe. Każda kolejka ma swój własny algorytm planujący: 1. Pierwszoplanowa: np. algorytm rotacyjny; 2. Drugoplanowa: np. algorytm FCFS. Musi istnieć planowanie między kolejkami: Planowanie stałopriorytetowe z wywłaszczeniem, np. kolejka pierwszoplanowa ma wyższy priorytet niż drugoplanowa możliwość zagłodzenia! Przydział porcji czasu procesora dla każdej z kolejek, np. 80% czasu procesora dla kolejki pierwszoplanowej (z planowaniem rotacyjnym), a 20% dla drugoplanowej (z planowaniem FCFS). Wiesław Płaczek Systemy Operacyjne: Wykład 4 16
Przykład kolejek wielopoziomowych Najwyższy priorytet Procesy systemowe Procesy interakcyjne Procesy redagowania interakcyjnego Procesy wsadowe Najniższy priorytet Procesy studenckie Wiesław Płaczek Systemy Operacyjne: Wykład 4 17
Planowanie wielopoziomowych kolejek ze sprzężeniem zwrotnym W zwykłym algorytmie wielopoziomowego planowania kolejek proces jest na stałe przypisany do określonej kolejki (brak elastyczności). Planowanie wielopoziomowych kolejek ze sprzężeniem zwrotnym (multilevel feedback queue) umożliwia przemieszczanie procesów między różnymi kolejkami: proces zużywający dużo czasu procesora zostaje przeniesiony do kolejki o niższym priorytecie i odwrotnie. Planista wielopoziomowych kolejek ze sprzężeniem zwrotnym jest określony za pomocą następujących parametrów: Liczba kolejek; Algorytm planowania dla każdej kolejki; Metoda użyta do decydowania o awansowaniu procesu do kolejki o wyższym priorytecie; Metoda użyta do decydowania o zdymisjonowaniu procesu do kolejki o niższym priorytecie; Metoda wyznaczająca kolejkę, do której trafia proces potrzebujący obsługi. Jest to najogólniejszy algorytm planowania przydziału procesora. Wiesław Płaczek Systemy Operacyjne: Wykład 4 18
Kolejki wielopoziomowe ze sprzężeniem zwrotnym Najwyższy priorytet Kolejka 0 Kwant = 8 Kwant = 16 Kolejka 1 FCFS Kolejka 2 Najniższy priorytet Proces, który nie wykona się w danym kwancie czasu jest wysyłany do kolejki o niższym priorytecie (i większym kwancie czasu). Wiesław Płaczek Systemy Operacyjne: Wykład 4 19
Planowanie wieloprocesorowe W systemach wieloprocesorowych planowanie przydziału CPU jest bardziej skomplikowane. A. Systemy homogeniczne (identyczne procesory): Dzielenie obciążeń (load sharing) wszystkie procesy trafiają do jednej kolejki i są przydzielane do dowolnego z dostępnych procesorów. Struktura master-slave jeden procesor pełni funkcję planisty dla pozostałych procesorów. Wieloprzetwarzanie asymetryczne (asymmetric multiprocessing) jeden procesor (serwer główny) wykonuje planowanie, operacje WE/WY i inne czynności systemowe; pozostałe wykonują tylko kod użytkowy. B. Systemy heterogeniczne (różne procesory) planowanie dedykowane dla danego systemu. Wiesław Płaczek Systemy Operacyjne: Wykład 4 20
Planowanie w czasie rzeczywistym Rygorystyczne systemy czasu rzeczywistego do wypełniania krytycznych zadań w gwarantowanym czasie. Proces jest dostarczany wraz z instrukcją określającą potrzeby czasowe. Na postawie tych danych planista akceptuje proces, zapewniając wykonanie go na czas, lub odrzuca zlecenie jako niewykonalne. Niemożliwe udzielenie gwarancji wykonania procesu w zadanym czasie w systemach z pamięcią pomocniczą lub wirtualną. Łagodne systemy czasu rzeczywistego procesy o decydującym znaczeniu uzyskują priorytet nad innymi procesami: Planowanie musi być priorytetowe; Procesy czasu rzeczywistego muszą mieć najwyższy priorytet, a ich priorytety nie mogą maleć z upływem czasu. Opóźnienie ekspediowania procesów do procesora musi być małe: o Wstawianie w długotrwałych funkcjach systemowych punktów wywłaszczeń, w których może nastąpić przełączenie kontekstu. o Możliwość wywłaszczenia całego jądra potrzebna ochrona danych jądra przy pomocy mechanizmów synchronizacji (np. Solaris 2). Wiesław Płaczek Systemy Operacyjne: Wykład 4 21
Opóźnienie ekspedycji Zdarzenie Przetwarzanie przerwania Czas do nadejścia odpowiedzi Proces osiąga gotowość do działania Opóźnienie ekspedycji Konflikty Ekspedycja Odpowiedź na zdarzenie Wykonanie procesu w czasie rzeczywistym Czas Faza konfliktowa (conflict phase) obejmuje: 1. Wywłaszczenie wszelkich procesów działających w jądrze. 2. Zwolnienie przez procesy niskopriorytetowe zasobów potrzebnych procesowi wysokopriorytetowemu. Wiesław Płaczek Systemy Operacyjne: Wykład 4 22
Ocena algorytmów Modelowanie deterministyczne (deterministic modeling) przyjmuje konkretne, z góry określone obciążenie robocze systemu i definiuje zachowanie algorytmu dla danego obciążenia (np. dla zbioru procesów o określonych długościach faz procesora porównuje się średnie czasy oczekiwania dla różnych algorytmów). Jest proste i szybkie, daje dokładne liczby (łatwo porównywalne). Wymaga zbyt wiele dokładnej wiedzy i dotyczy zbyt specyficznych sytuacji nie może być ogólnie użyteczne. Modele obsługi kolejek (queuing models) ustala się rozkłady faz procesora i WE/WY, czasów przybywania procesów (np. na podstawie pomiarów) i w oparciu o nie oblicza się średnią przepustowość, wykorzystanie procesora, czas oczekiwania itd. dla różnych algorytmów planowania. Potrzebne są pewne założenia (np. uproszczone rozkłady), co może prowadzić do niedokładnych, a czasem nierealistycznych wyników. Symulacje komputerowe modelowanie systemu komputerowego (zwykle przy użyciu technik Monte Carlo), np. z użyciem taśm śladów. Dostarczają dokładniejszych wyników, ale mogą być kosztowne i czasochłonne. Implementacja testowanie algorytmu w rzeczywistym systemie. Wiesław Płaczek Systemy Operacyjne: Wykład 4 23
Ocena planowania CPU przez symulacje Faktyczne dane o wykonaniu procesu Procesor 10 WE/WY 203 Procesor 12 WE/WY 203 Procesor 4 WE/WY 154 Symulacja Metoda FCFS Symulacja Metoda FJS Statystka działania metodą FCFS Statystka działania metodą FJS Procesor 126 Taśma ze śladem Symulacja Metoda RR (Q=14) Statystka działania metodą rotacyjną (Q=14) Taśma śladów (trace tape) taśma z zapisem zdarzeń rzeczywistego systemu. Wiesław Płaczek Systemy Operacyjne: Wykład 4 24
Planowanie procesów w systemie Linux Dwa oddzielne algorytmy planowania procesów: Algorytm z podziałem czasu do sprawiedliwego planowania z wywłaszczeniami działania wielu procesów. Algorytm dla zadań czasu rzeczywistego, gdzie priorytety bezwzględne są ważniejsze niż sprawiedliwość. W skład tożsamości każdego procesu wchodzi klasa planowania, określająca, który z algorytmów ma być użyty dla procesu. Dla zwykłych procesów z podziałem czasu stosowany jest algorytm priorytetowy oparty na kredytowaniu: kredyt = kredyt/2 + priorytet Do wykonania wybierany jest proces o największym kredycie. Kredyt wykonywanego procesu jest obniżany o jedną jednostkę przy każdym przerwaniu zegara kiedy kredyt spadnie do zera, proces jest zawieszany. Kiedy żaden z procesów gotowych do działania nie ma kredytu, następuje wtórne kredytowanie każdego procesu w systemie (a nie tylko procesów gotowych). Dla procesów czasu rzeczywistego realizowane są dwie klasy planowania: Algorytm FCFS; Algorytm RR (rotacyjny). Każdy proces posiada priorytet planista uruchamia ten o najwyższym priorytecie! Kod jądra nie może być wywłaszczony przez kod trybu użytkownika! Wiesław Płaczek Systemy Operacyjne: Wykład 4 25
Planowanie procesów w Windows XP System Windows XP planuje wątki za pomocą priorytetowego algorytmu wywłaszczającego. Planista sprawia, że zawsze wykonywany jest wątek o najwyższym priorytecie. Fragment jądra, który zajmuje się planowaniem nazywa się dyspozytorem. Wątek wybrany przez dyspozytora będzie wykonywany aż do: wywłaszczenia przez wątek o wyższym priorytecie, zakończenia, wyczerpania kwantu czasu lub użycia w nim blokującego wywołania systemowego (np. operacji WE/WY). Priorytety podzielone są na dwie klasy: Klasa zmienna priorytety od 1 do 15; priorytet jest zmniejszany przy przerwaniu czasomierza, a zwiększany po zakończeniu czekania (np. na operację WE/WY). Klasa czasu rzeczywistego priorytety od 16 do 31; Istnieje też wątek z priorytetem 0, służący do zarządzania pamięcią. Z każdym priorytetem związana jest kolejka wątków; jeżeli żaden wątek nie jest gotowy, to wykonywany jest wątek postojowy (idle thread). Win32 API wyróżnia 6 klas priorytetów, a w obrębie każdej z klas określa 7 priorytetów względnych są one odpowiednio powiązane z priorytetami liczbowymi jądra; każda klasa posiada odpowiedni priorytet podstawowy. Ponadto Windows XP rozróżnia proces pierwszoplanowy aktualnie działający na ekranie, któremu zwiększa kwant czasu (typowo 3-krotnie) i procesy drugoplanowe w celu polepszenia wydajności pracy interakcyjnej. Wiesław Płaczek Systemy Operacyjne: Wykład 4 26
Planowanie procesów w systemie Solaris Solaris stosuje priorytetowe planowanie procesów cztery klasy planowania: Klasa czasu rzeczywistego; Klasa systemowa; Klasa interakcyjna; Klasa podziału czasu. W każdej klasie są różne priorytety i różne algorytmy planowania. Domyślną klasą planowania procesu jest klasa podziału czasu. W polityce planowania podziału czasu używane są wielopoziomowe kolejki ze sprzężeniem zwrotnym do dynamicznego zmieniania priorytetów oraz przydzielania odcinków czasu o różnych długościach (domyślnie: im wyższy priorytet, tym krótszy odcinek czasu i odwrotnie). Procesy interakcyjne mają z reguły wyższy priorytet, procesy ograniczone przez procesor mają priorytet niższy. Taka polityka planowania daje dobry czas odpowiedzi procesów interakcyjnych i dobrą przepustowość dla procesów ograniczonych przez procesor. Klasa systemowa służy do wykonywania procesów jądra priorytet takiego procesu pozostaje niezmienny przez cały czas wykonywania. Wątki w klasie czasu rzeczywistego otrzymują najwyższy priorytet daje to gwarancję uzyskania odpowiedzi w ograniczonym odstępie czasu (do tej klasy należy na ogół niewiele procesów). Wiesław Płaczek Systemy Operacyjne: Wykład 4 27
Synchronizacja procesów Podstawy. Problem sekcji krytycznej. Sprzętowe środki synchronizacji. Semafory. Klasyczne problemy synchronizacji. Regiony krytyczne. Monitory. Wiesław Płaczek Systemy Operacyjne: Wykład 4 28
Podstawy Proces współpracujący może wpływać na inne procesy w systemie lub podlegać ich oddziaływaniom, np. przez dzielenie danych. Współbieżny dostęp do danych dzielonych może powodować ich niespójność. Zachowanie spójności danych dzielonych wymaga mechanizmu zapewniającego uporządkowane wykonywanie współpracujących procesów. Typowym modelem dla tego rodzaju zagadnień jest problem producenta i konsumenta z ograniczonym buforem. Wiesław Płaczek Systemy Operacyjne: Wykład 4 29
Problem Producent Konsument Dzielone dane: #define ROZM_BUF 10 typedef struct {... } jednostka; jednostka bufor[rozm_buf]; int we = 0, wy = 0, licznik = 0; Proces Producenta: jednostka nastprod; while (1) { while (licznik == ROZM_BUF) ; /* nic nie rób */ bufor[we] = nastprod; we = (we + 1) % ROZM_BUF; licznik++; } Proces Konsumenta: jednostka nastkons; while (1) { while (licznik == 0) ; /* nie nie rób */ nastkons = bufor[wy]; wy = (wy + 1) % ROZM_BUF; licznik--; } Wiesław Płaczek Systemy Operacyjne: Wykład 4 30
Implementacja Producenta Konsumenta Procedury Producenta i Konsumenta są poprawne każda z osobna, ale współbieżnie mogą nie działać prawidłowo! Instrukcje licznik++ i licznik-- można zaimplementować: licznik++ licznik-- rejestr1 = licznik; rejestr2 = licznik; rejestr1 = rejestr1 + 1; rejestr2 = rejestr2-1; licznik = rejestr1; licznik = rejestr2; Możliwy jest następujący przeplot powyższych instrukcji: Producent: rejestr1 = licznik; (rejestr1 = 5) Producent: rejestr1 = rejestr1 + 1; (rejestr1 = 6) Konsument: rejestr2 = licznik; (rejestr2 = 5) Konsument: rejestr2 = rejestr2-1; (rejestr2 = 4) Producent: licznik = rejestr1; (licznik = 6) Konsument: licznik = rejestr2; (licznik = 4) Wartość zmiennej licznik może być 4, 5 lub 6 w zależności od kolejności wykonania instrukcji w języku maszynowym! Wiesław Płaczek Systemy Operacyjne: Wykład 4 31
Szkodliwa rywalizacja Szkodliwa rywalizacja (race condition) sytuacja, w której kilka procesów współbieżnie sięga po te same dane i wykonuje na nich działania, wskutek czego wynik zależy od porządku, w jakim następował dostęp do danych. Aby ustrzec się przed szkodliwą rywalizacją, współbieżność procesów musi być synchronizowana. W powyższym przykładzie problemu Producenta Konsumenta każda z instrukcji: licznik++; licznik--; musi być niepodzielna (atomowa), tzn. musi zostać wykonana w całości bez przerwania! Wiesław Płaczek Systemy Operacyjne: Wykład 4 32