12.07.2015 Views

Spis treœci - Patrz

Spis treœci - Patrz

Spis treœci - Patrz

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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

służąca do przechowywania wartości semafora, i zmienna KOLEJKA typu condition, doewentualnego wstrzymywania procesów wykonujących operację P. Po zwiększeniu wartościzmiennej semafor w procedurze V następuje bezwarunkowe wykonanie operacjisignal(KOLEJKA). Jeżeli nie czeka żaden proces, to efekt tej operacji jest pusty.Implementacja semafora za pomocą monitora różni się nieco od klasycznego semafora.Procesy są wznawiane w monitorze w takiej samej kolejności, w jakiej były wstrzymane.Natomiast w definicji semafora zakłada się tylko, że wstrzymany proces będzie wznowiony wskończonym czasie, czyli że nie będzie zagłodzony. W niektórych definicjach semafora mówisię o „sprawiedliwym" wznawianiu procesów. W monitorze wznawianie zrealizowano wnajbardziej sprawiedliwej postaci.monitor SEMAFOR;var semafor: integer;KOLEJKA: condition;export procedure P;beginif semafor = O then wait(KOLEJKA);semafor := semafor - lend; {P}export procedure V;beginsemafor := semafor + 1;signal(KOLEJKA)end; {V>beginsemafor := Oend; {SEMAFOR}4.2.2 Producenci i konsumenciBufor służący do komunikacji między producentami i konsumentami jest ukrytywewnątrz monitora BUFOR, który udostępnia dwie procedury: WSTAW i POBIERZ. ZmiennaPRODUCENCI służy do wstrzymywania producentów, gdy bufor jest pełny, a zmiennaKONSUMENCI - do wstrzymywania konsumentów, gdy bufor jest pusty. Zmienna ile wskazujeliczbę zajętych elementów bufora.monitor BUFOR;const N = ?;var bufor: array[0..N-l] of porcja;ile, do.włożenia, do.wyjęcia: integer;PRODUCENCI, KONSUMENCI: condition;export procedure WSTAW(element: porcja);beginif ile = N then wait(PRODUCENCI);do_włożenia := (do.wlożenia + 1) mód N;bufor[do_włożenia] := element;ile := ile + 1;signal(KONSUMENCI)end; {WSTAW}export procedure POBIERZ(var element: porcja);beginif ile = O then wait(KONSUMENCI);do.wyjęcia := (do.wyjecia + 1) mód N;69

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

Saved successfully!

Ooh no, something went wrong!