Education
Advertisement

Pamięć wirtualna[]

Pamięć wirtualna jest techniką pozwalającą na sztuczne zwiększenie ilości pamięci RAM poprzez użycie w jej charakterze pamięci masowej (np. twardego dysku).

Pamięć wirtualna jest techniką programową a także sprzętową gospodarowania pamięcią operacyjną RAM pozwalającą na przydzielanie pamięci dla wielu procesów, zwalnianie jej i powtórne przydzielanie, w ilości większej niż rzeczywista ilość pamięci fizycznej zainstalowanej w komputerze poprzez przeniesienie danych z ostatnio nie używanej pamięci do pamięci masowej (np. twardego dysku), w sytuacji gdy procesor odwołuje się do danych z pamięci przeniesionej na dysk przesuwa się te dane do pamięci w wolne miejsce, a gdy brak wolnej pamięci zwalnia się ją przez wyżej opisane przerzucenie jej na dysk.

Najczęściej spotykane są dwa sposoby przechowywania danych zrzuconych z pamięci fizycznej na dysk. Pierwszy, stosowany w systemach rodziny Windows polega na zapisie pamięci w pliku znajdującym się na ustalonej partycji komputera. Drugi, stosowany w systemach z rodziny UNIX to utworzenie osobnej partycji wymiany (partycji swap) przeznaczonej wyłącznie na pamięć wirtualną. Zapewnia to szybszy dostęp do danych niż pierwsze rozwiązanie (głównie ze względu na ominięcie obsługi systemu plików).

Stronicowanie[]

Pamięć wirtualna jest najczęściej zaimplementowana przy użyciu stronicowania. Procesor gospodaruje wówczas pamięcią w blokach będących wielokrotnością strony o jednakowej wielkości (w procesorach Pentium 4 kB lub 4 MB). Procesy (poza procesem zarządzania pamięcią) "widzą" pamięć poprzez adresy logiczne. Gdy proces rezerwuje pamięć proces rządzący pamięcią przydziela blok opisujący parametry tej pamięci w tablicy stron (adres logiczny, wielkość, adres fizyczny, warunki użycia i inne informacje umożliwiające gospodarowaniem pamięcią).

Adresy logiczne są tłumaczone na ich fizyczne odpowiedniki przy pomocy tablicy stron. Ta znajdująca się w RAM struktura zawiera informacje o tym, gdzie w danej chwili znajduje się dana strona. Tablica stron pamięci jest najczęściej buforowana poprzez bufor TLB, zawierający kilkadziesiąt (zwykle ok. 32) wpisów, do których w ostatnim czasie nastąpiło odwołanie.

Stronicowanie jest jednym ze sposobów rozwiązania problemu zewnętrznej fragmentacji polegającym na dopuszczeniu nieciągłości logicznej przestrzeni adresowej procesu.

Podstawowa metoda stronicowania:

  • Pamięć fizyczną dzieli się na bloki stałej długości zwane ramkami
  • Pamięć logiczną dzieli się na bloki stałej długości zwane stronami
  • Rozmiar strony i ramki jest identyczny
  • Przy wykonaniu procesu strony z pamięci pomocniczej są wprowadzane w dowolne ramki pamięci operacyjnej

W systemach komputerowych podział pamięci na mniejsze obszary o ustalonej lub zmiennej wielkości przydzielanie tym blokom adresów fizycznych lub logicznych.

Stronicowanie pamięci fizycznej[]

Stronicowanie pamięci wykonuje się z powodu ograniczenia przestrzeni adresowej procesora (stronicowanie fizyczne), takie stronicowanie stosowano w systemach 8 i 16 bitowych w których instalowano więcej pamięci niż wynosi możliwość adresowania procesora.

W pamięciach Flash EEPROM zapis do pamięci następuje poprzez wypełnienie bufora (strony) i następnie na wybrany rozkaz bufor zostaje przeniesiony do pamięci co trwa od 1 ms do 10 ms.

Stronicowanie pamięci w systemie MS DOS[]

System MS DOS używa procesora 8086 lub jego następcy w trybie rzeczywistym. W trybie tym procesor może zadresować 1MB pamięci. Na początku lat dziewięćdziesiątych pojawiła się koncepcja wykorzystania w MS DOS pamięci w obszarze ponad 1MB, pamięc ta była dzielona na bloki (strony) o wielkości 16kB i w tej wielkości dostępna przez okienko o wielkości 64 kB w przestrzeni adresowej procesora.

Stronicowanie pamięci w procesorach 80386[]

Procesory 80386 i nowsze pracujące w trybie chronionym umożliwiają dowolne mapowanie adresów logicznych na adresy fizyczne – mechanizm ten nazywany jest stronicowaniem, w j. ang. paging. Adresy logiczne obejmują całą przestrzeń adresową procesora, czyli 4GB, niezależnie od tego ile w rzeczywistości w danym komputerze zainstalowano pamięci. Zadaniem systemu operacyjnego jest odpowiednie zamapowanie adresów logicznych na adresy istniejącej pamięci fizycznej, natomiast zwykłe, użytkowe programy mogą zawsze odwoływać się do tych samych adresów logicznych.


