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.

end loop;end SEM_UNIX;Dostępna w systemie Unix operacja P(S,m), która umożliwia wstrzymanie procesu woczekiwaniu na dowolnie wybraną wartość m semafora S, nie daje się zrealizować w Adzie wprosty sposób. Problem polega na tym, że aby dowiedzieć się, na jaką. wartość czeka proces,trzeba najpierw spotkać się z nim. Jeśli w trakcie spotkania okaże się, że semafor nie maodpowiedniej wartości, spotkanie to musi się zakończyć, aby proces SEM_UNIX mógłzaakceptować wejście V. Jednak zakończenie spotkania oznacza zakończenie wstrzymywaniaprocesu obsługiwanego. W przykładzie 6.2.4 mieliśmy zbliżony problem i użyliśmy tam tablicywejść. Tutaj można zrobić podobnie.Jeśli zakres wartości parametru m jest bardzo ograniczony lub z góry wiadomo, jakie tobędą wartości, to odpowiednie instrukcje acceptP(m: in Integer)można jawnie wypisac. Naprzykład implementując w Adzie semafor M z przykładu 8.2.3, wystarczy dopisać w instrukcji:select galąźwhen s>=N => accept P(m: in Integer) do s := s - N; end P;ponieważ wiadomo, że wartością m będzie zawsze N. Jeśli zakres jest większy, trzebaskorzystać z pętli for takiej jak w przykładzie 6.2.4, wymusza to jednak aktywne czekanie.Jeśli wszystkie procesy wykonujące operację P(S, m) na danym semaforze sąumieszczone w jednej tablicy o indeksach 1. .N, to można rozbić tę operację na dwa etapy. Wpierwszym proces wywołujący przekazuje procesowi SEM_UNIX wartość m oraz swój indeks i,a w odpowiedzi otrzymuje informację, czy operacja P dala się wykonać natychmiast. Jeśli nie,to proces przechodzi do drugiego etapu, w którym wywołuje wejście DALEJ(i). Częśćspecyfikacyjną procesu SEM_UNIX należy rozszerzyć o następujące wejścia:entry P(m: in integer; i: in integer,przeszło: out boolean);entry DALEJ(1..N);W instrukcji select należy dodać gałąźaccept P(m: in integer; i: in integer;przeszło: out boolean) doprzeszło := mozna_przepuscic(m,i);end P;oraz zmodyfikować implementację wejścia V tak, aby wznawiać tyle procesów, ile w danejchwili można wznowić:accept V(m: in integer) dos := s + m;while mozna_wznowic(i) loopaccept DALEJ(i);end loop;end V;Funkcja logiczna mozna_przepuscic zmniejsza s o m, gdy jest to możliwe i wówczaszwraca wartość true, w przeciwnym razie zwraca wartość false zapamiętując w pomocniczychstrukturach indeks procesu i oraz jego zapotrzebowanie m. Wartością funkcji logicznejmozna_wznowic jest odpowiedź na pytanie, czy można wznowić (zgodnie z przyjętą strategią)jakiś proces. Jeśli tak, to zmniejsza ona s o zapotrzebowanie tego procesu i zwraca jegoindeks i. Trzeba również usunąć wejście P i odpowiednio zmodyfikować implementacjęwejścia CZEKP.173

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

Saved successfully!

Ooh no, something went wrong!