Ogólnie

 

Pamięć wirtualna zapewnia wykonywanym na komputerze procesom wrażenie posiadania własnej pamięci RAM, niezależnej od innych procesów. Ułatwia to tworzenie aplikacji, a także sztuczne zwiększenie ilości dostępnej pamięci poprzez wykorzystanie części dysku twardego do tego celu.

Pamięć wirtualna

 

Mechanizm komputerowy zapewniający procesowi wrażenie pracy w jednym dużym, ciągłym obszarze pamięci operacyjnej podczas gdy fizycznie może być ona pofragmentowana, nieciągła i częściowo przechowywana na urządzeniach pamięci masowej. Systemy korzystające z tej techniki ułatwiają tworzenie rozbudowanych aplikacji oraz poprawiają wykorzystanie fizycznej pamięci RAM. Często popełnianym błędem jest utożsamianie pamięci wirtualnej z wykorzystaniem pamięci masowej do rozszerzenia dostępnej pamięci operacyjnej. Rozszerzenie pamięci na dyski twarde w rzeczywistości jest tylko naturalną konsekwencją zastosowania techniki pamięci wirtualnej, lecz może być osiągnięte także na inne sposoby, np. nakładki lub całkowite przenoszenie pamięci procesów na dysk, gdy znajdują się w stanie uśpienia. Pamięć wirtualna działa na zasadzie przedefiniowania adresów pamięci tak, aby "oszukać" procesy i dać im wrażenie pracy w ciągłej przestrzeni adresowej.

Pamięć wirtualna wymaga wykonania dodatkowych nakładów pracy procesora przy odczycie i zapisie do pamięci, nakłady te występują tylko czasami i trwają dość długo, dlatego systemy czasu rzeczywistego lub szczególnego przeznaczenia, w których czas jest czynnikiem krytycznym i musi być przewidywalny, często nie korzystają lub ograniczają stosowanie mechanizmu pamięci wirtualnej.

Dyski twarde są około 100 razy wolniejsze od pamięci o dostępie swobodnym, przez co uruchamianie programów wymagających ilości pamięci większej niż fizycznie zainstalowana pamięć RAM powoduje wolne działanie komputera.

Stronicowana pamięć wirtualna

 

