12.07.2015 Views

Spis treœci - Patrz

Spis treœci - Patrz

Spis treœci - Patrz

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

procedure signal; {signal i wyjście}beginif not [ nP(L), V(C) ] then V(W)end;function empty: boolean;beginempty := wart(L) = 0end;procedure wyjście; {wyjście bez signal}beginV(W)end;Semafor L służy tylko do liczenia procesów czekających pod semaforem C naspełnienie warunku, więc na pierwszy rznt oka wydaje się, że jest on zbędny. Można byprzecież w procedurze signal zastosować instrukcję:if czekP(C) > 0 then V(C) else V(W)Mogłoby się jednak zdarzyć, że proces wykonujący procedurę wait nie rozpoczął jeszczeoperacji P(C), a już inny wykonujący procedurę signal (która mogła przecież rozpocząć się porozpoczęciu operacji wait) stwierdził, że żaden proces nie czeka pod semaforem C.Oznaczałoby to, że operacja V(C) nie będzie wykonana i proces, który dokończy waitwykonując P(C), pozostanie wstrzymany. Sprawdzanie warunku w procedurze signal jestbezpieczne, gdyż odbywa się po przejściu pod semaforem W, a więc w monitorze.Warto porównać powyższe rozwiązanie z rozwiązaniem przedstawionym w [Tane92], wktórym brak jest liczenia procesów wstrzymanych w monitorze.W rezultacie procedura wait składa się tylko z instrukcji V(W) ; P(C), a signal — zbezwarunkowo wykonywanej instrukcji V(C). Jest zatem możliwe równoczesne wykonywanieprocedur monitora przez wiele procesów, a także całkowite zablokowanie monitora.A oto kod podanych procedur w języku C. Funkcja przygotuj ma tu o jeden parametrwięcej niż w przykładzie 8.2.3, gdyż potrzebne są operacje nieblokujące.#include #include #include static int W = 0; /* semafor o numerze 0 */static int L = 1; /* semafor o numerze 1 */static int C = 2; /* semafor o numerze 2 */static int sem;static struct sembuf buf[3];void deklaracja (void){/* utworzenie trzyelementowego zbioru semaforów */sem = semget(l, 3, IPC_CREAT | 0666);}void inicjacja (void){semctl (sem, W, SETVAL, 1); /* W: semaphore := 1 */semctl (sem, L, SETVAL, 0); /* L: semaphore := 0 */semctl (sem, C, SETVAL, 0); /* C: semaphore := 0 */}static void przygotuj (int i, int sem_num, int sem_op, int sem_flg)217

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!