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.

end;with s^ do beginpocz := rozmiar;koń := rozmiar;poprz := początek;nast := nilend;end; {PAMIĘĆ.OPERACYJNA}Funkcja znaleziona wyszukuje zgodnie ze strategią. First Fit wolną strefę pamięci orozmiarze nie mniejszym od żądanego. Jeśli znajdzie się taką strefę, to tworzy się nowązajętą i wstawia ją do listy stref. Jeżeli się nie znajdzie, to zapotrzebowanie procesuzapamiętuje się w zmiennej chce i proces jest wstrzymywany.Pętla while w procedurze PRZYDZIEL jest potrzebna tylko po to, aby proceswstrzymany na warunku PIERWSZE wykonał po wznowieniu funkcję znaleziona. Wartością tejfunkcji na pewno będzie true (w procedurze ZWOLNIJ sprawdzono, że jest dostatecznie dużastrefa), ale nastąpi w niej przydział strefy wznawianemu procesowi.Procedura ZWOLNIJ wyszukuje strefę i usuwa ją z listy zajętych. Jeżeli jest jakiśwstrzymany proces i jego zapotrzebowanie można zaspokoić, to ten proces będziewznowiony.4.4.17 Strategia buddyMonitor zarządzający listą wolnych obszarów o wielkości c * 21 będzie zawierał kolejkęKOLEJKA procesów czekających na wolny obszar. Liczbę wolnych obszarów będzie określaćzmienna wolne. W zmiennej czeka będzie się pamiętać liczbę czekających procesów, a wnaile — liczbę wolnych obszarów, na które te procesy czekają. Pierwszy proces, który zaczynaczekać, czeka bowiem nie na jeden wolny obszar, lecz na dwa powstałe w wyniku podziałuobszaru większego. Gdy zaczyna czekać drugi proces, oba nadal czekają tylko na dwa wolneobszary. Gdy pojawi się trzeci proces, liczba obszarów, na które będą teraz czekały, wyniesiecztery itd. Ogólnie czeka się zawsze na parzystą liczbę wolnych obszarów, ale liczbaprocesów czekających może być nieparzysta.Proces, który żąda wolnego obszaru w chwili, gdy ich nie ma, zwiększa liczbęczekających, a następnie sprawdza, czy nie przekroczył w ten sposób liczby oczekiwanychobszarów. Jeśli przekroczył, to inicjuje proces DZIEL wywołując procedurę start.dziel.Po wznowieniu z kolejki KOLEJKA proces otrzymuje adres żądanego obszaru wzmiennej taca. Dzięki jej zastosowaniu, zaoszczędzono zbędnego wstawiania do listy wolnegoobszaru, który i tak za chwilę będzie z niej usunięty.W przypadku, gdy nikt nie czeka na obszar, w procedurze ZWOLNIJ trzeba wyznaczyćadres kumpla i ewentualnie odszukać go na liście. W tym celu określa się, którą połówkęproces zwalnia. Jeśli adres zwalnianego obszaru dzieli się całkowicie przez c * 2+i, to jest topierwsza połówka, trzeba więc szukać drugiej.W procedurze KONIEC_DZIEL trzeba uwzględnić trzy przypadki. Jeśli już nikt nieczeka na wolny obszar (bo czekające procesy otrzymały je w wyniku wykonania proceduryZWOLNIJ), to oba obszary trzeba ponownie połączyć. Jeśli jakiś proces czeka, to należy mupodać wolny obszar w zmiennej taca. Gdy sterowanie wróci do procedury KONIEC_DZIELsprawdza się znowu, czy ktoś czeka. Jeśli tak, to należy mu podać „na tacy" adres drugiegowolnego obszaru, jeśli nie, to wolny obszar trzeba wstawić do listy wolnych obszarów.const K = ?;105

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

Saved successfully!

Ooh no, something went wrong!