340 likes | 549 Views
Systemy operacyjne. Wykład 10 - ostatni Pamięć wirtualna. dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz. Egzamin – 27.06.2014. Warunkiem uczestnictwa w tym terminie egzaminu jest zaliczenie laboratorium na dzień 27.06.
E N D
Systemy operacyjne Wykład 10 - ostatni Pamięć wirtualna dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznychi Informatyki http://wbieniec.kis.p.lodz.pl/pwsz
Egzamin – 27.06.2014 Warunkiem uczestnictwa w tym terminie egzaminujest zaliczenie laboratorium na dzień 27.06 • Pytania testowe – jak na przedmiocie Architektura: • Wybór Tak / Nie • Wybór jednej opcji z listy • Wybór kilku opcji z listy • Ustawienie opcji w odpowiedniej kolejności • Pytania o krótkiej odpowiedzi: • Uzupełnić, opisać wykres • Rozwinąć , wyjaśnić skrót • Zadanie • Szeregowanie procesów • Przydział pamięci
Metody oszczędzania pamięci Metody pozwalające zmniejszyć zużycie miejsca w pamięci operacyjnej: – łączenie dynamiczne – ładowanie dynamiczne – nakładanie. Idea: fragment kodu programu nie jest wprowadzany do pamięci komputera dopóki nie ma faktycznego zapotrzebowania na jego wykonanie. Dzięki temu fragmenty kodu wykonywane rzadko nie zajmują miejsca w pamięci. Te fragmenty obejmują najczęściej: – procedury obsługi wyjątków, – struktury danych, które nie są w pełni wykorzystywane, – fragmenty kodu, których wykonanie jest objęte warunkiem, który rzadko jest spełniony. Wada Programista aplikacji musiałby utworzyć odpowiedni system gospodarowania pamięcią. Rozwiązanie Zarządzanie pamięcią przez system operacyjny.
Zasada lokalności programu Zasada lokalności przestrzennej Jeśli nastąpiło odwołanie programu do pewnej lokacji w pamięci komputera, to następne odwołania z dużym prawdopodobieństwem będą dotyczyły lokacji położonej w pobliżu tej do której nastąpiło to odwołanie. Zasada lokalności czasowej Jeśli nastąpiło odwołanie programu do określonej lokacji w pamięci komputera, to w przyszłości to odwołanie zostanie wielokrotnie powtórzone. Spełnienie zasad lokalności przez program powoduje, że jest możliwość automatycznego zarządzania pamięcią przez system operacyjny. Jedną z możliwości jest pamięć wirtualna.
Idea pamięci wirtualnej System operacyjny pozwala na wykorzystanie pamięci o pojemności większej od zainstalowanej pamięci RAM, dzięki wykorzystaniu przestrzeni dysku twardego. Mechanizm ukryty przed procesami użytkownika. Proces “widzi” logiczną przestrzeń adresową od 0 do max_address Obszary logicznej przestrzeni adresowej, do których proces często się odwołuje przechowywane są w pamięci RAM. Obszary, do których proces odwołuje się rzadko, są na dysku. System operacyjny bez współpracy procesu przesyła dane do oraz z dysku. Pamięć wirtualna jest szczególnie przydatna w systemach wieloprogramowych. Wszystkie uruchomione procesy są załadowane w całości do pamięci logicznej, ale w RAM znajdują się obszary wykorzystywane przez aktualnie wykonywany proces.
Implementacja pamięci wirtualnej Metody implementacji pamięci wirtualnej (ang. virtualmemory) Stronicowanie na żądanie (ang. demandpaging) Segmentacja (na żądanie) Segmentacja stronicowana (na żądanie) Stronicowanie zwykłe – przed rozpoczęciem wykonania programu jego strony muszą być załadowane do pamięci operacyjnej. Stronicowanie na żądanie – technika leniwej wymiany (ang. lazyswapper). Przed rozpoczęciem wykonania programu jego strony ładowane są do obszaru wymiany na dysku. Gdy nastąpi odwołanie do strony – jest ona wprowadzana do RAM. technika wymaga wzbogacenia każdej pozycji w tablicy stron o dodatkowy bit, nazywany bitem poprawności odniesienia, który sygnalizuje, czy strona do której odwołuje się program jest załadowana do pamięci operacyjnej.
Format pozycji tablicy stron Ochrona: Pozwolenie na zapis i odczyt (ewentualnie wykonanie). D (ang. dirty) automatycznie ustawiany na jeden, jeżeli strona zostanie zmodyfikowana. R (ang. referenced) automatycznie ustawiany na jeden, jeżeli nastąpi odwołanie do strony. V (ang. valid) 1-strona jest w pamięci 0 – strony nie ma w pamięci. Jeżeli V==0, to próba odwołania do strony generuje wyjątek błędu strony (ang. pagefault) Jeżeli V==0, to numer ramki jest nieistotny. System operacyjny może w tym miejscu przechować numer bloku dyskowego, w którym zapisano stronę.
Przechowywanie stron na dysku Ciągły obszar w przestrzeni wymiany odpowiada logicznej przestrzeni adresowej. Numer ramki w tablicy stron identyfikuje przy pomocy tablicy pomocniczej numer bloku dyskowego.
Obsługi błędu strony Błąd strony jest obsługiwany przez odpowiednia procedurę obsługi wyjątku. z „punktu widzenia” procesu, który czeka na obsługę błędu strony, wykonywany jest szereg innych czynności zachowanie stanu bieżącego procesu; sprawdzenie poprawności adresu, który wygenerował wyjątek (jeśli adres był nieprawidłowy to kończymy wykonanie procesu); rozpoczęcie wykonania operacji wejścia-wyjścia, której celem jest załadowanie odpowiedniej strony do wolnej ramki w pamięci operacyjnej; przydzielenie procesora innemu procesorowi na czas oczekiwania na zrealizowanie transmisji (ten krok niekoniecznie musi być wykonany); obsługa przerwania od dysku twardego sygnalizującego zakończenie operacji sprowadzania strony do pamięci. Po pomyślnym odczycie strony zmodyfikować pozycję w tablicy stron (numer ramki, V=1,D=0,R=0) oczekiwanie na przydzielenie procesowi dla którego została sprowadzona strona procesora; wykonanie przerwanego przez błąd strony rozkazu.
Wydajność stronicowania na żądanie Czas dostępu do pamięci RAM: 100 ns Czas sprowadzenia strony z dysku: 10 ms. Błąd braku strony zwiększa czas dostępu 100 000 razy Wniosek: Powinniśmy zadbać o to, aby błędy braku stron występowały bardzo rzadko. Efektywny czas dostępu do pamięci p – prawdopodobieństwo wystąpienia błędu ma – czas dostępu do pamięci tpfh – czas obsługi błędu strony Na czas obsługi błędu strony składają się czasy wykonania wszystkich czynności (poprzedni slajd). Czas ten jest długi, dlatego tez dąży się do jego skrócenia oraz do zminimalizowania liczby błędów strony (liczba ramek, które zostały programowi przydzielone i sprawność algorytmu wymiany).
Zastępowanie stron Problem podczas obsługi błędu strony – zabrakło wolnych ramek w pamięci. Rozwiązania: – Zawiesić proces, który żąda strony lub: – Wymiana stron Wymiana stron polega na odnalezieniu strony-ofiary, co do której istnieje podejrzenie, że nie będzie używana (już wcale lub w najbliższym czasie), wysłaniu jej do przestrzeni wymiany i sprowadzeniu w jej miejsce żądanej strony. Należy więc uzupełnić scenariusz obsługi błędu strony o następujące czynności: Jeśli nie istnieje wolna ramka, należy wytypować ramkę-ofiarę. Jeżeli ta strona w rej ramce została zmodyfikowana (D==1), jest zapisywana na dysku i aktualizowana jest tablic stron. Do zwolnionej ramki wczytywana jest żądana strona. Wybór strony-ofiary jest wykonywany przez algorytm zastępowania stron (ang. pagereplacement).
Algorytmy zastępowania stron Kryterium: Minimalizacja liczby błędów stron. Test algorytmu: za pomocą wygenerowanego losowo ciągu odwołań (ang. referencestring), czyli ciągu numerów stron, do których hipotetyczny program mógłby się odwoływać. Należy również założyć pewną liczbę wolnych ramek, którymi będzie dysponował ten program. Badanie przeprowadza się dla kilku różnych wartości tego czynnika, co pozwala sprawdzić, czy algorytm zachowuje sie poprawnie, tzn. czy wraz ze wzrostem liczby ramek maleje liczba błędów stron. W przykładach wykorzystamy ciąg odwołań : 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
Algorytm FIFO Zastąp stronę, która została sprowadzona jako pierwsza do pamięci. Sprowadzone strony tworzą kolejkę. Kolejność odwołań: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5. Jeżeli procesowi przydzielono trzy ramki: Jeżeli procesowi przydzielono cztery ramki:
Algorytm FIFO drugiej szansy Niestety działanie FIFO nie gwarantuje, że strona wymieniana nie będzie w najbliższym czasie potrzebna, dlatego algorytm FIFO generuje dużą liczbę błędów stron, a dodatkowo obciążony jest anomalią Belady’ego, tzn. wraz ze wzrostem liczby ramek może wzrastać liczba błędów stron. Algorytm drugiej szansy jest to modyfikacja algorytmu FIFO W standardowym algorytmie FIFO wybierana jest pierwsza strona z kolejki W algorytmie drugiej szansy sprawdzany jest bit odniesienia R. – Jeżeli R==0 (brak odniesienia) to strona jest wybierana na ofiarę. – Jeżeli R==1 (odniesienie) to: ● R = 0 ● Strona przesunięta jest na koniec kolejki (“otrzymała drugą szansę”). ● Przechodzimy do kolejnej strony w kolejce.
Algorytm drugiej szansy Jeżeli procesowi przydzielono trzy ramki: FIFO
Algorytm drugiej szansy Jeżeli procesowi przydzielono cztery ramki: FIFO
Algorytm optymalny Algorytm teoretyczny – powoduje najmniejszą liczbę wymian stron, a zarazem najmniejszą liczbę błędów stron. Zastąp stronę, do której nie będziemy się odwoływać przez najdłuższy czas. W praktyce – nie możliwe jest przewidzenie, która ze stron będzie najdłużej potrzebna Algorytm ten zwany OPT lub MIN jest stosowany do porównywania innych algorytmów i badania i stopnia, w jakim go przybliżają.
Algorytm optymalny Kolejność odwołań: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5. Jeżeli procesowi przydzielono trzy ramki: Jeżeli procesowi przydzielono cztery ramki:
Algorytm LRU Algorytm LRU (ang. LeastRecentlyUsed) wymienia tę stronę, która najdawniej była używana. Stanowi on w pewnym sensie odwrotność działania algorytmu OPT. Algorytm OPT „patrzy w przyszłość”, żeby znaleźć stronę do wymiany, a algorytm LRU „patrzy w przeszłość”. LRU jest najpopularniejszym algorytmem stosowanym do wymiany stron. Efektywność jego działania jest zbliżona do efektywności algorytmu OPT. Brak anomalii Belady’ego. Jeżeli procesowi przydzielono trzy ramki: Kolejka
Algorytm LRU Jeżeli procesowi przydzielono cztery ramki: Kolejka
Implementacja LRU Implementacja algorytmu LRU trudna, wymaga wsparcia sprzętu. Aby określić, która ze stron była najdawniej używana stosuje się liczniki, albo stos. Liczniki: każda pozycja tablicy stron ma wartość zegara logicznego, która jest zwiększana, przy każdym odwołaniu do strony. Problemem może być powstanie nadmiaru w zegarze logicznym. Stos: zawiera numery stron do których się odwoływał program . Numer strony, która została ostatnio użyta jest na szczycie tego stosu, a numer strony, która najdawniej była używana jest na jego dnie. Liczba elementów na stosie jest równa liczbie ramek. Zastosowanie stosu w implementacji algorytmu LRU pozwoliło określić klasę algorytmów nazywanych algorytmami stosowymi, które nie prowadzą do anomalii Belady’ego. Algorytm stosowy to taki algorytm dla którego zbiór stron obecnych w pamięci przy n dostępnych ramkach jest podzbiorem zbioru stron obecnych w pamięci, gdyby było dostępnych n+1 ramek. Jeśli w systemie nie ma odpowiednich środków sprzętowych do realizacji algorytmu LRU, to można zastosować metodę, która będzie dawała rezultaty zbliżone do rezultatów tego algorytmu.
Symulowanie algorytmu LRU algorytm MFU (ang. Most FrequentlyUsed) - wymienia on tę stronę, do której najczęściej się odwoływano, wychodząc z założenia, że nie będzie już potrzebna. Co pewien czas, w procedurze obsługi, przerwania zegarowego system przegląda tablicę stron. Dla strony w której R==1 (referenced) zwiększana jest zawartość licznika i R jest ustawiany na zero. W ten sposób strony, do których występuje wiele odwołań, charakteryzują się dużą wartością licznika. Jako ofiara wybierana jest strona o największej wartości licznika. Algorytm LFU (ang. LeastFrequentlyUsed) wybiera do wymiany te strony, do których najrzadziej się odwoływano.
Zastosowanie bitów R i D R (bit odniesienia) automatycznie ustawiany na jeden, jeżeli nastąpi odwołanie do strony. D (bit modyfikacji) automatycznie ustawiany na jeden, jeżeli strona zostanie zmodyfikowana. Możemy wyróżnić cztery stany stron, w zależności od ustawienia tych bitów w celu znalezienia kandydata do wymiany. (0,0) – strona nie używana i nie zmieniona, idealna kandydatka do wymiany, nie trzeba jej nawet zapisywać do przestrzeni wymiany, (0,1) – strona nie używana ostatnio, a więc może być wymieniona, ale trzeba ją zapisać do pamięci pomocniczej, bo jej stan uległ zmianie, (1,0) – strona używana, ale nie zmieniona, może być potrzebna, ale ewentualna jej wymiana nie wymagałaby zapisu jej zawartości na dysk, (1,1) – strona używana i zmieniona, nie wymieniać! Wymianę stron zaczyna sie od tych, które należą do pierwszej klasy, jeśli nie ma takowych, to brane są pod uwagę strony z następnych klas.
Pobieranie stron do pamięci Pobieranie następuje w momencie wystąpienia błędu braku strony. Jeżeli strona jest tylko do odczytu, np. kod programu to możemy wczytać ją z pliku wykonywalnego. – Przy starcie procesu żadna strona nie jest w pamięci. – Duża liczba błędów strony przy starcie programu. – Fragmenty kodu, które nie są wykorzystane, nie zostaną wczytanie do pamięci. Wczytuj strony grupami. Jeżeli mamy odwołanie do strony a, to prawdopodobne są odwołania do stron a+1,a+2,...
Zapisywanie zmodyfikowanych stron Strona zapisywana w momencie jej zastąpienia. – Mała liczba zapisów na dysk – Algorytm powolny: brak strony powoduje konieczność zapisania strony na dysk i wczytania strony z dysku. Strony zapisywane periodycznie w tle. – Proces drugoplanowy przegląda strony i zapisuje strony zmodyfikowane (D==1), do których ostatnio nie było odwołań. – Zapisanie strony powoduje skasowanie bitu D. – Proces drugoplanowy może zapisywać strony grupami => większa wydajność operacji dyskowych.
Buforowanie stron Zastępowanie stron niekoniecznie musi być przeprowadzane w momencie wystąpienia błędu braku strony. Odzyskane strony są umieszczane na jednej z dwóch list. – Lista stron zmodyfikowanych – Lista stron niezmodyfikowanych – bufor stron (ang. pagebuffer) Strony z listy stron zmodyfikowanych są grupami zapisywane na dysk i przenoszone do listy stron niezmodyfikowanych W przypadku zapotrzebowania na nową ramkę przydzielana jest jedna ramka z bufora stron. W przypadku wystąpienia błędu braku stron najpierw sprawdzamy czy ta strona jest na jednej z dwóch list.
Stronicowanie na żądanie w systemie wieloprogramowym na efektywność stronicowania na żądanie, oprócz algorytmu wymiany stron ma wpływ również metoda przydziału wolnych ramek procesom. Przypadek 1: w systemie pracuje system operacyjny i proces użytkownika. Podział zbioru wolnych ramek rozdziela ramki korzystnie dla procesu użytkownika. Jeśli skończy się pula wolnych ramek, to strony procesu użytkownika lub systemu operacyjnego podlegają wymianie. Możliwe, że system przekazuje część swoich ramek na rzecz procesu użytkownika lub system utrzymuje zawsze pewna liczbę wolnych ramek, aby usprawnić proces wymiany stron. Przypadek 2: system wielozadaniowy. Procesy rywalizują o przydział ramek Minimalna liczba ramek Aby proces mógł wykonać choć jeden rozkaz, w pamięci komputera musza znajdować się jednocześnie wszystkie strony, których ten rozkaz dotyczy. Nie można tego z góry – system operacyjny zakłada najgorszy scenariusz i przydziela tyle ramek, aby mógł w nich zmieścić wszystkie strony konieczne do wykonania najbardziej złożonego rozkazu na liście rozkazów procesora.
Algorytmy zastępowania ramek dla wielu procesów Zastępowanie stron w systemie wieloprogramowym. – Lokalne: strona-ofiara jest wybrana wyłącznie spośród stron procesu. – Globalne: strona-ofiara jest wybrana spośród stron wszystkich procesów Problem: Jak rozdzielić dostępne ramki pomiędzy procesy Przydział równy – przydziel stałą liczbę ramek: 100 ramek, 5 procesów, przydziel po 20 ramek. Przydział proporcjonalny – przydziel liczbę ramek proporcjonalną do rozmiaru procesu. Metody wywodzące się z przydziału proporcjonalnego oprócz rozmiaru procesu mogą uwzględniać też inne jego właściwości, np. priorytet.
Dynamiczna alokacja ramek Obserwuj częstość błędów stron dla procesu. – Jeżeli zbyt duża, przydziel mu dodatkowe ramki – Jeżeli zbyt mała, to zabierz ramki
Szamotanie Szamotanie procesu (ang. thrashing) występuje, gdy zmniejsza się przydział ramek dla danego procesu poniżej określonego progu. Proces ten zaczyna intensywnie wymieniać swoje strony. Proces zużywa więcej czasu na wymianę stron niż na wykonanie. Wykorzystanie procesora jest bardzo małe.
Przyczyny szamotania Występuje w systemach stosujących równocześnie planowanie długoterminowe (wsadowe) i stronicowanie na żądanie. Szamotanie jednego procesu powoduje zwiększenie obciążenia urządzenia wymiany a spadek obciążenia procesora. Planista chce zwiększyć wykorzystanie procesora – wprowadza do systemu nowe zadanie. Zadanie to zabiera część ramek pozostałym procesom i zwiększa ryzyko ich szamotania, które pojawia się lawinowo. Aby wyeliminować szamotanie należy zadbać o to by proces zawsze dysponował wystarczająca liczba ramek, aby pomieścić jednocześnie w pamięci wszystkie niezbędne w danej chwili do jego wykonania strony. Taki zbiór ramek nazywa się strefą. Stref w programie może być wiele, ale liczba wolnych ramek powinna być większa niż szerokość największej strefy Jeśli proces ulega szamotaniu, to może być całkowicie wycofany z pamięci operacyjnej do przestrzeni wymiany, do momentu aż w pamięci głównej pojawi się odpowiednia liczba ramek pozwalająca na jego prawidłowe wykonanie.
Konstrukcja kodu a szybkość wykonania Stronicowanie na żądanie jest teoretycznie przezroczyste dla programisty piszącego aplikacje dla użytkownika. Dobór struktur danych oraz sposobu odwołania do nich może mieć wpływ na częstotliwość błędów stron generowanych przez jego program. Zalecane jest stosowanie dużej liczby struktur odznaczających się dobrą lokalnością (np. stos) Nie jest zalecane stosowanie struktur odznaczających się złą lokalnością (np. tablica z adresowaniem mieszającym - ang. hashtable). Kompilacja i linkowanie mogą mieć znaczenie dla częstości błędów stron generowanych przez proces. Można ją zmniejszyć, jeśli kompilator będzie oddzielał kod od danych
Przykład optymalizacji kodu int A[1024][1024]; Każdy wiersz (4KB) jest przechowany na jednej stronie. Procesowi przydzielono jedną ramkę (4KB) – Program 1 for (j = 0; j<1024; j++) for(i = 0; i<1024; i++) A[i][j] = 0; Spowoduje 1024 x 1024 = 1048576 błędów strony – Program 2 for (i = 0; i<1024; i++) for(j = 0; j<1024; j++) A[i][j] = 0; Spowoduje 1024 błędy strony. Należy preferować kod odwołujący się do komórek pamięci o kolejnych adresach. (również ze względu na optymalne wykorzystanie pamięci podręcznej i szyny procesora).
Współpraca z urządzeniami I/O Proces P1 zgłasza żądanie odczytu z urządzenia do bufora w swojej pamięci. Czy strony, w których znajduje się bufor, są w pamięci ? Jeżeli nie, to trzeba je sprowadzić z dysku. Gdy P1 czeka na wykonanie odczytu, wykonuje się P2 P2 zgłasza błąd strony Problem: do zastąpienia może być wybrana strona P1, w której znajduje się bufor. Blokowanie (ang. locking) stron. – Strona zablokowana nie może być wybrana do zastąpienia. – Strony powinny pozostawać zablokowane przez stosunkowo krótki czas. Blokowanie wymaga wsparcia sprzętowego, w postaci odpowiedniego mechanizmu kontrolującego bit blokady (ang. lock) w tablicy stron. Blokowanie stron może również być użyte do ograniczenia szamotania procesów o niskim priorytecie