Monitory9, [W4] AIR SEMESTR VIII+II (MGR), KOMP. SYSTEMY STEROWANIA
[ Pobierz całość w formacie PDF ]
//-->J. UłasiewiczProgramowanie aplikacji współbieżnych111 Monitory11.1 Monitory abstrakcyjneSemafor nie jest mechanizmem strukturalnym. Aplikacje pisane zużyciem semaforów są podatne na błędy. Np. brak operacji sem_postblokuje aplikację.Monitor (Brinch Hansen, Hoare) jest strukturalnym narzędziemsynchronizacji.Monitory zaimplementowane w językach:Java, Modula-3, Concurrent Pascal, Concurrent Euclid.Definicja monitora1. Zmienne i działające na nich procedury zebrane są w jednymmodule. Dostęp do zmiennych monitora możliwy jest tylko zapomocą procedur monitora.2. W danej chwili tylko jeden proces wykonywać może procedurymonitora. Gdy inny proces wywoła procedurę monitora będzie onzablokowany do chwili opuszczenia monitora przez pierwszyproces.3. Istnieje możliwość wstrzymania i wznowienia procedur monitora zapomocą zmiennych warunkowych (ang.conditional variables).Nazmiennych warunkowych można wykonywać operacjeWaitiSignal.Wait(c)- Wstrzymanie procesu bieżącego wykonującego proceduręmonitora i wstawienie go na koniec kolejki związanej ze zmiennąwarunkową c. Jeżeli jakieś procesy czekają na wejście do monitora tojeden z nich będzie wpuszczony.Signal(c)– Odblokowanie jednego z procesów czekających nazmiennej warunkowej c. Gdy brak czekających procesów operacja niedaje efektów. OperacjaSignaljest bezpamięciowa (nie posiadalicznika).MonitoryPDF created with pdfFactory trial versionwww.pdffactory.comJ. UłasiewiczProgramowanie aplikacji współbieżnych2Notempty(c)– Funkcja zwraca true gdy kolejka c jest niepusta, falsegdy pusta.Jeśli nie jest to ostatnia instrukcja procedury monitora to proceswykonujący tę operację jest wstrzymany do chwili gdy wznowionyprzezeń proces zwolni monitor. Wstrzymany tak proces może przebywaćw:•wejściowej kolejce procesów oczekujących na wejście do monitora•kolejce uprzywilejowanejKtóre rozwiązanie zastosowano zależne jest od implementacji.P1 wejście domonitoraP1wait(c)P1 wyjście z monitoraP2P2 wejście domonitorasignal(c)P2 wyjście z monitoraMONITORZmiennewarunkoweProcesyoczekujące nawejście domonitoraC1Kolejka 2C2CNZmienneKolejka NProcesywstrzymane nazmiennychwarunkowychKolejka 1ProceduryKolejkauprzywilejowanaP1P2PkKolejki monitoraMonitoryPDF created with pdfFactory trial versionwww.pdffactory.comJ. UłasiewiczProgramowanie aplikacji współbieżnych3Procesyoczekujące nawejście domonitoraMONITOR MON;VAR c: CONDITIONPROCEDURE PR1(...)BEGIN...Wait(c);...END PR1;PROCEDURE PR1(...)BEGIN....Signal(c);...END PR2;...END MON;Procesywstrzymane naWait(c)FIFOProcesywstrzymane naSignal(c)FIFOLIFOPrzykład monitora11.1.1Rozwiązanie problemu wzajemnego wykluczania za pomocąmonitorówmonitor WzajemneWykluczanieint z1,z2;Pisz(int x1, int x2){z1 = x1;z2 = x2;};Czytaj(int *x1, int *x2){*x1 := z1;*x2 := z2;};Procedury Czytaj lub pisz wykonane będą w sposób wyłączny co wynikaz definicji monitora.MonitoryPDF created with pdfFactory trial versionwww.pdffactory.comJ. UłasiewiczProgramowanie aplikacji współbieżnych411.1.2Rozwiązanie problemu producenta i konsumenta za pomocąmonitorówP1K1ProducentBufxxxxKonsumenciOutInpmonitor ProducentKonsument#define N 8Record Buf[N];// Bufor na rekordyint Ile;// Ile rekordów w buforzeint Inp,Out;// Indeks wejściowy i wyjściowyCONDITION Prod; // Czekający producenciCONDITION Cons;// Czekający konsumenciWstaw(Record x ) {if(Ile == N) {Wait(Prod);}Inp := (Inp+1) % N;Buf(Inp) = x;Ile ++;Signal(Cons);}};Pobierz(Record *x ) {if(Ile == 0) {Wait(Cons);}Out := (Out+1) % N;*x = Buf(Inp)x;Ile --;Signal(Prod);}};Rozwiązanie problemu producenta / konsumenta za pomocą monitoraHoare’a (monitor ze wznawianiem).MonitoryPDF created with pdfFactory trial versionwww.pdffactory.comJ. UłasiewiczProgramowanie aplikacji współbieżnych511.1.3Rozwiązanie problemu czytelników i pisarzy za pomocąmonitorówmonitor CzytelnicyPisarzecondition Pisanie, Czytanie;// Kolejka pisarzy i czytelnikówint ReaderCount = 0;// Liczba czytelników w czytelniBoolean zajety = false;// true gdy w czytelni jest pisarzprocedure StartRead()if (zajety)Wait(Czytanie);ReaderCount++;Signal(Czytanie);}{// Gdy czytelnia zajęta - blokada// Wpuść następnego czytelnikaEndRead() {ReaderCount-- ;if(ReaderCount == 0) // Ostatni Czyt. wpuszcza pisarzySignal(Pisanie);}StartWrite() {// Czekaj gdy w czytelni jest pisarz lubif(zajety || ReaderCount != 0)Wait(Pisanie);zajety = true;}czytelnicyEndWrite() {zajety = false;// Gdy czekają czytelnicy to ich wpuść// Gdy czytelnicy nie czekają – wpuść pisarzyif (Notempty(Czytanie)) Signal(Czytanie);elseSignal(Pisanie);}Reader() {while (true) {StartRead();Czytaj(); // Wykonaj procedurę czytaniaEndRead();}}Writer() {while (true) {StartWrite();Pisz(); // Wykonaj procedurę pisaniaEndWrite();}}MonitoryPDF created with pdfFactory trial versionwww.pdffactory.com
[ Pobierz całość w formacie PDF ]