Jeśli włączone jest stronicowanie, wówczas cała pamięć (4GB) dzielona jest na bloki – strony o rozmiarach 4kB; w procesorach Pentium i nowszych możliwe jest także używanie stron o rozmiarach 4MB. Gdy program odwołuje się do pamięci, a więc podaje 32-bitową liczbę – numer komórki pamięci – jest ona rozbijana na trzy części:

  1. indeks w katalogu stron (liczba 10-bitowa),
  2. indeks w tablicy stron (liczba 10-bitowa),
  3. przesunięcie w obrębie strony (liczba 12-bitowa).

Katalog stron zawiera wskaźniki do tablic stron, tablice stron przechowują adresy fizyczne stron. (System operacyjny może zarządzać wieloma katalogami i tablicami stron).

Zatem pierwsza część adresu wybiera z katalogu stron tablicę stron. Druga część adresu wybiera pozycję z tablicy stron, która wyznacza fizyczny adres konkretnej strony. Przesunięcie jest adresem lokalnym w obrębie wybranej strony. Zatem adres fizyczny na który zamapowano adres logiczny jest wyznaczany z dwóch składników: adresu fizycznego strony i przesunięcia.

Ponieważ jest to dość skomplikowana operacja, dlatego procesory posiadają pamięć podręczną (TLBTranslation Lookaside Buffer), w której pamiętane są ostatnio wyznaczone adresy fizyczne stron. TLB przechowuje 32, 64, 256 lub więcej pozycji.

Stronicowanie386

Każda pozycja w tablicy stron przechowuje pewne dodatkowe informacje nt strony pamięci, także te przydatne w realizacji pamięci wirtualnej:

  • Bit obecności (ang. present) — mówi czy strona znajduje się w pamięci fizycznej. Gdy system operacyjny usuwa stronę z pamięci, tzn. zapisuje ją na dysk, zeruje ten bit. Jeśli program odwoła się do strony nieobecnej w pamięci procesor generuje wyjątek i wówczas system operacyjny wczytuje z dysku uprzednio zapisaną zawartość strony.
  • Bit użycia (ang. dirty) — jest ustawiany przez procesor, gdy nastąpi odwołanie do danej strony. System operacyjny chcąc zwolnić pamięć zapisuje pewne strony na dysku – wartość zerowa tego bitu, czyli brak odwołań do strony, jest sygnałem dla systemu, że może ją w pierwszej kolejności przenieść na dysk.

Segmentacja pamięci[]

Pamięć wirtualna może także działać w innych trybach - najpopularniejsze z nich to segmentacja i stronicowanie z segmentacją.

Pierwsza implementacja tej techniki (w systemie UNIX) pojawiła się w systemie 3BSD, napisanym w Uniwersytecie Kalifornijskim w Berkeley.

Segmentacja pamięci - metoda ochrony pamięci używana przy wielozadaniowości. Każdy proces otrzymuje swój własny obszar pamięci, realizowany poprzez rejestry segmentowe.

Gdy proces próbuje odczytać bądź zapisać "nie swoje" dane (tzn. z innego obszaru), występuje błąd Naruszenie ochrony pamięci (bardziej znany jako segmentation fault), po czym (najczęściej) program się wyłącza. Czasami może to prowadzić do zawieszenia się komputera.


Segmentacja pamięci polega na podzieleniu przez system operacyjny pamięci fizycznej na fragmenty o określonym początku, rozmiarze, atrybutach i identyfikatorze. System tworzy takie segmenty na żądanie aplikacji, przekazując jej jedynie identyfikatory nie pozwalające na odczytanie parametrów segmentów. Programy odwołują się zatem do kolejnych komórek pamięci w ramach należących do nich segmentów, nie wiedząc nic o tym, w jakie miejsca pamięci fizyczne trafiają ich odwołania. Procesy nie mają też prawa „widzieć” segmentów należących do innych programów — w czasie przekazywania kontroli procesowi system musi zablokować definicje segmentów należących do pozostałych procesów, przy każdym przełączeniu blokując segmenty wyłączanego programu i na nowo uaktywniając segmenty programu aktywowanego. Segmenty mają swoje zalety. Największą jest prostota relokacji kodu i danych: ponieważ nie jest ważne gdzie w pamięci fizycznej zakotwiczony jest segment, program może odwoływać się do kolejnych słów pamięci w ramach segmentu zawsze licząc od zera do końca segmentu. Konieczne dodawanie adresów realizuje sprzętowo układ zarządzający pamięcią — co za ulga dla systemu operacyjnego! Okazuje się jednak, że wady segmentacji przeważyły nad zaletami. Pierwsze implementacje segmentowanej pamięci wirtualnej narzucały dość poważne ograniczenia na rozmiary segmentów zmuszając programistów do dzielenia kodu programów oraz bloków danych w sposób nienaturalny i utrudniając tworzenie naprawdę dużych struktur danych. Nawet po zniesieniu tego ograniczenia okazało się, że nikt nie chce bawić się w dzielenie programu na logiczne części, a normalną pracę systemu i programu można osiągnąć znacznie prostszymi środkami. Podsumowując: segmentacja jest rozwiązaniem bardzo eleganckim, lecz na tyle kłopotliwym, że obecnie praktycznie się jej nie stosuje.


Pizdencja

Advertisement