Systemy operacyjne
Studia podyplomowe 2015-2016
Wydział Informatyki PB
dr inż. Marcin Czajkowskimateriały przygotowane przez dr inż. Wojciecha Kwedlo
Literatura - ogólne pozycje na temat systemów operacyjnych
● A. Silberschatz, P. B. Galvin, Podstawy systemów operacyjnych, wydanie 7, WNT, Warszawa, 2003.
● A.S. Tanenbaum, Systemy Operacyjne, Wydanie III, Wydawnictwo Helion, 2010. ~100 zł.
● W. Stallings, Systemy operacyjne. Struktura i zasady budowy. PWN, 2006. ~40 zł
● Gorąco polecam powyższe pozycje.
Literatura - pozycje na temat programowania współbieżnego
● Z. Weiss, T. Gruźlewski, Programowanie współbieżne i rozproszone w przykładach i zadaniach, WNT, Warszawa, 1993.
● M. Ben-Ari, Podstawy programowania współbieżnego i rozproszonego, WNT, Warszawa, 1996.
● Programowanie w Linuxie przy pomocy biblioteki wątków POSIX threads jest omówione w:
– M. Mitchell, J. Oldham, A. Samuel, Linux - programowanie dla zaawansowanych, Wydawnictwo RM, 2002
– J. Shapley Gray, Arkana: Komunikacja między procesami w Unixie, rozdz. 11.
Literatura - opisy jąder różnych wersji Unixa
● Bach M., Budowa systemu operacyjnego UNIX, WNT Warszawa, 1995, Opis jądra Systemu V Release 4.
● U. Vahalia, Jądro systemu Unix - nowe horyzonty, WNT Warszawa,2001, Opis historii Unixa i różnych cech jądra systemów Unixowych (System V, BSD, Solaris, Mach) - gorąco polecam.
● M. Beck, H. Bohm, M. Dziadzka, U. Kunitz, R. Magnus, D. Verworner, Linux Kernel - Jądro systemu, wydanie II, Wydawnictwo MIKOM, Warszawa, 2000, jądro Linuxa 2.0.x
● D. P. Bovet, M. Cesati, Linux kernel, Wydawnictwo RM, Warszawa, 2001, jądro Linuxa 2.2.x
Literatura - API wywołań systemowych Linuksa
● M. Mitchell, J. Oldham, A. Samuel, Linux - programowanie dla zaawansowanych, Wydawnictwo RM, 2002
● Kurt Wall, Linux : programowanie w przykładach, Mikom, 2000.
● Michael K. Johnson, Erik W. Troan, Oprogramowanie użytkowe w systemie LINUX, WNT, 2000.
Tematyka wykładów
● poznanie podstawowych pojęć związanych z systemami operacyjnymi;
● mechanizmy zarządzania procesami: algorytmy szeregowania procesów, metody komunikacji i synchronizacji procesów oraz wątków;
● rodzaje pamięci: operacyjna, zewnętrzna, wirtualna;
● systemy plików;
● planowanie przydziału procesora, wieloprogramowość, wielozadaniowość.
Czym jest system operacyjny
● Program kontrolujący wykonywanie aplikacji (programów użytkownika).
– Umożliwia wykonywanie programów użytkownika. (być może wielu równocześnie). Jednocześnie kontroluje pracę tych programów, uniemożliwiając nieprawidłowe wykorzystanie komputera.
– Dostarcza usługi umożliwiające dostęp do wejścia-wyjścia (pliki, ekran, klawiatura, sieć)
– Zarządza zasobami maszyny (procesor, pamięć operacyjna, pamięć dyskowa).
– Tworzy abstrakcje ułatwiające korzystanie z komputera, takie jak: plik, pamięć wirtualna, proces
● Cele stojące przed projektantem systemu
– Przenośność: programy użytkowe działające na różnym sprzęcie.
– Wydajność: efektywne wykorzystanie sprzętu (procesora,pamięci,we-wy).
– Zapewnienie ochrony systemu oraz procesów (przed innymi procesami, niepowołanym dostępem, wirusami, ....)
– Wygoda użytkownika.
– Możliwość ewolucji systemu (poprawki etc.)
● Definicja: nie ma powszechnej definicji (“Wszystko, to co dostarcza producent, gdy kupuje się system operacyjny”)
Jądro systemu operacyjnego (ang. kernel)
● Określenie co jest częścią systemu operacyjnego, a co nie, nie jest proste.
– czy kompilator C jest częścią systemu ? edytor tekstu (np. notepad) ? Interpreter poleceń (ang. shell) w Unixie ?
● Dla potrzeb tego wykładu przez “system operacyjny” będziemy rozumieli jądro systemu, które możemy (z grubsza) scharakteryzować jako:
– Część systemu przebywająca na stałe w pamięci.
– Wykonuje się w trybie uprzywilejowanym.
– Zarządza zasobami maszyny
– Udostępnia interfejs programom użytkownika w postaci wywołań systemowych.
● Unix, Linux – jądro monolityczne: jeden olbrzymi program
– Możliwość dynamicznego ładowania i usuwania fragmentów jądra, zwanych modułami
– Interpreter poleceń i inne narzędzia są zwykłymi programami użytkownika.
● Powyższy podział jest charakterystyczny dla systemów Unixowych, w świecie Microsoftu są odstępstwa (np. wiele funkcji z API Win32 wykonuje się na poziomie procesu użytkownika)
Perspektywa historyczna
● Na ewolucję oraz rozwój systemów operacyjnych olbrzymi wpływ miał czynnik ekonomiczny – relatywny (względny) koszt sprzętu oraz pracy ludzkiej.
● Początkowo koszt komputera był fantastycznie wysoki w porównaniu z kosztem pracy ludzi z niego korzystających.
– Główny cel stojący przed systemem, to maksymalizacja wykorzystania sprzętu (procesora, pamięci masowych drukarek).
– Rozwiązania typu: przetwarzanie wsadowe, wieloprogramowość, spooling
● Obecnie koszt komputera jest bardzo niski w porównaniu z kosztem pracy ludzi z niego korzystających.
– Cel stojący przed systemem to stworzenie środowiska zapewniającego jak największą wygodę i produktywność użytkowników. Może to oznaczać rezygnację z kryterium maksymalnego wykorzystania sprzętu na rzecz kryterium minimalnego czasu odpowiedzi.
– Praca interakcyjna (początkowo wielu użytkowników na jednej maszynie poprzez podział czasu procesora), praca interakcyjna z wieloma programami, graficzne interfejsy użytkownika + wielowątkowość
Generacje komputerów i systemów operacyjnych
● (1945-55) - Lampy próżniowe i brak systemu operacyjnego.
● (1955-65) – Tranzystory i proste systemy wsadowe
● (1965-80) – Układy scalone i wieloprogramowe systemy wsadowe (oraz systemy z podziałem czasu)
● 1980 – obecnie komputery PC.
Brak systemu operacyjnego
● Lata 40 – połowa lat 50, komputery zbudowane z lamp próżniowych
● Programista rezerwuje w specjalnym zeszycie czas komputera
● W zarezerwowanym czasie ma pełną kontrolę nad maszyną poprzez konsolę
– Wczytuje program z czytnika kart perforowanych lub taśmy magnetycznej
– Kompiluje program (w tym celu wczytuje kompilator np. Fortranu)
– Uruchamia program..
– Drukarka drukuje wyniki.
● Problemy:
– Duża część czasu spędzana na przygotowaniu programu do uruchomienia
– Nieefektywne wykorzystanie czasu pracy systemu.
● Zaleta: w przypisanym czasie mam pełną kontrolę nad komputerem
Proste systemy wsadowe
● Programista zostawia zadanie (ang. job) w postaci pliku kart perforowanych (program źródłowy, dane) operatorowi.
● Czynności o podobnym charakterze (np. Kompilacja) grupowane są razem
● Zadania łączone we wsad (ang. Batch) i wykonywane.
● Programista po jakimś czasie (kilka godzin) otrzymuje wyniki.
● Program monitora (protoplasta systemu operacyjnego)
– Wczytuje program użytkownika do pamięci
– Przekazuje mu sterowanie
– Po zakończeniu pracy program użytkownika powraca do monitora
– Może zawierać procedury obsługi wejścia wyjścia
● Zaleta: lepsze wykorzystanie (bardzo drogiego) sprzętu.
● Wada: programista czy też użytkownik nie ma kontroli nad wykonywaniem zadania (ale jego zdanie się nie liczy – względy ekonomiczne).
Prosty system wsadowy - jednoprogramowość
● Musimy przeznaczyć część pamięci na monitor
● Jeden program w pamięci.
● Pożądane wprowadzenie sprzętowej ochrony monitora przed programami użytkownika.
● W niektórych zastosowaniach biznesowych (banki ubezpieczenia) wejście-wyjście może zajmować dużą część czasu wykonania zadania.
● W takim przypadku procesor nie jest efektywnie wykorzystany.
● Potrzebne są mechanizmy pozwalające na jednoczesne wykorzystanie procesora i we-wy.
Spooling
● Simulateneous Peripheral Operation On-Line
● Wykorzystuje szybką pamięć dyskową.
● Dane i program z czytnika kart są przesyłane na dysk
● Program wczytany z dysku, wykonywany, wyniki są zapisywane na dysk
● Wyniki z dysku przesyłane są na drukarkę
● Wykonując zadanie i jednocześnie:
– Wczytuj kod następnych zadań z czytnika kart na dysk
– Drukuj wyniki już zakończonych zadań.
● Pula gotowych zadań na dysku – algorytmy szeregowania (ang. scheduling)
Wada jednoprogramowości
● Podczas wykonywania we-wy procesor jest bezczynny
● Rozwiązanie: wieloprogramowość (ang. Multiprogramming)
– W pamięci przechowywanych jest kilka programów
Wieloprogramowość
● Kiedy zadanie zgłasza zapotrzebowanie na usługę systemu wymagającą oczekiwania, wykonywany jest inne zadanie
● Potrzebny jest specjalny hardware (przerwania, DMA, ochrona pamięci)
Wieloprogramowy system wsadowy
● Zapewnianie usług we-wy.
● Przydzielanie urządzeń we-wy zadaniom.
● Zadania wstępnie na dysku - zarządzanie pamięcią dyskową.
● Wybór zadania wczytywanego do pamięci (szeregowanie zadań)
● Przydzielenie procesora jednemu z zadań rezydującemu w pamięci
● Zarządzanie dostępną pamięcią
Współdzielenie procesora (ang. time sharing)
● W systemach wsadowych celem jest maksymalizacja przepustowości. Programista (użytkownik) nie ma kontroli nad wykonywaniem zadań.
– Problem w przypadku np. błędu kompilacji.
– Niektóre typy zadań wymagają pracy interakcyjnej (np. rezerwacja biletów)
– A w między czasie relatywne koszty pracy ludzkiej względem kosztów sprzętu wzrosły, ale nie na tyle aby każdemu przydzielić dedykowany komputer.
● Podział czasu procesora
– Wiele użytkowników korzystających z terminali (praca interakcyjna)
– System otrzymuje polecenia kontrolne z terminala.
– Procesor wykonuje na przemian programy poszczególnych użytkowników (redukcja mocy obliczeniowej dostępnej pojedynczemu użytkownikowi)
● Załadowany do pamięci i wykonywany w niej program nazywany jest procesem.
● Nowe funkcje systemu operacyjnego: wymiana (ang. swapping), pamięć wirtualna.
● W systemach z podziałem czasu celem jest minimalizacja czasu odpowiedzi.
Systemy operacyjne dla komputerów osobistych
● Komputer dedykowany jednemu użytkownikowi.
● Mała cena sprzętu sprawia, że maksymalizacja wykorzystania procesora przestaje być głównym celem.
● Priorytetem jest wygoda użytkownika i minimalizacja czasu odpowiedzi.
● Systemy graficznego interfejsu użytkownika.
● Z przyczyn ekonomicznych pierwsze wersje sprzętu były prymitywnie proste. Nastąpiło stopniowe zaadoptowanie technologii rozwiniętych dla większych maszyn.
– MS-DOS (brak podziału czasu, brak ochrony systemu)
– Windows 3.1 (współdzielenie procesora wymagające współpracy procesów, pamięć wirtualna, brak ochrony)
– Windows NT (współdzielenie procesora, pamięć wirtualna, pełna ochrona, mechanizmy bezpieczeństwa)
Systemy równoległe
● Architektura postaci Symmetric Multiprocessing (SMP).
● System ze współdzieloną pamięcią (ang. shared memory, tightly coupled system).
● Każdy procesor wykonuje identyczną kopię systemu operacyjnego
● Pozwala na wykonywanie wielu procesów jednocześnie
● Wspierana przez większość nowoczesnych systemów operacyjnych (Linux, Win NT i pochodne)
● Upowszechnione dzięki procesorom wielordzeniowym (ang. multicore)
Systemy czasu rzeczywistego (ang. real-time)
● Reakcja na zdarzenie musi się zakończyć przed upływem określonego czasu. (ang. hard real-time).
– Innymi słowy: Poprawność systemu nie zależy tylko od poprawności uzyskanej odpowiedzi, ale także od czasu oczekiwania na tę odpowiedzi.
● Przykłady: odtwarzacz DVD, symulator samolotu, sterownik wtrysku paliwa, system naprowadzania rakiety.
● Z reguły system w ROM-ie, brak pamięci dyskowej.
● Konflikt z zasadą podziału czasu.
● Warunek hard real-time nie jest spełniony przez większość współczesnych systemów ogólnego przeznaczenia.
● Systemy klasy soft real-time: zadanie do obsługi w czasie rzeczywistym otrzymuje pierwszeństwo nad pozostałymi zadaniami.
● Nie gwarantują nieprzekraczalnego czasu reakcji.
● Większość systemów Unixowych i Win NT spełnia te wymagania.
Systemy rozproszone (ang. distributed)
● Luźno związany (ang. loosely coupled) system komputerowy. Każdy procesor dysponuje własną pamięcią, niedostępną innym procesorom. Koordynacja i synchronizacja poprzez wymianę komunikatów
● Zalety
– Współdzielenie zasobów (ang. resource sharing)
– Przyspieszenie obliczeń.
– Większa wiarygodność systemu.
– Udostępnienie możliwości komunikacji.
Systemy rozproszone
● Sieciowe systemy operacyjne
– Umożliwia współdzielenie plików, drukarek
– Dostarcza mechanizm komunikacji
– System na jednej maszynie wykonuje się niezależnie od pozostałych maszyn w sieci
● Rozproszone systemy operacyjne
– Mniejsza autonomia poszczególnych maszyn
– Sprawia wrażenie, że pojedynczy system operacyjny kontroluje pracę sieci (jednej wielkiej maszyny)
– Obecnie przedmiot badań naukowych (Amoeba, Mach, Locus, systemy typu Grid ...)
Systemy typu hand-held
● Tablety
● Telefony komórkowe
● Cechy charakterystyczne
– Ograniczona pamięć
– Wolne procesory (nacisk na niski pobór mocy)
– Małe rozmiary wyświetlaczy
● Główna różnica pomiędzy systemami hand-held a PDA: brak wielogigabajtowych dysków twardych (pamięć wirtualna) (ale są systemy plików na pamięciach Flash)
● Przykłady: iOS, Android.
Wbudowane systemy operacyjne
● Systemy dla urządzeń nie uznawanych za komputery i nie posiadających możliwości instalowania aplikacji przez użytkowników.
● Kuchenki mikrofalowe, odtwarzacze MP3, samochody, odbiorniki telewizyjne
● Mamy gwarancje że nigdy nie będzie działało niezaufane oprogramowanie
● Przykłady: QNX, VxWorks
Uproszczony schemat architektury komputera
● Procesor, pamięć i urządzenia we-wy podłączone są do wspólnej magistrali.
● W rzeczywistych systemach mamy do czynienia z kilkoma fizycznymi magistralami (PCI, ISA, USB, ...)
Praca systemu komputerowego
● Procesor i urządzenia wejścia-wyjścia mogą pracować współbieżnie
● Każdy kontroler we-wy obsługuje jeden typ urządzeń
● Każdy kontroler-posiada lokalny bufor
● Procesor przesyła dane do/z pamięci oraz do/z lokalnych buforów
● Wejście-wyjście przeprowadzane jest pomiędzy lokalnym buforem kontrolera a urządzeniem.
● Kontroler informuje o zakończeniu operacji zgłaszając przerwanie.
● SYSTEM OPERACYJNY OPIERA SIĘ NA PRZERWANIACH !!!
Przerwania
● Przerwania programowe (ang. trap)
– Wywołanie systemu operacyjnego (np. specjalny rozkaz syscall w procesorach MIPS)
– Rozkaz pułapki (brk w x86)
● Sprzętowe zewnętrzne (asynchroniczne względem programu)
– Kontroler we-wy informuje procesor o zajściu zdarzenia, na przykład
● Zakończenie transmisji danych.
● Nadejście pakietu z sieci.
● Przerwanie zegara.
● Błąd parzystości pamięci.
● Sprzętowe wewnętrzne, głównie niepowodzenia (ang. fault)
– Dzielenie przez zero
– Przepełnienie stosu
– Brak strony w pamięci (w przypadku implementacji stronicowania)
– Naruszenie mechanizmów ochrony.
Obsługa przerwania
● Wykonywana przez system operacyjny
– Zapamiętanie stanu procesora (rejestrów i licznika rozkazów)
– Określenie rodzaju przerwania
● przepytywanie (ang. Polling)
● wektor przerwań (tablica adresów indeksowana numerem przerwania)
– Przejście do właściwej procedury obsługi
– Odtworzenie stanu procesora i powrót z przerwania
● Uwaga: Odtworzenie stanu procesora może dotyczyć innego procesu niż zapamiętanie. (przełączenie kontekstu – ang. context switch). Przykład:
– Wykonuje się proces A
– Przerwanie zegara=>zapamiętanie stanu procesu A
– System operacyjny stwierdza że A zużył cały przydzielony kwant czasu procesora. System postanawia przekazać sterowanie procesowi B.
– Odtworzenie stanu procesu B(przełączenie kontekstu) => powrót z przerwania
– Wykonuje się proces B
Krótko o procesach
● Najprościej możemy określić proces jako “Wykonujący się program”
● Ta definicja ma pewne niuanse. Rozpatrzmy przypadek procesu powstałego w wyniku uruchomienia programu użytkownika.
– Proces może wywoływać kod tego programu.
– Mówimy, że proces “proces wykonuje się w trybie użytkownika”.
– Może także wywoływać funkcję bibliotek współdzielonych (.so w Linuksie, biblioteki dynamiczne .dll w Windows), które formalnie nie są częścią programu.
● Po pewnym czasie proces (tzn. kod programu lub biblioteki) decyduje się wykonać funkcję systemową, np. otworzyć plik
● Mówimy wtedy, że “proces wykonuje się w trybie jądra”.
– W tej sytuacji proces wykonuje kod systemu operacyjnego, a nie kod programu z którego został wczytany.
– Widzimy, że nie ma relacji 1<=>1 pomiędzy procesami i programami, ponieważ proces wykonuje kod dwóch programów: swojego i jądra systemu
Różnice w prędkości transmisji urządzeń zewnętrznych
4 MB/secDigital camcorder
500 MB/secPCI bus
60 MB/secXGA monitor
50 MB/secFireWire (IEEE 1394)
20 MB/secHard drive
12.5 MB/secFast Ethernet
1.5 MB/secUSB
200 KB/secPrinter / scanner
7 KB/sec56K modem
100 bytes/secMouse
10 bytes/secKeyboard
Prędkość transmisjiUrządzenie
Hierarchia pamięci
● Przemieszczając się w dół hierarchii
– Zwiększamy czas dostępu
– Zmniejszamy koszt jednego bajtu
Wykorzystanie pamięci podręcznych (ang. caching)
● Wykorzystanie szybkiej pamięci do przechowywania najczęściej używanych danych.
– Pamięć podręczna procesora.
– Pamięc podręczna dysku.
● Wymaga wprowadzenie polityki zarządzania pamięcią podręczną.
● Problem spójności pamięci podręcznej: (ang. cache coherency) Informacja przechowywana w pamięci podręcznej niezgodna z informacją przechowywaną w pamięci głównej
– Przykład 1. System dwuprocesorowy. Każdy procesor ma własną pamięć podręczną. Zawartość jednej komórki pamięci przechowywana w obydwu pamięciach podręcznych. Procesor A zapisuje tę komórkę, Procesor B próbuje odczytu .......
– Przykład 2. Pamięć podręczna dysku. Zmodyfikowana zawartość pewnych sektorów dysku jest przechowywana przez pewien czas w pamięci operacyjnej zanim zostanie zapisana fizycznie na dysk. Jeżeli w tym czasie nastąpi załamanie systemu ............
Mechanizmy ochrony (ang. protection)
● Potrzeba zapewnienia, że “źle sprawujący się program” nie zakłóci pracy innych programów i samego systemu operacyjnego. Program użytkownika nie może być w stanie wykonać pewnych operacji.
● Przykłady “złego zachowania się programu”
– Bezpośrednia komunikacja z urządzeniami wejścia-wyjścia => ochrona we-wy
– Dostęp do pamięci należącej do innych procesów lub do systemu => ochrona pamięci
– Zablokowanie przerwań, zmiana wektora przerwań => ochrona systemu przerwań
– Nieskończona pętla => ochrona procesora
● Program użytkownika nie ma prawa wykonać żadnej z powyższych operacji !!!
Podwójny tryb pracy
● Procesor może wykonywać instrukcje w jednym z dwóch trybów
– Tryb jądra (instrukcje wykonywane przez system operacyjny)
– Tryb użytkownika (instrukcje wykonywane przez program użytkownika)
tryb jądra
Tryb użyt.
Przerwanie (programowe lub sprzętowe)
Ustaw tryb użytkownika
System operacyjny
Programużytkownika
● Instrukcje uprzywilejowane – mogą być wywoływane wyłącznie w trybie jądra
– Próba ich wykonania w trybie użytkownika powoduje przerwanie i przejście do systemu operacyjnego
Mechanizmy ochrony
● Instrukcje uprzywilejowane
– Instrukcje do komunikacji z urządzeniami we-wy
– Blokowanie/odblokowanie przerwań
– Zmiana wektora przerwań
● Aby zapewnić, że program użytkownika nigdy nie wykona się w trybie jądra
● Przerwanie zegara:
– gwarantuje ochronę procesora przed programem użytkownika z nieskończoną pętlą
Pojęcie procesu
● Program = plik wykonywalny na dysku
● Proces = uruchomiony i wykonywany program w pamięci
● Program jest pojęciem statycznym.
● Proces ma naturę dynamiczną (zmieniającą się). Zmianie ulegają m.in.
– Licznik rozkazów (adres ostatnio wykonywanej instrukcji)
– Rejestry procesora
– Wskaźnik stosu
● Proces ma przestrzeń adresową
– Kod
– Dane zainicjalizowane
– Dane niezainicjalizowane
– Stos
Uruchomprogram
Model procesów
● Z punktu widzenie procesora na komputerze jest wykonywany jeden program
● Z punktu widzenia systemu jednocześnie jest wykonywanych wiele programów.
A
C
D
Pojedynczy licznik rozkazów(punkt widzenia procesora)
AB
C DB
B
ABCD
Czas
Wiele liczników rozkazów(punkt widzenia systemu oper.)
Stany procesu
● Nowy – proces został utworzony.
● Gotowy – proces czeka na przydział procesora.
– Proces mógłby się wykonywać, ale nie wykonuje się, ponieważ w tej chwili wykonuje się jakiś inny proces.
● Aktywny – wykonywane są instrukcje procesu.
– W systemie z jednym procesorem w danej chwili jeden proces może być aktywny
● Oczekujący (uśpiony) – proces czeka na zdarzenie (np. Zakończenie operacji we-wy).
– Na poprzednim wykładzie proces, który zainicjalizował transmisję DMA lub wysłała znak do drukarki, był usypiany w oczekiwaniu na przerwanie.
– Proces w stanie uśpionym nie otrzyma procesora.
● Zakończony – proces zakończył działanie
Oczekujący
Nowy
Zakończony
Gotowy
Aktywny
1
5
4
3
2
77 6
Przejścia pomiędzy stanami procesu
● 1 (Nowy => Gotowy). Nowo utworzony proces przechodzi do kolejki procesów gotowych.
– Planista długoterminowy (ang. long-term scheduler) w systemach wsadowych.
● 2 (Gotowy => Aktywny) Proces otrzymuje przydział procesora.
● 3 (Aktywny => Gotowy) Procesowi został odebrany procesor (i przekazany innemu procesowi).
– Przejściami 2 oraz 3 zarządza planista krótkoterminowy (ang. short-term).
● 4 (Aktywny => Oczekujący) Proces przechodzi w stan oczekiwania na zajście zdarzenia. (np. na zakończenie transmisji wejścia -wyjścia – patrz poprzedni wykład)
● 5 (Oczekujący => Gotowy) Zdarzenie na które czekał proces nastąpiło (przerwanie we/wy na poprzednim wykładzie).
– Przejścia 4 oraz 5 są wykonywane przy przeprowadzeniu synchronicznej operacji wejścia wyjścia (ale nie tylko).
● 6 (Aktywny => Zakończony). Proces zakończył pracę (np. funkcja exit w Uniksach, błąd ochrony)
● 7 (Gotowy =>Zakończony oraz Oczekujący => Zakończony). Proces został zakończony przez inny proces (np. funkcja kill w systemie Unix).
Dodatkowy stan – zawieszony (ang. suspended)
● Proces oczekuje bardzo długo na operacje we-wy (np. polecenie login)
– Przejście do stanu zawieszonego
– Pamięć zajmowana przez proces podlega wymianie (ang. swapping) tzn. zapisaniu na dysk do obszaru wymiany (swap area).
– Zwolniona pamięć może być wykorzystana przez inne procesy.
– Po zajściu zdarzenia proces ponownie wczytywany z obszaru wymiany
● Inne przyczyny zawieszenie procesu.
– Żądanie użytkownika
– Brak pamięci w systemie
– Proces co jakiś czas cyklicznie wykonuje jakąś czynność np. Sprawozdawczość
● Przejściami do i z stanu zawieszenie zarządza planista średnioterminowy (ang. medium-term scheduler)
Diagram przejść z uwzględnieniem stanu zawieszenia.
● Planista długoterminowy
● Planista krótkoterminowy – najważniejszy i występujący w każdym systemie.
– Rozstrzyga problem: “Któremu procesowi w stanie gotowym mam przydzielić procesor”
● Planista średnioterminowy
Blok kontrolny procesuang. Process Control Block - PCB
● PCB służy do przechowywania informacji o procesie istotnych z punktu widzenia systemu operacyjnego
– Stan procesu
– Identyfikator procesu
– Licznik rozkazów
– Rejestry procesora
– Informacja o przydzielonej pamięci
– Informacja o otwartych plikach
– Informacja o połączeniach sieciowych
– Informacja niezbędna do tworzenia systemowych struktur danych. System operacyjny posługuje się różnymi kolejkami procesów. Jeżeli kolejki są implementowane jako listy z dowiązaniami, PCB może zawierać dowiązanie (wskaźnik) do następnego elementu w kolejce
Przełączenie kontekstu (ang. context switch), a przełączenie trybu (ang. mode switch)
● W większości systemów (Uniksy,Windows) przyjęto model, w którym funkcje systemu wykonują się w kontekście procesu użytkownika. W uproszczeniu model ten zakłada że system operacyjny jest kolekcją procedur wywoływanych przez procesy w celu wykonania pewnych usług.
● Stąd mówiłem o procesie wykonującym się w trybie jądra (jeżeli wykonywany jest kod jądra).
● Przejście od programu użytkownika do programu jądra w wyniku wywołania funkcji systemowej (przerwanie programowe) lub przerwania sprzętowego wiąże się z przełączeniem trybu.
● Zmiana trybu jest znacznie mniej kosztowna niż zmiana kontekstu.
Przełączenie kontekstu
P1
Jądr
o
P2
Jądr
o
P3
Jądr
o
P4
Jądr
o
● Przełączenie kontekstu to zmiana procesu.
● Przełączenie trybu zmiana trybu pracy procesora (jądra <=> użytkownika)
Utworzenie procesu● Proces rodzicielski tworzy proces potomny, który z kolei może stworzyć
kolejne procesy. Powstaje drzewo procesów.
● Współdzielenie zasobów. Procesy rodzicielski i potomny mogą
– Współdzielić część zasobów
– Współdzielić wszystkie zasoby
– Nie współdzielić żadnych zasobów
● Wykonywanie
– Procesy rodzicielski i potomny wykonują się współbieżnie
– Proces rodzicielski oczekuje na zakończenie procesu potomnego.
● Przestrzeń adresowa
– Odrębna przestrzeń adresowa dla procesu potomnego
● (fork w systemie Unix – proces potomny wykonuje się w nowej przestrzeni adresowej będącej kopią przestrzeni procesu rodzicielskiego)
● Proces ma nowy program załadowany do nowej przestrzeni adresowej (CreateProcess w Win32)
– Proces potomny i rodzicielski wykonują się w tej samej przestrzeni adresowej (clone w Linuksie; wątki Java i POSIX)
Wywołania systemowe fork, exec, wait w Unix-ie
● fork tworzy nowy proces
– Wywoływana z procesu rodzicielskiego
– Powracają z niej proces potomny i rodzicielski
● exec – zastępuje obraz bieżącego procesu nowym programem.
– proces wołający nigdy nie wraca z exec (chyba że powstanie błąd)
● wait – blokuje proces do momentu zakończenia procesu potomnego
#include <stdio.h>#include <unistd.h>int main(int argc, char *argv[]){ int pid;
pid = fork();if (pid < 0) { /* Błąd !!! */
fprintf(stderr, "Fork Failed");exit(-1);
}else if (pid == 0) { /* proces potomny */
execlp("/bin/ls","ls",NULL);}else { /* proces rodzicielski */
wait(NULL);printf("Child Complete");exit(0);
}}
Zakończenie procesu
● Zakończenie na własne żądanie. Proces sam podejmuje decyzję o zakończeniu pracy – wywołując odpowiednie wywołanie systemowe. (system Unix: exit ).
– W programie w języku C jest to robione automatycznie po zakończeniu funkcji main
● Proces został zakończony w wyniku akcji innego procesu
– Unix: proces otrzymał sygnał SIGKILL.
– Polecenie kill w shellu, funkcje systemowe raise oraz kill.
● Proces został zakończony przez system operacyjny
– Naruszenie mechanizmów ochrony.
– Przekroczenie ograniczeń na przyznany czas procesora.
– Proces rodzicielski się zakończył (w niektórych systemach)
● Cascading termination
Wielowątkowość
● Jeden proces wykonuje się w wielu współbieżnych wątkach (ang. thread).
● Każdy wątek (inna nazwa: proces lekki, ang. lightweight)
– Ma swój własny stan (Aktywny, Gotowy, Zablokowany, ... )
– Ma swoje wartości rejestrów i licznika rozkazów.
– Ma swój własny stos (zmienne lokalne funkcji !!!).
– Ma dostęp do przestrzeni adresowej, plików i innych zasobów procesu
● WSZYSTKIE WĄTKI TO WSPÓŁDZIELĄ !!!
● Operacje zakończenia, zawieszenia procesu dotyczą wszystkich wątków.
Procesy są od siebie izolowane, wątki nie !
Procesy i wątki
ProcesPrzestrzeń adresowaOtwarte plikiProcesy potomneObsługa sygnałówSprawozdawczośćZmienne globalne
Wątek 1Licznik rozkazówRejestryStos i wskaźnik stosuStan
Wątek 2Licznik rozkazówRejestryStos i wskaźnik stosuStan
Wątek 3Licznik rozkazówRejestryStos i wskaźnik stosuStan
Cechy wątków
● Zalety
– Utworzenie i zakończenie wątku zajmuje znacznie mniej czasu niż w przypadku procesu
– Możliwość szybkiego przełączania kontekstu pomiędzy wątkami tego samego procesu
– Możliwość komunikacji wątków bez pośrednictwa systemu operacyjnego
– Możliwość wykorzystania maszyn wieloprocesorowych SMP
● Wady
– “Źle zachowujący się wątek” może zakłócić pracę innych wątków tego samego procesu.
● W przypadku dwóch procesów o odrębnych przestrzeniach adresowych nie jest to możliwe
Wątki na poziomie użytkownikaang. user-level threads
● System operacyjny nie jest świadom istnienia wątków.
● Zarządzanie wątkami jest przeprowadzane przez bibliotekę w przestrzeni użytkownika.
– Wątek A wywołuje funkcję read
– Standardowo funkcja systemowa read jest synchroniczna (usypia do momentu zakończenia operacji)
– Jednak “sprytna” implementacja w bibliotece wywołuje wersję asynchroniczną i przełącza się do wątku B.
● Rozwiązanie to jest szybkie, ma jednak wady:
– Dwa wątki nie mogą się wykonywać współbieżnie na dwóch różnych procesorach.
– Nie można odebrać procesora jednemu wątkowi i przekazać drugiemu
Wątki na poziomie jądraang. kernel-level threads
● Wątek jest jednostką systemu operacyjnego.
● Wątki podlegają szeregowaniu przez jądro.
● W systemie SMP wątki mogą się wykonywać na różnych procesorach.
– Przetwarzanie równoległe.
● Windows i Linux wykorzystują tę metodę.
Przykład użycia wątków: Program do przetwarzania obrazów
● Użytkownik wydał polecenie “Save”
– Jego wykonanie może potrwać kilkadziesiąt sekund.
– Kto w tym czasie będzie obsługiwał mysz i klawiature ?
● Wątek główny odpowiadający za interakcję z użytkownikiem.
– Po wydaniu polecenia “Save” tworzy wątek roboczy zapisujący obraz do pliku.
– Następnie powraca do konwersacji z użytkownikiem
– Dzięki temu aplikacja nie jest zablokowana (klepsydra w Win) na czas zapisywania
● Wątek roboczy wykonuje zapis i kończy pracę.
● Uwaga na synchronizację wątków !!!
– Co się stanie gdy po wydaniu polecenia “Save” natychmiast wydamy polecenie “Usuń obraz”?
– Sytuacja wyścigu (ang. race).
Problemy z wątkami
● W standardowej bibliotece C, w wersji wielowątkowej, errno jest implementowane jako prywatna zmienna globalna (nie współdzielona z innymi wątkami)
● Kilka wątków jednocześnie wywołuje funkcje malloc/free - może dojść do uszkodzenia globalnych struktur danych (listy wolnych bloków pamięci)
– Potrzeba synchronizacji => może prowadzić do spadku wydajności
Problemy z wątkami
● Proces otrzymuje sygnał:
– Wszystkie wątki otrzymują sygnał
– Wybrany wątek otrzymuje sygnał
– Wątek aktualnie aktywny otrzymuje sygnał
● Proces wykonuje fork.
– Czy duplikować jedynie działający wątek, czy też wszystkie wątki ?
● Proces wywołuje exit.
– Zakończyć proces czy też jedynie aktywny wątek ?
● Anulowanie wątku (ang cancellation).
– Wykonać natychmiast .
– Wątek co jakiś czas sprawdza czy nie został anulowany.
● Standard POSIX zawiera odpowiedzi na powyższe problemy.
POSIX threads – utworzenie i dołączenie wątku● Funkcja pthread_create tworzy nowy
wątek. Rozpoczyna on pracę od funkcji, której adres przekazano jako trzeci argument.
● Funkcja pthread_join usypia wywołujący ją wątek do momentu, kiedy wątek o identyfikatorze przekazanym jako pierwszy argument zakończy pracę.
● Zakończenie pracy wątku – powrót z funkcji która go rozpoczyna.
void *thread(void *param) {// tu kod wątku
// możemy przekazać wynik return NULL }
int main() { pthread_t id; // Parametr przekazywany wątkowi void *param=NULL;
pthread_create(&id,NULL,&thread,param);// Funkcja thread w odrębnym wątku// współbieżnie z main// id przechowuje identyfikator wątku
void *result;// Czekaj na zakończenie wątkupthread_join(id,&result);// Wynik w result,zamiast &result można// przekazać NULL
}
Top Related