2. Zarządzanie pamięcią

Procesor ma do dyspozycji pewną liczbę bitów, za pomocą których można adresować pamięć. W procesorach 32 bitowych jest to 32 bity, 64 bitowych – 64 bity itd. Przy użyciu tych bitów może zostać zaadresowany pewien ciągły obszar pamięci. Każdy uruchomiony program ma swoją taką przestrzeń adresową. Pamięć, którą może zaadresować procesor nazywamy logiczną przestrzenią adresową. W komputerze jest zainstalowana pamięć RAM, której rozmiar jest zwykle mniejszy niż możliwy do zaadresowania logiczny obszar pamięci procesora. Obszar adresów dotyczący zainstalowanej pamięci RAM nazywamy fizycznym obszarem adresowym. Programy w zasadzie nigdy nie wykorzystują całego obszaru logicznego, a tylko jego mały fragment. Jednostka zarządzania pamięcią tłumaczy adresy zajętych przez program obszarów w pamięci logicznej na dostępne fizycznie adresy w pamięci RAM (Rys. 3.). W najprostszym przypadku może być to tzw. rejestr przemieszczenia, którego wartość jest dodawana do adresu logicznego.

Rys. 3. Logiczna i fizyczna przestrzeń adresowa

 

W systemach wielozadaniowych może dojść do sytuacji, w której chcemy uruchomić np. dwa programy jednocześnie, ale zainstalowana pamięć RAM jest zbyt mała. Wtedy, w najprostszym przypadku, możemy wymienić procesy w pamięci (Rys. 4). Metoda ta nie jest już od dawna stosowana ze względu na swoje wady.

Rys. 4. Wymiana dwóch procesów

 

W przypadku wymiany, proces, który jest aktualnie wykonywany, jest zatrzymywany i wysyłany do pamięci pomocniczej (na dysk twardy). Na jego miejsce wprowadzany jest nowy proces. Każdy z procesów ma przydzielony pewien kwant czasu na swoje działanie. Oczywiście czas ten nie może być krótszy niż czas potrzebny na wysłanie i sprowadzenie procesu do pamięci pomocniczej. Dodatkowym problemem jest to, że zwykle proces, który ma być powtórnie wprowadzony do pamięci, musi znaleźć się dokładnie w tym samym miejscu, w którym był poprzednio. Wymiana procesów trwa długo, nie jest więc to rozwiązanie optymalne.

Zwykle w systemach wielozadaniowych w danej chwili działa wiele procesów. Załóżmy, że mamy sytuację przedstawioną w tabeli 1. W kolejce zadań jest pięć procesów. Każdy z nich zajmuje określoną ilość pamięci i działa przez określony czas.

Tabela 1. Kolejka zadań

Kolejka zadań

Proces

P1

P2

P3

P4

P5

Pamięć

600 KB

1000 KB

300 KB

700 KB

500 KB

Czas

10

5

20

8

15

 

W systemie operacyjnym mamy miejsce na umieszczenie w pierwszej chwili trzech pierwszych procesów P1, P2, P3 (Rys. 5). Po 5 jednostkach czasu proces P2 kończy swoje działanie. Na jego miejsce możemy wprowadzić proces P4. Zajmuje on jednak mniej miejsca w pamięci niż proces P2, powstaje więc pewien nieużytek (dziura). Później kończy działanie proces P1. Wprowadzamy proces P5. Również powstaje pewien nieużytek. Po pewnym czasie może się okazać, że jedna trzecia pamięci stanowi nieużytek. Pomięć jest poszatkowana. Jest to tzw. fragmentacja zewnętrzna pamięci.

Rys. 5. Rozmieszczenie procesów w pamięci operacyjnej

 

Z fragmentacją zewnętrzną można walczyć. Można szukać najbardziej pasujących obszarów pamięci, do których zostanie wprowadzony nowy proces. Stosuje się trzy strategie:

  • pierwsze dopasowanie – proces jest wstawiany w pierwszy dostępny obszar, w który się mieści,
  • najlepsze dopasowanie – proces jest wstawiany w wolny obszar tak, aby pozostały nieużytek był najmniejszy,
  • najgorsze dopasowanie – proces jest wstawiany w wolny obszar tak, aby pozostały nieużytek był największy (z nadzieją, że inny proces się zmieści w tym nieużytku).

Żadna z tych strategii nie rozwiązuje problemu. Żadna nie jest też zdecydowanie lepsza od drugiej. Innym rozwiązaniem mogłoby być upakowanie pamięci. Wszystkie procesy są wtedy przenoszone w inne obszary pamięci, tak aby tworzyły jeden blok. Z pozoru wydaje się to prostym rozwiązaniem, jednak tak nie jest. Często procesu nie da się przenieść w prosty sposób. Z drugiej strony koszt czasowy takiej operacji jest nieakceptowalny. Spowolnienie działania całego systemy byłoby zbyt duże.