Prawie wszystkie istniejące obecnie implementacje dzielą wirtualną przestrzeń adresową procesu na strony. Strona jest to obszar ciągłej pamięci o stałym rozmiarze, zazwyczaj 4 KB. Systemy, gdzie zapotrzebowanie na wielkość wirtualnej przestrzeni adresowej jest większe lub dysponujące większymi zasobami pamięci operacyjnej mogą używać stron o większym rozmiarze. Rzeczywista pamięć operacyjna podzielona jest na ramki, których rozmiar odpowiada wielkości stron. System operacyjny według uznania może przydzielać ramkom strony pamięci lub pozostawiać je puste.

  • Tablice stron
    Każde odwołanie przez dany proces do wirtualnego adresu pamięci powoduje jego przetłumaczenie na adres fizyczny przy pomocy tablicy stron. Wpisy w tablicy stron przechowują namiary na ramkę, gdzie aktualnie znajduje się dana strona lub znacznik informujący, że dana strona znajduje się aktualnie na dysku twardym.

    Systemy mogą utrzymywać tylko jedną tablicę stron - wtedy wszystkie procesy pracują we wspólnej wirtualnej przestrzeni adresowej, przy czym każdy z nich używa innej jej części. Odmiennym podejściem jest utrzymywanie osobnych tablic stron dla każdego procesu oraz dodatkowej na potrzeby samego systemu operacyjnego. W tym modelu każdy proces posiada swoją własną, niezależną przestrzeń adresową. Dwa identyczne adresy logiczne należące do różnych procesów tłumaczone są na inne adresy rzeczywiste, uniemożliwiając tym samym jednemu procesowi modyfikację danych innego.

  • Dynamiczne tłumaczenie adresów
    Dynamiczne tłumaczenie adresów jest zadaniem głównego procesora. Najczęściej wykonywane jest przez sprzętowy komponent zwany Memory management unit (ang. układ zarządzania pamięcią) obsługujący każde odwołanie do pamięci. MMU przeszukuje aktualną tablicę stron w poszukiwaniu ramki zawierającej żądane dane i przekazuje rzeczywisty adres pozostałym częściom procesora odpowiedzialnym za wykonanie instrukcji. Jeśli MMU stwierdzi, że dana strona nie znajduje się w pamięci, generuje przerwanie braku strony, które musi zostać obsłużone przez zarządcę pamięci systemu operacyjnego.

  • Zarządca pamięci
    Ta część systemu operacyjnego odpowiada za tworzenie i zarządzanie tablicami stron, a także obsługuje przerwanie braku strony generowane przez MMU. W przypadku jego wystąpienia zarządca poszukuje wskazanej strony na dysku twardym (pamięć wymiany), ładuje ją do aktualnie wolnej ramki, uaktualnia tablicę stron i nakazuje MMU ponowne przetłumaczenie adresu. Ładowanie brakujących stron z dysku jest powolnym procesem, dlatego jeśli system dysponuje wystarczającą liczbą ramek, dąży do minimalizacji wystąpień błędów braku strony.

    Gdy ilość dostępnej pamięci operacyjnej jest na wyczerpaniu, zarządca może podjąć decyzję o przeniesieniu części stron z ramek na dysk. Do wyznaczenia niepotrzebnych stron stosowany jest algorytm LRU (Least Recently Used), w którym na dysk przenoszone są najrzadziej używane strony jako te, których najprawdopodobniej proces będzie potrzebować najpóźniej.

Segmentowana pamięć wirtualna

 

Pamięć wirtualna może być zrealizowana również w oparciu o techniki segmentowania. Wirtualna przestrzeń adresowa aplikacji podzielona jest na bloki zmiennej długości zwane segmentami. Adres logiczny składa się z numeru segmentu oraz przesunięcia w obrębie tego segmentu. Pamięć jest wciąż fizycznie dostępna za pomocą tzw. adresu absolutnego lub liniowego. Do jego otrzymania, procesor odczytuje deskryptor segmentu z tablicy segmentów. Zawiera on flagę informującą, czy dany segment znajduje się aktualnie w pamięci czy nie, adres początku segmentu oraz jego długość. Następnie sprawdza czy przesunięcie adresu mieści się w granicach segmentu. Jeśli segment nie znajduje się w pamięci, generowane jest przerwanie powiadamiające system operacyjny o konieczności jego załadowania. W trakcie wczytywania może okazać się niezbędne przeniesienie innych segmentów na dysk, aby zrobić miejsce dla nowego.

Możliwe jest połączenie segmentacji pamięci ze stronicowaniem poprzez podzielenie każdego segmentu na strony. Systemy korzystające z tej techniki, np. Multics czy IBM System/38 pamięć wirtualna realizowana jest przez stronicowanie, zaś segmentacja wprowadza dodatkowy mechanizm ochrony. W procesorach IA-32 oraz Intel 80386 segmenty znajdują się w 32-bitowej liniowej stronicowanej przestrzeni adresowej: segmenty mogą być przenoszone z/do przestrzeni adresowej, zaś strony w obrębie przestrzeni adresowej mogą być przenoszone z/do pamięci operacyjnej. Korzystają z tego jednak tylko nieliczne systemy - najczęściej stosowane jest wyłącznie stronicowanie pamięci.

Różnica pomiędzy pamięcią stronicowaną a segmentowaną nie polega wyłącznie na podziale pamięci na porcje o stałym i zmiennym rozmiarze. W tego typu systemach segmentacja jest często widoczna dla procesów użytkownika, w przeciwieństwie do przezroczystych stron, które nie wymagają od nich żadnego dodatkowego zaangażowania.