SYSTEMY OPERACYJNE
dr. hab. Vitaliy Yakovyna
yakovyna@matman.uwm.edu.pl http://wmii.uwm.edu.pl/~yakovyna/
UNIWERSYTET WARMIŃSKO-MAZURSKI W OLSZTYNIE
Wydział Matematyki i Informatyki
ZARZĄDZANIE PAMIĘCIĄ
PAMIĘĆ GŁÓWNA
Informacje
Ogólne
Zarządzanie Pamięcią
• Głównym celem systemu komputerowego jest wykonywanie programów
• Programy te wraz z danymi muszą, przynajmniej
częściowo, znajdować się w pamięci głównej podczas wykonywania
• Nowoczesne systemy komputerowe utrzymują kilka procesów w pamięci podczas wykonywania systemu
• Wybór schematu zarządzania pamięcią dla systemu zależy od wielu czynników
• Większość algorytmów wymaga jakiejś formy wsparcia sprzętowego
Pamięć Główna
• Pamięć ma kluczowe znaczenie dla funkcjonowania nowoczesnego systemu komputerowego
• Pamięć składa się z dużej tablicy bajtów, każdy z własnym adresem
• CPU pobiera instrukcje z pamięci zgodnie z wartością licznika programu
• Te instrukcje mogą powodować dodatkowe
ładowanie i przechowywanie pod określonymi adresami pamięci
Sprzęt Podstawowy
• Pamięć główna i rejestry wbudowane w każdy rdzeń procesora są jedyną pamięcią ogólnego
przeznaczenia, do której CPU ma bezpośredni dostęp
• Istnieją instrukcje maszynowe, które przyjmują adresy pamięci jako argumenty, ale żadne nie biorą adresów dyskowych
• Jeśli danych nie ma w pamięci, należy je tam
przenieść, zanim procesor będzie mógł na nich działać
Rejestry, Pamięć Główna, Pamięć Podręczna
• Rejestry wbudowane w każdy rdzeń procesora są dostępne w jednym cyklu zegara procesora
• Dostęp do pamięci głównej odbywa się poprzez transakcję na szynie pamięci
• Ukończenie dostępu do głównej pamięci może zająć wiele cykli zegara procesora
• Szybka pamięć podręczna jest dodawana między procesorem a pamięcią główną, zwykle w układzie procesora, w celu szybkiego dostępu
• Sprzęt zarządza pamięcią podręczną wbudowaną w procesor bez kontroli systemu operacyjnego
Ochrona Pamięci
• Aby zapewnić prawidłowe działanie systemu, musimy chronić system operacyjny przed dostępem procesów użytkowników, a także chronić procesy użytkowników przed sobą
• Ochronę tę musi zapewnić sprzęt, ponieważ system operacyjny zwykle nie ingeruje w dostęp procesora do pamięci
• Każdy proces musi mieć osobną przestrzeń pamięci
• Oddzielna przestrzeń pamięci na proces ma podstawowe znaczenie dla załadowania wielu
procesów do pamięci w celu współbieżnego wykonania
Rejestry Bazy i Limitu
• Aby określić zakres legalnych adresów, do których proces może uzyskać dostęp, można użyć dwóch rejestrów
• Rejestr bazowy zawiera najmniejszy legalny adres pamięci fizycznej; rejestr limitu określa rozmiar zakresu
• Rejestry podstawy i limitu mogą być ładowane tylko przez system operacyjny za pomocą specjalnej
uprzywilejowanej instrukcji
Rejestry Bazy i Limitu
Sprzętowa Ochrona Adresu
z Rejestrami Podstawy i
Limitu
• Każda próba dostępu do pamięci systemu
operacyjnego lub pamięci innych użytkowników przez program wykonywany w trybie
użytkownika powoduje pułapkę do systemu operacyjnego, który traktuje tę próbę jako błąd krytyczny
Memory Protection: Kernel Mode
• System operacyjny działający w trybie jądra otrzymuje nieograniczony dostęp zarówno do pamięci systemu operacyjnego, jak i pamięci użytkownika
• Dostęp ten pozwala systemowi operacyjnemu ładować programy użytkowników do pamięci, zrzucać te programy w przypadku błędów,
uzyskiwać dostęp i modyfikować parametry wywołań systemowych, wykonywać operacje
we/wy do i z pamięci użytkownika oraz zapewniać wiele inne usługi
Wiązanie Adresu
• Adresy w programie źródłowym są generalnie symboliczne (np. zmienna count)
• Kompilator zazwyczaj wiąże te adresy symboliczne z adresami relokowalnymi (np. „14 bajtów od
początku tego modułu”)
• Linker lub ładowarka z kolei wiąże adresy
relokowalne z adresami bezwzględnymi (np. 74014)
• Każde wiązanie jest mapowaniem z jednej przestrzeni adresowej na drugą
Wiązanie Adresu (2)
Klasycznie wiązanie instrukcji i danych z adresami pamięci można wykonać na dowolnym etapie:
1. Podczas kompilacji. Jeśli w czasie kompilacji
wiadomo, gdzie proces będzie się znajdować w pamięci, można wygenerować kod bezwzględny.
2. Podczas ładowania. Jeśli w czasie kompilacji nie jest znane, gdzie proces będzie rezydował w pamięci,
kompilator musi wygenerować kod relokowalny.
3. Podczas wykonania. Aby ten schemat działał, musi być dostępny specjalny sprzęt. Większość systemów operacyjnych korzysta z tej metody.
Moduł Zarządzania
Pamięcią (MMU)
• Mapowanie w czasie wykonania z adresów wirtualnych na fizyczne jest wykonywane przez urządzenie sprzętowe zwane
modułem zarządzania pamięcią (MMU)
Logiczna a Fizyczna Przestrzeń Adresowa
• Adres generowany przez CPU jest powszechnie określany jako adres logiczny, podczas gdy adres widziany przez
jednostkę pamięci – jako adres fizyczny
• Wiązanie adresów podczas kompilacji lub ładowania generuje identyczne adresy logiczne i fizyczne
• Jednak wiązanie adresów podczas wykonania skutkuje różnymi adresami logicznymi i fizycznymi
• Zbiór wszystkich adresów logicznych generowanych przez program jest logiczną przestrzenią adresową
• Zbiór wszystkich adresów fizycznych odpowiadających tym adresom logicznym jest fizyczną przestrzenią adresową
Logiczna a Fizyczna Przestrzeń Adresowa (2)
• Program użytkownika nigdy nie uzyskuje dostępu do rzeczywistych adresów fizycznych
• Program użytkownika zajmuje się adresami logicznymi
• Sprzęt do mapowania pamięci konwertuje adresy logiczne na adresy fizyczne
• Ostateczna lokalizacja adresu pamięci nie jest
określana, dopóki nie zostanie wykonane powiązanie
• Koncepcja logicznej przestrzeni adresowej, która jest powiązana z oddzielną fizyczną przestrzenią adresową, ma kluczowe znaczenie dla zarządzania pamięcią
Dynamiczna relokacja za
pomocą rejestru relokacji
• Rejestr bazowy nazywa się teraz rejestrem relokacji
• Wartość w rejestrze relokacji jest dodawana do każdego adresu wygenerowanego przez proces użytkownika w momencie wysyłania adresu do pamięci
Ładowanie Dynamiczne
• Cały program i wszystkie dane procesu muszą znajdować się w pamięci fizycznej, aby proces mógł zostać wykonany
• Rozmiar procesu jest ograniczony do rozmiaru pamięci fizycznej
• Aby uzyskać lepsze wykorzystanie przestrzeni pamięci, możemy zastosować ładowanie dynamiczne
• W przypadku ładowania dynamicznego procedura nie jest ładowana, dopóki nie zostanie wywołana. Wszystkie
procedury są przechowywane na dysku w przenośnym formacie
• Ładowanie dynamiczne nie wymaga specjalnego wsparcia ze strony systemu operacyjnego. Użytkownicy mają
obowiązek zaprojektować swoje programy tak, aby skorzystać z takiej metody
Łączenie Dynamiczne i Biblioteki Współdzielone
• Biblioteka łączona dynamicznie (DLL) to biblioteka, która łączona jest z programem wykonywalnym dopiero w
momencie jego wykonania
• Niektóre systemy operacyjne obsługują tylko łączenie
statyczne, w którym biblioteki są traktowane jak każdy inny moduł obiektowy i są łączone ładowarką w program binarny
• Przy statycznym łączeniu każdy program musi zawierać kopię biblioteki w pliku wykonywalnym. Zwiększa to nie tylko
rozmiar wykonywalnego pliku, ale może również marnować pamięć główną
• Biblioteki DLL mogą być współdzielone przez wiele
procesów, dzięki czemu tylko jedna instancja biblioteki znajduje się w pamięci głównej. Dynamiczne biblioteki są również znane jako biblioteki współdzielone
Biblioteki Dynamiczne
• Gdy program odwołuje się do procedury znajdującej się w bibliotece dynamicznej, moduł ładujący lokalizuje
bibliotekę
• Następnie dostosowuje adresy odwołujące się do funkcji w bibliotece do lokalizacji w pamięci, w której
przechowywana jest biblioteka DLL
• Biblioteka może zostać zastąpiona nową wersją, a wszystkie programy odwołujące się do biblioteki będą automatycznie korzystać z nowej wersji
• Informacje o wersji są zawarte zarówno w programie, jak i bibliotece
• Do pamięci można załadować więcej niż jedną wersję biblioteki
Łączenie Dynamiczne a Ładowanie Dynamiczne
• Łączenie dynamiczne jest podobne do ładowania dynamicznego
• W przeciwieństwie do ładowania dynamicznego, łączenie dynamiczne i biblioteki współdzielone zazwyczaj wymagają pomocy ze strony systemu operacyjnego
• Jeśli procesy w pamięci są chronione przed sobą, to system operacyjny jest jedyną jednostką, która
może umożliwić wielu procesom dostęp do tych samych adresów pamięci
Ciągły Przydział
Pamięci
Ciągły Przydział Pamięci
• Pamięć główna musi pomieścić zarówno system operacyjny, jak i różne procesy użytkownika
• Potrzebujemy przydzielać pamięć główną w najbardziej efektywny sposób
• Pamięć jest zwykle dzielona na dwie partycje: jedną dla systemu operacyjnego i jedną dla procesów
użytkownika
• W ciągłym przydziale pamięci każdy proces jest zawarty w pojedynczej sekcji pamięci, która
przylega do sekcji zawierającej następny proces
Ochrona Pamięci
• Gdy planista wybierze proces do wykonania, dyspozytor ładuje rejestry relokacji i limitu prawidłowymi wartościami jako część procesu przełączania kontekstu
• Schemat z rejestrem relokacji zapewnia skuteczny sposób na dynamiczne zmiany rozmiaru
przydzielonej pamięci
Przydział Pamięci
• Schemat ze zmiennymi rozdziałami – polega na przydzieleniu procesom rozdziałów
pamięci o zmiennej wielkości, gdzie każdy rozdział mieści dokładnie jeden proces
Schemat ze Zmiennymi Rozdziałami
• Gdy nadejdzie proces, system przeszukuje zbiór w poszukiwaniu dziury, która jest wystarczająco duża
• Jeśli dziura jest zbyt duża, dzieli się na dwie części
• Kiedy proces kończy wykonanie, uwalnia blok pamięci, który jest umieszczany z powrotem w zbiorze dziur
• Jeśli nowa dziura sąsiaduje z innymi dziurami, te
sąsiednie dziury są scalane, tworząc jedną większą dziurę
• Jest to szczególny przypadek problemu dynamicznego przydzielenia pamięci, który dotyczy sposobu spełnienia żądania rozmiaru n z listy wolnych dziur
Problem Dynamicznego Przydzielenia Pamięci
• Pierwsze dopasowanie. Przydziela się pierwszą dziurę, która jest wystarczająco duża. Wyszukiwanie można
rozpocząć albo na początku zbioru dziur, albo w miejscu, w którym zakończyło się poprzednie wyszukiwanie.
• Najlepsze dopasowanie. Przydziela się najmniejszą
dziurę, która jest wystarczająco duża. Musimy przeszukać całą listę, chyba że lista jest uporządkowana wg rozmiaru.
Ta strategia tworzy najmniejszą pozostałą dziurę.
• Najgorsze dopasowanie. Przydziela się największą dziurę.
Ponownie musimy przeszukać całą listę, chyba że jest ona posortowana wg rozmiaru.
Fragmentacja
• Strategie pierwszego i najlepszego dopasowania podlegają fragmentacji zewnętrznej
• Fragmentacja zewnętrzna występuje, gdy dostępna jest wystarczająca ilość pamięci do spełnienia
żądania, ale dostępne przestrzenie nie są ciągłe:
pamięć jest podzielona (fragmentowana) na wiele małych dziur
• Analiza statystyczna pierwszego dopasowania
pokazuje, że, nawet przy pewnej optymalizacji, przy przydziale N bloków, kolejne 0,5·N bloków zostaną utracone w wyniku fragmentacji. Ta właściwość jest znana jako reguła 50-procent.
Fragmentacja Wewnętrzna
• Koszty dla śledzenia bardzo małego otworu będą znacznie większymi niż sam otwór
• Ogólne podejście do uniknięcia tego problemu
polega na rozbiciu pamięci fizycznej na bloki o stałej wielkości i przydzieleniu pamięci w jednostkach na podstawie wielkości bloku
• Pamięć przydzielona do procesu może być nieco większa niż żądana pamięć
• Różnicą między tymi dwiema liczbami jest
fragmentacja wewnętrzna – nieużywana pamięć wewnątrz rozdziału
Fragmentacja: Rozwiązanie
• Jednym z rozwiązań problemu fragmentacji zewnętrznej jest zagęszczanie
• Zagęszczanie jest możliwe tylko wtedy, gdy relokacja jest dynamiczna i odbywa się w czasie wykonywania
• Schemat zagęszczania może być drogi
• Innym możliwym rozwiązaniem problemu fragmentacji zewnętrznej jest zezwolenie, aby przestrzeń adresowa procesów nie była ciągła
• Jest to strategia stosowana w stronicowaniu,
najczęstszej używanej technice zarządzania pamięcią
Pamięć Główna.
Streszczenie
Streszczenie (1)
• Pamięć ma kluczowe znaczenie dla funkcjonowania nowoczesnego systemu komputerowego i składa się z dużej liczby bajtów, z których każdy ma własny adres
• Jednym ze sposobów przydzielenia przestrzeni
adresowej dla każdego procesu jest użycie rejestrów bazowego i limitu. Rejestr bazowy zawiera
najmniejszy legalny adres pamięci fizycznej, a rejestr limitu określa rozmiar zakresu
• Wiązanie adresu symbolicznego do rzeczywistych adresów fizycznych może wystąpić podczas (1) kompilacji, (2) ładowania lub (3) wykonywania
Streszczenie (2)
• Adres generowany przez CPU jest znany jako adres logiczny, który moduł zarządzania pamięcią (MMU) tłumaczy na fizyczny adres w pamięci
• Jednym z podejść do przydzielania pamięci jest przydzielanie rozdziału ciągłej pamięci o różnych rozmiarach. Te rozdziały można przydzielić w
oparciu o trzy możliwe strategie: (1) pierwsze dopasowanie, (2) najlepsze dopasowanie i (3) najgorsze dopasowanie