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