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.

Realizacja pierwszej wersji zadania jest banalna, ponieważ w Adzie procesy czekają naspotkanie w kolejce obsługiwanej zgodnie z dyscypliną FCFS. (W istocie jest to realizacjasemafora binarnego.)task DYSK isentry PRZYDZIEL;entry ZWOLNIJ;end;task body DYSK isbeginloopaccept PRZYDZIEL;accept ZWOLNIJ;end loop;end DYSK;Rozwiązanie wersji 2W Adzie nie ma możliwości priorytetowego szeregowania procesów w oczekiwaniu naspotkanie. Musimy więc zastosować tablicę wejść umożliwiająca określanie z góry numerucylindra, do którego żądanie można zaakceptować. Takie podejście prowadzi jednak doaktywnego czekania w procesie DYSK w wtedy, gdy nie ma żadnych żądań do dysku.C: constant Integer := ?; — liczba cylindrówtask DYSK isentry PRZYDZIEL(1..C);entry ZWOLNIJ;end;task body DYSK isbeginloopfor i in l..C loop — od krawędzi do środka cylindrawhile PRZYDZIEL(i)'count > 0 loop -- obsługa kolejkiaccept PRZYDZIEL(i);accept ZWOLNIJ;end loop;end loop;for i in reverse l..C loop — od środka do krawędziwhile PRZYDZIEL(i)'count > 0 loopaccept PRZYDZIEL(i);accept ZWOLNIJ;end loop;end loop;end loop;end DYSK;Ponieważ pojedyncze wykonanie instrukcji accept obsługuje tylko jedno spotkanie,musimy w pętli for umieścić instnikcję while, która umożliwi obsługę wszystkich procesówoczekujących na transmisję z tego samego cylindra. Podobnie jak w pierwszym rozwiązaniutego zadania w rozdz. 4, nieprzerwany strumień żądań do jednego cylindra może spowodowaćzagłodzenie innych procesów. Łatwo tę wadę usunąć. Wystarczy przed rozpoczęciem obsługiżądań do danego cylindra zapamiętać ich liczbę, up. w zmiennej j, a pętlę while zamienić napętlę for, która będzie wykonana dokładnie j razy.176

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

Saved successfully!

Ooh no, something went wrong!