9.1
Pamięć wirtualna
1.
Podstawy.
2.
Stronicowanie na żądanie.
3.
Zastępowanie stron.
4.
Algorytmy zastępowania stron
5.Problem szamotania
6.Model zbioru roboczego
Wykład 12, Systemy operacyjne (studia dzienne) PJWSTK, Adam Smyk, 2016/17
9.2
1. Logiczna przestrzeń adresowana może być dużo większa niż przestrzeń fizyczna.
2. Umożliwia to wykonanie programu, który tylko w części znajduje się w pamięci fizycznej – program nie jest ograniczony wielkością dostępnej pamięci fizycznej (może być od niej większy).
3. Zwiększa wieloprogramowość (więcej procesów może być wykonywanych w tym samym czasie) → lepsze wykorzystanie procesora i wyższa przepustowość.
4. Pozwala na wydajniejsze tworzenie i wymianę procesów – mniej potrzebnych operacji wejścia-wyjścia.
5. Uwalnia użytkownika od potrzeby znajomości organizacji i ograniczeń pamięci fizycznej → ułatwia programowanie.
9.3
Podstawy
Pamięć wirtualna jest techniką, która umożliwia wykonanie procesów, pomimo że nie są one w całości przechowywane w pamięci operacyjnej. Pozwala stworzyć abstrakcyjną pamięć główną w postaci olbrzymiej, jednolitej tablicy i odseparować pamięć logiczną od pamięci fizycznej.
Pamięć wirtualna jest najczęściej implementowana w formie:
Stronicowania na żądanie (ang. demand paging) Segmentacji na żądanie (ang. demand segmentation)
9.4
Schemat pamięci wirtualnej
Odwzorowanie pamięci
Pamięć fizyczna
Dysk Pamięć
wirtualna Strona 0 Strona 1 Strona 2
. . .
Strona n
9.5
Stronicowanie na żądanie
Procesy podzielone na strony przebywają w pamięci pomocniczej (zwykle dysk).
Strona jest sprowadzana z pamięci pomocniczej do operacyjnej tylko wtedy, kiedy jest potrzebna.
Mniej operacji WE/WY.
Mniejsze zapotrzebowanie na pamięć.
Krótszy czas odpowiedzi.
Może pracować jednocześnie więcej użytkowników.
Strona jest potrzebna kiedy następuje do niej odwołanie.
Z każdą pozycją w tablicy stron związany jest bit poprawności (valid-invalid bit)
Odwołanie do strony z bitem poprawności równym 0 powoduje pułapkę braku strony (page-fault trap), po czym następuje awaryjne przejście do systemu operacyjnego.
9.6
Pamięć logiczna
0 A
1 B
2 C
3 D
4 E
5 F
A B
C D E
F
Dysk
Przykład schematu tablicy stron z brakiem stron w pamięci fizycznej
Tablica stron
0 4 1
1 0
2 6 1
3 0
4 0
5 9 1
Pamięć fizyczna 0 1 2 3
4 A
5
6 C
7 8
9 F
10 11 12 13 14 15 ramka bit poprawności
9.7
Dysk Pamięć
fizyczna
Obsługa braku stron
1
3
2
4 Strona jest w pamięci pomocniczej
Pułapka
Sprowadzenie brakującej strony
Operacja M 0
Odniesienie
6 Wznowienie
wykonania
System operacyjny
5 Odnowienie tablicy stron
9.8
Obsługa braku strony
1. Sprawdzamy wewnętrzną tablicę (w bloku kontrolnym procesu), aby określić czy odwołanie do pamięci było dozwolone.
2. Jeżeli odwołanie było niedozwolone, kończymy proces. Jeżeli było dozwolone, lecz zabrakło właściwej strony w pamięci, to sprawdzamy tę stronę.
3. Znajdujemy wolną ramkę.
4. Zamawiamy wczytanie z dysku potrzebnej strony do wolnej ramki.
5. Po zakończeniu czytania modyfikujemy wewnętrzną tablicę procesu, oraz tablicę stron, zaznaczając, że strona jest w pamięci.
6. Wznawiamy wykonanie rozkazu przerwanego brakiem strony i kontynuujemy wykonywanie procesu (czasami do wykonania rozkazu potrzeba sprawdzić więcej niż jedną stronę).
Skrajny przypadek: czyste stronicowanie na żądanie (pure demand paging) – rozpoczynanie wykonywania procesu bez żadnej strony w pamięci (nigdy nie sprowadza się strony do pamięci, zanim, nie będzie potrzebna).
9.9
Sprawność stronicowania na żądanie
Czas dostępu do pamięci: (nanosekundy)
Prawdopodobieństwo braku strony: p (0 p 1)
Czas obsługi braku strony: T
Efektywny czas dostępu: t_ef = (1-p)+pT
Główne składowe czasu obsługi braku strony:
1. Obsługa przerwania wywołanego brakiem strony.
2. Wczytanie strony z dysku do pamięci (zwykle najbardziej czasochłonne).
3. Wznowienie procesu.
9.10
Sprawność stronicowania na żądanie
Efektywny czas dostępu: t_ef = (1-p)+pT
Przykład: = 100 ns,
T = 25 ms = 25 000 000 ns,
t_ef = (1 – p) 100 + p 25 000 000 [ns]
t_ef = 100 + 24 999 900 p [ns]
Aby pogorszenie szybkości dostępu do pamięci spowodowane brakiem stron było mniejsze niż 10%
potrzeba:
P < 0,0000004,
czyli mniej niż 1 brak strony na 2 500 000 odniesień do pamięci!
9.11
Problem z pamięcią wirtualną
Załóżmy że mamy „10-stronicowy” proces, który używa tylko połowy ze swych stron
Stronicowanie na żądanie pozwala wówczas zaoszczędzić na operacjach WE/WY ponieważ nie wprowadza się stron, które nigdy nie będą użyte.
Można zwiększyć stopień wieloprogramowości, wykonując podwójnie więcej procesów, np. mając 40 ramek, to zamiast 4 procesów (każdy po 10 ramek), moglibyśmy wykonać 8 procesów
Powiększenie stopnia wieloprogramowości może doprowadzić do nadprzydziału pamięci
Może się z darzyć, że każdy z tych procesów dla szczególnego zestawu danych spróbuje użyć wszystkich 10 stron, co spowoduje zapotrzebowanie na 80 ramek, przy tylko 40 dostępnych.
9.12
Problem z pamięcią wirtualną
Nadprzydziałobjawi się w następujący sposób
Podczas wykonywania procesu użytkownika wystąpi brak strony
Sprzęt zaalarmuje SO, który sprawdzi swoje wewnętrzne tablice, aby rozstrzygnąć, że to jest brak strony.
SO określi miejsce przebywania strony na dysku, po czym okaże się, że na liście wolnych ramek nie ma ani jednej wolnej ramki (cała pamięć jest w użyciu).
Co może zrobić SO w takiej sytuacji?
Mógłby zakończyć proces użytkownika (nie jest to najlepsze rozwiązanie)
Mógłby wymienić proces, zwalniając wszystkie jego ramki i zmniejszając poziom wieloprogramowości
Istnieje jednak bardziej interesująca możliwość: zastępowania stron
9.13
Zastępowanie stron
Zasada zastępowania stron jest następująca:
Jeżeli wszystkie ramki są zajęte, to znajduje się taką, która nie jest właśnie używana i zwalnia się ją.
Ramkę można zwolnić poprzez zapisanie jej zawartości na dysku i zmianę tablicy stron.
Zwolnioną ramkę można użyć do wprowadzenia strony, której brak spowodował przerwanie procesu
9.14
Zastępowanie stron
Procedura obsługi braków stron ulega modyfikacji, aby uwzględnić zastępowanie stron:
1. Zlokalizowanie potrzebnej strony na dysku.
2. Odnalezienie ramki:
– Jeśli istnieje wolna ramka, to zostanie użyta;
– W przeciwnym razie trzeba wykonać algorytm zastępowania stron w celu wytypowania ramki-ofiary;
– Stronę-ofiarę zapisuje się na dysku (bit modyfikacji); towarzyszy temu stosowana zmiana tablic stron i ramek.
3. Wczytanie potrzebnej strony do świeżo zwolnionej ramki i zamiana tablicy stron i ramek
4. Wznowienie działania procesu.
9.15
2
3
Dysk Tablica stron
0
1
2 0 0
3 r 1
4
5
Pamięć fizyczna 0 1 2 3
r Ofiara
12 13 14 15 ramka bit poprawności
Schemat zastępowania stron
1 3 2
4 Zmiana na
„niepoprawne 0”
Uaktualnienie tablicy stron dla nowej
strony
Sprowadzenie potrzebnej
strony Wysłanie strony-ofiary
9.16
Algorytm zastępowania stron
Zależy nam na algorytmie, który minimalizuje częstość braków stron
Algorytm ocenia się na podstawie wykonania go na pewnym ciągu odniesień do pamięci i zsumowania liczby braków stron
Śledząc pewien proces moglibyśmy zanotować następujący ciąg adresów stron:
1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1
Liczba braków stron dla danego ciągu odniesień zależy:
Od liczby ramek procesu dostępnych w pamięci
Od całkowitej liczby dostępnych ramek
9.17
Algorytm FIFO
Numer każdej strony znajdująca się w pamięci operacyjnej, jest jednocześnie zapisywany do kolejki (FIFO)
Kiedy trzeba zastąpić stronę, wtedy wybiera się stronę najstarszą – z czoła kolejki FIFO
Liczba braków stron dla danego procesu i danego algorytmu: 15
Algorytm nie zawsze działa zadowalająco
strona zastępowana może zawierać zmienną, będącą ciągle w użyciu od dawna, ale jest najstarsza i musi być usunięta
za chwilę trzeba będzie sprawdzić z powrotem aktywną stronę, a usunąć inną
zły wybór przy zastępowaniu zwiększa liczbę braków stron i spowalnia wykonanie procesu
9.18
Anomalia Belady’ego
Rozpatrzmy ciąg odwołań do stron:
1 2 3 4 1 2 5 1 2 3 4 5
Rysunek przedstawia krzywą braków stron w zależności od liczby dostępnych ramek
anomalia Balady’ego – liczba braków stron dla 4-ch ramek jest większa od liczby stron dla 3-ch ramek
wniosek: w niektórych algorytmach zastępowania stron współczynnik braków stron może wzrastać ze wzrostem wolnych ramek
9.19
Algorytm optymalny (OPT)
Skoro algorytm FIFO nie do końca spełnia wymagania zamiany stron to:
Jaki algorytm jest algorytmem optymalnym?
Jakieś propozycje?
9.20
Algorytm optymalny (OPT)
Algorytm optymalny (OPT):
zastępuje tą stronę, która najdłużej nie będzie używana
Liczba braków stron dla tego samego ciągu odniesień i optymalnego algorytmu: 9
Algorytm jest trudny do realizacji ponieważ wymaga wiedzy o przyszłej postaci ciągu odniesieńUżywany jest więc głównie w studiach porównawczych, aby stwierdzić np. że jakiś algorytm odbiega od optymalnego w najgorszym razie o np.. 12,3%, a średnio jest gorszy od niego o 4,7%
9.21
Algorytm LRU (least recently used)
Algorytm optymalny nie jest osiągalny, ale być może da się uzyskać jego przybliżenie???
Do szacowania najbliższej przyszłości możemy użyć niedawnej przeszłości – zastąpić stronę, która była najmniej ostatnio używana
Algorytm stosuje się często i uważa się za dość dobry – główna trudność: sposób implementacji zastępowania wg kolejności LRU wymaga zaplecza sprzętowego
Kłopot sprawiają określenie porządku ramek na podstawie czasu ich ostatniego użycia.
Stosuje się dwie implementacje: licznikową i stosową.
9.22
Algorytm LRU
Implementacja z użyciem liczników:
Do każdej pozycji w tablicy stron dołączamy rejestr czasu użycia, do procesora zaś dodajemy zegar logiczny lub licznik.
Wskazania zegara są zwiększane wraz z każdym odniesieniem do pamięci.
Ilekroć występuje odniesienie do pamięci, tylekroć zawartość rejestru zegara jest kopiowana do rejestru czasu użycia należącego do danej strony w tablicy stron.
Tak więc dysponujemy czasem ostatniego do niej odniesienia
Zastępujemy stronę z najmniejszą wartością czasu
Schemat wymaga:
Przeglądania tablicy stron w celu odnalezienia najdawniej używanej
Zapisywania w pamięci
Uaktualnianie rejestrów czasu użycia przy wymianie stron
9.23
Algorytm LRU (least recently used)
Implementacja stosowa : utrzymywanie stosu numerów stron
Przy każdym odwołaniu do strony jej numer wyjmuje się ze stosu numerów stron i umieszcza na jego szczycie
Na szczycie stosu jest więc zawsze stron użyta ostatnio a na spodzie są strony najdawniej używane
Do implementacji używa się dwukierunkowej listy – uaktualnianie listy jest dość pracochłonne
Zastępowanie optymalne, metoda LRU oraz tzw.
algorytmy stosowe nie są dotknięte anomalią Belady’ego.
9.24
Algorytmy przybliżające metodę LRU
Niewiele systemów posiada odpowiedni sprzęt do realizacji prawdziwego algorytmu LRU -> często stosowane są algorytmy przybliżające zastępowanie stron metodą LRU.
Algorytm bitów odniesienia:
bit odniesienia (reference bit) jest ustawiany dla danej strony przez sprzęt zawsze wtedy, gdy występuje do niej odniesienie (pisanie/
czytanie)
na początku wszystkie bity odniesienia są zerowe
w trakcie wykonania procesu odpowiednie bity odniesienia są ustawione na 1
wiadomo więc, które strony były użyte, ale nie wiadomo w jakim porządku
w miarę upływu czasu, bity mogą być wyzerowane, oznaczając że strona nie była używana przez ileś ostatnich odwołań
9.25
Algorytmy przybliżające metodę LRU
Algorytm dodatkowych bitów odniesienia:
Z każdą stroną związany jest 8-bitowy rejestr, na początku:
0000000
W regularnych odstępach czasu (np.. co 100 ms) system operacyjny wprowadza bit odniesienia na najbardziej znaczącą pozycję rejestru
Jako strona-ofiara przy zastępowaniu wybierana jest strona zawierająca najmniejszą liczbę w rejestrze.
9.26
Algorytmy przybliżające metodę LRU
Algorytm dodatkowych bitów odniesienia:
Przykład
warość rejestru dla strony 0 >01110100>
warość rejestru dla strony 1 >11000101>
warość rejestru dla strony 2 >10000000>
Ostatnio były użyte strony 1 i 2, natomiast strona 0 nie była ostatnio użyta i ona zostanie przeznaczona do zamiany.
Jeżeli nie bierzemy pod uwagę strony 0 to do zamiany przeznaczona będzie strona 2, jako rzadziej używana niż strona 1.
9.27
Algorytmy przybliżające metodę LRU c.d.
Algorytm drugiej szansy (zegarowy):
jego podstawą jest algorytm FIFO
jeżeli bit odniesienia = 0, to strona zostaje wybrana do zastąpienia.
jeżeli bit odniesienia = 1, to bit ten jest zerowany, a strona dostaje „drugą szansę”, tzn. do zastąpienia bierze się pod uwagę następną stronę itd..
przeglądanie stron wykonuje się cyklicznie.
Ulepszenie – branie pod uwagę pary: (bit odniesienia, bit modyfikacji).
9.28
Algorytm drugiej szansy (zegarowy)
…
0
1
1
0
1
…
Strony Bit odniesienia
Następna ofiara
…
0
0
0
0
1
…
Strony Bit odniesienia
Cykliczna kolejka stron
9.29
Algorytmy zliczające
Wprowadzenie liczników odwołań do każdej strony.
Algorytm LFU – najrzadziej używanej strony (ang. least fequently used):
do zastąpienia wybiera się stronę o najmniejszej wartości licznika.
Może być obarczony błędami wynikającymi z tego, że strona była na początku intensywnie używana, a potem nie jest wcale potrzebna.
Rozwiązanie: przesuwanie liczników w prawo o 1 bit w regularnych odstępach czasu
Algorytm MFU – najczęściej używanej strony (ang. most fequently used):
do zastąpienia wybiera się stronę o największej wartości licznika.
Uzasadnienie: Strona o najmniejszej wartości licznika prawdopodobnie została niedawno wprowadzona do pamięci i będzie jeszcze używana
Niestety implementacja tych algorytmów jest kosztowna, a nie przybliżają one dobrze algorytmu optymalnego.
9.30
Przydział ramek do procesów
Problem: Jak dzielić stałą ilość wolnej pamięci między różne procesy?
Minimalna liczba ramek przypadających na proces jest zdefiniowana przez architekturę logiczną komputera ( określona jest przez zbiór rozkazów komputera).
Jeśli brak strony wystąpi przed dokończeniem wykonywania rozkazów, to rozkaz niestety musi być powtórzony.
Oznacza to, że należy mieć wystarczającą liczbę ramek do przechowania wszystkich stron, do których może się odnosić pojedynczy rozkaz
Maksymalna liczba ramek wynika z ilości dostępnej pamięci fizycznej
Rzeczywista liczba ramek przydzielonych dla danego procesu jest określona stosowanym algorytmem przydziału
9.31
Algorytm przydziału ramek
Przydział równy (ang. equal allocation): każdy proces dostaje tyle samo ramek, jeżeli jest m ramek oraz n procesów, to każdemu procesowi przydziela się m/n ramek
Przydział proporcjonalny (ang. proportional allocation): każdemu procesowi przydziela się dostępną pamięć odpowiednio do jego rozmiaru
niech si oznacza wielkość pamięci wirtualnej procesu pi; sumą pamięci wirtualnej wszystkich procesów określamy jako S=si
gdy ogólna liczba ramek wynosi m, procesowi pi przydzielamy i ramek, które w przybliżeniu wynosi i=(si/S)m
Przydział priorytetowy (ang. priority allocation): liczba przydzielonych ramek jest proporcjonalna do priorytetu procesu albo kombinacji rozmiaru i priorytetu (proces o wyższym priorytecie dostaje więcej ramek).
9.32
Problemy z brakującymi ramkami
Gdy wiele procesów rywalizuje o ramki w pamięci, algorytmy zastępowania stron można zakwalifikować do dwu kategorii:
zastępowania globalnego: procesy mogą wybierać brakujące im ramki ze zbioru wszystkich ramek, nawet gdy ramka jest w danej chwili przydzielona do innego procesu; w ten sposób proces o wyższym priorytecie może zwiększać liczbę swoich ramek kosztem procesu o niższym priorytecie
zastępowania lokalnego: liczba ramek przydzielonych procesowi nie zmienia się; proces wybiera do zastąpienia brakującą ramkę ze zbioru swoich ramek
9.33
Szamotanie
Proces, który ma w pamięci minimalną liczbę ramek i którego strony są aktywnie używane, spotyka się z problemem szamotania
Szybko następuje brak strony i trzeba zastąpić jakąś stronę, która za chwilę okaże się potrzebna – proces szamoce się spędzając więcej czasu na stronicowaniu niż na wykonaniu.
Szamotanie powoduje poważne zaburzenia wydajności.
9.34
Przyczyny szamotania
SO nadzoruje wykorzystanie jednostki centralnej i w przypadku gdy jest ono za małe to zwiększa się stopień wieloprogramowości wprowadzając nowy proces do systemu.
Strony są zastępowane według globalnego algorytmu zastępowania stron
Załóżmy, że proces w pewnej chwili wchodzi w nową fazę działania i potrzebuje więcej ramek
zaczyna wykazywać braki stron i powoduje utratę stron przez inne procesy
one też potrzebują tych stron, wykazują zatem ich braki i przyczyniają się do odbierania stron innym procesom
rośnie więc kolejka procesów do urządzenia stronicującego i jednocześnie opróżnia się kolejka procesów gotowych do wykonania
Planista przydziału procesora dostrzega spadek wykorzystania procesora, więc zwiększa stopień wieloprogramowości
Nowy proces, aby wystartować, zabiera ramki wykonywanym procesom, sytuacja się powtarza...
Powstaje szamotanina, przepustowość systemu gwałtownie maleje
9.35
Zjawisko szamotania ilustruje poniższy wykres
Jak widać, aby zwiększyć wykorzystanie procesora i powstrzymać szamotanie należy zmniejszyć stopień wieloprogramowości
Efekt szamotania można ograniczyć za pomocą lokalnego algorytmu zastępowania
Przy zastępowaniu lokalnym, gdy jakiś proces zaczyna się szamotać, wówczas nie wolno mu zabierać ramek innego procesu i doprowadzać go także do szamotania, czyli:
Zastępowaniu stron powinno towarzyszyć zwracanie uwagi na to, którego procesu są one częściami
Jeśli jednak jakieś procesy się szamocą, to będą one pozostawać przez większość czasu w kolejce do urządzenia stronicującego, czyli:
wzrasta więc czas dostępu również dla procesów, które się nie szamocą
Szamotanie cd…..
9.36
Unikanie szamotania
1.Aby zapobiec szamotaniu należy dostarczyć procesowi tyle ramek ile potrzebuje
2.Istnieje kilka sposobów aby dowiedzieć ile ramek proces będzie potrzebować
Wykorzystuje się tzw. model strefowy zachowania się procesu podczas jego wykonywania
Tworzy się następnie model zbioru roboczego 3. Model strefowy procesu
Zakłada się, że w trakcie wykonania proces przechodzi z jednej strefy programu do innej
Przez strefę programy rozumie się pewien deterministyczny zbiór stron pozostających we wspólnym użyciu
Program składa się z wielu różnych stref, które mogą na siebie zachodzić
Strefy programu są określone przez jego strukturę i struktury danych
Proces będzie się szamotać jeśli otrzyma mniej ramek niż wymagane jest do obsługi bieżącej strefy
9.37 9.38
Model zbioru roboczego
Model zbioru roboczego (ang. working-set model) opiera się na założeniu, że program ma charakterystykę strefową (a tym samym zapewniona jest pewna lokalność odwołań)
∆ - rozmiar okna zbioru roboczego
za zbiór roboczy przyjmuje się zbiór stron, do których nastąpiło ostatnich ∆ odniesień
jeśli strona jest aktywnie używana , to będzie znajdować się w zbiorze roboczym
gdy przestanie być używana, to wówczas wypadnie ze zbioru roboczego po
∆ jednostkach czasu odliczonego od ostatniego do niej odwołania
zbiór roboczy przybliża więc strefę programu
np. ∆=10 odniesień do pamięci (patrz rysunek )
zbiór roboczy w chwili t1 będzie równy {1,2,5,6,7}
do chwili t2 zbiór roboczy zmieni się na {3,4}
9.39
Model zbioru roboczego
Dokładność zbioru roboczego zależy od wyboru parametru ∆
Jeśli zbyt mały to nie obejmie całego zbioru roboczego
Jeśli zbyt duży, to może zachodzić na kilka stref programu
Najważniejszą cechą zbioru roboczego jest jego rozmiar
Jeśli dla procesu i rozmiar jego zbioru roboczego jest ∆i , to łączne zapotrzebowanie na ilość ramek (Z) można określić wzorem
Z=∑ ∆i ,
Jeśli łączne zapotrzebowanie jest większe niż ogólna liczba dostępnych ramek to powstanie szamotanie; SO musi wybrać proces, którego wykonanie wstrzymać, a strony procesu usunąć z pamięci i zwolnione ramki przydzielić innym procesom.
9.40
Częstość braku stron
Model zbioru roboczego daje zadowalające rezultaty, ale wygodniejszą metodą nadzorowania szamotania jest mierzenie częstości braków stron.
Szamotanie odznacza się dużą częstością występowania braków stron – dąży się, zatem do nadzorowania częstości tych braków
Za duża jej wartość świadczy o tym, że proces potrzebuje więcej ramek;
po przekroczeniu wartości granicznej przydziela się procesowi dodatkową ramkę
Przy spadku częstości poniżej pewniej granicy usuwa się ramkę z procesu