W systemie wielozadaniowym: Wpamięci wiele procesów jednocześnie Każdy proces potrzebuje pamięci na: Instrukcje (kod lub tekst) Dane statyczne (w programie) Dane dynamiczne (sterta, stos). System operacyjny potrzebuje pamięci na swoje instrukcje i dane. Pamięć musi być dzielona pomiędzy system operacyjny i procesy. Podstawy Wymiana (swapping) Alokacja ciągła (contiguous allocation) Stronicowanie (paging) Segmentacja (segmentation) Segmentacja stronicowana (segmentation with paging) 4.1 4.3 Podsystem zarządzania pamięcią Podstawy Zadania podsystemu: Relokacja (relocation) Alokacja (allocation) Ochrona (protection) Współdzielenie (sharing) Organizacja logiczna Organizacja fizyczna Przed wykonaniem proces musi być wprowadzony do pamięci operacyjnej. Kolejka wejściowa (Input queue) zbiór procesów na dysku, oczekujących na wprowadzenie do pamięci operacyjnej w celu wykonania. 4.2 4.4
Wiązanie (binding) rozkazów i danych z adresami pamięci Wieloetapowe przetwarzanie programu użytkownika Fragment programu: W języku assembler: Jakie wartości adresów przypisać Rx i Ry?: 4.5 4.7 Wiązanie (binding) rozkazów i danych z adresami pamięci Powiązanie adresów i danych z adresami pamięci może być wykonane na różnych etapach: W czasie kompilacji (Compile time): Jeśli lokacja pamięci jest znana a priori, może być generowany kod bezwzględny; konieczna rekompilacja, gdy adres startowy ulegnie zmianie. Wczasie ładowania (Load time): Jeśli lokacja pamięci nie jest znana w czasie kompilacji, kompilator musi wytworzyć kod relokowalny (relocatable code) wiązanie jest opóźniane do czasu ładowania. W czasie wykonania (Execution time): Wiązanie jest opóźniane aż do czasu wykonywania programu; proces może być relokowany pomiędzy różnymi segmentami pamięci. Rozwiązanie wspomagane sprzętowo(np., rejestry bazowe, rejestry graniczne - base and limit registers). Przestrzeń adresów logicznych i fizycznych Koncepcja adresów logicznych i fizycznych: Adresy logiczne (wirtualne) generowane przez CPU. Adresy fizyczne widziane przez jednostkę pamięci. Adresy logiczne i fizyczne są: takie same, gdy wiązanie zachodzi w czasie kompilacji lub ładowania, różne, gdy wiązanie ma miejsce w czasie wykonania. 4.6 4.8
Jednostka zarządzania pamięcią Memory-Management Unit (MMU) Urządzenie sprzętowe, które odwzorowuje adresy wirtualne na fizyczne. MMU zawartość rejestru relokacji jest dodawana do każdego adresu generowanego przez proces użytkownika odwołującego się do pamięci. Program użytkownika operuje adresami logicznymi; nigdy nie posługuje się rzeczywistymi, fizycznymi adresami. Ładowanie dynamiczne Procedura jest ładowana dopiero po wywołaniu. Lepsze wykorzystanie pamięci; procedury niewywoływane nie są ładowane. Efektywne, gdy obszerne fragmenty kodu rzadko wywoływane. 4.9 4.11 Relokacja dynamiczna Łączenie dynamiczne Łączenie konsolidacja (linking) opóźniane aż do czasu wykonywania programu. Małe fragmenty kodu (stub), przeznaczone do lokalizacji procedur bibliotecznych rezydujących w pamięci. Stub zostaje zastępowany adresem procedur, a następnie procedura jest wykonywana. System operacyjny sprawdza, czy procedura jest obecna w przestrzeni adresowej procesu. Łączenie dynamiczne jest szczególnie pożyteczne w odniesieniu do bibliotek. 4.10 4.12
Nakładki (overlays) Wymiana (swapping) Wpamięci przechowuje się tylko te instrukcje i dane, które są potrzebne w danym czasie. Konieczne, gdy proces zajmuje więcej pamięci, niż mu przydzielono. Implementacja na poziomie użytkownika. Proces może zostać czasowo wysłany z pamięci głównej do zewnętrznej (backing store), a po jakimś czasie sprowadzony ponownie do pamięci głównej celem kontynuowania wykonywania. Pamięć zewnętrzna (backing store) szybki dysk, dostatecznie pojemny, zdolny do przechowywania kopii obrazów pamięci używanej przez wszystkich użytkowników; musi zapewniać dostęp bezpośredni. Podczas wymiany najdłużej trwają transmisje; czas transmisji wprost proporcjonalny do objętości pamięci wymienianej. Wróżnych systemach modyfikacje systemu wymiany, np. dla UNIX, Linux, czy Windows. 4.13 4.15 Nakładki dla assemblera dwuprzebiegowego Wymiana 4.14 4.16
Alokacja ciągła Alokacja ciągła (cd.) Pamięć główna zwykle jest dzielona na dwie partycje (obszary): Dla rezydującego systemu operacyjnego; zwykle dolna przestrzeń adresowa, łącznie z wektorem przerwań. Dla procesów użytkowników; zwykle w obszarze górnym pamięci. Przydzielanie wielu obszarów Dziura (Hole) blok dostępnej pamięci; rozmiary różne. Procesowi przydzielana jest dziura o wystarczającej pojemności. System operacyjny przechowuje informacje dotyczące: a) przydzielonych partycji b) wolnych partycji (dziur) Przydział (alokacja) pojedynczego obszaru. Rejestr relokacji (bazowy) używany do wzajemnej ochrony procesów użytkowników. Rejestr relokacji zawiera wartość najmniejszego adresu fizycznego; Rejestr graniczny zawiera max. wartość dla adresów logicznych;. OS process 5 process 8 OS process 5 OS process 5 process 9 OS process 5 process 9 process 10 process 2 process 2 process 2 process 2 4.17 4.19 Przemieszczanie dynamiczne Problem dynamicznej alokacji pamięci Strategie wyboru wolnego obszaru (dziury). Pierwsza pasująca (first-fit): Przydzielanie pierwszego obszaru wystarczająco dużego. Najlepiej pasująca (best-fit): Przydzielanie najmniejszego obszaru, wystarczająco dużego; wymaga przeszukiwania całej listy (jeśli nie jest uporządkowana); Pozostająca część obszaru jest najmniejsza. Najgorzej pasująca (worst-fit): Przydzielanie największej dziury. First-fit i best-fit lepsze niż worst-fit ze względu na szybkość i wykorzystanie pamięci. 4.18 4.20
Fragmentacja Translacja adresów Fragmentacja zewnętrzna (external fragmentation) suma wolnych obszarów wystarczająco duża dla spełnienia zamówienia, ale nie stanowi spójnego obszaru. Fragmentacja wewnętrzna (internal fragmentation) przydzielono nieco więcej pamięci niż zamawiano; niewykorzystana część partycji nie może być przydzielona innemu procesowi. Redukcja fragmentacji zewnętrznej poprzez upakowanie pamięci (compaction): Przemieszczenie zawartości pamięci tak, aby cała wolna pamięć znalazła się w jednym bloku (partycji). Upakowanie możliwe tylko wtedy, gdy relokacja adresów dynamiczna i wykonywana w czasie wykonywania programu. Adres generowany przez CPU jest podzielony na: Numer strony (p) (page number) używany jako indeks do tabeli stron (zawierającej nr ramki), która służy do wyznaczenia adresu bazowego każdej strony w pamięci fizycznej (nr ramki*rozmiar ramki). Odległość na stronie (d) (page offset) wpołączeniu z adresem bazowym służy do wyznaczenia adresu fizycznego przesyłanego do MMU. 4.21 4.23 Stronicowanie (paging) Translacja adresów - schemat Przestrzeń adresów logicznych procesu może być nieciągła; procesowi przydzielana jest dostępny obszar pamięci fizycznej. Pamięć fizyczna jest dzielona na bloki o stałym rozmiarze, zwane ramkami (frames); rozmiar jest potęgą 2, 512-8192 bajtów. Pamięć logiczna jest dzielona na bloki o tym samym rozmiarze nazywane stronami (pages). Prowadzić rejestr wolnych ramek. Aby uruchomić program o rozmiarze n stron należy znaleźć n wolnych ramek i załadować do nich program. Tabela stron translacja adresów logicznych na fizyczne. Fragmentacja wewnętrzna możliwa. 4.22 4.24
Przykład 1 Wolne ramki Przed przydziałem Po przydziale 4.25 4.27 Przykład 2 Implementacja tabeli stron Tabela stron jest przechowywana w pamięci głównej (operacyjnej). Rejestr bazowy tabeli stron (page-table base register (PTBR)) - wskazuje na tabelę. Rejestr rozmiaru tabeli stron (page-table length register (PRLR)) zawiera rozmiar tabeli stron. Każdy dostęp do instrukcji/danych wymaga dwu dostępów do pamięci (jeden do tabeli stron, drugi do instrukcji/danych). Problem może być rozwiązany poprzez zastosowanie pamięci asocjacyjnej szybka pamięć notatnikowa (cache); inna nazwa to bufor translacji bliskiego otoczenia (translation look-aside buffers (TLBs)) 4.26 4.28
Pamięć asocjacyjna TLB Ochrona pamięci Translacja adresu Translacja (A, A ): Page # Frame # Jeśli A jest w rejestrze asocjacyjnym, pobierz nr ramki. W przeciwnym razie weź nr ramki z tabeli stron. Realizacja poprzez dołączenie bitu ochrony dla każdej ramki. Do każdej pozycji w tabeli stron dołącza się bit ważności (valid-invalid bit): valid oznacza, że strona jest w przestrzeni adresów logicznych procesu (strona jest legalna). invalid w przeciwnym przypadku. 4.29 4.31 Stronicowanie TLB Valid (v) / Invalid (i) Bit tabeli stron 4.30 4.32
Struktura tabeli stron Przykład tabeli dwupoziomowej Stronicowanie hierarchiczne (Hierarchical Paging) Tabele mieszane (Hashed Page Tables) Tabele odwrotne (Inverted Page Tables) Adres logiczny (maszyna 32-bit, rozmiar strony 4K) podzielony na: nr strony (20 bitów). ofset na stronie (12 bitów). Ponieważ tabela stron jest stronicowana, to numer strony jest dalej podzielony na: nr strony (10-bitów). ofset na stronie (10-bitów). Adres logiczny: Nr strony ofset p 1 p 2 d 10 10 12 gdzie p 1 indeks dla zewnętrznej tabeli stron, p 2 jest przesunięciem względem początku strony w tabeli stron. 4.33 4.35 Tabele hierarchiczne Dwupoziomowa tabela stron Przestrzeń adresów logicznych rozdzielona pomiędzy wiele tabel stron. Prosta technika: dwupoziomowa tabela stron. 4.34 4.36
Schemat translacji adresów Przykład stron dzielonych Dla stronicowania dwupoziomowego w architekturze 32-bitowej. 4.37 4.39 Strony dzielone Segmentacja Kod dzielony Kod wznawialny (reentrant) kod tylko do odczytu współużytkowany przez procesy (np. edytory tekstu, kompilatory, systemy okienkowe itp.). Musi pojawiać się w tej samej lokacji przestrzeni adresów logicznych wszystkich procesów. Kod i dane prywatne Każdy proces posiada oddzielną kopię kodu i danych. Strony z prywatnym kodem i danymi mogą pojawiać się w dowolnym miejscu przestrzeni adresów logicznych. Schemat zarządzania pamięcią jest zgodny ze sposobem widzenia pamięci przez użytkownika. Program jest zbiorem segmentów. Segment to jednostka logiczna, taka jak: program główny (main program), procedura (procedure), funkcja (function), metoda (method), obiekt (object), zmienne lokalne i globalne (local, global variables) blok wspólny (common block), stos (stack), tabela symboli (symbol table), tablice (arrays). 4.38 4.40
Program widziany przez użytkownika Architektura segmentacji Adres logiczny składa się z dwóch części: <segment-number, offset>, Tabela segmentów (segment table) zawiera: Baza (base) adres fizyczny początku segmentu w pamięci. Ograniczenie (limit) długość segmentu. Rejestr bazowy tabeli segmentów (segment-table base register (STBR)) wskazuje lokację tabeli segmentów w pamięci. Rejestr długości (segment-table length register (STLR)) zawiera liczbę (s) segmentów w programie; s legalne gdy s < STLR. 4.41 4.43 Logika segmentacji Architektura segmentacji (cd.) 1 1 4 Relokacja. dynamiczna za pośrednictwem tabeli segmentów. 2 Dzielenie. Segmenty dzielone (shared segments) 3 4 2 3 Wspólny numer segmentu (same segment number). Alokacja (allocation). Pierwszy pasujący/ najlepiej pasujący (first fit/best fit) Fragmentacja zewnętrzna (external fragmentation). Przestrzeń użytkownika Przestrzeń pamięci fizycznej 4.42 4.44
Architektura segmentacji (cd.) Przykład segmentacji Ochrona. Każda pozycja w tabeli segmentów zawiera dodatkowo: Bit ważności (validation bit) = 0 => segment nielegalny Uprawnienia do odczytu/zapisu/wykonania (read/write/execute privileges). Zkażdym segmentem związane są bity ochrony; dzielenie kodu na poziomie segmentu. Segmenty różnej długości, przydział pamięci dynamicznie. 4.45 4.47 Segmentation Hardware Dzielenie segmentów 4.46 4.48
Dzielenie segmentów 4.49 Intel 30386 Address Translation 4.50