Zarządzanie pamięcią w systemie operacyjnym Cele: przydział zasobów pamięciowych wykonywanym programom, zapewnienie bezpieczeństwa wykonywanych procesów (ochrona pamięci), efektywne wykorzystanie dostępnej pamięci, symulowanie pamięci fizycznej w urządzeniach pamięci masowej (pamięć wirtualna). Pamięć operacyjna to tablica tzw. słów identyfikowanych ich adresem. Adres fizyczny odpowiada poziomowi dostępu do pamięci fizycznej (adresowanie modułów pamięci fizycznej) Adres logiczny adres, którym posługujemy się w programie Adres liniowy adres w przestrzeni adresowej widzianej przez system operacyjny Sekwencja przekształceń: Adr. logiczny -> Adr.liniowy -> Adr. fizyczny Obszary adresowane przez program użytkownika: Obszar kodu, Obszar danych, Obszar stosu, Obszar zmiennych dynamicznych Przestrzeń adresów logicznych zaczyna się zwykle od 0 i kończy na rozmiarze pamięci aktualnie przydzielonej programowi. Moduł ładowalny zawsze adresuje te same pozycje przestrzeni logicznej niezależnie od faktycznego położenia w obszarze liniowym. Mówimy wówczas o relokowalnym module wykonywalnym.
Przekształcenie adresu logicznego w fizyczny zachodzi na poziomie sprzętu z wykorzystaniem tzw. rejestru bazowego.
rejestr bazowy zawiera adres przestrzeni liniowej odpowiadający pierwszemu słowu przydzielonemu programowi. Ochrona pamięci zapewniona jest przez sprzętowe porównanie adresu logicznego z zawartością rejestru granicznego.
Przydział pamięci procesom wykonywanym W wyniku wielokrotnych przydziałów dochodzi do segmentacji liniowej przestrzeni pamięci. Powstają trudne do wykorzystania dziury. Taktyki przydziału obszaru dla nowego procesu: pierwszy wystarczający, najmniejszy z większych, największy. Fragmentacja zjawisko polegające na powstawaniu wielu niewielkich wolnych obszarów pamięci. Pomimo istnienia wystarczającej ilości wolnej pamięci nie można zrealizować przydziału większego bloku pamięci dla nowo tworzonego procesu. Aby uniknąć fragmentacji stosuje się relokowanie modułów w pamięci. Relokacja wymaga:
przepisania obszarów w pamięci operacyjnej, modyfikacji zawartości rejestrów bazowych. Operacja przepisywania bloków w pamięci jest czasochłonna. Dlatego też stosuje sie technikę zwaną stronnicowaniem pamięci. Stronnicowanie jest wspomagane sprzętowo na poziomie procesora. Przestrzeń adresowa pamięci fizycznej i liniowej podzielone są na bloki o stałej długości zwane stronami (np. w procesorach Intel 80x86 i Pentium rozmiar strony wynosi 4kb). Adres liniowy dzielony jest na dwie części: część starsza wyznacza numer strony w liniowej przestrzeni adresowej, część młodsza wyznacza przesunięcie względem początku strony. Istnieje tablica stron, która dla strony o określonym numerze w przestrzeni liniowej określa jej położenie (nr strony) w przestrzeni adresowej pamięci fizycznej.
Procesom przydzielana jest pamięć będąca wielokrotnością rozmiaru strony (problem tzw. fragmentacji wewnętrznej). Nie ma problemu z koniecznością przemieszczania modułów wykonywalnych w pamięci wystarcza tylko zmiana zapisu w tablicy stron przydzielonych programowi.
Pełna tablica stron może zajmować wiele miejsca i dlatego przechowywana jest w określonej lokalizacji pamięci fizycznej. Jednak dla przyspieszenia operacji dostępu do pamięci fizycznej część tablicy stron buforowana jest w szybkich rejestrach procesora tworzących pamięć asocjacyjna (np w Intel Pentium- 32 ostatnio wykorzystywane strony).
W przypadku gdy rozmiar pamięci fizycznej jest mniejszy niż rozmiar pamięci liniowej zachodzi konieczność nadzorowania i zarządzania dostępnością strony. Wykorzystuje się do tego tzw. bit poprawności.
Segmentacja podział obszaru przydzielonego procesowi na rozłączne fragmenty w obszarze pamięci liniowej. Deskryptory segmentów przechowywane są w tablicy deskryptorów. Tablica deskryptorów znajduje się w pamięci operacyjnej. Deskryptory mogą być lokalne (dla segmentów będących własnością procesu) lub globalne (dla segmentów dzielonych pomiędzy procesami). Adres logiczny jest parą: numer segmentu, przemieszczenie względem początku segmentu W przeciwieństwie do stron segmenty mogą być różnej długości. Zarządzanie pamięcią w architekturze Intel IA-32 Wykorzystywane są obydwie koncepcje segmentacji i stronnicowania. Adres logiczny jest parą: selektor (16 bitów) przesunięcie wewnątrz segmentu (32 bity). Struktura selektora: numer selektora w tablicy deskryptorów - 13 bitów wybór tablicy deskryptorów 1 bit dane o ochronie segmentu 3 bity Selektor zawiera: adres bazowy segmentu w przestrzeni liniowej, długość segmentu informacje o typie, użyciu. W dowolnym momencie pracy procesu dostępny jest 6 segmentów. Ich selektory znajdują się w 6 rejestrach: 1 dla kodu, 1 dla stosu, 4 dla danych. Z rejestrami tymi stowarzyszone są ukryte rejestry zawierające odpowiednie selektory z tablicy selektorów.
Pamięć wirtualna Umożliwia symulowanie bardzo dużej pamięci liniowej przy niewielkiej objętości pamięci fizycznej. Tylko niewielka część stron pamięci liniowej znajduje się w danej chwili w pamięci fizycznej. Sprzęt sprawdza czy adres liniowy do którego odwołuje się wykonywany rozkaz znajduje się na stronie obecnej w pamięci. Jeśli nie przerywa
wykonanie programu i przekazuje sterowanie do SO, który dokonuje wymiany stron. Tablica stron jest zwykle elementem bloku kontrolnego procesu. W zależności od przyjętej koncepcji i typu procesu SO może dopuszczać przydzielanie dowolnej liczby stron pamięci fizycznej procesowi lub nakładać na tę ilość ograniczenia (aby np. zapobiegać wywłaszczaniu z pamięci fizycznej innych procesów w szczególności systemowych) Istnieją dwie główne koncepcje przydziału stron fizycznych procesowi sprowadzanemu do pamięci liniowej: o załadowanie możliwie dużej liczby stron uzywanych przez startujący proces (rys. poniżej) rzadko stosowana o sprowadzanie stron na życzenie gdy nastąpi odwołanie do nich.
Wymiana stron w pamięci jest kosztowna. SO musi zapewnić odpowiednie zarządzanie pamięcią wirtualną minimalizujące koszty wymiany stron.