Jednym z zadań systemu operacyjnego jest zarządzanie zasobami systemowymi. Jednym z podstawowych zasobów systemowych niezbędnych do działania procesów jest pamięć operacyjna. Tak więc przydzielanie procesom pamięci operacyjnej jest jednym z podstawowych zadań systemu operacyjnego. Dalej, przez "pamięć" będziemy zawsze rozumieć "pamięć operacyjną".
Pamięć możemy traktować jak dużą tablicę słów (maszynowych). W zależności od architektury, słowo maszynowe składa się z określonej liczby (będącej potęgą 2-ki) bitów, np. 32, 64 czy 128. Pozycję słowa w tablicy, jaką jest pamięć, nazywamy adresem. Adres jest liczbą binarną złożoną z określonej liczby bitów. Zwykle liczba tych bitów jest również potęgą 2-ki, często taką samą jak w słowie maszynowym, choć nie zawsze.
W systemie operacyjnym działa zwykle równocześnie wiele procesów. Każdy z nich, aby móc działać, musi być umieszczony w pamięci. Napotykamy tu dwa problemy związane z pamięcią:
- Każdy proces powinien mieć dostęp do swojej pamięci, ale nie powinien mieć dostępu do pamięci innych procesów. Należy więc zapewnić mechanizm ochrony pamięci.
- Kompilując program, trudno przewidzieć, w którym miejscu w pamięci będzie on umieszczony. Jednym z rozwiązań tego problemu jest generowanie w trakcie kompilacji kodu przemieszczalnego. W trakcie ładowania programu do pamięci, wszelkie adresy zawarte w takim kodzie mogą być odpowiednio przesuwane.
Czasami, gdy nie można zaspokoić zapotrzebowania na pamięć wszystkich procesów system operacyjny musi wstrzymać wykonywanie niektórych procesów, zapisać je w pamięci masowej (na dysku), a przydzieloną im pamięć operacyjną rozdzielić pomiędzy pozostałe procesy. Po pewnym czasie, gdy dostępna jest odpowiednia ilość pamięci operacyjnej, procesy te można
wznowić, ładując je z dysku. Mechanizm taki nazywamy
wymianą procesów. Gdy mamy do czynienia z wymianą, proces może zostać załadowany w inne miejsce w pamięci, niż to, w którym był poprzednio. Nie wystarczy wówczas, aby kod programu stanowiącego proces był przemieszczalny. Cała zawartość pamięci przydzielonej procesowi musi być przemieszczalna i to w każdej chwili.
Problem przemieszczania zawartości pamięci przydzielonej procesom rozwiązuje się tworząc na potrzeby procesu odrębny
obraz pamięci. Całą pamięć operacyjną dostępną w komputerze, tak jak ją widzi system operacyjny, nazywamy
pamięcią fizyczną. Adresy pamięci fizycznej nazywamy adresami fizycznymi. Posługując się adresami fizycznymi mamy dostęp do całej pamięci fizycznej.
Proces, w odróżnieniu od systemu operacyjnego, nie powinien mieć dostępu do całej pamięci, ale tylko do pamięci przydzielonej mu przez system operacyjny. System operacyjny tworzy na potrzeby procesu obraz przydzielonej mu pamięci, który nie zmienia się gdy zawartość pamięci przydzielonej procesowi jest przemieszczana w pamięci fizycznej. Jest to pewnego rodzaju iluzja. Pamięć, taką jak ją widzi dany proces, nazywamy
pamięcią logiczną. Adresy, którymi posługują się procesy, a które odnoszą się do ich pamięci logicznych, nazywamy adresami logicznymi. Pamięć logiczna jest realizowana przez mechanizm, który jest również odpowiedzialny za ochronę pamięci. Mechanizm ten jest realizowany sprzętowo przez
jednostkę zarządzania pamięcią (ang. memory management unit, w skrócie MMU), która:
- sprawdza, czy używane przez proces adresy logiczne są poprawnymi adresami, tzn. czy odnoszą się do przydzielonej procesowi pamięci; w przypadku, gdy adres logiczny jest niepoprawny, zgłaszany jest błąd,
- tłumaczy adresy logiczne, na odpowiadające im adresy fizyczne.
Zwróćmy uwagę, że każdy proces ma własną pamięć logiczną. Przełączanie kontekstu między procesami wymaga przeprogramowania MMU. Tak więc konstrukcja MMU ma nie tylko wpływ na efektywność dostępu do pamięci, ale również na czas przełączania kontekstu między procesami.