W systemie wielozadaniowym: W pamię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. Podsystem zarządzania pamięcią - zadania: Relokacja (relocation) Alokacja (allocation) Ochrona (protection) Współdzielenie (sharing) Organizacja logiczna Organizacja fizyczna 9.1 9.2 Podstawy Podstawy Wymiana (swapping) Alokacja ciągła (contiguous allocation) Stronicowanie (paging) Segmentacja (segmentation) Segmentacja stronicowana (segmentation with paging) 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. 9.3 9.4 Wiązanie (binding) rozkazów i danych z adresami pamięci Fragment programu: Wjęzyku assembler: Jakie wartości adresów przypisać Rx i Ry?: 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. W czasie ł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). 9.5 9.6 1
Wieloetapowe przetwarzanie programu użytkownika 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 zachdzi w czasie kompilacji lub ładowania, różne, gdy wiązanie ma miejsce w czasie wykonania. 9.7 9.8 Jednostka zarządzania pamięcią Memory-Management Unit (MMU) Relokacja dynamiczna 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. 9.9 9.10 Ładowanie dynamiczne Łączenie 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. Łą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. 9.11 9.12 2
Nakładki (overlays) Nakładki dla assemblera dwuprzebiegowego 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. 9.13 9.14 Wymiana (swapping) Wymiana 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. 9.15 9.16 Alokacja ciągła Przemieszczanie dynamiczne 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. 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;. 9.17 9.18 3
Alokacja ciągła (cd.) Problem dynamicznej alokacji pamięci Przydzielanie wielu obszarów OS process 5 process 8 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) OS process 5 OS process 5 process 9 OS process 5 process 9 process 10 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. process 2 process 2 process 2 process 2 9.19 9.20 Fragmentacja Stronicowanie (paging) 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. 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. 9.21 9.22 Translacja adresów Translacja adresów - schemat 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) w połączeniu z adresem bazowym służy do wyznaczenia adresu fizycznego przesyłanego do MMU. 9.23 9.24 4
Przykład 1 Przykład 2 9.25 9.26 Wolne ramki 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)) Przed przydziałem Po przydziale 9.27 9.28 Pamięć asocjacyjna TLB Stronicowanie TLB Translacja adresu Page # Frame # Translacja (A, A ): Jeśli A jest w rejestrze asocjacyjnym, pobierz nr ramki. W przeciwnym razie weź nr ramki z tabeli stron. 9.29 9.30 5
Efektywny czas dostępu Ochrona pamięci Szukanie asocjacyjne = ε jednostek czasu Załóżmy cykl pamięci = 1 mikrosekunda Współczynnik trafień (hit ratio) procent trafień numeru strony w rejestrze asocjacyjnym TLB. Hit ratio = α Efektywny czas dostępu (Effective Access Time (EAT)) EAT = (1 + ε) α +(2+ε)(1 α) =2+ε α 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. 9.31 9.32 Valid (v) / Invalid (i) Bit tabeli stron Struktura tabeli stron Stronicowanie hierarchiczne (Hierarchical Paging) Tabele mieszane (Hashed Page Tables) Tabele odwrotne (Inverted Page Tables) 9.33 9.34 Tabele hierarchiczne Przykład tabeli dwupoziomowej Przestrzeń adresów logicznych rozdzielona pomiędzy wiele tabeli stron. Prosta technika: dwupoziomowa tabela stron. 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. 9.35 9.36 6
Dwupoziomowa tabela stron Schemat translacji adresów Dla stronicowania dwupoziomowego w architekturze 32-bitowej. 9.37 9.38 Hashed Page Table Inverted Page Table Architecture 9.39 9.40 Strony dzielone Przykład stron dzielonych 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. 9.41 9.42 7
Segmentacja Program widziany przez użytkownika 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). 9.43 9.44 Logika segmentacji Architektura segmentacji 1 2 3 4 Przestrzeń użytkownika 1 4 2 3 Przestrzeń pamięci fizycznej 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. 9.45 9.46 Architektura segmentacji (cd.) Architektura segmentacji (cd.) Relokacja. dynamiczna za pośrednictwem tabeli segmentów. Dzielenie. Segmenty dzielone (shared segments) Wspólny numer segmentu (same segment number). Alokacja (allocation). Pierwszy pasujący/ najlepiej pasujący (first fit/best fit) Fragmentacja zewnętrzna (external fragmentation). 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 segmentaem związane są bity ochrony; dzielenie kodu na poziomie segmentu. Segmenty różnej długości, przydział pamięci dynamicznie. 9.47 9.48 8
Segmentation Hardware Przykład segmentacji 9.49 9.50 Dzielenie segmentów Dzielenie segmentów 9.51 9.52 Intel 30386 Address Translation 9.53 9