• Nie Znaleziono Wyników

Algorytmy przydziału pamięci

5. ZARZĄDZANIE PAMIĘCIĄ OPERACYJNĄ

5.3. Algorytmy przydziału pamięci

W rozdziale będą poddane analizie metody przydziału pamięci na różnych etapach rozwoju systemów operacyjnych. Niektóre z nich są szeroko stosowane we współczesnych systemach operacyjnych, podczas gdy inne mają dzisiaj wyłącznie znaczenie historyczne. Na rys. 5.7 przedstawiono ogólną klasyfikację metod przydziału pamięci. Wydzielono dwie grupy metod: metody, w których wykorzystuje się mechanizmy przenoszenia procesów między pamięcią operacyjną a pamięcią zewnętrzną, oraz metody, w których nie wykorzystuje się pamięci zewnętrznej.

Metody przydziału pamięci

Bez wykorzystania pamięci zewnętrznej

Z wykorzystaniem pamięci zewnętrznej

Bloki o stałym rozmiarze Dynamiczny przydział bloków Przemieszczane bloki pamięci

Stronicowanie pamięci Segmentacja pamięci Segmentacja stronicowana Rys. 5.7. Klasyfikacja metod przydziału pamięci

5.3.1. Przydział pamięci oparty o bloki o stałym rozmiarze

Najprostszy sposób zarządzania pamięcią jest oparty na podziale jej na stałe bloki o określonym rozmiarze. Taki podział może być dokonany przez operatora np. podczas startu systemu, a następnie podczas pracy systemu granice między poszczególnymi blokami nie ulegają przemieszczeniom (rys. 5.8). Nowo powołany proces zostaje umieszczony w ogólnej kolejce procesów oczekujących na umieszczenie w pamięci lub w jednej z kolejek związanych z poszczególnymi blokami w pamięci.

Podsystem zarządzania pamięcią realizuje w tym przypadku następujące operacje:

 porównuje rozmiar pamięci niezbędny dla nowego procesu z rozmiarami wolnych bloków oraz wybiera odpowiedni blok,

 ładuje do zadanego bloku nowy proces oraz ustala adresy.

Blok odpowiedni dla procesu może być w tym przypadku określony już na etapie kompilacji programu, co pozwala na ustalenie adresów fizycznych przez kompilator.

Zaletą tej metody jest prostota realizacji, jednak bardzo istotną wadą jest mała elastyczność. Ponieważ w danym bloku może być wykonywany tylko jeden proces, stopień wieloprocesowości systemu jest ograniczony przez liczbę

bloków w pamięci (proces zajmuje cały blok niezależnie od jego rozmiaru). Dla przykładu, w systemie z ośmioma blokami w pamięci można wykonywać jednocześnie maksymalnie osiem procesów, mimo że procesy mogą zajmować niewielką część pamięci. Z drugiej strony podział pamięci na bloki wyklucza możliwość wykonania procesu o rozmiarze większym od rozmiaru pojedynczego bloku. . . . Proces 1 Proces 2

Proces 3

System

operacyjny

Kolejka procesów Blok nr 1 Blok nr 2 Blok nr 3 Blok nr n

Rys. 5.8. Podział pamięci na bloki o stałych rozmiarach

Ten sposób przydziału pamięci był stosowany w pierwszych wielozadaniowych systemach operacyjnych. Współcześnie metodę bloków pamięci o stałym rozmiarze można spotkać w niektórych systemach operacyjnych czasu rzeczywistego, w których jest niezbędna duża szybkość pracy.

5.3.2. Dynamiczny przydział bloków

W tym przypadku każdemu procesowi jest przydzielany niezbędny obszar pamięci na etapie tworzenia procesu. Jeśli w danym momencie w pamięci operacyjnej nie ma wolnego ciągłego obszaru o odpowiednim rozmiarze, to proces nie jest tworzony. Po zakończeniu pracy procesu pamięć po nim zostaje zwolniona, a na to miejsce może zostać załadowany nowy proces. W ten sposób podczas pracy systemu w pamięci występuje szereg obszarów zajętych przez aktualnie realizowane procesy oraz pofragmentowany wolny obszar pamięci.

Na rys. 5.9 przedstawiono stany pamięci w różnych chwilach podczas pracy systemu:

t0 – w pamięci znajduje się jedynie system operacyjny,

t1 – do pamięci załadowano cztery procesy,

t2 – proces P3 kończy działanie,

t3 – na miejsce procesu P3 zostaje załadowany proces P5,

tn – stan pamięci po wielu operacjach załadowania procesu do pamięci oraz zakończeniu działania. SO SO P1 P2 P3 P4 SO P1 P2 P4 SO P1 P2 P4 P5

. . .

SO t0 t1 t2 t3 tn

Rys. 5.9. Dynamiczny przydział obszarów pamięci

Zadaniem systemu operacyjnego dynamicznie przydzielającego obszary pamięci jest:

 stworzenie i obsługa odpowiednich struktur danych, przechowujących informacje o adresach początkowych i rozmiarach poszczególnych zajętych oraz wolnych obszarów pamięci,

 analiza zapotrzebowania na pamięć przez nowe procesy, przeszukiwanie tablicy wolnych obszarów pamięci oraz wybór obszaru odpowiedniego dla nowego procesu,

 załadowanie programu do określonego obszaru pamięci oraz modyfikacja tablic wolnych i zajętych obszarów pamięci (podczas realizacji proces nie jest przemieszczany w pamięci),

 modyfikacja tablic wolnych oraz zajętych obszarów pamięci po zakończeniu procesu.

W porównaniu z metodą przydziału stałych obszarów pamięci, metoda dynamicznego przydziału pamięci jest znacznie bardziej elastyczna. Charakteryzuje się jednak bardzo istotnym mankamentem, a mianowicie fragmentacją pamięci, która powoduje, że w pamięci powstaje cały szereg niewielkich wolnych obszarów, których nie można wykorzystać. Metoda dynamicznego przydziału pamięci była bardzo szeroko stosowana w latach 60. i 70. poprzedniego stulecia, np. w popularnym systemie OS/360.

5.3.3. Przemieszczane bloki pamięci

Jedną z metod eliminacji fragmentacji pamięci jest przemieszczanie wszystkich zajętych obszarów pamięci w jednym kierunku (np. w kierunku młodszych adresów) w celu połączenia wszystkich obszarów wolnych (rys. 5.10). W takim przypadku system operacyjny powinien dodatkowo, w stosunku do dynamicznego przydziału pamięci, kopiować zawartość obszarów pamięci zajętych przez poszczególne procesy w inne miejsca oraz modyfikować odpowiednie tablice wolnych i zajętych obszarów pamięci. Operacja ta może być wykonywana po każdym zakończeniu pracy procesu lub tylko w przypadku, gdy dla nowego procesu nie ma miejsca w pamięci. Ponieważ podczas pracy programów następuje przemieszczanie ich w pamięci, więc staje się niezbędne dynamiczne wiązanie adresów, polegające na sprzętowym wyznaczaniu adresów fizycznych.

Procedura przemieszczania obszarów pamięci wymaga znacznego nakładu pracy procesora, co zmniejsza korzyści płynące z łączenia wolnych obszarów pamięci. Metoda ta była stosowana we wczesnych wersjach systemu operacyjnego OS/2.