Systemy operacyjne (2009/2010)

Transkrypt

Systemy operacyjne (2009/2010)
1
7 października 2009
12:49
- proces jest obiektem aktywnym w przeciwieństwie do (tekstu) programu
- proces wykonuje program
○ w UNIXie można podmieniać programy procesom
- w pojęciu procesu mieści się
1) przydzielona mu pamięć, czyli przestrzeń adresowa
2) zbiór rejestrów
3) inne zasoby potrzebne do wykonywani programu
4) informacje administracyjne (np. stan, kod zakończenia)
- przestrzeń adresowa:
1) kod programu (text section)
2) dane (data section)
3) stos procesu (stack section)
4) jest adresowana od zera do (adresy logiczne)
5) jest sprzętowo odwzorowywana na pamięć fizyczną (translacja adresów)
6) nie musi się znajdować w całości w pamięci operacyjnej (pamięć wirtualna)
7) ochrona pamięci
- Wykonanie procesu jest przerywane przez różne zdarzenia.
- rejestr rozkazów, wskaźnik stosu, rejestry ogólnego przeznaczenia, rejestr stanu oraz rejestry specjalne (np. do zarządzania pamięcią) określają
przebieg wykonania procesu.
- Proces musi odtworzyć stan, w którym był przed przerwaniem wykonania.
- System operacyjny (być może z pomocą sprzętu) musi zapamiętywa¢ stan tych rejestrów przerywając wykonanie
procesu.
- Inne elementy, które należy zapisać:
1) otwarte pliki
2) identyfikator procesu
3) stosy alternatywne
-
system przechowuje informacje o procesach w tablicy procesów
jeden element tej tablicy lub liczby jest nazywany blokiem kontrolnym procesu (PCB)
przełączenie kontekstu - zapamiętanie stanu procesu w PCB
proces może nie wykorzystać całego kwantu czasu (np.. gdy zarządza operacji wejścia-wyjścia)
Realizacja przełączania procesu:
- czasem na poziomie sprzętu - x86
○ pojęcie zadania na poziomie procesora
○ specjalna tablica zadań TSS
○ przekazanie sterowania do innego zadania powoduje automatyczny zapis stanu jego wykonania w odpowiednim miejscu tablicy
○ ograniczenie do 8192 procesów
○ windows i linux nie korzystają z tego ze względu na ograniczenie liczby procesów
- najczęściej na poziomie systemu operacyjnego - lepsza przenośność i elastyczność
- przełączenie jest najczęściej sterowane przerwaniami
Przerwania
- asynchroniczne - generowane przez urządzenia
○ asychroniczne, bo pojawiają się w dowolnym momencie wykonania procesu
- synchroniczne - generowane przez programy (pułapki (breakpointy debugera), wyjątki)
- po wykryciu przerwania i zakończeniu cyklu aktualnie wykonywanego rozkazu, sprzęt zapamiętuje na stosie adres powrotu (i być może rejestry (i
wykonuje procedurę obsługi przerwania))
- po zakończeniu obsługi przerwania następuje odtworzenie stanu procesora
- z zapisywaniem i odtwarzaniem rejestrów bywa różnie - zależy od sprzętu
- niekiedy przerwanie jest bardzo skomplikowane - obsługa na osobnym stosie (bo co można zrobić z przepełnieniem stosu), zmiana poziomu
ochrony, przełączenie kontekstu) - zależy od konkretnego sprzętu
○ w x86 jest tyle stosów, co poziomów ochrony (podobno)
-
Wektor przerwań - przerwania skierowane
najczęściej sprzęt oferuje wiele przerwań
tablica przerwań - zawiera adres skoku do procedury obsługi
tablica (x86) może zawierać dodatkowe informacje do obsługi (np. o zmianie poziomu ochrony)
system operacyjny musi odpowiednio skonfigurować tablicę
IO
- bardzo powolne, więc system tylko je inicjuje w imieniu procesu i przęłącza kontekst
- po zakończeniu IO sprzęt zgłasza przerwanie
Systemy Operacyjne Strona 1
- po zakończeniu IO sprzęt zgłasza przerwanie
- DMA - Direct Access Memory - procesor przydziela kanał DMA, dzięki czemu możliwy jest zapis bezpośrednio do pamięci bez udziału procesora
Stany procesu
- proces staje się wstrzymany w trakcie operacji wejścia - wyjścia
Kolejki procesów
- system umieszcza w PCB procesów w kolejkach
○ kolejce (kolejkach) procesów gotowych
○ kolejce (kolejkach) procesów wstrzymanych na danym zasobie (dysk)
- kolejki cykliczne
Tryby pracy w architekturze IA-32
0) jądro
1) system
2) rozszerzenia
3) aplikacja
- w większości systemów (lInux) wykorzystuje się tylko dwa poziomy ochrony
- tryb użytkownika
- tryb uprzywilejowany
niektóre rozkazy są uprzywilejowane
wykonywani funkcji obsługo przerwań
- ochrona wymaga wsparcia sprzętowego
Współbieżność
- współbieżność = abstrakcja równoległości
- procesy sekwencyjne
- wirtualny procesor (koncepcyjnie każdy proces go ma)
Poprawność programów współbieżnych
- bezpieczeństwo (lub zapewnianie)
- nigdy nie dojdzie do sytuacji niepożądanej
- odpowiednik częściowej poprawności programu sekwencyjnego
- ujmuje się to w specyfikacji
- żywotność
- każdy proces, który chce wykonać pewną akcję, będzie to mógł zrobić w skończonym czasie
- nieujmowane w specyfikacji
Brak żywotności:
- globalny - zakleszczenie (deadlock)
- lokalny - zagłodzenie (staarvation)
wprowadzenie statycznych priorytetów najczęściej prowadzi do zagłodzenia
Inne wymagania i założenia
- brak aktywnego oczekiwania - oczekujący proces ma zostać obudzony dopiero wtedy, gdy będzie mógł podjąć dalszą pracę
- brak ścisłego powiązania - metody synchronizacji nie powinny uzależniać działania jednego procesu od innych
- uczciwość systemu operacyjnego - każdy proces gotowy kiedyś stanie się aktywny
Programowanie współbieżne
1) model rozproszony - nie ma wspólnej pamięci, są łącza komunikacyjne
a) komunikacja synchroniczna (nadawca czeka, aż odbiorca odbierze) (CSP)
b) komunikacja asynchroniczna - jak z listem - odbiorca odbiera, jak mu się zachce (Ada)
c) domyślne rozwiązanie w Linuxie
2) model scentralizowany - jest wspólna pamięć (więc są wspólne zmienne globalne)
a) semafory
b) monitory (brak wsparcia językowego w C)
Unix / Linux
- domyślnie wspiera model rozproszony
Systemy Operacyjne Strona 2
- domyślnie wspiera model rozproszony
- narzędzia synchronizacji:
○ łącza
○ łącza nazwane
○ kolejki komunikatów
- wsparcie dla modelu zcentralizowanego:
○ semafory
○ segmenty pamięci dzielonej
synchroniczność - rozmowa telefoniczna
asynchroniczność - poczta
symetryczność - obydwa procesy znają nawzajem swoje nazwy
asymetryczna - tylko jeden proces zna identyfikator drugiego (klient-serwer)
Abstrakcja komunikacji asynchronicznej
bufor - zmienne będące nieskończonymi kolejkami komunikatów
bufory można deklarować jedynie poza procesami
procesy nie mogą korzystać ze zmiennych globalnych innych typów
dwie niepodzielne operacje:
○ sendMessage(b,k) - umieszcza komunikat na końcu kolejki b, operacja nieblokująca
○ getMessage(b,k) - pobiera pierwszy komunikat z kolejki, a jeśli jest ona pusta, to wstrzymuje proces
- zmienna k może być dowolnego typu, ale typ komunikatu odbieranego musi się zgadzać z typem komunikatu włożonego
- procesy oczekujące na getMessage są budzone w niedeterministycznej kolejności
- gwarantujemy uczciwość operacji getMessage - jeśli do kolejki będziemy ciągle wkładać nowe komunikaty, to każdy proces oczekujący w końcu go
dostanie
-
- przeplot
○ program współbieżny jest poprawny, jeśli dla każdego przeplotu spełniona jest własność bezpieczeństwa i żywotności
dowodzi się tego za pomocą logik temporalnych, czasami nawet można to zautomatyzować
Klasyczne problemy współbieżności
a) wzajemne wykluczanie
b) producenci i konsumenci
c) problem czytelników i pisarzy
d) problem pięciu filozofów
Wzajemne wykluczanie:
while true do
begin
własne sprawy;
protokół wstępny;
sekcja krytyczna;
protokół końcowy;
end;
Producenci i konsumenci
- producenci produkują dane
- konsumenci konsumują dane
- możemy mieć bufor pośredniczący
○ jednoelementowy
○ wieloelementowy
○ ograniczony
○ rozproszony
- porcje mogą mieć rozmiar stały lub zmienny
- bezpieczeństwo:
○ bufor nie może się przepełnić
○ konsument nie pobierze porcji z pustego bufora
- żywotność:
○ jeśli tylko ktoś odbiera dane, to każdy producent, który wyprodukował porcję, przekaże ją pewnemu konsumentowi (i symetrycznie dla
konsumentów
Czytelnicy i pisarze
- czytelnicy odczytują dane
- pisarze zapisują dane
- warianty:
○ priorytety dla czytelników lub pisarzy (wtedy rezygnacja z żywotności)
○ ograniczenie na liczbę czytających
- bezpieczeństwo:
gdy ktoś pisze nikt nie czyta
- żywotność
○ każdy czytelnik, które chce przeczytać dane, w końcu będzie mógł to zrobić
Problem pięciu filozofów. Widelec jako komunikat.
Systemy Operacyjne Strona 3
Problem pięciu filozofów. Widelec jako komunikat.
- bezpieczeństwo:
○ jednego widelca używa jednocześnie tylko jeden filozof
○ filozof nie zaczyna jeść nie mając obydwu widelców
- żywotność
○ nie zagłodzimy nikogo
Poprawne rozwiązanie (jedno z wielu):
Wzajemne wykluczanie w modelu scentralizowanym
○ bez wsparcia ze strony sprzętu i środowiska
○ za pomocą specjalnego niepodzielnego rozkazu maszynowego
○ za pomocą mechanizmów wspieranych przez system - semafory i monitory
Algorytm Petersona
Systemy Operacyjne Strona 4
Problemy z algorytmem Petersona
- kompilator może coś zoptymalizować niepoprawnie
kto_czeka:=2;
while chce1 and (kto_czeka = 2) do;
może zostać poprawione na
-
kto_czeka:=2;
while chce1 do;
□ remedium: zmienne ulotne (violate)
ewentualnie nieprzeładowanie danych w rejestrze procesora
w nowoczesnych procesorach w celu optymalizacji stosuje się OoO- out of order execution
ponadto procesory mają pamięć cache - problem przy wielu procesorach
rozwiązuje się to za pomocą przerwań międzyprocesorowych - drogie rozwiązanie
weak order memory - potencjalna zmiana kolejności zapisów / odczytów
remedium: rozkazy barierowe (memory barrier), np. lfence, mfence, sfence (x86)
Wsparcie ze strony sprzętu
- niepodzielny rozkaz maszynowy test_and_set(G)
test_and_set(Li)
begin
Li := G ;
G := 1;
end;
Rozwiązanie problemu wzajemnego wykluczania
- aktywne oczekiwanie
- możliwość zagłodzenia
- stosowany w praktyce (wirujące blokady, spinlock)
- do blokowania na krótki czas
- na poziomie jądra
- aktywne oczekiwanie
- pozwala na uniknięcie narzutu związanego z przełączaniem kontekstu
- stosuje się również inne niepodzielne rozkazy
Realna implementacja
Systemy Operacyjne Strona 5
Semafor ogólny
- wspólna pamięć
- abstrakcyjny typ danych z operacjami:
○ inicjacji (od razu przy deklaracji, poza procesami)
○ opuszczenia p (próby przejścia przez semafor)
○ podniesienia v
- operacje p i v są niepodzielne i wykluczają się nawzajem
- nie są dopuszczalne żadne inne operacje na semaforze
-
Semantyka semafora ogólnego
semafor to zmienna int
semafor o wartości 0 jest zamkniety
semafor o wartościach większych niż 0 jest otwarty
p powoduje zmniejszenie wartości semafora
operacja P na zamkniętym semaforze powoduje wstrzymanie wykonującego go procesu
v zwiększa wartość semafora, jeśli nikt na nim nie czeka (albo kogoś wpuszcza)
Klasyczna definicja semafora (Dijkstra)
-
niczego nie zakładamy o implementacji czekania
ani o kolejności budzenia procesów
w literaturze spotyka się też wait i signal, ale nie u nas
brak żywotności
Semafor słaby
Systemy Operacyjne Strona 6
- żywotność dla dwóch procesów
Semafor silny
- jest żywotność dal dowolnej liczby procesów
Semafor silnie uczciwy
Systemy Operacyjne Strona 7
Semafor binarny
Podnoszenie semafora binarnego
Systemy Operacyjne Strona 8
Symulacja semafora ogólnego binarnymi
Systemy Operacyjne Strona 9
- przykład dziedziczenia sekcji krytycznej (ochrony zapewnianej przez mutex)
○ proces, który wie, że kogoś obudzi, nie podnosi semafora
○ obudzony zastaje zamknięty semafor i może go podnieść w imieniu budzącego
○ wobec tego pomiędzy budzeniem a faktycznym budzeniem nic nie może się stać
Schemat:
Schemat dziedziczenia sekcji krytycznej
Systemy Operacyjne Strona 10
Pięciu filozofów na semaforach
Semafor uogólniony
- podnoszenie o dowolną wysokość
Systemy Operacyjne Strona 11
Semafor dwustronnie ograniczony
- semafor przyjmuj wartości z [0 .. M]
- podnoszenie i opuszczanie jest blokujące
- do rozwiązywanie problemu producentów i konsumentów
Semafory Agerwali. Operacja PA
- PA i VA są niepodzielne i wzajemnie się wykluczają
Implementacja priorytetów za pomocą semaforów Agerwali
Systemy Operacyjne Strona 12
Semafory uniksowe
najpierw należy utworzyć zestaw semaforów (semget)
w zestawie może być wiele semaforów
jednym wywołaniem funkcji systemowej semop można wykonać w sposób niepodzielny wiele operacji na semaforach z jednego zestawu
operacje na pojedynczym semaforze:
○ uogólnione opuszczenie P(n)
○ uogólnione podniesienie V(n)
○ wstrzymanie procesu w oczekiwaniu na zamknięcie semafora (ozn. Z)
○ operacja P może być blokująca i nieblokująca (wówczas generowany jest błąd)
○ można odczytywać i zmieniać wartości semaforów
- operacja P może powodować zagłodzenie
- może zagłodzić proces chcący opuścić semafor o dużo
- semantyka operacji jednoczesnych:
- wykonuje po kolei wyspecyfikowane operacje
- jeśli jakiejś operacji nie da się wykonać, to poprzednie są anulowane
- efekt: wszystko albo nic
-
Czytelnicy i pisarze
Monitor
- moduł programistyczny
- udostępniający na zewnątrz pewne procedury i funkcje
- ukrywa wszystkie zmienne, stałe i typy
Systemy Operacyjne Strona 13
- ukrywa wszystkie zmienne, stałe i typy
- synchronizacja
- w danej chwili co najwyżej jeden proces wykonuje procedurę lub funkcję monitora (jest w monitorze)
Składnia monitora
-
zmienne i funkcje eksportowane poprzedzane są słowem export
monitor jest sekcją krytyczną
wzajemne wykluczanie odbywa się na poziomie całego monitora, a nie poszczególnych procedur / funkcji
monitor gwarantuje ochronę zmiennych globalnych
- sekcja krytyczna umieszczona w monitorze
- musi kompilować się niezależnie do procesu
- nie ma dostępu do lokalnych zmiennych
- tak napisany program jest cieżko skalowalny
- w praktyce w monitorze są tylko protokoły, a sekcja znajduje się w procesie
Zmienne warunkowe
- deklarowalna jedynie wewnątrz monitora
- c : condition
- operacje:
- wait(c) - bezwarunkowe wstrzymanie procesu wykonującego tę operację. Wstrzymany proces opuszcza monitor
- signal(c) - obudzenie jednego procesu oczekującego na zmiennej warunkowej c. Wznowiony proces kontynuuje wykonanie od kolejnej
instrukcji po wait()
- empty(c) - czy ktoś czeka na c
Typowe użycie zmiennych warunkowych
Różne semantyki operacji wait
- Klasyczne monitory (C.A.R. Hoare, 1974):
- ze zmiennymi warunkowymi są związane kolejki proste (FIFO) procesów oczekujących
- procesy oczekujące na wejście do monitora także oczekują w kolejce prostej (FIFO)
- Różne realizacje monitorów (język Mesa, biblioteka pthreads):
- nie zakłada się budzenia procesów w kolejności ich zawieszania
- wznawiany proces jest wybierany przez moduł szeregujący zgodnie z zaimplementowaną strategią
- można założyć silną uczciwość
Problemy
1) Co zrobić, jeśli nikt nie czeka na zmiennej warunkowej
- ano nic - wówczas signal jest równoważny instrukcji pustej
2) Co zrobić, gdy signal(c) nie jest ostatnią operacją w monitorze?
- 3 rozwiązania
Per Brinch Hansen:
- signal ma być ostatnią operacją w monitorze
- obudzony proces przejmuje monitor
- procesy budzone mają priorytet nad oczekującymi (warunek natychmiastowego wznowienia)
Systemy Operacyjne Strona 14
- procesy budzone mają priorytet nad oczekującymi (warunek natychmiastowego wznowienia)
C. A. R. Hoare
- proces sygnalizujący wychodzi z monitora i ustawia się na początku kolejki procesów oczekujących na wejście do monitora
- jego miejsce zajmuje obudzony proces
- spełniony warunek natychmiastowego wznowienia
Język Mesa (1977)
- proces sygnalizujący wykonuje się dalej
- po jego wyjściu wznawiany jest dowolny proces - albo oczekujący na wejście albo obudzony z wait
- łatwa implementacja, więc jest to często spotykane rozwiązanie
linux
- proces wznawiający działanie po waicie nie ma gwarancji, że warunek na który czekał jest nadal spełniony
- na zajęciach przyjmujemy, że obowiązuje semantyka Hoara
-
-
Monitory - podsumowanie
Procesy oczekują na wejście do monitora w kolejce prostej
Z każdą zmienną warunkową jest związana osobna kolejka prosta
signal na pustej kolejce nie robi nic
signal, który faktycznie budzi jakiś proces, powoduje wstrzymanie procesu sygnalizującego i umieszczenie go na początku kolejki procesów
oczekujących na wejście do monitora; w jego miejsce do monitora wraca obudzony proces, który wznawia wykonania od kolejnej instrukcji po
wait
signal wykonywany jako ostatnia instrukcja w monitorze nie wstrzymuje procesu
W monitorze umieszczamy protokoły
W protokole wstępnym skupiamy się na tym, kiedy proces musi poczekać
Instrukcję warunkową formułujemy tak, aby wait znalazło się w gałęzi po then
W protokole końcowym skupiamy się na tym, czy można kogoś wznowić i jeśli tak, to kogo
Jeśli to możliwe wykonujemy signal jako ostatnią instrukcję monitora
Czytelnicy i pisarze
Systemy Operacyjne Strona 15
Typy monitorowe
- Języki programowania oferują czasem możliwość definicji typu monitorowego
- Po zdefiniowaniu typu monitorowego można utworzyć wiele egzemplarzy monitora
- Analogia do klasy i obiektu
Monitory w biblitoece pthreads (1995)
Systemy Operacyjne Strona 16
-
-
-
Monitory w biblitoece pthreads (1995)
Biblioteka pthreads implementuje wątki zgodne ze standardem POSIX.
Biblioteka nie oferuje monitorów jako obiektów strukturalnych
Jednak mechanizmy synchronizacyjne: muteksy i zmienne warunkowe dają funkcjonalność monitorów z semantyką Mesy
Na muteksie m można wykonać operacje:
- pthread mutexlock (cm) — jeśli muteks m jest wolny, to proces „zabiera go sobie, wpp. proces czeka
- pthread mutexunlock (Sm) — proces oddaje muteks m
Tylko proces, który ma muteks może wykonać unlock
Analogia z wchodzeniem do monitora
na zmiennej warunkowej można wykonać operacje:
- pthread cond wait (&c, &zm) — atomowo wstrzymuje proces na zmiennej c i oddaje muteks m
- pthread cond signal (&c) wznawia co najmniej jeden proces ze zmiennej c. Proces sygnalizujący powinien być w posiadaniu muteksa m.
Proces obudzony ze zmiennej warunkowej c musi ponownie zdobyć muteks m.
Procesy wykonujące operacje na zmiennych warunkowych powinny być w posiadaniu muteksa m, czyli „być w monitorze
Specyfikacja nie gwarantuje, że signal obudzi dokładnie jeden proces — spontaniczne pobudki
Więcej informacji na laboratorium
Z monitorem m związujemy muteks m.
Każda procedurę/funkcję monitora rozpoczynamy od Iock(&zm) a kończymy wykonaniem unIock(&m)
Operacje na zmiennych warunkowych przenosimy (prawie) bez zmian.
Wzajemne wykluczanie
- pomijając to, że to nie do końca działa
- generalnie trzeba przerobić ify na while i zrobić coś w rodzaju półaktywnego oczekiwania - trzeba się obudzić i sprawdzić warunek
Symulacja semafora monitorem
Systemy Operacyjne Strona 17
Podsumowanie monitorów
- jest strukturalny
- zwalnia programistę z konieczności dbania o wzajemne wykluczanie w dostępnie do zmiennych globalnych
- ułatwia pisanie programów
Systemy Operacyjne
Definicje
- trudny test!
Definicja
... programem, który zarządza systemem komputerowym. Tworzy
on również bazę dla programów użytkowych i działa jako pośrednik
między użytkownikiem komputera a sprzętem komputerowym.
Abraham Silberschatz
...zbiorem ręcznych i automatycznych procedur, które pozwalają
grupie osób na efektywne współdzielenie urządzeń maszyny
cyfrowej.
Per Brinch Hansen
... zorganizowanym zespołem programów, które pośredniczą między
sprzętem a użytkownikami, dostarczając użytkownikom zestawu
środków ułatwiających projektowanie, kodowanie, uruchamianie i
eksploatację programów oraz w tym samym czasie sterują
przydziałem zasobów dla zapewnienia efektywnego działania.
Alan Shaw
... warstwą oprogramowania operującą bezpośrednio na sprzęcie,
której celem jest zarządzanie zasobami systemu komputerowego i
stworzenie użytkownikowi środowiska łatwiejszego do zrozumienia i
wykorzystania.
Andrew Tanenbaum
- nie do końca wiadomo, co systemem operacyjnym jeszcze jest, a czym już nie jest
System operacyjny jest podobny do rządu. Podobnie jak rząd nie
wykonuje sam żadnej użytecznej funkcji. Po prostu tworzy
środowisko, w którym inne programy mogą wykonywać pożyteczne
prace.
A. Silberschatz
Systemy Operacyjne Strona 18
A. Silberschatz
- jednorodność
- wirtualizacja
Zadania systemu operacyjnego
- ukrywa szczegóły sprzętowe systemu komputerowego poprzez abstrakcje:
równoległości — możliwa praca współbieżna
pamięci - pamięć wirtualna
urządzeń — jednolity sposób dostępu do nich
...
- zarządza zasobami i rozlicza użytkowników z ich wykorzystania
- decyduje który proces ma się wykonać
- przydziela pamięć wykonującym się procesom
- zapobiega zakleszczeniom
- zapewnia bezpieczną i wygodną pracę poprzez
- interfejs użytkownia (tekstowy lub graficzny)
- mechanizmy ochrony dostępu, uwierzytelniania i szyfrowania
- ...
1)
2)
3)
4)
Dawne systemy operacyjne
programista sam wszystko ładuje
pojawia się operator i przetwarzanie wsadowe
systemy rezydentne
wieloprogramowość - w pamięci jest kilka zadań, zadania nie są sztucznie wywłaszczane przez system - przełączanie zadania przy wywoływaniu
operacji wejścia wyjścia
a) planowanie zadań (które mają zostać załadowane do pamięci)
b) planowanie przydziału procesora (dla załadowanych zadań)
5) wielozadaniowość (lata '60 i '70)
a) każde zdanie otrzymuje kwant czasu
b) SO wirtualizuje zasób (procesor)
6) pojawiają się komputery osobiste
7) systemy wieloprocesorowe
a) wieloprzetwarzanie symetryczne
i. wiele nierozróżnialnych, takich samych procesorów
b) wieloprzetwarzanie asymetryczne
i. przetwarzanie na różnych typach procesorów
8) systemy rozproszone
a) procesory są ze sobą luźno związane
b) komunikacja odbywa się poprzez łącza komunikacyjne
c) każdy procesor ma własną pamięć i zegar
9) systemy wbudowane
Szeregowanie
- szeregowanie krótkoterminowe - do wykonania
- szeregowanie długoterminowe - do wprowadzenia do systemu
- wykonanie procesu składa się z faz:
○ procesora
○ wejścia - wyjścia
- generalnie empiryczne dominują krótkie fazy procesora
- procesy:
○ ograniczane przez wejście - wyjście
○ ograniczane przez procesor
- szeregowanie długoterminowe (systemy wsadowe)
○ nadzoruje stopień wieloprogramowości
○ serwuje właściwą mieszankę procesów ograniczanych przez wejście - wyjście i przez procesor
○ wykonywane rzadko
○ obecnie nieobecne w systemach (albo mocno zredukowane)
Systemy Operacyjne Strona 19
- szeregowanie:
○ z wywłaszczeniem (za każdym razem, gdy się da, zastanawiamy się nad tym, który proces powinien się wykonywać)
• aktywny proces zmienia stan na wstrzymany
• aktywny proces zmienia stan na gotowy
• wstrzymany lub nowy proces zmienia stan na gotowy
• aktywny proces kończy się
- konieczność synchronizacji zmiennych
○ bez wywłaszczenia
□ aktywny proces zmienia stan na wstrzymany
□ aktywny proces kończy się
jedyna metoda w przypadku specyficznego sprzętu (bez czasomierza)
mniejsze problemy synchronizacyjne
dłuższy czas oczekiwanie
proces może stracić procesor jedynie dobrowolnie
- jądro niewywłaszczalne - procesu wykonującego funkcję systemową nie wywłaszcza się (tak było kiedyś w Linuxie)
- jądro wywłaszczalne - funkcje systemowe też się wywłaszcza
Ekspedytor
-
Moduł realizujący faktyczne przekazanie procesora wybranemu przez planistę procesowi, tzn.:
○ przełączenie kontekstu
○ wejście w tryb użytkownika
○ wykonanie skoku w odpowiednie miejsce kodu programu
- Ekspedytor musi być szybki
○ niektóre maszyny zawierają specjalne instrukcje sprzętowe wspomagające przełączanie procesu
- Opóźnienie ekspedycji — czas od wstrzymania jednego procesu do uaktywnienia drugiego
- Miary wykorzystania systemu
○
○
○
○
○
Wykorzystanie procesora
Przepustowość — liczba procesów kończonych w jednostce czasu
Czas obrotu zadania — czas od chwili nadejścia procesu do systemu do chwili jego zakończenia
Czas oczekiwania — łączny czas, jaki proces spędza w kolejce procesów gotowych
Czas odpowiedzi (reakcji) — czas między wysłaniem żądania do procesu a rozpoczęciem odpowiedzi na to żądanie
- Są różne algorytmy szeregujące dostowane do specyfiki systemu.
○ Systemy wsadowe:
użytkownicy nie niecierpliwią się przy terminalach
procesy mogą otrzymywać procesor na dłużej
jest potrzebna mniejsza liczba przełączeń kontekstu
○ Systemy interakcyjne:
żaden proces nie może zmonopolizować procesora
niezbędne wywłaszczanie
○ Systemy czasu rzeczywistego:
powiemy o nich nieco później
Cele szeregowania:
- W ogólności:
zagwarantowanie uczciwego dostępu do procesora
Systemy Operacyjne Strona 20
○ zagwarantowanie uczciwego dostępu do procesora
○ dbanie o równowagę w systemie i równomierne obciążenie wszystkich jego składowych
○ realizacja założonej polityki
- W systemach wsadowych:
○ maksymalizacja wykorzystania procesora
○ maksymalizacja przepustowości
○ minimalizacja czasu obrotu
- W systemach interaktywnych:
○ zagwarantowanie szybkiego czasu odpowiedzi
○ minimalizacja wariancji czasu odpowiedzi
Algorytmy szeregowania
○ algorytm FCFS
○ algorytm SJB
○ szeregowanie priorytetowe
○ algorytm RR
○ kolejki wielopoziomowe
○ kolejki wielopoziomowe ze sprzężeniem zwrotnym
○ szeregowanie loteryjne
○ szeregowanie w Linuksie (jądro 2.6)
○ szeregowanie w Miniksie
Algorytm FCFS
-
First-Come First-Seryed
Szeregowanie niewywłaszczające na zasadzie kolejki prostej
Bloki kontrolne (PCB) procesów wchodzących do kolejki procesów gotowych umieszcza się na jej końcu
Procesor otrzymuje ten proces, którego PCB znajduje się na początku kolejki procesów
-
diagramy Gantta
średni czas oczekiwania może być długi
duża wariancja czasu oczekiwania
efekt konwoju - banda procesów rzuca się na cenny zasób zmonopolizowany przez jeden proces
Szeregowanie SJF
-
Shortest Job First
Szeregowanie niewywłaszczające
Zadanie o najkrótszej kolejnej fazie procesora najpierw
Algorytm zachłanny
Optymalizuje średni czas oczekiwania
może powodować zagłodzenie
trzeba z góry wiedzieć, na jak długo proces chce dostać procesor
SRTF - wywłaszczającaa wersja SJF
- Shortest Remaining Time First
- gdy pojawia się nowy procesora krótszej fazie procesora niż długość fazy pozostałej wykonywanemu, to dochodzi do wywłaszczenia
Szeregowanie priorytetowe
- Uogólnienie SJF
- Priorytety mogą być
Systemy Operacyjne Strona 21
- Priorytety mogą być
○ wewnętrzne: obliczane przez SO na podstawie pewnych właściwości procesu
○ zewnętrzne: przydzielane poza SO
- Może być wywłaszczające lub niewywłaszczające
- problem z sekcją krytyczną
procesów w sekcji nie wywłaszcza się
procesy w sekcji dostają wyższy priorytet
- Możliwość zagłodzenia - zatem:
- proces długo wykonywany jest wywłaszczany
- proces w trakcie wykonywania ma obniżany priorytet
- Postarzanie - sposób radzenia sobie z zagłodzeniem - procesom długo czekającym podwyższa się nieco priorytet
- obecnie raczej kara się procesy za wykonanie niż nagradza za niewykonanie
Szeregowanie rotacyje, algorytm round-robin (RB)
-
Wywłaszczająca wersja FCFS dostosowana do systemów z podziałem czasu
PCB procesów gotowych znajdują się w kolejce
Wykonywany proces jest wywłaszczany co kwant czasu i wraca do kolejki
Do wykonania jest wybierany proces z początku kolejki
Konieczne wsparcie sprzętowe: czasomierz generujący przerwania
Jeśli wykonywany proces ma fazę procesora krótszą niż kwant czasu, to dobrowolnie zwalnia procesor
W przeciwnym razie po upływie kwantu czasu pojawia się przerwanie zegarowe i SO przełącza kontekst
Kwant czasu w szeregowaniu rotacyjnym
- Wydajność zależy od doboru kwantu czasu
- Kwant czasu a czas przełączania kontekstu:
- każde przełączenie kontekstu to narzut na system
- kwant czasu powinien być długi w porównaniu z czasem przełączania kontekstu
- gdy kwant czasu jest bardzo długi, to RR = FCFS
- Kwant czasu a czas reakcji systemu:
- długi kwant czasu zmniejsza średni czas reakcji
- długie kwanty czasu nie nadają się więc do systemów interaktywnych
- gdy kwant czasu jest bardzo krótki, to RR = TS (time sharing — podział czasu)
- Kwant czasu a czas obrotu:
- czas obrotu niekoniecznie maleje wraz ze wzrostem długości kwantu
- w praktyce: 80% faz procesora powinno być krótszych niż kwant czasu
Szeregowanie wielopoziomowe
- Osobne kolejki dla poszczególnych grup procesów, np.:
- procesy czasu rzeczywistego
- procesy systemowe
- pierwszoplanowe procesy interakcyjne
- procesy drugoplanowe
- Każda kolejka z własnym algorytmem szeregowania, np.:
- pierwszoplanowe procesy interakcyjne: RR
- procesy drugoplanowe: FCFS
- Zasady wyboru kolejki, np.:
- procesy systemowe mają zawsze priorytet przed interakcyjnymi
- kolejka procesów systemowych otrzymuje 80% czasu procesora
Szeregowanie wielopoziome ze sprzężeniem zwrotnym
- Procesy nie są przypisane na stałe do konkretnej kolejki
- Jeśli proces zużywa dużo czasu procesora, to jest przenoszony do kolejki o niższym priorytecie
Systemy Operacyjne Strona 22
Inne algorytmy szeregujące
- Szeregowanie loteryjne
- procesy otrzymują losy na poszczególne zasoby (np. na procesor)
- w miarę potrzeby SO urządza loterię — wybiera numer losu (np. 50 razy na sekundę)
- zwycięzca otrzymuje zasób (np. 20 ms czasu procesora)
- niektóre procesy mogą otrzymać więcej losów
- współpracujące ze sobą procesy mogą wymieniać się losami (klient po wysłaniu komunikatu do serwera może mu oddać wszystkie swoje
bilety)
- Przydział czasu pracy użytkownikom a nie procesom
Linux, jądro 2.6
- Dwie klasy procesów: czasu rzeczywistego i działające z podziałem czasu
- 140 poziomów priorytetów:
- im mniejsza wartość tym wyższy priorytet
- 0 — 99 procesy czasu rzeczywistego
- 100 — 139 procesy użytkownika
- Z każdym procesorem są związane dwie priorytetowe kolejki
procesów:
- procesy aktywne, posiadające jeszcze kwant do wykorzystania
- procesy nieaktywne, które już działały
- Do wykonania wybiera się pierwszy proces z kolejki procesów o najwyższym priorytecie
- niegdyś podział na epoki - priorytety wyliczano jednocześnie dla wszystkich procesów, obecnie oblicza się dla każdego procesu z osobna
- Linux nie jest systemem czasu rzeczywistego
- Procesy zwykłe są szeregowane następująco:
- każdy proces otrzymuje wartość nice E (- 20, 19)
- priorytet procesu oblicza się jako 100 + nice + 20
- każdy proces otrzymuje kwant czasu
- zadania o tym samym priorytecie są szeregowane na zasadzie RR
- Priorytet procesów przelicza się dynamicznie na podstawie jego dotychczasowego zachowania:
- zadania interakcyjne otrzymują bonus do -5
- zadania ograniczane procesorem otrzymują karę do +5
- ocenę, czy zadanie jest interakcyjne, dokonuje się na podstawie czasu ich pobytu w stanie uśpienia
- Gdy proces kończy kwant:
- ocenia się stopień jego interaktywności (tu jest pies pogrzebany)
- jeśli był to proces interakcyjny, to może zostać ponownie umieszczony w kolejce procesów aktywnych
- w przeciwnym razie, przelicza się jego priorytet i umieszcza w nowej kolejce wśród procesów nieaktywnych
- Procesy czasu rzeczywistego są szeregowane inaczej:
- albo wg FCFS (niewywłaszczalnego z zachowaniem priorytetów)
- albo wg RR
- ich priorytetów nie przelicza się
- wojna schedulerowa
System Minix
-
Uniksowy system operacyjny
Stworzony w celach edukacyjnych (Andrew Tannenbaum)
Krótki kod (23 tysiące wierszy)
Brak ciągłych zmian (jak w przypadku Lin uksa)
Dostępny razem z kodem także w postaci obrazu popularnych maszyn wirtualnych
Systemy Operacyjne Strona 23
-
-
Architektura
Architektura mikrojądra: jądro oferuje minimum funkcjonalności
Wiele zadań SO jest realizowanych przez odrębne procesy działające w różnych trybach uprzywilejowania
Procesy komunikują się ze sobą poprzez wymianę komunikatów
Są cztery warstwy procesów:
- warstwa 1: zadanie zegara, zadanie systemowe
- warstwa 2: zadania obsługujące urządzenia (sieć, dyski, konsolę)
- warstwa 3: procesy systemowe (zarządca procesów, system plików, zarządca sieci)
- warstwa 4: procesy użytkowników
Kolejki procesów gotowych
Szeregowanie wielopoziomowe
Standardowo 16 kolejek
W pierwszej kolejce znajduje się zadanie zegara i zadanie system owe
Potem kilka kolejek zajmują zadania obsługi urządzeń
Dalej są procesy systemowe
. . procesy użytkownika
W ostatniej znajduje się jedynie proces idle
Kwant czasu może być różny dla różnych procesów
Zadania obsługi urządzeń i procesy systemowe zazwyczaj powinny być wykonywane w sposób niewywłaszczalny
Na wszelki wypadek w Miniksie są wywłaszczalne, ale otrzymują bardzo duży kwant czasu
Po jego zużyciu stają się znów gotowe
System obniża jednak priorytet procesu, jeśli jest jedynym gotowym do wykonania w kolejce
Zdegradowany proces może powrócić do pierwotnego priorytetu — jeśli wykorzysta swój kwant, ale inne procesy będą miały szansę się wykonać,
proces podwyższa priorytet
Procesy są szeregowane na zasadzie RR
Proces, który nie wykorzystał kwantu czasu, po powrocie do stanu gotowości wraca na początek kolejki i może być wykonywany przez pozostałą
część kwantu
Proces, który wykorzystał kwant czasu, jest umieszczany na końcu kolejki
Pierwszy proces z kolejki o najwyższym priorytecie
Nie dojdzie do zagłodzenia, bo procesy systemowe reagują na zlecenia od procesów użytkowników i same wysyłają zlecenia zadaniom obsługi
urządzeń
Zakleszczenia
- jeśli w grafie zasobów istnieje cykl, wówczas w systemie może być zakleszczenie
- z zakleszczeniami na ogół nie robi się nic, bo
- systemy generalnie implementują wywłaszczanie
- większość zasobów jest podzielna
- niepodzielne są struktury danych systemu operacyjnego - dlatego nie wywłaszczamy procesów systemowych
Systemy Operacyjne Strona 24
Systemy Operacyjne Strona 25
Unikanie zakleszczeń:
Unikanie zakleszczeń - algorytm bankiera
Systemy Operacyjne Strona 26
Systemy Operacyjne Strona 27
Algorytm bankiera, zamawianie zasobów
Pamięć
- Procesor generuje odwołania do pamięci (adres)
- Przekazuje je układowi MMU (memory managment unit)
Systemy Operacyjne Strona 28
-
Przekazuje je układowi MMU (memory managment unit)
Układ MMU po ewentualnym przekształceniu adresu umieszcza je na szynie adresowej
Po szynie adres dociera do pamięci
Pamięć odczytuje adres z szyny adresowej i umieszcza zawartość odpowiedniej komórki pamięci na szynie danych
Po szynie danych wartość dociera do procesora
MMU również administruje pamięcią - odpowiada za ochronę, adresy wirtualne itd.
- wiązanie adresów (z konkretnymi identyfikatorami)
Wiązanie na etapie kompilacji
-
Kompilator zastępuje adresy symboliczne fizycznymi — wiązanie adresów na etapie kompilacji
Program ładujący po prostu wprowadza moduł ładowalny do pamięci
Ten schemat jest możliwy, jeśli z góry wiadomo, gdzie w pamięci operacyjnej zostanie umieszczony program
Program wykonywalny jest nierelokowalny
Wiązanie podczas ładowania
- OBJ Dump - podgląda pliki wykonywalne i .o
- Kompilator produkuje moduł relokowalny, w którym wszystkie adresy są liczone względem początku modułu
- Moduł relokowalny można wprowadzić w dowolne miejsce pamięci
Systemy Operacyjne Strona 29
- Moduł relokowalny można wprowadzić w dowolne miejsce pamięci
- Program ładujący wylicza fizyczne adresy przed wprowadzeniem modułu do pamięci — wiązanie adresów podczas ładowania
- Taki program nie może być jednak przenoszony z jednego miejsca pamięci w inne w czasie wykonania
Wiązanie podczas wykonania
-
Kompilator produkuje program z adresami logicznymi
Program ładujący po prostu wprowadza moduł do pamięci
Przy każdym odwołaniu pod adres logiczny sprzęt przekształca go na adres fizyczny
Taki program można wprowadzić w dowolne miejsce pamięci
Można przenosić go też z jednego miejsca pamięci w inne w czasie wykonania
Łączenie statyczne
-
łączenie = konsolidacja
Łączenie jest wykonywane na etapie tworzenia modułu ładowalnego — łączenie statyczne
Moduł ładowalny jest „kompletny”: zawiera kod wszystkich potrzebnych modułów
Jest proste w realizacji
Nie wymaga wsparcia systemu operacyjnego
Może być wykonywane niezależnie od sposobu wiązania adresów
Każdy moduł ładowalny zawiera własną kopię modułów bibliotecznych
Ładowanie dynamiczne
Systemy Operacyjne Strona 30
-
Moduł ładowalny zawiera jedynie program główny
Program ładujący wprowadza początkowo do pamięci jedynie program główny
Pozostałe moduły znajdują się na dysku w postaci relokowalnej i są ładowane, gdy stają się potrzebne
Program musi być tak napisany, aby przed wywołaniem funkcji innego modułu załadował go sobie do pamięci
Nie wymaga istotnego wsparcia systemu operacyjnego — SO udostępnia jedynie operacje do ładowania modułów (np.: dlload, dlclose, dlsym)
Nieużywany podprogram nie zostanie nigdy załadowany
Rozmiar programu może być większy niż rozmiar pamięci operacyjnej
Moduły wspólne dla wielu aplikacji mogą być przechowywane na dysku w postaci jednej kopii
Moduły wspólne dla wielu aplikacji będą załadowane wielokrotnie do pamięci operacyjnej
Łączenie dynamiczne
-
Moduł ładowalny zawiera jedynie informacje o tym jakie moduły są potrzebne do jego wykonania
SO ładuje potrzebny moduł (z biblioteki dzielonej), gdy zajdzie taka potrzeba
Dotyczy najczęściej jedynie modułów bibliotecznych
W kodzie zamiast odwołań bibliotecznych znajdują się namiastki procedur
Namiastka wie, gdzie znaleźć odpowiednią bibliotekę lub jak ją załadować do pamięci
Po spełnieniu swojego zadania namiastka jest zastępowana właściwym wywołaniem
Łączenie dynamiczne może być wykonywane:
- w chwili ładowania programu (łączenie podczas ładowania)
- w chwili wystąpienia odwołania do modułu
- Wymaga wsparcia SO, który sprawdza, czy potrzebny moduł już znajduje się w pamięci (sprowadzony przez inną aplikację)
- Moduł wykorzystywany przez wiele aplikacji znajdzie się w pamięci - biblioteki dzielone
- Łączenie dynamiczne daje oszczędność miejsca na dysku i w pamięci
-
Zarządca pamięci
Rejestruje, które fragmenty pamięci są wolne, a które zajęte
Systemy Operacyjne Strona 31
- Rejestruje, które fragmenty pamięci są wolne, a które zajęte
- Przydziela i odbiera pamięć procesom
- Przesyła fragmenty pamięci między pamięcią główną a pamięcią pomocniczą
- Umożliwia współdzielenie wspólnych fragmentów kodu między procesami
- Zapewnia ochronę pamięci
- Zarządzanie pamięcią
- Techniki niewirtualne:
brak zarządzania
pojedynczy obszar pamięci
wymiana
strefy statyczne
przydział ciągły
stronicowanie
segmentowanie
segmentowanie ze stronicowaniem
- Pamięć wirtualna (na następnym wykładzie)
Brak zarządzania pamięcią:
- Zalety:
- duża elastyczność z punktu widzenia użytkownika
- niepotrzebne wsparcie sprzętowe
- niepotrzebne oprogramowanie systemowe
- Wady:
- brak jakichkolwiek usług
- użytkownik musi wszystko oprogramować sam
- Przykładowe zastosowanie: wyspecjalizowane systemy wbudowane oparte na mikrokontrolerach
Pojedynczy obszar pamięci
- Pamięć jest podzielona na dwa obszary:
- zajmowany przez system operacyjny (ROM, RAM lub obie)
- zajmowany przez jedyny program użytkownika
- MS DOS
- Bardzo prosty, nieduże wymagania wobec SO:
- nierelokowalne programy wynikowe
- proste ładowanie
- minimalny mechanizm ochrony pamięci (lub nawet brak)
- brak wieloprogramowości
- Wciąż stosowany (np.: systemy wbudowane) mimo poważnych ograniczeń
-
Strefy statyczne
IBM OS/360 MFT
Pamięć jest podzielona na pewną liczbę obszarów
Każdy obszar ma ustalony rozmiar
W każdym obszarze może wykonywać się jeden proces
SO przechowuje informacje, które obszary są wolne
Gdy zgłasza się proces szuka się dla niego wystarczająco dużego obszaru
Jeśli znajdzie się taki obszar przydziela się go procesowi w całości
Zalety: prostota
Wady:
- stopień wieloprogramowości ograniczany przez liczbę stref
- fragmentacja wewnętrzna — część obszaru przydzielonego procesowi pozostaje niewykorzystana
Systemy Operacyjne Strona 32
- fragmentacja wewnętrzna — część obszaru przydzielonego procesowi pozostaje niewykorzystana
Algorytmy znajdowania wolnego obszaru
- Pierwszy pasujący (first fit) — przeszukuje się tablicę od początku do znalezienia pierwszego odpowiednio dużego obszaru
- Cykliczny pierwszy pasujący — j.w., ale przeszukiwanie rozpoczyna się od ostatnio przydzielonego obszaru
- Najlepiej pasujący (best fit) — szuka się najmniejszego, wystarczająco dużego obszaru
-
Przydział ciągły pamięci
Procesy otrzymują ciągły blok pamięci
Liczba stref nie jest ustalona
Obszary wolnej pamięci tworzą tzw. dziury
Początkowo cała pamięć (z wyj. części zajmowanej przez SO) jest dostępna dla procesów i tworzy jedną wielką dziurę
Gdy pojawia się proces, SO szuka dla niego wystarczająco obszernej dziury
Proces otrzymuje dokładnie tyle pamięci, ile zażądał
Zjawisko fragmentacji wewnętrznej zatem nie istnieje
-
Przydział ciągły w systemie wsadowym
Procesy wchodzące do systemu są umieszczane w kolejce wejściowej
Planista długoterminowy wprowadza proces do systemu zgodnie z przyjętą strategią szeregowania, o ile jest dla niego dostatecznie duża dziura
Proces, który otrzymał pamięć jest wprowadzany do pamięci i rywalizuje o procesor (moduł szeregujący)
Proces, który kończy działanie oddaje pamięć
Powoduje to powstanie nowej dziury, rozszerzenie istniejącej lub złączenie kilku dziur w jedną większą
Powstaje możliwość wprowadzenia kolejnego procesu
Strategie wyboru wolnego obszaru
- Po pewnym czasie dziury są rozproszone po całej pamięci
- SO przechowuje listę wolnych obszarów (która może być długa!) - prowadzi do patologii
- z tego powodu nie dajemy procesom obszarów pamięci mniejszych niż np. 10 kB, co jednak prowadzi do fragmentacji wewnętrznej
- Wolny obszar może być wybierany w następujący sposób:
- pierwsza pasująca przeszukiwanie od początku lub cykliczne
- najlepiej pasująca — minimalizujemy pozostałości po przydziale szukając najmniejszą pasującą dziurę
- najgorzej pasująca przydzielamy największą dziurę mając nadzieję, że to co pozostanie wystarczy na potrzeby innych procesów
w ten sposób unika się produkowania małych dziur
- Uwagi:
- przydzielanie najgorzej pasującej okazuje się w praktyce gorsze od pozostałych pod względem wykorzystania pamięci
- przydzielanie pierwszej pasującej i najlepszej pasującej są porównywalne pod względem wykorzystania pamięci
- przydzielanie pierwszej pasujące działa z reguły szybciej
-
Fragmentacja zewnętrzna
Pamięć po pewnym czasie zostaje podzielona na małe obszary
Fragmentacja zewnętrza — suma rozmiarów wolnych obszarów wystarcza do spełnienia zamówienia, ale nie stanowi spójnego obszaru
Przy przydzielaniu pierwszego pasującego obszaru nawet 1/3 pamięci może być bezużyteczna
Remedium:
- kosztowna defragmentacja, możliwa tylko przy dynamicznym wiązaniu adresów
- rezygnacja z ciągłości obszaru zajmowanego przez proces
-
Algorytm bliźniaków
Mamy n list bloków pamięci, na i tej liście znajdują się bloki o wielkości 2i
Proces dostaje najmniejszy blok pamięci, w którym się zmieści
Jeżeli brakuje bloków danego rozmiaru, to dzielimy puste bloki większe
Po zakończeniu procesu sprawdzamy, czy bliźniak bloku jest pusty. Jeśli tak, to scalamy bloki
-
Stronicowanie
Proces zajmuje nieciągły fragment pamięci operacyjnej
Pamięć fizyczna jest podzielona na ramki, każda o tym samym rozmiarze (potęga dwójki)
Pamięć logiczna jest podzielona na strony tego samego rozmiaru
Ładowanie procesu polega na wprowadzeniu jego stron w dowolne wolne ramki
Każdy proces ma tablicę stron, która zawiera odwzorowanie numerów stron na numery ramek
Wymaga wsparcia sprzętowego
Stronicowanie
- Jest wykonywana sprzętowo
- Polega na zamianie numeru strony na numer ramki, w której strona się znajduje
- Pośredniczy w tym tablica stron
Tablica ramek
- SO przechowuje tablicę ramek
- W tablicy ramek jest jedna pozycja dla każdej ramki
- SO pamięta czy ramka jest wolna, a jeśli nie, to któremu procesowi została przydzielona
Systemy Operacyjne Strona 33
-
Sprzętowa implementacja
SO przechowuje tablicę stron każdego procesu w pamięci fizycznej
Wskaźnik do tablicy stron procesu znajduje się wjego PCB
Sprzęt posiada specjalny rejestr zawierający adres początku tablicy stron (PTBR - Page Table Base Register)
Podczas przełączenia kontekstu do tego rejestru wpisuje się wartość z PCB procesu wybranego do wykonania
Szczegóły są zależne od konkretnego systemu operacyjnego i sprzętu
- Problemy:
- Zwiększa się czas potrzebny na dostęp do komórki pamięci: dwa dostępy do pamięci w celu pozyskania jednego słowa
- Tablica stron może być bardzo duża
- Remedium:
- Bufor translacji adresów strony
- Wielopoziomowe tablice stron, haszowane tablice stron, odwrotne tablice stron
Bufor translacji adresów
Translation Look-aside BufFer
Mała (32 do 1024), szybka, ale także bardzo droga pamięć asocjacyjna
Każda komórka składa się z dwóch części: klucza i wartości
Wyszukiwanie k w pamięci odbywa się przez równoczesne porównanie k z kluczami we wszystkich komórkach
Jeśli klucz zostanie znaleziony, to wynikiem wyszukiwania jest związana z nim wartość
TLB zawiera kilka pozycji z tablicy stron
Kluczami są numery stron, a wartościami — numery ramek
Numer strony jest najpierw wyszukiwany w TLB
Jeśli zostanie znaleziony (trafienie w TLB), to nie ma potrzeby sięgać do tablicy stron
Jeśli adresu nie ma w TLB (chybienie w TLB), to numer ramki pobiera się z tablicy stron i dodaje nowy wpis do TLB
Współczynnik trafień: jak często wyszukiwanie w TLB kończy się sukcesem
Ze względu na lokalność odwołań współczynnik trafień wynosi ok. 80% — 98%!
Znając czasy dostępu do TLB i pamięci oraz współczynnik trafień można obliczyć efektywny czas dostępu do pamięci
- Przykład:
współczynnik trafień: 90%
czas wyszukania w TLB: 4 ns
czas dostępu do pamięci operacyjnej: 30 ns
efektywny czas dostępu do pamięci:
0,90 * 34 + 0,10 * 64 = 37 ns
- lokalność odwołań
-
- Dodanie nowego wpisu do TLB może wymagać usunięcia innego wpisu
- Różne strategie wyboru ofiary:
- Least Recently Used — najdawniej użyty
- losowo (całkiem skuteczne)
- Niektórych wpisów nie warto usuwać z TLB — przypinanie pozycji w TLB
- TLB trzeba kasować przy każdym przełączaniu kontekstu (poza przypiętymi)
- W niektórych realizacjach w TLB znajduje się także identyfikator przestrzeni adresowej (ASID):
- dzięki temu można przechowywać wpisy dotyczące różnych procesów
- jeśli ASID procesu i pozycji w TLB nie pasują do siebie, to jest to interpretowane jako chybienie
- TLB bez ASID trzeba opróżniać przy każdej zmianie tablicy stron
- Tablica stron wymaga ciągłego fragmentu pamięci
- Nie zmienia to faktu, że tablica stron podlega stronicowaniu
- W tablicy stron można umieścić dodatkowe informacje, np.:
- bit poprawności odwołania
- czy strona jest przeznaczona tylko do odczytu
- czy zawartość strony uległa zmianie (bit modyfikacji)
- . . . (więcej na ten temat przy pamięci wirtualnej)
Wielopoziomowe tablice stron
- Intel : 2 poziomy
- SPARk: 3 poziomy
- Motorola: 4 poziomy
Haszowana tablica stron
Systemy Operacyjne Strona 34
- Stosowane w architekturach 64-bitowych
- Element w tablicy stron jest listą, której elementy są złożone z trzech pól:
- numeru strony
- numeru ramki
- wskaźnika do następnego elementu na liście
- Numer strony jest kluczem, dla którego wylicza się funkcję haszującą — wyznacza ona pozycję w tablicy stron
- Następnie porównuje się numery stron w elementach w liście z numerem strony tłumaczonego adresu
- Wynikiem jest numer ramki w pasującym elemencie listy
- W jednym elemencie tablicy stron można przechowywać też informacje o grupie ramek (tablica stron grupowanych)
Odwrotna tablica stron
- Po jednej pozycji dla każdej ramki
- Każda pozycja składa się z:
- numeru strony przechowywanego w danej ramce
- informacji o procesie, do którego strona należy
- Adresy logiczne składają się z:
- identyfikatora procesu,
- numeru strony
- przesunięcia
- Gdy pojawi się odwołanie do pamięci sprzęt wyszukuje pary złożonej z identyfikatora procesu i numeru strony w tablicy stron
- Adres fizyczny to para złożona z pozycji w tablicy, w której znaleziono strony oraz z przesunięcia
- Stosowana w PowerPC
- Aby poprawić wydajność stosuje się haszowanie
Zalety stronicowania
- brak segmentacji zewnętrznej
- segmentacja wewnętrzna na ostatniej stronie należącej do procesu
Systemy Operacyjne Strona 35
- segmentacja wewnętrzna na ostatniej stronie należącej do procesu
- trzeba przechowywać tablice stron
- możliwe jest współdzielenie pamięci (kłopot przy odwrotnej tablicy stron)
Pamięć wirtualna
- Nie wszystkie strony procesu muszą znajdować się w pamięci
- Część z nich może przebywać w pamięci pomocniczej
- Technika pamięci wirtualnej:
- umożliwia wykonanie procesów, które w całości nie mieszczą się w pamięci fizycznej
- stwarza wrażenie jednorodnej, olbrzymiej pamięci
- można wprowadzić do systemu więcej procesów
- nie trzeba ładować do pamięci całego programu — krótszy czas uruchamiania
- programista nie jest ograniczany wielkością dostępnej pamięci
- może być realizowana jako naturalne rozszerzenie stronicowania
Stronicowanie na żądanie
- Pozycja tablica stron zawiera:
- numer ramki w pamięci (jak poprzednio) lub adres dyskowy strony
- bit poprawności odwołania
- Jeśli bit poprawności odwołania jest ustawiony, to strona znajduje się w pamięci operacyjnej
- Jeśli bit poprawności odwołania nie jest ustawiony, to strony nie ma w pamięci operacyjnej lub nie należy do logicznej przestrzeni adresowej
procesu - błąd braku strony
- sytuacja obsługiwana przez system
- Procesy znajdują się w pamięci pomocniczej
- Gdy zachodzi potrzeba procedura stronicująca wprowadza potrzebną stronę procesu do pamięci
- Cały proces jest całkowicie przezroczysty dla użytkownika
1) Strona staje się potrzebna, gdy następuje odwołanie do niej
2) Sprzęt stronicujący wykrywa nieustawiony bit poprawności odwołania i generuje błąd braku strony
3) System operacyjny obsługuje błąd braku strony:
a) sprawdzając, czy odwołanie było dozwolone
b) znajdując wolną ramkę
c) zlecając sprowadzenie strony z dysku
4) Po zakończonej operacji wejścia-wyjścia, SO:
a) modyfikuje tablicę stron
b) wznawia wykonanie przerwanego rozkazu
- trzeba znaleźć miejsce w pamięci na nową stronę
○ czasem trzeba usunąć jakąś stronę
- pamięć wirtualna i stronicowanie na żądanie mocno zwalnia system - pogorszenie czasu rzędu 10% przy jednym błędzie na 2,5 miliona dostępów
do pamięci
Zwalnianie ramek
- Trzeba zwolnić pewną ramkę
- Strategie zwalniania:
○ globalna - wyrzucamy ramkę jakiegoś procesu
○ lokalna - wyrzucamy ramkę aktualnego procesu
- Którą? Różne algorytmy zastępowania stron:
○ FIFO
○ LRU
○ MFU
○ optymalna
- Zwalnianą ramkę trzeba być może zapisać na dysk bit modyfikacji w tablicy stron jest ustawiany sprzętowo w chwili zapisu do strony; zapisywane
są jedynie strony zmodyfikowane
- chcemy minimalizować liczbę błędów braku strony
-
Algorytm FIFO
z każdą stroną procesu związujemy czas (logiczny - licznik) jej wprowadzenia do pamięci
usuwamy najstarszą stronę
implementacja: kolejka stron przebywających w pamięci
im więcej ramek, tym mniej braków strony - niekoniecznie
Anomalia Belady'ego
- w niektórych algorytmach współczynnik braku stron może wzrosnąć ze wzrostem liczby wolnych ramek
Optymalny algorytm zastępowania stron
- usuwamy stronę, do której najdłużej nie będzie odwołania - patrzenie w przyszłość
Least Recently Used
- usuwamy tę stronę, która była najdawniej używana
- bazuje na lokalności odwołań
Implementacja za pomocą licznika
Systemy Operacyjne Strona 36
-
-
-
Implementacja za pomocą licznika
Licznik w każdej pozycji tablicy stron + zegar logiczny
Gry nastąpi odwołanie do strony, wartość zegara jest kopiowana do licznika w odpowiedniej pozycji tablicy stron
Przy wymianie przeglądamy tablicę stron wybierając tę o najmniejszej wartości licznika
Problemy:
○ zegar może się przepełnić
○ sprzęt musi aktualizować wartości licznika przy każdym odwołaniu do pamięci
○ przeglądanie tablicy stron (zatem na nic nam TLB)
○ wielokrotne spowolnienie efektywnego czasu dostępu do pamięci
Implementacja za pomocą stosu
Numery stron przechowuje się na stosie
Gry nastąpi odwołanie do strony, jej numer przesuwa się na wierzchołek stosu
Przy wymianie wybiera się stronę z dna stosu
Problemy:
○ sprzęt musi aktualizować stos przy każdym odwołaniu do pamięci
○ trzeba wydobywać elementy z wnętrza stosu
○ wielokrotne spowolnienie efektywnego czasu dostępu do pamięci
Algorytmy przybliżające LRU
Zamiast licznika w pozycji tablicy stron pamięta się bit odwołania
Bit ten jest sprzętowo ustawiany, gdy wystąpi do niej odwołanie
Zamiast jednego bitu w pozycji w tablicy stron może być wiele bitów przesuwanych sprzętowo w lewo w regularnych odstępach czasu
pojedyncze bity są łatwo ustawialne przez sprzęt
Algorytm przybliżający LRU drugiej generacji (algorytm zegarowy)
- Jest tylko jeden bit odwołania
- Stronę do zastąpienia wybiera się za pomocą FIFO, ale:
○ po wybraniu strony sprawdza się jej bit odwołania
○ jeśli jest on równy zero, strona zostaje zastąpiona
○ wpp. bit zeruje się, a strona otrzymuje „drugą szansę” — kontynuuje się wyszukiwanie strony do zastąpienia
○ przeszukiwanie cykliczne
○ poszukujemy zawsze od następnej po ostatnio usuniętej
○ gdy wszystkie strony mają ustawione bity odwołania, to sprowadza się do FIFO
- Implementacja: algorytm zegarowy — ćwiczenia
- Ulepszenia (Macintosh): uwzględniamy w drugiej kolejności bit modyfikacji, preferując strony niemodyfikowane
Sztuczki stosowane przy wymianie stron
- Pula wolnych ramek
○ Wczytywanie potrzebnej strony do wolnej ramki inicjuje się przed wybraniem strony do zastąpienia
○ Ramka zajmowana przez wymienianą stronę wraca do puli po zakończeniu zapisu
- W wolnej ramce pamięta się, która strona się w niej ostatnio znajdowała
○ ramka nie jest przecież czyszczona
○ po wystąpieniu braku strony sprawdza się, czy potrzebna strona jest w puli wolnych ramek
○ jeśli tak, to nie jest potrzebna żadna operacja wejścia-wyjścia
- Lista zmodyfikowanych stron - zapis na zapas:
○ gdy urządzenie stronicujące jest bezczynne zapisuje „na zapas” zmodyfikowaną stronę i zeruje bit modyfikacji
- Least Frequently Used - usuwanie strony z najmniejszym licznikiem odwołań
- Most Frequently Used - usuwa się stronę z największym licznikiem odwołań
○ skoro proces intensywnie korzystał z tej strony, to może już mu się znudziło
Generalne strategie zastępowania
- Zastępowanie globalne:
○ strona do zastąpienia może należeć do dowolnego procesu
○ lepsza przepustowość
○ większa elastyczność (jeśli ktoś potrzebuje więcej ramek, to je dostanie)
○ mniejsza przewidywalność czasu wykonania procesu
- Zastępowanie lokalne:
○ strona do zastąpienia należy do zbioru własnych stron procesu
○ zbiór stron w pamięci zależy tylko od lokalnego ciągu odwołań
Przydział ramek
- Ile co najmniej ramek trzeba przydzielić każdemu procesowi?
○ zależy od architektury
○ każdy rozkaz musi mieć szansę wykonać się do końca —
○ rozkaz może leżeć na granicy stron
○ rozkaz może mieć wiele argumentów
○ argumenty mogą być adresowane pośrednio
- Jak rozdzielać ramki na poszczególne procesy?
przydział równy
Systemy Operacyjne Strona 37
○ przydział równy
○ przydział proporcjonalny (do wielkości procesu)
○ przydział priorytetowy
Migotanie (szamotanie) stron, lokalna strategia zastępowania
Występuje, gdy proces nie ma wystarczającej liczby ramek i wszystkie strony w pamięci są aktywnie używane
Gdy proces dysponuje małą liczbą ramek często występują braki stron
Potrzebne strony są wprowadzane w miejsce innych stron tego procesu (przy strategii lokalnej)
Ale usunięta strona będzie za chwilę znów potrzebna
○ Efekt: częste wymiany stron procesu
- Więcej czasu proces spędza na wymianie stron niż na wykonywaniu kodu
- Ponadto wydłuża się kolejka do urządzenia stronicującego, co powoduje wzrost czasu efektywnego dostępu do pamięci w innych procesach
-
Migotanie stron, globalna strategia zastępowania
- „Migotający” proces podbiera ramki innym procesom
○ To prowadzi do częstych braków stron w innych procesach
○ Procesy przestają być gotowe i ustawiają się w kolejce do urządzenie stronicującego
○ Spada wykorzystanie CPU
○ SO zauważa spadek wykorzystania CPU i stwierdza, że należy zwiększyć poziom wieloprogramowości
○ Do systemu wchodzi nowy proces, który zabiera ramki innym
○ Nie można zakończyć żadnej czynności
Model zbioru roboczego
Przykładowa aproksymacja zbioru roboczego
- jest to tylko aproksymacja, bo mówimy tu o jednostkach czasu a nie realnych odwołaniach
Uruchomienie procesu przy stronicowaniu na żądanie
- Wprowadza się stronę zawierającą pierwszy rozkaz procesu
○ resztę dociągnie się przy błęfach braku stron
- A jak obsłużyć funkcję systemową fork()?
○ Kopiowanie przy zapisie
początkowo proces potomny i macierzysty współdzielą te same strony (szczególnie strony z kodem, ale początkowo również z
danymi)
system operacyjny oznacza te strony jako tylko do odczytu
przy próbie zapisu do takiej strony system operacyjny sporządza kopię strony i odwzorowuje ją na przestrzeń adresową
odpowiedniego procesu
Odwzorowanie pliku na pamięć
- Sekwencyjne przetwarzanie pliku na dysku wymaga odwołania do systemu przy każdej funkcji odczytu/zapisu
- Odwzorowanie pliku na pamięć
○ blok dyskowy jest odwzorowany na stronę procesu
dostęp do pliku jest wykonywany za pomocą zwykłych rozkazów odczytu/zapisu pamięci
Systemy Operacyjne Strona 38
○ dostęp do pliku jest wykonywany za pomocą zwykłych rozkazów odczytu/zapisu pamięci
○ działa zwykły schemat stronicowania na żądanie
○ pierwszy dostęp powoduje sprowadzenie strony
○ kolejne operacje odczytu/zapisu pliku są obsługiwane jak zwykły dostęp do pamięci
○ zamknięcie pliku powoduje zapis danych na dysk
○ Ten sam plik może być odwzorowany przez wiele procesów
○ W połączeniu z kopiowaniem przy zapisie można tworzyć prywatne kopie modyfikowanych danych
- W niektórych systemach każdy dostęp do pliku jest realizowany tylko w ten sposób
Dyski
-
Parametry
Prędkość obrotowa (np. 200 obr/s)
Szybkość przysyłania — szybkość przepływu danych między napędem dysku a komputerem
Czas wyszukiwania — czas przesuwania głowicy do odpowiedniego cylindra
Opóźnienie obrotowe — czas potrzebny do podejścia odpowiedniego sektora pod głowicę
Czas dostępu czas wyszukiwania + opóźnienie obrotowe
- Dyski o stałej prędkości obrotowej — gęstość bitów maleje w stronę zewnętrznej krawędzi (dyski twarde)
- Dyski o stałej prędkości liniowej:
- stała gęstość bitów
○ zewnętrzne ścieżki mają więcej sektorów
○ zmienna prędkość obrotowa zapewnia stałą szybkość przysyłu danych
○ CD-ROM, DVD-ROM
-
Adresowanie dysków
Dane są odczytywane z dysku blokami (np. 512 bajtów)
Dysk jest traktowany jak jednowymiarowa tablica bloków logicznych
Tablica jest odwzorowywana na sektory, ścieżki i cylindry
Odwzorowanie ukrywa sektory uszkodzone i zastępuje je sektorami rezerwowymi
Są różne sposoby organizacji sektorów rezerwowych
- adres logiczny to
(powierzchnia (talerz jednostronnie) : j, cylinder : i, sektor :)
adres fizyczny : b = k + s * (j + i * t)
s : liczba sektorów na ścieżce
t : liczba cylindrów na powierzchnię (talerz jednostronnie)
-
Planowanie dostępu do dysku (dawniej)
Proces zgłasza zapotrzebowanie na operacje wejścia-wyjścia do SO
Zamówienie zawiera m.in. adres dyskowy, adres w pamięci, liczbę bajtów
Zamówienia są kolejkowane i obsługiwane w miarę gotowości napędu i sterownika
Po zrealizowaniu zamówienia SO może wybrać zamówienie do realizacji w następnej kolejności
Odpowiednie zaplanowanie tych operacji pozwala polepszyć czas dostępu poprzez minimalizację ruchu głowicy
Strategia FCFS
Strategia SSFT
Systemy Operacyjne Strona 39
Strategia SCAN
Strategia C-SCAN
Systemy Operacyjne Strona 40
Strategia LOOK i C-LOOK
- jak SCAN i C-SCAN, ale głowica przemieszcza się pomiędzy skrajnymi zamównieniami
Strategia F-SCAN
- tak samo jak SCAN, ale przed rozpoczęciem przesuwania głowicy zamykany jest zbiór zgłoszeń
Jaką strategię zastosować
- zależy od liczby zamówień
- zależy od rodzaju zamówień i sposobu dostępu do plików
- zależy od lokalizacji katalogów
○ metadane (struktura systemu plików) powinna być zgrupowana pewnie w jednym miejscu, żeby było szybciej
Kto szereguje zamówienia
- SO mógł to robić, dopóki miał dostęp do fizycznej struktury dysku
- z drugiej strony SO może wymagać określonej kolejności zapisów
Urządzenia IO
- Urządzenie blokowe (np. dysk)
○ informacje są przechowywane w blokach o ustalonym rozmiarze
○ każdy blok ma własny adres
○ urządzenie odczytuje i zapisuje każdy blok niezależnie od pozostałych
- Urządzenie znakowe (np. myszka, drukarka)
○ odczytuje i zapisuje strumień znaków (bajtów) bez struktury (terminal)
○ nie ma możliwości adresowania poszczególnych znaków
○ Są urządzenia, które nie pasują do tego podziału (czasomierze)
- dostęp sekwencyjny - urządzenie przysyła dane zawsze w określonej kolejności (taśma magnetyczna)
○ pierwotnie
- dostęp swobodny - użytkownik może odczytywać / zapisywać dane w dowolnym miejscu
○ w miarę rozwoju
- synchroniczny - urządzenie przesyła dane w przewidywalnym z góry czasie
- asynchroniczny 0 nie wiadomo, kiedy pojawiają się dane z urządzenia
○ czujniki
○ dyski
Sposób współdzielenia
- wyłączny dostęp - tylko jeden proces korzysta
○ drukarka (generalnie)
- współdzielenie - jak wiadomo
○ dysk
SO i IO
- Pomimo tych różnic chcielibyśmy mieć jednolity interfejs dostępu do urządzeń
- Urządzenia grupuje się w kilka powszechnie przyjętych typów i udostępnia dobrze określone interfejsy:
Systemy Operacyjne Strona 41
- Urządzenia grupuje się w kilka powszechnie przyjętych typów i udostępnia dobrze określone interfejsy:
○ wejście-wyjście blokowe
○ wejście-wyjście znakowe
○ wejście-wyjście odwzorowywane na pamięć
○ gniazda sieciowe
○ inne
- Moduł wejścia-wyjścia ma budowę warstwową
○ Oprogramowanie użytkownika
○ Warstwa SO niezależna od urządzenia
□ w Uniksie większość urządzeń jest reprezentowana jako pliki
□ czasami pseudourządzenia
□ /dev/null
□ informacje o systemie
□ /proc/partitions
○ Podprogramy obsługi urządzeń
□ zachowania typowe dla urządzenia
○ Podprogramy obsługi przerwań
□ SO instaluje sobie, żeby wiedzieć, co robić w wypadku przerwania
□ zło konieczne - specyficzne dla urządzeń
□ wyodrębnione głęboko w strukturze SO
□ jak najmniejsza część SO powinna od nich zależeć
○ Sprzęt
-
Komunikacja komputera ze sterownikiem
Sterownik jest wyposażony w rejestry
Rejestry mogą zawierać informacje o stanie urządzenia, informacje sterujące, dane odczytane, dane zapisywane
Procesor zleca niskopoziomowe operacje (np. włącz silnik napędu) umieszczając w rejestrach określone wartości
Odbywa się to poprzez przesłanie po szynie ustalonych ciągów bitów
Komunikację realizuje się poprzez porty wejścia-wyjścia lub operacje odwzorowywane w pamięci operacyjnej
Komunikacja za pomocą portów
- w języku maszynowym procesora są rozkazy wejścia - wyjścia do numerowanych portów
- numery portów tworzą odrębną (różną od pamięci) przestrzeń adresową
Komunikacja odwzorowywana na pamięć operacyjną
- rejestry sterowników są odwzorowywane na pewien obszar przestrzeni adresowej
- procesor zapisuje, odczytuje dane z tego obszaru za pomocą zwykłych rozkazów dostępu do pamięci
Komunikacja za pomocą odpytywania
- Procesor sprawdza bit gotowości urządzenia (poprzez odpowiedni port)
- Sterownik ustawia ten bit, gdy urządzenie jest gotowe do otrzymania kolejnych danych
- Procesor wpisuje dane do odpowiedniego rejestru sterownika (poprzez port) i inicjuje transmisje ustawiając odpowiedni bit
sterujący w odpowiednim porcie
- Sterownik czyści bit gotowości i wykonuje operację na urządzeniu
- Po jej zakończeniu ustawia bit gotowości i informacje o tym, czy operacja się udała
- to rozwiązanie jest efektywne, jeżeli urządzenie i sterownik są szybkie
- w przeciwnym razie procesor marnuje czas oczekując na zakończenie operacji IO
Komunikacja za pomocą przerwań
- Procesor jest wyposażony w linię, po której układ obsługi przerwań sygnalizuje konieczność przerwania wykonania bieżącego kodu
- Procesor wykonuje wówczas procedurę obsługi przerwania
- Często są dwie linie żądania przerwań: przerwania niemaskowalne, których nie można wyłączyć i przerwania maskowalne, które procesor może
zablokować na czas wykonania krytycznych fragmentów kodu
- Przerwania są często wielopoziomowe
○ w trakcie obsługi przerwania może pojawić się inne przerwanie
○ priorytety przerwań
○ trzeba uważać na to, by procesor nie został zmonopolizowany przez przerwania
- Procesor zamiast oczekiwać na ustawienie bitu gotowości przez sterownik urządzenia może zająć się innymi działaniami
- Sterownik urządzanie powiadamia o zakończeniu operacji wejścia-wyjścia poprzez zgłoszenie przerwania
-
Bezpośredni dostęp do pamięci
Przesyłanie dużych ilości danych bajt po bajcie prowadzi do marnowania czasu procesora
Większość systemów komputerowych jest wyposażona w sterownik bezpośredniego dostępu do pamięci (DMA)
Procesor inicjuje transmisję przekazując sterownikowi DMA źródło, miejsce w pamięci oraz liczbę danych
Sterownik DMA przejmuje nadzór nad odbiorem kolejnych danych
Po zakończeniu transmisji sterownik DMA generuje przerwanie
-
Warstwa niezależna od urządzenia
realizuje czynności dla wszystkich urządzeń
buforowanie
wspólna przestrzeń nazw
dba o zgłaszanie błędów
przydziela i zwalnia urządzenia
Systemy Operacyjne Strona 42
- przydziela i zwalnia urządzenia
-
Systemy plików
Plik logiczny pojemnik na dane
System plików — podsystem SO umożliwiający użytkownikom tworzenie plików, dostęp do nich i manipulowanie nimi
Interfejs systemu plików funkcje systemowe oraz inne udogodnienia umożliwiające aplikacjom wykonywanie operacji na plikach
Architektura systemu plików — szczegóły związane z wewnętrzną implementacją plików
- w Unixie każdy system plików udostępnia ten sam interfejs
- aplikacje mają jednolity obraz wszystkich plików
Pliki
- jądro nie interpretuje zawartości pliku traktując go jako ciąg bajtów
- jądro udostępnia podstawowe operacje
○ nazywanie plików
○ organizacja
○ kontrola dostępu
- plik może mieć dostęp sekwencyjny bądź swobodny
Katalogi
- Plik są zorganizowane w hierarchiczną przestrzeń nazw
- Przestrzeń nazw może:
○ być płaska,
○ być drzewiasta,
□ DOS
○ mieć postać grafu acyklicznego
□ LINUX
□ tak po prawdzie root może utworzyć cykl
- Plik identyfikuje się za pomocą jego nazwy ścieżkowej:
○ bezwględnej,
○ względnej
Dowiązanie
Dowiązanie — odniesienie do pliku w katalogu
Do tego samego pliku może istnieć wiele dowiązań (w Linuxie)
Plik nie ma unikatowej nazwy!
Dowiązania mogą być sztywne lub symboliczne
○ sztywne
□ plik i dowiązanie nie są rozróżnialne
○ symboliczne
□ pliki i dowiązania są rozróżnialne - skrót Windowsowy
- Dowiązanie symboliczne jest specjalnym plikiem, który wskazuje na inny plik
- Dowiązania sztywne do tego samego pliku są nierozróżnialne
- Dowiązania symboliczne są niewidoczne dla wielu (ale nie dla wszystkich!) programów
-
Reprezentacja katalogu
- Wewnętrzny format reprezentacji katalogu jest zależny od konkretnego systemu plików
- Standard POSIX określa standardowe programy biblioteczne do manipulowania katalogami
Atrybuty pliku i i-węzły
- Z każdym plikiem jest związany dokładnie jeden i-węzeł
○ węzeł ma licznik dowiązań
- Atrybuty przechowywane w węźle indeksującym (i-węźle) pliku
- Dokładna postać i-węzła jest zależna od konkretnego systemu plików
- Atrybuty można jednak odczytywać w postaci niezależnej od konkretnego systemu plików (funkcje systemowe fstat i stat)
- Powszechne atrybuty pliku:
○ typ pliku: zwykły, katalog, FIFO, dowiązanie symboliczne, urządzenie
□ w wypadku urządzenia pamiętana jest nazwa urządzenia
○ liczba dowiązań do pliku
○ rozmiar pliku
○ identyfikator urządzenia, na którym znajduje się plik
○ numer i-węzła (unikatowy w obrębie dysku logicznego); nie jest przechowywany w i-węźle, lecz w katalogu
○ właściciel pliku
○ prawa dostępu do pliku
○ znaczniki czasowe
Deskryptory pliku
- Przed użyciem plik należy otworzyć
- Funkcja systemowa open pobiera jako argument nazwę ścieżkową pliku, a przekazuje w wyniku deskryptor
○ system idzie do właściwego i-węzła
○ indeks załadowanego do pamięci i-węzła jest umieszczany w systemowej tablicy otwartych plików
○ tablica deskryptorów przechowuje indeks do systemowej tablicy plików
- Każdy proces ma katalog roboczy — względem niego określa się ścieżki względne
Systemy Operacyjne Strona 43
-
Każdy proces ma katalog roboczy — względem niego określa się ścieżki względne
Każdy proces ma domyślną maskę tworzenia pliku zawierającą uprawnienia, które należy odebrać tworzonym plikom
Deskryptor pliku jest obiektem związanym z procesem
Wielokrotne otwarcie tego samego pliku tworzy nowe deskryptory
Kolejne operacje na pliku wykonuje się za pomocą deskryptora pliku
Plik otwarty przez proces jest reprezentowany przez pewne obiekty w jądrze
W skład tego obiektu wchodzi m.in.: wskaźnik pliku i tryb otwarcia pliku
Deskryptor = sesja dostępu do pliku
- deskryptory mogą być duplikowane za pomocą dup i dup2 (nie jest jednak powielany wpis w systemowej tablicy otwartych plików)
- zamykanie za pomocą close
○ zmniejsza licznik deskryptorów odwołujących się do wpisu w systemowej tablicy otwartych plików
-
IO
Plik odczytuje się za pomocą funkcji systemowej read, a zapisuje za pomocą funkcji systemowej write
Operacje zapisu i odczytu są niepodzielne - blokowanie i-węzła
Przed każdym zapisem w plikach otwartych do dopisywania, wskaźnik pliku jest przesuwany na jego koniec
Dostęp swobodny realizuje się za pomocą funkcji systemowej Iseek
Problem w procesach wielowątkowych (funkcje pread i pwrite z systemu Solaris)!
Nakładanie blokad na pliki
- Blokady doradzane:
○ nie są wymuszane przez jądro
○ chronią plik przed współpracującymi procesami sprawdzającymi jawnie, czy blokada nie jest nałożona
- Blokady obowiązkowe:
○ jądro odrzuca operacje naruszające blokadę
- Różne realizacje w różnych systemach operacyjnych
Alokacja
- alokacja ciągła - plik może znajdować się jedynie w spójnym fragmencie dysku
○ dawny, ewentualnie specjalne zastosowania (urządzenia wbudowane)
- alokacja listowa - każdy fragment zawiera adres następnego fragmentu
○ FAT
○ przejrzenie całego pliku zajmuje dużo czasu - wiele skoków
○ łatwo wstawić coś do środka albo na koniec - trzeba tylko poprawić kilka dowiązań
○ lista jest jednokierunkowa
- alokacja indeksowa - mamy tablicę fragmentów w pierwszym bloku, adresującą pozostałe bloki
○ EXT2, NTFS
○ adresowanie może być kilkustopniowe
○ najwydajniejszy
-
Współistnienie różnych systemów plików
Z pozoru jest monolityczna
Tak naprawdę składa się z kilku niezależnych „poddrzew stanowiących niezależne systemy plików
Jeden podstawowy system plików
Katalog główny podstawowego systemu plików = systemowy katalog główny
Pozostałe systemy plików przyłącza się do istniejącej struktury (montowanie)
Montowanie może przesłonić fragment systemu plików
Węzły wirtualne
- v-węzeł reprezentuje systemy plików w jądrze
- v-węzeł — „klasa abstrakcyjna”, z której wyprowadza się podklasy stanowiące konkretne implementacje różnych systemów plików
- Dwa pola:
○ v_data — wskaźnik do prywatnej struktury danych przechowującej dane charakterystyczne dla konkretnego systemu plików (np. wskaźnik
do i-węzła)
○ v_op — wskaźnik do struktury zawierającej wskaźniki do funkcji implementujących interfejs v-węzła
- Oba pola są wypełniane wartościami w czasie inicjowania v-węzła (w funkcji open)
- Dwie kategorie funkcji:
○ funkcje „wirtualne”, które definiują zachowanie zależne od systemu plików
○ wysokopoziomowe podprogramy używane przez inne fragmenty jądra i wywołujące funkcje wirtualne
Systemy Operacyjne Strona 44
Wirtualny system plików
- implementacja podobna do węzłów wirtualnych
- pseudoobiektowość
- pole z danymi i pole z funkcjami wirtualnymi
-
Systemowe struktury danych po otwarciu pliku
Tablica deskryptorów
Pozycja w systemowej tablicy otwartych plików
V-węzeł w pamięci
Obiekty z warstwy zależnej od konkretnego systemu plików
Tablica rozdzielcza wirtualnych systemów plików
- Globalna tablica zawierająca po jednej pozycji dla każdego systemu plików z polarni:
○ nazwa typu systemu plików
adres podprogramu inicjującego
Systemy Operacyjne Strona 45
○ adres podprogramu inicjującego
○ wektor operacji dla tego systemu plików
Montowanie systemu plików
- Uzyskaj dostęp do v-węzła katalogu będącego punktem zamontowania za pomocą analizy nazwy ścieżkowej (za chwilę)
○ na wejściu ścieżka, na wyjściu wskaźnik do v-węzła
- Sprawdź, czy na tym katalogu nic nie zamontowano
- Znajdź w tablicy rozdzielczej informacje o typie montowanego systemu plików
- Wywołaj podprogram inicjujący z tablicy rozdzielczej
- Utwórz nową strukturę vfs i zainicjuj ją.
-
Inicjalizacja struktury vfs
Dodaj strukturę vfs do listy jednokierunkowej o początku rootyfs
Ustaw pole vfs, aby pokazywało wektor operacji ze znalezionej pozycji tablicy rozdzielczej
Ustaw pole vfs_ynodecoyered, aby wskazywało na v-węzeł punktu zamontowania
Zapamiętaj wskaźnik do struktury vfs w polu vfs mountedhere v-węzła przesłanianego katalogu
Wywołaj zależną od konkretnego systemu plików operację VFS MOUNT
○ inicjalizuje system plików
Analiza nazw ścieżkowych
- jest implementowana w warstwie niezależnej od systemu plików
- tłumaczy nazwę ścieżkową na v-węzeł żądanego pliku
Szczegóły analizy nazwy ścieżkowej
Funkcja lookuppn() wykonuje pętlę analizując po kolei składowe nazwy ścieżkowej:
Sprawdza, czy v-węzeł reprezentuje katalog
Jeśli składowa to .., a katalog bieżący jest systemowym katalogiem głównym, to przechodzi do kolejnej składowej
Jeśli składowa to .. ,a katalog bieżący jest katalogiem głównym zamontowanego systemu plików, to odnajduje punkt zamontowania
Wywołuje zależną od systemu plików operację VOP_LOOKUP na węźle
Jeśli składowej nazwy nie ma, i była to ostatnia składowa, to kończy się powodzeniem i przekazuje wskaźnik do katalogu macierzystego, wpp błąd
○ sytuacja 5 jest sensowna, bo gdy creat wywoła lookup, to jasne jest, że pliku nie ma
6) Jeśli nowa składowa jest punktem zamontowania, to wywołuje operację vfs root zamontowanego systemu plików
7) Jeśli nowa składowa jest dowiązaniem symbolicznym, to wywołuje operację yOP_SYM LI N K tłumacząc dowiązanie symboliczne i dołącza
pozostałą część nazwy do zawartości dowiązania
8) Wykonuje kolejną iterację pętli
1)
2)
3)
4)
5)
-
-
Działanie VOP_LOOKUP
Wyszukuje nazwę w katalogu
Jeśli jest to lokalny system plików, to wyszukiwanie odbywa się blok po bloku
W przypadku zdalnych systemów plików jest generowane odpowiednie żądanie do serwera
Sposób przechowywania informacji o znalezionych katalogach jest zależny od konkretnego systemu plików (tablica haszująca, pamięć podręczna iwęzłów itp.)
Implementacja otwarcia pliku
Przydziel deskryptor pliku
Przydziel obiekt reprezentujący plik otwarty
Dokonaj analizy nazwy ścieżkowej i uzyskaj v-węzeł pliku oraz v-węzeł katalogu macierzystego pliku
Sprawdź uprawnienia do pliku (VOPACCESS)
Sprawdź poprawność (otwieranie katalogu do zapisu itp.)
Jeśli plik nie istnieje i nakazano jego utworzenie, wywołaj operację VOP CREATE v-węzła katalogu macierzystego pliku
Wywołaj operację VOP OPEN v-węzła reprezentującego plik
Zainicjuj obiekt reprezentujący plik otwarty
Systemy lokalnych systemów plików
- Tradycyjne systemy plików:
○ s5fs — pierwotny uniksowy system plików
○ ffs - Berkeley Fast File System
○ ext2fs — second extended file system
○ fat — pierwotny system plików systemów DOS i Windows
○ vfat — rozszerzenie fat o długie nazwy
○ ntfs — standardowy system plików Windows NT, XP,
○ hpfs — standardowy system plików systemu OS/2
- Systemy plików specjalnego przeznaczenia:
- ISO 9660 — system plików dla CD-ROM
- Rock Ridge, UDF — rozszerzenia ISO 9660
- …
- Sieciowe systemy plików:
- Network File System - bazujący na TCP-IP lub UDP
- Andrew File System
Systemy Operacyjne Strona 46
- Andrew File System
- Distributed File System
- …
- Systemy plików z kroniką:
- Raiser File System
- ext3 i ext4
- Resier 4
- Journaled File System
- …
- Systemy plików specjalnego przeznaczenia
- system plików /proc
- specfs
- tfs
- system plików /processor
- union
Systemy plików - ćwiczenia
- superblok - jeden węzeł główny
- d-etntry - wpis w katalogu:
- nazwa pliku
- wskaźnik do i-node'a
- zdarza się copy on write
- w ext2 liczba rozmiar pliku który można zapisać w polu wielkość i-węzła jest mniejszy od faktycznego maksymalnego rozmiaru pliku
Systemy Operacyjne Strona 47