Pamięć Jan Tuziemski Źródło części materiałów: os-book.com
Cele wykładu Przedstawienie sposobów organizacji pamięci komputera Przedstawienie technik zarządzania pamięcią
Podstawy Przed uruchomieniem program musi być wczytany z pamięci Pamięć główna i rejestry procesora to jedyne jednostki dostępne dla CPU
Podstawy Dostęp do rejestrów jest bardzo szybki Dostęp do pamięci głównej wolniejszy (z tego powodu istnieją bufory CPU)
Podstawy Procesy użytkowników mogą mieć dostęp jedynie do pamięci im przypisanej Ograniczenie to implementuje się przy pomocy dwóch rejestrów
Podstawy
Wiązanie adresów Z poziomu użytkownika odwołanie do pamięci następuje zazwyczaj symbolicznie (np. zmienna i ) Takie nazwy muszą być związane z adresami fizycznej pamięci Proces ten odbywa się w jednym z trzech momentów
Wiązanie adresów Faza kompilacji: jeżeli w trakcie kompilacji znane jest miejsce programu w pamięci, kompilator może wygenerować kod bezwzględny zawierający adresy pamięci. Wymaga rekompilacji przy zmianach. Zastosowanie: MS-DOS, plik.com zawiera dane o pamięci
Podstawy Faza ładowania: kompilator generuje kod przemieszczalny, w którym adresy określone są względem lokalizacji początkowej programu. Wiązanie ostatecznie odbywa się w trakcie ładowania programu przez moduł ładujący. Przy zmianach wymaga ponownego załadowania programu.
Podstawy Faza wykonania: jeżeli proces może zmieniać lokalizację w pamięci w trakcie wykonania, powiązanie adresów fizycznych musi być odłożone do czasu wykonania danego fragmentu kodu. Wymaga wspomagania sprzętowego. Najczęściej stosowane rozwiązanie.
Fazy procesu
Adresy fizyczne vs logiczne Adresy logiczne (wirtualne) generowane przez CPU Jednostki pamięci widzą adresy fizyczne (rejestr adresowy) Adresy fizyczne i logiczne są takie same jeżeli zostały powiązane na etapie kompilacji/ładowania Powiązanie podczas wykonania generuje odmienny zestaw adresów logicznych i fizycznych (przestrzeń adresów logicznych i fizycznych)
Adresy fizyczne vs logiczne Wiązanie podczas wykonania generuje odmienny zestaw adresów logicznych i fizycznych (przestrzeń adresów logicznych i fizycznych) Za odwzorowanie adresów fizycznych w logiczne odpowiedzialna jest jednostka zarządzania pamięcią Jest to jednostka sprzętowa
Adresy fizyczne vs logiczne Istnieją różne sposoby odwzorowania pamięci wirtualnej w fizyczną Najprostszy: rejestr relokacji Na poziomie sprzętowym do każdego adresu logicznego dodana pewna wartość liczbowa Z poziomu użytkownika adresy fizyczne są niewidoczne Rejestry są przesuwane tylko gdy dochodzi do odwołania się do komórki pamięci, np. przy pobraniu danych
Rejestr przesunięć
Ładowanie dynamiczne Dotychczas zakładaliśmy, że cały program jest ładowany do pamięci Ładowanie dynamiczne pozwala zoptymalizować wykorzystanie pamięci Do pamięci ładowane są tylko podprogramy, których wykonanie jest konieczne w danym momencie
Ładowanie dynamiczne Przed wykonaniem danego podprogramu należy sprawdzić czy znajduje się on w pamięci Każdy podprogram znajduje się na dysku w postaci przemieszczalnej Odpowiedzialność projektowania oprogramowania spoczywa na programiście OS może dostarczać procedury ułatwiające korzystanie z ładowania dynamicznego
Konsolidacja dynamiczna
Konsolidacja dynamiczna Niektóre systemu umożliwiają statyczną konsolidację Statyczna konsolidacja wymaga dołączenia do obrazu binarnego kopii biblioteki języka (lub podprogramów) Rozwiązanie powoduje nieoptymalne użycie zasobów
Konsolidacja dynamiczna W przypadku konsolidacji dynamicznej w miejscu odwołania bibliotecznego znajduje się namiastka Namiastka to krótki fragment kodu zawierający instrukcję znalezienia potrzebnej biblioteki Wykonanie namiastki powoduje: 1) sprawdzenia czy dany fragment biblioteki nie jest załadowany do pamięci 2) ewentualne ładowanie programu do pamięci
Konsolidacja dynamiczna Rozwiązanie pozwala na prostą wymianę biblioteki na nowszą wersję Jeżeli program wymaga działania ze starą wersją, informację o wersji dostarcza się do programu i biblioteki Systemy tego typu nazywa się bibliotekami dzielonymi
Konsolidacja dynamiczna Wymaga wsparcia OS Jeżeli pamięć procesów jest chroniona tylko OS może sprawdzać i udostępniać kod między procesami
Wymiana Wykonanie procesu możliwe jest wówczas gdy znajduje się w pamięci Proces może być wymieniany: odsyłany z pamięci operacyjnej do pamięci pomocniczej i sprowadzany z powrotem Umożliwia to sytuację, w której fizyczna pamięć procesów jest większa niż pamięć operacyjna
Wymiana
Wymiana Do wymiany potrzebna jest pamięć pomocnicza: zazwyczaj szybki dysk o odpowiedniej pojemności. Wymiana stosowana np. w algorytmach planowania priorytetowego (wtaczanie i wytaczanie procesów o odpowiednich priorytetach)
Wymiana OS utrzymuje kolejkę procesów gotowych (pamięć operacyjna+pomocnicza) Planista wybiera proces do wykonania Ekspedytor odpowiada za ładowanie i usuwanie procesów z pamięci operacyjnej Ładowanie/usuwanie zabiera określoną ilość czasu
Wymiana Przykład: proces 100MB, prędkość przesyłania z pamięci 50 MB/s, czas 2 s Przesyłanie w dwie strony, łącznie ok 4 s nie uwzględniając innych czynników (czas dostępu itp.) Czas wymiany można skrócić przez ładowanie tylko potrzebnych fragmentów procesu W tym wypadku proces musi informować o tym, ile pamięci potrzebuje
Wymiana Inne ograniczenia: Proces podlegający usunięciu z pamięci powinien być bezczynny Problemy pojawiają się np. w przypadku operacji I/O Standardowa forma wymiany rzadko spotykana w nowoczesnych OS Czasami spotyka się jej zmodyfikowane wersje
Przydział ciągły pamięci Pamięć dzielona jest między procesy użytkownika i OS W przydziale ciągłym pamięci, każdy proces umieszczony jest w jednym, zwartym fragmencie
Przydział ciągły pamięci Ochrona pamięci przy pomocy rejestru granicznego
Przydział ciągły pamięci Metoda wielu obszarów: podział pamięci na obszary Rozmiar obszaru może być zmienny Dziura wolny obszar pamięci Proces otrzymuje dziurę o odpowiednim rozmiarze Proces opuszczając pamięć pozostawia dziurę, następuje proces łączenia dziur
Przydział ciągły pamięci OS utrzymuje informację o pamięci wolnej i przydzielonej
Przydział ciągły pamięci Dynamiczny przydział pamięci: którą dziurę przyporządkować procesowi o rozmiarze n? Pierwsze dopasowanie: pierwszą pasującą Najlepsze dopasowanie: najmniejszą z pasujących (wymaga przeszukania listy) Najgorsze dopasowanie: największa z dostępnych dziur (jej pozostałości będą największe, być może najbardziej użyteczne)
Przydział ciągły pamięci W wyniku zajmowania i zwalniania pamięci przez procesy dochodzi do fragmentacji (wiele małych kawałków pamięci): fragmentacja zewnętrzna W celu uniknięcia fragmentacji zewnętrznej przydziela się procesom bloki o ustalonej długości (by nie przechowywać informacji o małych dziurach np. 2 bajtowej wielkości )
Przydział ciągły pamięci Proces może otrzymać więcej pamięci niż potrzebuje (fragmentacja wewnętrzna) Rozwiązaniem fragmentacji zewnętrznej jest upakowanie: jest to przemieszczanie i łączenie wolnych bloków pamięci.
Stronicowanie Metoda pozwalająca na nieciągłość fizycznej przestrzeni adresowej procesu Ogranicza się w niej problemu fragmentacji
Stronicowanie Pamięć fizyczną dzieli się na bloki o stałej długości (ramki) Pamięć logiczna podzielona jest na bloki o tym samym rozmiarze (strony) Gdy ma nastąpić wykonanie procesu, jego strony wprowadzane są w dowolne ramki
Stronicowanie
Stronicowanie Każdy adres wygenerowany przez procesor dzieli się na numer strony p i odległość na stronie d Numer strony jest indeksem w tablicy stron Tablica stron zawiera adresy wszystkich stron w pamięci operacyjnej W połączeniu z odległością na stronie d adres bazowy pozwala określić miejsce danych w pamięci fizycznej
Stronicowanie
Stronicowanie Rozmiar strony i ramki jest określany przez sprzęt Zwykle jest to potęga 2 Taki wybór ułatwia adresowanie Jeśli przestrzeń adresowa 2^m a rozmiar strony 2^n to adres logiczny jest postaci: page number page offset p d m -n n
Stronicowanie Przykład: strona 4 słowa; pamięć fizyczna 32 słowa
Stronicowanie Fragmentacja przykład: 2048 B rozmiar strony Proces 72776 B Proces potrzebuje 35 ramek i 1086 B Proces otrzyma 36 ramek, ostatnia będzie miała 2048-1086=962 wolnych bajtów W najgorszym razie n-1 wolnych B Średnio 1/2n B wolnych (w ostatniej ramce )
Stronicowanie Rozmiar ramki jest problemem optymalizacyjnym (preferowane małe ramki, generują dużo informacji do przechowywania)
Stronicowanie wolne ramki: a) przed przydziałem; b) po przydziale
Implementacja tablicy stron Przechowywana jest w pamięci Do jej wskazania służy rejestr bazowy tablicy stron Dostęp do komórki i: odwołanie do rejestru bazowego tablicy stron (ustalenie adresu strony w pamięci) + odwołanie do pamięci fizycznej Podsumowując: potrzeba dwóch odwołań do pamięci
Implementacja tablicy stron Rozwiązanie: bufor translacji adresów stron TLB Szybka pamięć sprzętowa przyspieszająca wyszukiwanie Wyszukiwanie równoległe Zazwyczaj może zawierać małą liczbę adresów Potrzebna implementacja zdarzeń: brak adresu, wymiana adresu
Implementacja tablicy stron Schemat działania:
Szacowanie czasu dostępu Współczynnik trafień procent numerów stron odnajdywanych w TBL np. 0,8 Czas przeszukania TBL np. 20ns Czas dostępu do pamięci 100 ns
Szacowanie czasu dostępu Gdy adres znajduje się w TBL czas dostępu wynosi: 20ns (przeszukanie) + 100ns (odwołanie do pamięci) Gdy adresu nie ma w TBL: 20ns (przeszukanie) + 100ns (odwołanie do tablicy stron) + 100ns (odwołanie do pamięci)
Efektywny czas dostępu Dla współczynnika trafień 0,8: 0,8*120+0,2*220 = 140 ns Dla współczynnika 98% O,98*120 + 0,02*220 = 122ns
Ochrona pamięci Tablica stron może również służyć do ochrony pamięci przed nieuprawnionym użyciem Dodatkowe bity w tablicy mogą służyć do oznaczenia specyfikacji pamięci (tylko do odczytu itp. )
Ochrona pamięci Bit poprawności: informuje o tym czy dana strona należy do logicznej przestrzeni procesu
Ochrona pamięci Obecnie tablice stron są bardzo pojemne, procesy nie wykorzystują ich w pełni Niektóre systemy wykorzystują dodatkowo rejestr długości tablicy stron, by przechowywać informację o wykorzystywanej długości tablicy
Strony dzielone Stronicowanie umożliwia dzielenie wspólnego kodu przez procesy Kod musi być kodem wznawialnym (niemodyfikującym samego siebie) W celu wykonanie kodu przez kilka procesów, wystarczy przechowywać jego jedną kopię Każdy proces potrzebuje dodatkowo własnej pamięci na przechowywanie danych
Strony dzielone Schemat stron dzielonych
Struktura tablicy stron Stronicowanie hierarchiczne System 32 bitowy, rozmiar strony 4KB, maksymalny rozmiar tablicy stron 2^32/2^12 ok. milion wpisów Jeżeli każda pozycja w tablicy ma 4B to rozmiar tablicy dla procesu wynosi do 4MB Tablica stron staje się zbyt duża Jednym z rozwiązań jest stronicowanie dwupoziomowe, w którym tablica stron dzielona jest na części
Stronicowanie dwupoziomowe Tablica stron jest dzielona na strony System 32 bitowy, adres logiczny to 20 bitowy numer strony i 10 bitowa odległość na stronie Dokonuje się podziału adresu strony do postaci
Stronicowanie dwupoziomowe Schemat dwupoziomowej tablicy stron
Stronicowanie dwupoziomowe Tłumaczenie adresu w dwupoziomowej architekturze 32 bitowej
Stronicowanie dwupoziomowe W systemach 64 bitowych stronicowanie dwupoziomowe wciąż prowadzi do zbyt dużego rozmiaru strony zewnętrznej Rozwiązaniem może być wprowadzenie większej liczby poziomów By rozmiar każdej ze stron miał 10 bitów potrzebne jest 7 poziomów Zastosowanie tego rozwiązania prowadziłoby do zbyt wolnego dostępu do pamięci Z tego względu stronicowanie hierarchiczne nie jest stosowane w architekturach 64 bitowych
Haszowana tablica stron Zasada działania: numer strony wirtualnej podlega haszowaniu Następuje przeszukanie listy elementów powiązanych z tablicą haszującą W przypadku poszukiwania zakończonego sukcesem buduje się adres logiczny
Haszowana tablica stron Schemat działania
Odwrócona tablica stron W stronicowaniu każdy proces posiada własną tablicę stron Innym sposobem powiązania adresów wirtualnych i fizycznych jest odwrócona tablica stron
Odwrócona tablica stron Polega ona na utworzeniu jednej tablicy przechowującej listę wszystkich stron znajdujących się aktualnie w pamięci, dla wszystkich procesów Adres logiczny składa się z: identyfikatora procesu, numeru strony, odległości
Odwrócona tablica stron Odwołanie do pamięci polega na pobraniu identyfikatora procesu i numeru strony i przeszukaniu odwróconej tablicy stron
Odwrócona tablica stron Zaletą rozwiązania jest ograniczenie pamięci potrzebnej do przechowywania tablicy Niewątpliwą wadą jest dłuższy czas dostępu, związany z koniecznością przeszukiwania tablicy Utrudnionej jest również implementowanie wspólnych obszarów pamięci
Segmentacja Odpowiada szczególnemu sposobowi widzenia pamięci przez użytkowników (podział na segmenty)
Segmentacja Adres logiczny zawiera numer segmentu oraz odległość Tablica segmentów odwzorowuje adres logiczny na adres fizyczny
Segmentacja Adres konstruuje się na podstawie wartości bazy, granica umożliwia ochronę pamięci
Segmentacja Zalety: ochrona danych segmenty pozwalają rozdzielić różne funkcje procesów przez co ochrona staje się łatwiejsza (w segmencie przeznaczonym do odczytu nie będzie dopuszczony zapis itp. ) Umożliwia dzielenie kodu między procesami
Segmentacja Przykład współdzielenia kodu
Segmentacja Segmentacja ze stronicowaniem
Segmentacje Obecnie używana w ograniczonym stopniu (nie dla każdego procesu) Procesory wciąż zapewniają wsparcie dla segmentacji
Podsumowanie