Studia podyplomowe 2015-2016 Wydział Informatyki PBaragorn.pb.bialystok.pl/~mczajk/so/OS1-1.pdf ·...

63
Systemy operacyjne Studia podyplomowe 2015-2016 Wydział Informatyki PB dr inż. Marcin Czajkowski materiały przygotowane przez dr inż. Wojciecha Kwedlo

Transcript of Studia podyplomowe 2015-2016 Wydział Informatyki PBaragorn.pb.bialystok.pl/~mczajk/so/OS1-1.pdf ·...

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”)

System operacyjny na tle innych składników komputera

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

Migracja cech i własności systemów operacyjnych

Struktury systemów komputerowychistotne z punktu widzenia

systemu operacyjnego

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ą

Procesy i wątki

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 pomiędzy procesami

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

Proces z jednym wątkiem

● Standardowy Unix

● MS-DOS

Proces z wieloma wątkami

● Linux

● MS-Windows

● POSIX

● OS/2

● Solaris

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

}