System komputerowy można z grubsza podzielić na cztery części: sprzęt, system operacyjny, programy
użytkowe oraz użytkowników.
Sprzęt (hardware), czyli procesor (CPU), pamięć, układy sterujące i urządzenia wejścia-wyjścia to podstawowe zasoby systemu komputerowego.
Oprogramowanie (software) to program lub zestaw programów zapewniających wykorzystanie możliwości sprzętu przy rozwiązywaniu określonych zadań.
Zestaw komputerowy jest to komputer z systemem operacyjnym.
Oprogramowanie komputera można podzielić na dwie grupy
- oprogramowanie systemowe
- oprogramowanie użytkowe.
• Programy użytkowe (aplikacje) określają sposoby użycia zasobów do rozwiązywania zadań stawianych przez użytkowników. Zazwyczaj istnieje wielu różnych użytkowników (ludzie, maszyny, inne komputery) realizujących różne zadania.
• System operacyjny dostarcza środków do właściwego użycia zasobów danego komputera, tworzy środowisko (environment), w którym inne programy wykonują swoje zadania, pośredniczy pomiędzy aplikacjami użytkownika a sprzętem
Ponieważ sprzęt komputerowy jest funkcjonalnie skomplikowany, zazwyczaj nie zezwala się programom na bezpośrednie korzystanie z możliwości sprzętu, zmuszając je do korzystania z niego za pośrednictwem systemu operacyjnego. Umożliwia to systemowi zachowanie kontroli nad niemal wszystkimi czynności komputera i
podłączonych do niego urządzeń, a jednocześnie uwalnia programistów i użytkowników systemów
komputerowych od gruntownej znajomości zasad pracy komputera i podłączonych do niego urządzeń.
Tak więc do umożliwienia pracy całości systemu komputerowego zawsze potrzebny jest pewien specjalny program nazywany systemem operacyjnym SO (ang. skrót OS Operating System). W rzeczywistości jest to zestaw (pakiet) programów zapewniających wykonywanie na komputerze podstawowych czynności jak sterowanie pracą zestawu komputerowego i zarządzanie przebiegiem przetwarzania programów. Niektóre z tych programów znajdują się w pamięci operacyjnej zaraz po uruchomieniu komputera i załadowaniu systemu
operacyjnego oraz pozostają tam aż do chwili wyłączenia, inne znajdują się w plikach i po każdym
wywołaniu są ładowane do pamięci i wykonywane.
Mówiąc w skrócie, główne zadanie systemu operacyjnego to:
- wspomaganie tworzenia i wykonywania programów,
- umożliwienie dostępu do urządzeń wejściawyjścia,
- dostęp do plików i jego kontrola,
- kontrola dostępu do systemu operacyjnego
SYSTEMY OPERACYJNE
Aby komputer prawidłowo wykonał program użytkownika trzeba, aby program ten mógł być zredagowany, sprawdzony, zamieniony na kod operacyjny rozkazów procesora i wreszcie, aby mógł być uruchomiony i przetestowany. Wszystkie te czynności są na tyle skomplikowane, że nie są one realizowane przez sprzęt lecz przez specjalne programy. Zbiór programów, które umożliwiają wykonanie opisanych zadań, a także korzystanie z wszelkich zasobów komputera, tj. z procesora (-ów), pamięci, urządzeń wejścia-wyjścia oraz z innych
programów użytkowych tzw. System operacyjny.
System operacyjny jest ładowany do pamięci operacyjnej na początku pracy komputera. Program ten ma bardzo specyficzny charakter: w przeciwieństwie do programów użytkowych (aplikacji) nie korzysta z żadnych gotowych funkcji, tylko sam je udostępnia, a więc od niego zależą rzeczywiste możliwości wykorzystania sprzętu komputerowego. System operacyjny musi rozdzielać zasoby komputera między różnymi
pracami wykonywanymi na tym komputerze. Ważnym zadaniem jest więc zorganizowanie i optymalizacja dostępu do urządzeń zewnętrznych oraz efektywne wykorzystanie pamięci. System operacyjny musi określić kiedy i w jaki sposób urządzenie zewnętrzne może zostać wykorzystane przez dany program, w którym miejscu pamięci ma znaleźć się program użytkowy, a gdzie dane dla niego i jak przydzielać adresy różnym programom.
We współczesnych komputerach stosuje się przetwarzanie interakcyjne (ang. Interactive processing), polegające na ustawicznej ingerencji użytkownika w proces przetwarzania na wszystkich jego etapach. W takim przypadku
system operacyjny jest wykorzystywany przez użytkownika i dlatego projektanci systemów operacyjnych dążą do tego, aby był on przyjazny użytkownikowi. Określenie to przyznano tym systemom operacyjnym, które ułatwiają użytkownikowi korzystanie z komputera i pomagają mu w rozstrzyganiu napotkanych problemów.
Komputery podzielić można na komputery przeznaczone dla jednego użytkownika (ang. single user) i dla wielu użytkowników (ang. multiuser). W pierwszym przypadku komputer wykonuje zwykle jeden program, a w drugim wykonują się jednocześnie programy wielu użytkowników. Zadania systemu operacyjnego są znacznie bardziej złożone w tym drugim przypadku, gdzie musi on zapewnić wieloprogramowość (ang. multiprogramming). Jednym ze sposobów realizacji takich systemów jest przydział czasu na wykonywanie poszczególnych programów i takie systemy są nazywane systemami z podziałem czasu (ang. time
sharing). W związku z liczbę użytkowników zadania systemu operacyjnego są różne stąd wyróżniamy:
• Systemy dla jednego użytkownika gdzie zasoby przeznaczone są dla jednego użytkownika (np. w przypadku komputerów osobistych), nie ma mechanizmów autoryzacji dostępu, a mechanizmy ochrony informacji są ograniczone,
• Systemy wielodostępne gdzie wielu użytkowników może korzystać z zasobów systemu komputerowego, a system operacyjny rozdziela między nich zasoby gwarantując ich ochronę przed
niepowołaną ingerencją Zdarza się jednak, że w działanie systemu ingerują zdarzenia zewnętrzne (np. stan alarmowy na wyjściu czujnika w systemach sterowania przemysłowego) i one sterują wykonywaniem
poszczególnych programów. Mówi się wówczas, że system jest systemem czasu rzeczywistego (ang. real-time systems). Ponieważ w tych ostatnich systemach dane pochodzą z zewnątrz, to ważnym parametrem jest czas reakcji komputera na dane zdarzenie zewnętrzne. Często jest to reakcja na zgłoszone przerwanie, a więc czas jego obsługi. Aby czas reakcji był krótki, wymagana jest duża szybkość pracy komputera. Współpraca użytkownika z komputerem organizowana jest, na poziomie systemu operacyjnego, za pomocą tzw. systemu plików (ang. system file). System operacyjny umożliwia programiście posługiwanie się plikiem, tj. zbiorem danych opisanym nazwą. Nazwa jest wybierana przez użytkownika, który może plik utworzyć, przepisać w inne miejsce pamięci, chronić przed przypadkowym zapisem, wywoływać, łączyć itp. W plikach tych użytkownik umieszcza programy i dane. Aby użytkownikowi ułatwić posługiwanie się plikami, system operacyjny zawiera programy pomocnicze.
System operacyjny jako program zarządzający zasobami
Przez zarządzanie zasobami komputera system operacyjny steruje podstawowymi funkcjami komputera. Jednakże sterowanie to jest realizowane w dość osobliwy sposób - nie tak jak zwykle traktujemy mechanizm sterowania jako coś zewnętrznego w stosunku do sterowanego obiektu, a przynajmniej jako wyraźnie wydzieloną część tego obiektu. System operacyjny funkcjonuje w ten sam sposób, jak zwykłe oprogramowanie komputera; to znaczy jest on programem wykonywanym przez procesor. Podobnie jak inne programy komputerowe dostarcza on rozkazy do procesora. Jedyną różnicą jest intencja programu. System operacyjny kieruje procesorem w zakresie używania pozostałych zasobów systemu oraz synchronizowania wykonywania przez procesor innych programów. Żeby jednak procesor mógł wykonywać te czynności, musi zaprzestać realizowania programu systemu operacyjnego i zacząć wykonywać inne programy. System operacyjny wyrzeka się więc sterowania procesorem, umożliwiając mu wykonanie użytecznej pracy, po czym wznawia sterowanie z wyprzedzeniem wystarczającym do przygotowania następnej pracy.
Zasoby sprzętowe zarządzane przez system operacyjny
• Procesor - przydział czasu procesora,
• Pamięć
- alokacja przestrzeni adresowej dla procesów,
- transformacja adresów,
• Urządzenia zewnętrzne
- udostępnianie i sterowanie urządzeniami pamięci masowej,
- alokacja przestrzeni dyskowej,
- udostępnianie i sterowanie drukarkami, skanerami itp.
• Informacja (system plików)
- organizacja i udostępnianie informacji,
- ochrona i autoryzacja dostępu do informacji.
Zarządzanie zasobami
Zarządzanie zasobami w systemie wielozadaniowym polega na takim ich rozdzieleniu pomiędzy użytkowników, aby każdy z nich miał wrażenie, że pracuje na własnym komputerze.
System operacyjny dokonuje tego poprzez:
- przydział zasobów,
- synchronizację dostępu do zasobów,
- ochronę i autoryzację dostępu do zasobów,
- odzyskiwanie zasobów,
- rozliczanie - gromadzenie danych o wykorzystaniu zasobów.
Główne zadania systemu operacyjnego podczas zarządzania zasobami systemu komputerowego to:
- tworzenie deskryptora zasobu,
- usuwanie deskryptora zasobu,
- realizacja żądania przydziału,
- zwolnienie i odzyskiwanie zasobu.
Zarządzanie zasobami systemu komputerowego obejmuje:
• Zarządzanie procesami
• Zarządzanie pamięcią operacyjną
• Zarządzanie plikami
• Zarządzanie wejściem/wyjściem
• Zarządzenie nośnikami danych
Zarządzanie procesem - proces to program w stanie uruchomiony, każdy proces wymaga przydziału pewnych zasobów, włączając w to czas procesora, pamięć, pliki oraz urządzenia wejścia/wyjścia, aby w pełni wykonać swoje zadanie. System operacyjny jest odpowiedzialny w fazie zarządzania procesami za:
- tworzenie i usuwanie procesu,
- wstrzymywanie i przywracanie procesu,
- zapewnienie mechanizmów pozwalających na synchronizację procesów oraz komunikację między procesami.
Za zarządzanie procesami odpowiada jądro systemu operacyjnego.
Zarządzanie pamięcią operacyjną - pamięć to zbiór komórek, każda z własnym adresem. Pamięć operacyjna jest dostępna i dzielona pomiędzy procesor oraz urządzenia wejścia/wyjścia. Pamięć RAM jest ulotnym miejscem przechowywania danych, traci swoją zawartość w czasie awarii systemu. System operacyjny jest odpowiedzialny w fazie zarządzania pamięcią za:
- utrzymywanie informacji która część pamięci jest aktualnie używana i przez który proces,
- decydowania który proces powinien zostać wczytany do pamięci jeżeli pamięć jest wolna,
- przydzielanie i zwalnianie pamięci
Zarządzanie plikami - plik jest zbiorem informacji zdefiniowanym przez twórcę pliku. System operacyjny jest odpowiedzialny w fazie zarządzania plikami za:
- tworzenie i kasowanie plików,
- tworzenie i kasowanie katalogów,
- wsparcie dla użytkowników końcowych przy operacjach na plikach,
- mapowanie plików na nośniku danych,
- tworzenie kopii plików.
Zarządzanie wejściem/wyjściem - system wejścia/wyjścia składa się z: systemu buforowania, interfejsu urządzeń głównych, sterowników (kontrolerów) dla specyficznych urządzeń. Zarządzenie nośnikami danych - pamięć główna jest ulotna i często za mała aby obsłużyć wszystkie programy i dane, dlatego stosuje się pamięci masowe do powiększania tej pamięci tak zwanej pamięć drugiego rzędu (nośniki danych np.: dysk twardy,
CD-ROM ), na napędach tych mapuje się pamięć główną. System operacyjny jest odpowiedzialny w fazie zarządzania nośnikami danych za:
- zarządzanie wolną pamięcią,
- alokacją zapisu,
- planowaniem dysku.
Wybrane mechanizmy zarządzania zasobami
Przerwanie
DMA
Ochrona pamięci
Rozkazy uprzywilejowane
Przerwanie
Praktycznie we wszystkich komputerach przewidziano mechanizm, za pomocą którego inne moduły (wejściewyjście, pamięć) mogą przerwać normalne przetwarzanie danych przez procesor. (por. wykład na I roku). W przypadku programowanego wejścia-wyjścia problemem jest to, że procesor musi długo czekać, aż potrzebny moduł wejściawyjścia będzie gotowy do odbioru lub transmisji danych. Podczas oczekiwania procesor musi powtarzać badanie stanu modułu wejścia-wyjścia. W rezultacie wydajność całego systemu ulega poważnej degradacji. Alternatywą dla procesora jest wydanie modułowi rozkazu wejścia-wyjścia, a następnie przejście do innej użytecznej pracy. Moduł wejścia-wyjścia może przerwać pracę procesora żądaniem obsługi, gdy jest już gotów do wymiany z nim danych. Wówczas procesor dokonuje transferu danych, po czym wraca do poprzedniego przetwarzania.
Przerwanie
Przy wykorzystaniu przerwań procesor może być angażowany w wykonywanie innych rozkazów w czasie, gdy jest realizowana operacja wejścia-wyjścia. Technika ta umożliwia zawieszenie
programu użytkowego w celu obsłużenia różnych warunków przerwań oraz późniejsze wznowienie programu.
Przerwanie (ang. interrupt) lub żądanie przerwania (IRQ - Interrupt ReQuest) - sygnał powodujący zmianę przepływu sterowania, niezależnie od aktualnie wykonywanego zadania (programu). Pojawienie się przerwania powoduje wstrzymanie aktualnie wykonywanego programu i wykonanie przez procesor kodu procedury obsługi przerwania (ang. interrupt handler).
Przerwania dzielą się na trzy grupy:
- zewnętrzne
- wewnętrzne
- programowe.
1. Zewnętrzne - sygnał przerwania pochodzi z zewnętrznego układu obsługującego przerwania sprzętowe; przerwania te służą do komunikacji z urządzeniami zewnętrznymi, np. z klawiaturą, napędami dysków itp.
2. Wewnętrzne, nazywane wyjątkami - zgłaszane przez procesor dla sygnalizowania sytuacji wyjątkowych (np. dzielenie przez zero); dzielą się na trzy grupy:
1. faults (niepowodzenie) - sytuacje, w których aktualnie wykonywana instrukcja powoduje błąd; gdy procesor powraca do wykonywania przerwanego kodu wykonuje następną instrukcję po tej która wywołała wyjątek;
2. traps (pułapki) - sytuacja, która nie jest błędem, jej wystąpienie ma na celu wykonanie określonego kodu; wykorzystywane przede wszystkim w debugerach; gdy procesor powraca do wykonywania przerwanego kodu do tej samej instrukcji która wywołała wyjątek;
3. aborts - błędy, których nie można naprawić.
3. Programowe - z kodu programu wywoływana jest procedura obsługi przerwania; najczęściej wykorzystywane do komunikacji z systemem operacyjnym, który w procedurze obsługi przerwania umieszcza kod wywołujący odpowiednie funkcje systemowe w zależności od zawartości rejestrów ustawionych przez program wywołujący, lub oprogramowaniem wbudowanym jak procedury BIOS lub firmware Przetwarzanie przerwań wewnątrz procesora jest udogodnieniem przewidzianym do wspierania systemu operacyjnego. Producenci procesorów część pozycji w tablicy wektorów przerwań rezerwują dla przerwań wewnętrznych. Pozostałe numery przerwań mogą być dowolnie wykorzystane przez producentów systemów komputerowych i oprogramowania. Obsługiwanie większości przerwań (wszystkich lub wybranych numerów) można wstrzymać lub zablokować, wyjątkiem są przerwania niemaskowalne. Tablica wektorów przerwań znajduje się w pierwszych 1024 (256 - 4 Bajtowych adresów procedur obsługi przerwań) komórkach pamięci operacyjnej.
Tryb rzeczywisty
W trybie rzeczywistym (ang. real) pracy procesora adres procedury obsługi przerwania jest zapisany w tablicy wektorów przerwań. Tablica wektorów przerwań przechowuje adresy poszczególnych procedur obsługi przerwań; przerwania identyfikowane są przez numer (wektor przerwania) i w przypadku procesorów serii x86 jest możliwych do 256 przerwań.
W komputerach PC jest zazwyczaj 16 różnych sygnałów IRQ (ang. interrupt request) - IRQ0 do IRQ15. Często mówiąc o IRQ ma się na myśli sam numer przerwania, jako zasób udostępniany przez procesor. Jako, że jest ich tylko 16, bywają problemy z przydzieleniem osobnego przerwania każdemu z urządzeń, które go potrzebuje, może to powodować przydzielenie tego samego przerwania dwóm urządzeniom. Mówi się wtedy o konflikcie
przerwań, gdyż najczęściej dwa urządzenia nie mogą współdzielić jednego. Aktualne systemy operacyjne pozwalają unikać tych konfliktów
Tryb chroniony
W trybie chronionym (ang. protected) pracy procesora x86 (od procesora i386) mamy do czynienia z tablicą deskryptorów przerwań IDT (ang. Interrupt Descriptor Table) łączącą każdy wektor wyjątku lub przerwania z deskryptorem bramy (deskryptory bram to deskryptory pozwalające na kontrolowany dostęp do segmentów kodu o różnych stopniach uprzywilejowana) dla procedury lub zadania obsługującym dany wyjątek lub przerwanie. Położenie IDT jest zapisane w rejestrze tablicy deskryptorów przerwań (ang. Interrupt Descriptor Table Register, IDTR). IDT zawiera do 256 wpisów zwanych deskryptorami. Rozmiar IDT to 256*8B (8 Bajtów to rozmiar pojedynczego deskryptora); w przypadku mniejszej ilości deskryptorów (obsługiwanych przerwań) niż maksymalne 256, puste sloty (czyli w rzeczywistości nieważne deskryptory) powinny zawierać flagę dostępności segmentu ustawiona na 0.
IDT może zawierać trzy różne rodzaje deskryptorów bram:
1. deskryptor bramy zadania
2. deskryptor bramy przerwania
3. deskryptor bramy pułapki
Procesory 80386 i nowsze mogą pracować w dwóch trybach:
* rzeczywistym - w którym procesor zachowuje się jak 8086, tj. adresowanie jest 16-bitowe, każdy program ma dostęp do całej pamięci 1MB i do wszystkich portów procesora;
* chronionym - udostępniane są pełne możliwości procesora: ochrona pamięci przez mechanizm segmentacji i stronicowania, blokowanie dostępu do portów, poziomy uprzywilejowania programów, wspomaganie wielowątkowości.
DMA
W pewnych przypadkach pożądane jest umożliwienie bezpośredniej wymiany danych między wejściemwyjściem a pamięcią. W takim przypadku procesor przekazuje modułowi wejścia-wyjścia prawo do
odczytywania lub zapisywania rozkazów w pamięci, dzięki czemu przesyłanie danych między wejściemwyjściem a pamięcią może następować bez angażowania procesora. Podczas takiego przesyłania
moduł wejścia-wyjścia odczytuje lub zapisuje rozkazy w pamięci, uwalniając procesor od odpowiedzialności za tę wymianę. Operacja taka jest znana jako bezpośredni dostęp do pamięci (ang. Direct
Memory Access ) - DMA. DMA ma za zadanie odciążyć procesor główny od samego przesyłania danych z miejsca na miejsce (np. z urządzenia wejściowego do pamięci), procesor może w tym czasie zająć
się innym 'produktywnym' działaniem. Specjalizowane układy wspomagające DMA (np. te spotykane w PC) potrafią też kopiować obszary pamięci dużo szybciej niż uczyniłby to
programowo procesor główny. Aktualnie DMA - to technika, w której inne układy (np.
kontroler dysku twardego, karta dźwiękowa, itd.) mogą korzystać z pamięci operacyjnej RAM lub (czasami) portów we-wy pomijając przy tym procesor główny - CPU. Wymaga to współpracy ze strony procesora, który musi zaprogramować kontroler DMA do wykonania odpowiedniego transferu, a następnie na czas przesyłania danych zwolnić magistralę systemową. Sam transfer jest już zadaniem wyłącznie
kontrolera DMA. Realizacja cykli DMA może przez urządzenie być zrzucona na specjalny układ lub być realizowana samodzielnie przez urządzenie.
Ochrona pamięci
W komputerze wykonującym równocześnie wiele programów (współbieżnie), cała dostępna pamięć operacyjna jest z zasady w każdej chwili rozdzielona między pewną liczbę procesów. Gdy kilka procesów dzieli pamięć operacyjną, wówczas duże znaczenie dla zapewnienia ich nienaruszalności ma przestrzeganie zasady, że żaden z nich nie może zmienić zawartości komórek pamięci, które są bieżąco przydzielone drugiemu procesowi. Dlatego
wszystkie odniesienia do pamięci generowane przez proces muszą być sprawdzane podczas wykonania, aby było pewne, że dotyczą tylko tego obszaru pamięci, który jest przydzielony dla danego procesu. Pomimo potrzeby ochrony pamięci istnieją takie sytuacje, w których kilka procesów powinno mieć możliwość dostępu do tych samych obszarów pamięci operacyjnej. Jeżeli na przykład pewna liczba procesów wykonuje ten sam program, to uzyskamy większą korzyść wówczas, gdy zezwoli się, by wszystkie procesy posługiwały się tą samą kopią danego programu, niż gdy dla każdego z nich będzie istnieć odrębna kopia. Zdarza się również, że kilka procesów musi dzielić jedną strukturę danych, a więc muszą one uzyskać wspólny dostęp do tego obszaru w pamięci, w którym znajduje się wspólna struktura danych. System zarządzania pamięcią operacyjną musi zatem
sprawować kontrolę nad dostępem do obszarów dzielonych pamięci operacyjnej bez narażania na
szwank zasadniczej ochrony pamięci. Zbiór rozkazów uprzywilejowanych Po to aby procesy współbieżne nie mogły się wzajemnie zakłócać, część listy rozkazów maszynowych powinna być zarezerwowana wyłącznie do użytku systemu operacyjnego. Te zastrzeżone dla systemu operacyjnego
rozkazy uprzywilejowane powinny spełniać następujące zadania:
• włączanie i wyłączanie przerwań;
• przełączanie procesora od procesu do procesu;
• obsługiwanie rejestrów używanych przez sprzętową ochronę pamięci operacyjnej;
• wykonywanie operacji wejścia i wyjścia;
• zatrzymywanie procesora centralnego i sterowanie jego operacjami (np. włączanie i wyłączanie wewnętrznych mechanizmów, takich jak jednostki przyspieszające operacje zmiennopozycyjne lub pamięci podręczne W celu rozróżnienia, kiedy jest dozwolone wykonywanie rozkazów uprzywilejowanych, kiedy zaś nie wolno ich używać, większość komputerów działa w więcej niż jednym trybie pracy. Na ogół istnieją dwa tryby pracy, często nazywane odpowiednio trybem nadzorcy (ang. superuisor mode) i trybem użytkownika (ang. user mode).
Rozkazów uprzywilejowanych można używać jedynie w trybie nadzorcy. Przełączenie z trybu użytkownika do trybu nadzorcy następuje automatycznie w przypadku wystąpienia którejkolwiek z poniższych sytuacji.
- Proces użytkownika wywołuje system operacyjny w celu wykonania pewnej czynności, która wymaga użycia rozkazu uprzywilejowanego. Takie wywołanie nazywamy odwołaniem się do systemu ; dawniej używano też terminu rozkaz programowany.
- Nadeszło przerwanie.
- Pojawił się błąd w procesie użytkownika. Ta sytuacja może być traktowana jako „przerwanie wewnętrzne” i jest najpierw obsługiwana przez procedurę obsługi przerwania.
- Wystąpiła próba wykonania rozkazu uprzywilejowanego, podczas gdy komputer pracuje w trybie użytkownika. Można to uważać za szczególny rodzaj błędu i potraktować tak jak powyżej. Przełączenie z trybu nadzorcy do trybu użytkownika wykonuje się za pomocą rozkazu uprzywilejowanego
Systemy ogólnego przeznaczenia
Systemy ogólnego przeznaczenia stosuje się w komputerach, które mają wielu użytkowników wykonujących bardzo różnorodne zadania. Systemy takie tworzy się po to, aby obsługiwały ciągły przepływ prac mających postać zadań wykonywanych przez komputer. Każda praca jest specyficznym zadaniem spełnianym dla
konkretnego użytkownika i wymaga wykonania jednego lub wielu programów. Systemy ogólnego przeznaczenia dzieli się często na dwie grupy: systemy wsadowe (ang. batch system) i
systemy wielodostępne (ang. multi-access system).
• Zasadnicza cecha systemów wsadowych polega na tym, że od chwili, w której praca trafi do komputera, użytkownik nie ma już żadnego kontaktu z nią dopóty, dopóki nie zostanie ona wykonana.
• W systemach wielodostępnych (lub interaktywnych) użytkownik może wykonywać jeden lub więcej programów wywołując je za pośrednictwem terminala i może posłużyć się terminalem w celu nadzorowania
przebiegu programów i sterowania ich wykonywaniem. System operacyjny rozdziela zasoby obliczeniowe między różnych użytkowników w taki sposób, aby wydawało się, iż każdy z nich ma wyłączny dostęp do
całej maszyny.
Ze względu na dopuszczalną liczbę zadań systemy dzielimy na:
• systemy jednozadaniowe gdzie niedopuszczalne jest rozpoczęcie wykonywania następnego zadania użytkownika przed zakończeniem poprzedniego,
• systemy wielozadaniowe gdzie dopuszczalne jest istnienie jednocześnie wielu zadań (procesów), którym zgodnie z pewną strategią przydzielany jest procesor ( czas pracy). Zwolnienie procesora następuje w
wyniku: żądania przydziału dodatkowego zasobu, zainicjowania operacji wejścia/wyjścia, przekroczenia
ustalonego limitu czasu (kwantu czasu).
Systemy jednozadaniowe są to na ogół systemy dedykowane (np. komputery osobiste czy stacje robocze), a systemy wielozadaniowe to systemy z podziałem czasu,w których jednocześnie pracuje wielu użytkowników. W
takich komputerach system operacyjny wyznacza czas dla każdego z użytkowników i stąd nazwa systemów.
• W jednozadaniowych systemach wsadowych wykonywany jest jeden program. System operacyjny, zwany monitorem, nie zezwala na bezpośredni dostęp użytkownika do komputera. Programy i dane przygotowywane są na nośnikach magnetycznych, które następnie są wprowadzane przez operatora i wczytywane przez system.
Do użytkownika przekazywane są wydruki, na podstawie których może on dokonywać ewentualnych poprawek.
Obecnie nie stosuje się takich systemów
• Wielozadaniowe systemy wsadowe jednocześnie mogą obsługiwać wiele programów. Programy te zajmują czas procesora naprzemiennie. Oznacza to, że gdy procesor czeka na operację wejścia-wyjścia jednego programu, to rozpoczyna się wykonywanie drugiego programu. Sterowaniem takiego przełączania zadań zajmuje się część systemu operacyjnego zwana programem szeregującym zadania. Aby ułatwić to zadanie system operacyjny zajmuje się także gospodarką zajętości pamięci. Ponieważ większa część programów i danych znajduje się w pamięci dyskowej, to sposób optymalizacji czasu dostępu do tej
pamięci, czyli sposób wymiany informacji pomiędzy pamięcią operacyjną i pamięcią dyskową staje się bardzo
istotnym problemem. W systemie operacyjnym zadanie to jest nazywane zarządzaniem pamięcią.
• Wielozadaniowe systemy operacyjne można podzielić na oferujące i pozbawione wywłaszczania.
W systemie z wywłaszczaniem jest możliwe przerwanie wykonywania procesu i przeniesienie go z
powrotem do kolejki kontrolowanej przez algorytm szeregowania (scheduler). W systemie bez
wywłaszczania zadania muszą przełączać się dobrowolnie. Proces aktywny (wykonujący się) jest
przenoszony do kolejki procesów oczekujących tylko wtedy, gdy sam przerwie (wstrzyma, zawiesi) swoje
działanie a dopóki tego nie uczyni (lub nie zakończy działania), żaden inny proces nie otrzyma dostępu do
procesora.
ZADANIA SYSTEMÓW
OPERACYJNYCH
Literatura:
• Silberschatz A., P. B. Galev, Podstawy systemów
operacyjnych, WNT 1993, 2000
• Lister A. M., Eager R.D., Wprowadzenie do
systemów operacyjnych, WNT 1994.
Z wielu zadań systemu operacyjnego poniżej wyróżniono dwa, które mają największy wpływ na
architekturę systemu:
1. szeregowanie zadań (przygotowanie programów, ich wykonywanie, przydzielanie zbiorów danych, wykonywanie operacji wejściawyjścia itp.),
2. zarządzanie pamięcią
operacyjne są dość złożone w porównaniu z jednoprogramowymi. Aby dysponować
kilkoma zadaniami gotowymi do uruchomienia, muszą one być przechowywane w pamięci, wymagając tym samym pewnej formy zarządzania pamięcią. Ponadto, jeśli kilka zadań czeka w stanie gotowości, procesor musi zdecydować, które ma być realizowane, co wymaga pewnego algorytmu
szeregowania ć umożliwia procesorowi jednoczesne wykonywanie wielu zadań. Do tego celu wykorzystywana jest metoda określana jako tryb z podziałem czasu (time sharing), co odzwierciedla fakt, że czas procesora jest dzielony między wiele zadań (użytkowników). Zarówno wieloprogramowe przetwarzanie wsadowe, jak i system z podziałem czasu posługują się
wieloprogramowością systemów operacyjnych jest wieloprogramowanie a to oznacza, że wiele zadań lub programów może się wykonywać. Każde zadanie jest przełączane między używaniem centralnego procesora a oczekiwaniem na realizację operacji wejściawyjścia. Procesor pozostaje zajęty, wykonując jedno z zadań, podczas gdy inne oczekują. Kluczem do wieloprogramowania jest
szeregowanie.
SZEREGOWANIE CZASOWEGłównym celem nowoczesnych systemów operacyjnych jest wieloprogramowanie a to oznacza, że wiele zadań lub programów może się wykonywać. Każde zadanie jest przełączane między używaniem centralnego procesora a oczekiwaniem na realizację operacji wejścia/wyjścia. Procesor pozostaje zajęty, wykonując jedno z zadań, podczas gdy inne oczekują. Kluczem do wieloprogramowania jest szeregowanie.
SZEREGOWANIE CZASOWE
Głównym celem nowoczesnych systemów operacyjnych jest wieloprogramowanie a to
oznacza, że wiele zadań lub programów może się wykonywać. Każde zadanie jest przełączane
między używaniem centralnego procesora a oczekiwaniem na realizację operacji wejściawyjścia.
Procesor pozostaje zajęty, wykonując jedno z zadań, podczas gdy inne oczekują.
Kluczem do wieloprogramowania jest szeregowanie. Szeregowanie zadań w systemach komputerowych odbywa się na trzech poziomach:
1) szeregowanie wysokiego poziomu tj. podejmowanie decyzji czy dane zadanie (program) ma zostać
dołączone do kolejki do wykonania,
2) szeregowanie krótkoterminowe tj. podejmowanie decyzji o zleceniu procesorowi wykonania danego
zadania,
3) szeregowanie zleceń wejścia-wyjścia tj. podejmowanie decyzji o kolejności programów żądających dostępu do urządzeń wejścia-wyjścia Celem wyjaśnienia opisanych przypadków wprowadźmy pojęcia, które będą pomocne w trakcie dalszego opisu: zadanie (ang. job lub task ), proces (ang. process) i stan (ang. state) oraz wątek (ang. thread).
Zadaniem nazywa się skompilowany program, połączony już z programami bibliotecznymi oraz
plikami, które są przez ten program wywoływane. A więc jest to program całkowicie przygotowany
do wykonania. Zadanie jest reprezentowane przez specyfikacje procesu jak i wątku
Proces jest to zadanie, którym aktualnie zajmuje się komputer i które w każdej chwili przyjmuje jakiś
stan. Proces może wymagać wykonania więcej niż jednego programu; na odwrót, jeden program
może występować w więcej niż jednym procesie. Dlatego informacja, iż konkretny program jest w
danej chwili wykonywany, nie mówi nam wiele o tym, jakie czynności mają być wypełnione ani
jakie zadania mają być zrealizowane. W znacznej mierze z tego powodu w rozważaniach
dotyczących systemów operacyjnych użyteczniejsze jest pojęcie procesu niż programu
przez CPU nazywamy
procesem bieżącym dla tego procesora (CPU). Jest oczywiste, że liczba procesów
bieżących wewnątrz systemu komputerowego jest zawsze mniejsza lub równa liczbie dostępnych procesorów Proces z definicji jest to po prostu egzemplarz wykonywanego programu. Należy odróżnić jednak proces od wątku - każdy proces posiada własną przestrzeń adresową, natomiast wątki posiadają wspólną sekcję danych.
Każdemu procesowi przydzielone zostają zasoby, takie jak:
* procesor
* pamięć
* dostęp do urządzeń wejścia-wyjścia
* pliki
Każdy proces posiada tzw. "rodzica". W ten sposób tworzy się swego rodzaju drzewo procesów. Proces może (ale nie musi) mieć swoje procesy potomne.
Ogólnie zasoby z których korzysta proces
dzielimy na:
• Zasób własny (niepodzielny) - z którego korzysta (lub ma dostęp w dowolnym czasie) tylko jeden proces,
• Zasób dzielony - wspólny zasób, z którego może korzystać w sposób wyłączny wiele procesów
Wątek - to jednostka wykonawcza w obrębie jednego procesu, będąca kolejnym ciągiem instrukcji
wykonywanym w obrębie tych samych danych (w tej samej przestrzeni adresowej).
Wątki tego samego procesu korzystają ze wspólnego kodu i danych, mają jednak oddzielne stosy.
W systemach wieloprocesorowych, a także w systemach z wywłaszczaniem, wątki mogą być
wykonywane równocześnie (współbieżnie). Równoczesny dostęp do wspólnych danych grozi
jednak utratą spójności danych i w konsekwencji błędem działania programu. Do zapobiegania takim
sytuacjom wykorzystuje się mechanizmy synchronizacji wątków: semafory, muteksy, sekcje
krytyczne.
Procesy
Wykonanie procesów przebiega sekwencyjnie, tak więc proces może przyjmować kilka stanów:
- działający,
- czekający na udostępnienie zasobów przez system operacyjny
- przeznaczony do zniszczenia,
- właśnie tworzony.
W skład procesu wchodzi:
* kod programu
* licznik rozkazów
* stos
* sekcja danych
Zarządzanie procesami
Zarządzanie procesami obejmuje:
-• Tworzenie procesów i ich kończenie
-• Komunikacja między procesami (pamięć
współdzielona, system komunikatów,
komunikacja pośrednia i bezpośrednia)
• Podział procesu na wątki
• Synchronizowanie procesów oraz
unikanie blokad
• Kolejkowanie procesów
Tworzenie procesów
• Użytkownik za pomocą powłoki zleca uruchomienie programu, proces wywołujący wykonuje polecenie fork, lub jego pochodną.
• System operacyjny tworzy przestrzeń adresową dla procesu oraz strukturę opisującą nowy proces.
• Wypełnia strukturę opisującą proces.
• Kopiuje do przestrzeni adresowej procesu dane i kod, zawarte w pliku wykonywalnym.
• Ustawia stan procesu na działający.
• Dołącza nowy proces do kolejki procesów oczekujących na procesor.
• Zwraca sterowanie do powłoki użytkownika.
Wykonywanie procesów
Dany proces rozpoczyna wykonywanie w momencie przełączenia przez jądro systemu
operacyjnego przestrzeni adresowej na przestrzeń adresową danego procesu oraz takie
zaprogramowanie procesora, by wykonywał kod procesu. Wykonujący się proces może
żądać pewnych zasobów, np. większej ilości pamięci. Zlecenia takie są na bieżąco realizowane przez system operacyjny
Kończenie procesów
* proces wykonuje ostatnią instrukcję - zwraca do systemu operacyjnego kod zakończenia. Jeśli proces zakończył Si poprawnie zwraca wartość 0, w przeciwnym wypadku zwraca
wartość kodu błędu.
* w momencie zwrotu do systemu operacyjnego kodu zakończenia, system operacyjny ustawia stan procesu na przeznaczony do zniszczenia i rozpoczyna zwalnianie wszystkich zasobów, które w czasie działania procesu zostały temu procesowi przydzielone.
* system operacyjny po kolei kończy wszystkie procesy potomne w stosunku do procesu macierzystego.
* system operacyjny zwalnia przestrzeń adresową procesu. Jest to dosłowna śmierć procesu.
* system operacyjny usuwa proces z kolejki procesów gotowych do uruchomienia i szereguje zadania. Jest to ostatnia czynność wykonywana na rzecz procesu.
procesor zostaje przydzielony innemu procesowi.
Procesy współbieżne
Współbieżność można rozumieć jako uaktywnienie kilku procesów w tym samym czasie. Jeżeli
komputer wykonuje więcej procesów, to można uzyskać pozorną współbieżność przełączając
procesor od jednych procesów do drugich. Jeżeli przełączenia są dokonywane w dostatecznie
małych okresach czasu, to system obserwowany przez dłuższy czas pozwoli stworzyć iluzję
współbieżności. Pozorna współbieżność powstaje w wyniku przeplatania procesów w jednym
procesorze.
Współbieżność jest też realizowana z użyciem mechanizmu wielowątkowości
(multithreading). Wątek jak wiemy to autonomiczna jednostka wykonywalnego
kodu. Czas procesora jest przydzielany poszczególnym wątkom, a odpowiada za to moduł szeregowania procesów. Przerywa on działanie programu co określony kwant czasu (domyślnie jest to 20ms) i sprawdza, któremu z wątków ma zostać przydzielone
sterowanie.
Współbieżność powoduje powstawanie problemów związanych z przełączaniem od jednego procesu do drugiego i ochroną jednego procesu przed skutkami drugiego. Jeżeli kilka procesów współzawodniczy o zasoby, to może wytworzyć się taka sytuacja, w której każdy proces - aby móc nadal działać - będzie musiał skorzystać z tych zasobów, których używa inny roces; wówczas żaden proces nie będzie mógł kontynuować swej pracy. Taką sytuację nazywamy blokadą. Przypomina ona korek w ruchu ulicznym, zdarzający się wówczas, gdy zatrzymują się dwa strumienie pojazdów z przeciwnych stron, ponieważ próbując jeden drugiemu przeciąć drogę -tarasują ją sobie nawzajem. Oczywiście jednym z zadań systemu operacyjnego jest niedopuszczanie do powstawania
blokady albo przynajmniej ograniczanie jej skutków.
Procesy mogą znajdować się w jednym z pięciu stanów:
— stan nowy (ang. new),
— stan gotowości (ang. ready),
— stan wykonywania (ang. running),
— stan oczekiwania (ang. waiting),
— stan zatrzymania (ang. halted).
Proces jest wprowadzany w stan nowy poprzez szeregowanie wysokiego poziomu. Stan gotowości procesu powstaje w wyniku działania szeregowania krótkoterminowego i jest to stan, w
którym zadanie czeka na wolny czas procesora.
Ze stanu gotowości procesy przechodzą w stan wykonywania w takiej kolejności, w jakiej uszeregowano je w stanie gotowości. Stan wykonywania jest to stan, w
którym procesor wykonuje dane zadanie. Ze stanu ykonywania procesy mogą zostać wprowadzone w stan
oczekiwania w przypadku, gdy pojawiają się operacje wejścia-wyjścia i następuje szeregowanie zleceń wejściawyjścia. W stan zatrzymania proces wchodzi po wykonaniu programu przez procesor igdy system operacyjny likwiduje dany proces. Na rysunku pokazano diagram
przejść procesów ze stanu do stanu.
Aby ułatwić proces szeregowania zadań system operacyjny tworzy dla każdego procesu deskryptor procesu nazywany też czasem blokiem kontrolnym procesu lub wektorem stanu, który jest obszarem
pamięci operacyjnej zawierającymwszystkie ważne informacje o danym
procesie.
Blok sterujący (kontrolny) zawiera następujące
informacje:
— identyfikator procesu (ang. identifier),
— znacznik stanu (ang. state flag),
— wskaźnik priorytetu (ang. priority level),
— licznik rozkazów (ang. program counter),
— wskaźnik pamięci (ang. memory pointers),
— stan procesora (ang. context data),
— stan zleceń operacji wejścia-wyjścia,
— licznik czasu pracy (ang. accounting
information
Identyfikator procesu służy do wygodnego
manipulowania informacjami o procesie. Znacznik stanu
wskazuje na stan w jakim znajduje się proces. Wskaźnik
priorytetu określa hierarchię ważności procesu. Licznik
rozkazów służy do przechowywania adresu
początkowego danego programu, wskaźnik pamięci do
przechowywania adresu końcowego, znacznik stanu
procesora do przechowania danych początkowych
programu, zawartości rejestrów itp., a stan zleceń
operacji wejścia-wyjścia przechowuje wykaz urządzeń
zewnętrznych potrzebnych do wykonania danego
programu. Licznik czasu pracy przechowuje tzw.
ograniczniki czasowe danego programu. Są to wartości
liczbowe określające czas, w ciągu którego program może
przebywać w stanie wykonywania. Jeśli czas ten
przekroczono, to system operacyjny sam spowoduje
przejście tego programu w stan zatrzymania.
Programy szeregujące ustawiają procesy w trzy
kolejki.
• Program szeregujący wysokiego poziomu zajmuje
się procesami w stanie nowym,
• program szeregowania krótkoterminowego
zajmuje się procesami w stanie gotowości
• program szeregowania zleceń wejścia-wyjścia
zajmuje się procesami w stanie oczekiwania
Obsługa kolejek może być realizowana według
różnych algorytmów. Aby wybrać odpowiedni
algorytm trzeba posługiwać się następującymi
kryteriami:
— wykorzystanie czasu pracy procesora,
— przepustowość komputera,
— czas obsługi procesu,
— czas oczekiwania,
— czas odpowiedzi.
Szeregowanie
Aby zrozumieć, jak system operacyjny zarządza
szeregowaniem różnych zadań w pamięci, rozważmy
prosty przykład. Niech będą dwa ( A i B) aktywne
procesy, z których każdy jest rozmieszczony w części
pamięci. Rozpoczniemy w momencie, gdy jest
realizowany proces A. Procesor wykonuje rozkazy
programu zawartego w części pamięci przypisanej do
procesu A. W pewnym późniejszym momencie
procesor zaprzestaje wykonywania rozkazów procesu
A i rozpoczyna wykonywanie rozkazów
przechowywanych w obszarze systemu operacyjnego.
Następuje to z jednego z trzech powodów:
1. Proces A przekazuje wywołanie obsługi (np. żądanie
wejścia-wyjścia) systemowi operacyjnemu.
Wykonywanie procesu A jest więc zawieszone do
czasu spełnienia żądania przez system operacyjny.
2. Proces A powoduje przerwanie. Gdy sygnał ten zostaje
wykryty, procesor zaprzestaje wykonywania procesu A
i przenosi się do programu obsługi przerwań w
systemie operacyjnym. Różne zdarzenia związane z
procesem A mogą spowodować przerwanie. Jedną z
możliwości jest błąd, taki jak przystąpienie do
wykonywania rozkazu uprzywilejowanego. Innym
przykładem jest wyczerpanie się czasu; w celu
zapobieżenia monopolizacji procesora przez jeden
proces, każdy proces uzyskuje dostęp do procesora
tylko na krótki czas.
3. Pewne zdarzenie nie związane z procesem A, lecz
wymagające uwagi, powoduje przerwanie. Przykładem
jest zakończenie operacji wejścia-wyjścia
W każdym przypadku wynik jest następujący:
procesor zapisuje bieżące dane kontekstowe i licznik
programu A w bloku kontrolnym procesu A, po
czym przystępuje do działania w systemie
operacyjnym. System operacyjny może wykonać
pewną pracę, taką jak zainicjowanie operacji
wejścia-wyjścia. Potem należący do systemu
operacyjnego program szeregowania
krótkookresowego decyduje, który proces powinien
być realizowany jako następny. W tym przykładzie
został wybrany proces B. System operacyjny poleca
procesorowi odnowienie danych kontekstu B i
przystąpienie do realizowania procesu B w punkcie,
w którym był on pozostawiony ( w stanie
oczekującym).
Ten prosty przykład ujawnia podstawową funkcję
programu szeregowania krótkookresowego.
System operacyjny uzyskuje sterowanie procesorem przez swój
program obsługi przerwań, jeśli nastąpiło przerwanie, lub przez
program obsługi wezwań serwisowych, jeśli wystąpiło wezwanie
do obsługi. Gdy przerwanie lub wezwanie jest przetwarzane,
program szeregowania krótkoterminowego jest wzywany do
wybrania procesu przeznaczonego do realizacji. W celu
wykonania tego zadania system operacyjny utrzymuje pewną
liczbę kolejek. Każda kolejka jest po prostu listą procesów
czekających na pewne zasoby. Kolejka długookresowa jest listą
zadań czekających na użycie systemu. Gdy warunki pozwolą,
program szeregujący wysokiego poziomu dokona alokacji pamięci
i utworzy proces z jednej spośród czekających jednostek. Kolejka
krótkookresowa składa się ze wszystkich procesów będących w
stanie gotowości. Każdy z tych procesów mógłby korzystać z
procesora jako następny. Do programu szeregowania
krótkookresowego należy wybranie jednego z nich. Na ogół jest to
robione za pomocą algorytmu cyklicznego, co powoduje
przydzielenie czasu kolejno każdemu procesowi. Mogą też być
użyte poziomy priorytetu. Jest wreszcie kolejka wejścia-wyjścia
związana z każdym urządzeniem we-wyjścia. Wszystkie procesy
czekające na użycie określonego urządzenia są ustawiane w jego
kolejce.
Każde zapotrzebowanie na proces (zadanie wsadowe, zadanie
konwersacyjne definiowane przez użytkownika) jest
umieszczane w kolejce długookresowej. Gdy zasoby stają się
osiągalne, zapotrzebowanie na proces staje się procesem, jest
przenoszone do stanu gotowości i umieszczane w kolejce
krótkookresowej. Procesor wykonuje na przemian rozkazy
systemu operacyjnego oraz procesów użytkowych. Gdy
sterowanie należy do systemu operacyjnego, decyduje on,
który spośród procesów czekających w kolejce
krótkookresowej ma być realizowany jako następny. Gdy
system operacyjny zakończy swoje pilne zadania, zleca
procesorowi realizację wybranego zadania.
Jak wspomnieliśmy wcześniej, realizowany proces może być z
wielu powodów zawieszony. Jeśli jest zawieszony, ponieważ
zgłosił żądanie wejścia-wyjścia, to zostaje umieszczony w
odpowiedniej kolejce wejścia-wyjścia. Jeśli natomiast
powodem zawieszenia było wyczerpanie się czasu lub
konieczność przejścia systemu operacyjnego do pilniejszych
zadań, to jest przenoszony do stanu gotowości i powraca do
kolejki krótkookresowej.
Zauważmy na koniec, że system operacyjny zarządza
również kolejkami wejścia-wyjścia. Gdy operacja
wejścia-wyjścia jest zakończona, system operacyjny
usuwa zaspokojony już proces z kolejki wejścia-wyjścia
i umieszcza go w kolejce krótkoterminowej. Następnie
wybiera inny czekający proces (jeśli taki istnieje) i
sygnalizuje urządzeniu wejścia-wyjścia
zapotrzebowanie zgłoszone przez ten proces.
Stwierdziliśmy, że głównym zadaniem systemu
operacyjnego jest zarządzanie zasobami systemu
(czasem procesora i urządzeniami wejścia-wyjścia) za
pomocą kolejek. Pozostaje jeszcze problem zarządzania
zasobami pamięci, czym zajmiemy się dalej.