Systemy operacyjne
© Jerzy Skurczyński
Instytut Informatyki Stosowanej
Państwowa Wyższa Szkoła Zawodowa w
Elblągu
Elbląg, 2002 r.
Literatura:
1. M.J. Bach, Budowa systemu operacyjnego UNIX, WNT, 1995.
2. D.P. Bovet, M. Cesati, Linux kernel, RM, 2001.
3. L. Bułhak i in., DOS 5 od środka, HELP, 1997.
4. A. Silberschatz i in., Podstawy systemów operacyjnych, WNT, 1993.
5. A.S. Tanenbaum, Rozproszone systemy operacyjne, PWN, 1997.
6. ................... Windows ... od środka, Help, .......
1. CELE ISTNIENIA SYSTEMÓW OPERACYJNYCH
Zarys historii rozwoju systemów operacyjnych
Najwcześniejsze komputery (konstruowane w latach 40-tych i na początku 50-
tych) nie miały
żadnego stałego oprogramowania. Programy użytkowników były pisane w
kodzie maszynowym
i bezpośrednio (w postaci ciągu bitów) wprowadzane do pamięci operacyjnej
komputera.
Wyniki działania programów również były odczytywane bezpośrednio z
pamięci. Takie
programowanie „surowej maszyny” było bardzo niedogodne dla
użytkowników.
Aby ułatwić używanie komputera, zaczęto do niego przyłączać dodatkowe
urządzenia służące do
przyspieszenia wprowadzania programów i danych do pamięci komputera
oraz odczytywania
wyników. Zostały one nazwane urządzeniami zewnętrznymi komputera
(dawniej nazywano je
też urządzeniami peryferyjnymi lub peryferałami
(peripheral)
).
Rodzaje najwcześniejszych urządzeń zewnętrznych:
1) urządzenie typu „dalekopis” (sterowana elektryczna maszyna do pisania)
pełniące rolę konsoli
operatorskiej, to jest służące do wprowadzania i odczytywania niewielkich
porcji informacji
w postaci znakowej;
2) czytniki nośników papierowych (taśmy i karty perforowane) umożliwiające
dość szybkie
wprowadzenie większych programów i danych przygotowanych na
oddzielnych urządzeniach
(perforatorach);
3) drukarki (wierszowe i głowicowe) umożliwiające dość szybki wydruk
wyników.
Nieco później pojawiły się przewijaki taśm magnetycznych, umożliwiające
wielokrotny zapis
i odczyt większych ilości danych przeznaczonych do czasowego przechowania
(na przykład
pośrednich wyników obliczeń lub wyników kompilacji programów).
Programowanie obsługi przez komputer urządzeń zewnętrznych (czyli
prawidłowego
komunikowania się komputera z nimi) należało do najtrudniejszych i
najbardziej
skomplikowanych zadań programistycznych - i tak jest po dzień dzisiejszy.
W początkowym okresie komputery były bardzo drogimi urządzeniami. Czas
ich pracy był
wyceniany bardzo wysoko i w związku z tym zaczęły pojawiać się koncepcje
mające na celu
zaoszczędzenie czasu ich używania przez poszczególnych użytkowników.
Podstawowe koncepcje to:
1) zatrudnianie zawodowych operatorów, którzy szybko i bezbłędnie
komunikowali się
z komputerem za pośrednictwem konsoli;
2) przygotowywanie na oddzielnych urządzeniach większej liczby tekstów
programów i zestawów
danych dla nich i łączenie ich we wsady
(batch)
, które umożliwiają
natychmiastowe rozpoczęcie
wykonywania następnego programu po zakończeniu poprzedniego (lub
odrzuceniu go z powodu
błędów);
3) uruchamianie na początku pracy komputera specjalnego programu
przebywającego w jego
pamięci przez cały czas i zawiadującego współpracą komputera z
urządzeniami zewnętrznymi
oraz kolejnością uruchamiania innych programów.
Trzecia z powyższych koncepcji doprowadziła do powstania systemów
operacyjnych, których
pierwotną postacią był tak zwany monitor rezydujący. Był to program
przebywający przez cały
czas w pamięci operacyjnej komputera i wprowadzający do pamięci i nadzorujący
wykonywanie
innych programów (przekazanie im sterowania i przejęcie go z powrotem po ich
zakończeniu).
O kolejności wprowadzania programów decydował operator podając odpowiednie
polecenia
z konsoli, mogło to być też zautomatyzowane poprzez użycie tak zwanych kart
sterujących
poprzedzających karty z zapisem treści programu.
Jedną z podstawowych funkcji operatora systemu komputerowego (poza fizyczną
obsługą urządzeń
wejścia/wyjścia - wkładaniem i wyjmowaniem nośników papierowych,
zakładaniem i zdejmowaniem
taśm magnetycznych) było zainicjowanie pracy komputera po włączeniu zasilania.
Ponieważ
komputery nie posiadały pierwotnie pamięci trwałych (ROM) umożliwiających
automatyczny start,
operator musiał ręcznie (przy użyciu kluczy) wprowadzić do pamięci kilka
rozkazów maszynowych
umożliwiających wczytanie z nośnika papierowego bardziej złożonego programu
(odpowiednika
dzisiejszego BIOS-u), który z kolei umożliwiał wczytanie systemu operacyjnego z
taśmy
magnetycznej.
Rozwój systemów operacyjnych miał na celu jak najefektywniejsze
wykorzystanie możliwości
sprzętu komputerowego i zawsze był nierozłącznie związany z rozwojem samego
sprzętu.
Ponieważ urządzenia zewnętrzne zawsze działają znacznie wolniej od samego
komputera (jego
procesora), dążono do jak największego uniezależnienia pracy procesora od
czasu wprowadzania
danych i wyprowadzania wyników. Uzyskiwano to poprzez:
1) odchodzenie od współpracy procesora bezpośrednio z urządzeniami
operującymi na nośniku
papierowym (są zdecydowanie najwolniejsze) poprzez przepisywanie danych i
wyników na/z
taśmy magnetyczne przy użyciu wyspecjalizowanych urządzeń lub mniejszych,
pomocniczych
komputerów (tak zwane przetwarzanie satelitarne);
2) buforowanie, czyli wydzielenie fragmentu pamięci operacyjnej do celów
komunikacyjnych
i umożliwienie urządzeniom zewnętrznym (po zainicjowaniu transmisji przez
procesor) niezależny
(autonomiczny) zapis/odczyt do/z tego fragmentu;
3) spooling, związany z zastępowaniem taśm magnetycznych dyskami
magnetycznymi (szybszy
dostęp do danych), będący w istocie buforowaniem na dysku większej ilości
zarówno danych, jak
i programów, i umożliwiający wykonywanie programów i wykorzystywanie
zestawów danych
w innej kolejności, niż były wczytane.
Wspólną ideą powyższych rozwiązań było dążenie do zrównoleglenia pracy
procesora i urządzeń
zewnętrznych poprzez zapewnienie im jak największej niezależności czasowej od
siebie (czyli
spowodowanie, aby mogły one pracować asynchronicznie). Oczywiście nawet
przy pełnym
zrównolegleniu nie można oczekiwać, że łączny czas pracy urządzeń
zewnętrznych oraz pracy
procesora będą sobie równe - zadania obliczeniowe wymagające istotnie
większego nakładu czasu
procesora nazywamy zadaniami zorientowanymi na przetwarzanie (typowe
przykłady - duże
obliczenia naukowe i inżynierskie), zaś wymagające głównie pracy urządzeń
zewnętrznych -
zadaniami zorientowanymi na operacje wejścia/wyjścia (typowy przykład -
drukowanie
rachunków).
Uwaga
Istotną cechą architektury współczesnych komputerów jest wyposażenie prawie
wszystkich urządzeń
zewnętrznych (oraz komunikujących się z nimi układów elektronicznych
wewnątrz komputera)
w wyspecjalizowane mikroprocesory zawiadujące ich pracą i komunikacją. W
tym sensie prawie
każdy współczesny system komputerowy jest maszyną równoległą, w której
jeden (lub więcej)
procesorów ogólnego użytku oraz pewna liczba procesorów wyspecjalizowanych
pracują w dużym
stopniu współbieżnie.
Po utworzeniu ośrodków obliczeniowych i zatrudnieniu w nich
wykwalifikowanego personelu (a tym
samym uniemożliwieniu użytkownikom bezpośredniej styczności z komputerem)
podstawowym
problemem stał się długi łączny czas przetwarzania zadania z punktu widzenia
pojedynczego
użytkownika (zaniesienie danych i programu, odebranie następnego dnia
wydruków komunikatów
o błędach, dostarczenie skorygowanych danych ...). Użytkownicy byli zmuszeni
do bardzo dużej
koncentracji przy przygotowywaniu tekstów programów i danych, jak również
musieli przygotowy-
wać dla operatorów komputerów szczegółowe instrukcje postępowania,
uwzględniające wszystkie
możliwe scenariusze rozwoju sytuacji w trakcie przetwarzania.
Pierwszym krokiem w kierunku rozwiązania problemu stało się wprowadzenie
wielozadaniowości
(wieloprogramowości) systemów komputerowych. Systemy operacyjne zaczęto
konstruować tak,
aby mogły ładować do różnych fragmentów pamięci komputera wiele programów
jednocześnie
i wykonywać je kawałkami, przerzucając sterowanie od jednego programu do
drugiego wtedy, kiedy
wykonywany program musi na coś zaczekać (na przykład na transmisję
większego bloku danych):
program A program B program A program C program B
Wiązało się to z zaprojektowaniem systemu operacyjnego tak, aby skutecznie
radził sobie z:
a) zarządzaniem przydziałem pamięci; b) planowaniem przydziału
procesora programom.
Wielozadaniowość zmniejszyła średni czas przetwarzania pojedynczego zadania,
ale w dalszym
ciągu nie umożliwiła użytkownikom bezpośredniej współpracy z komputerem.
Rozwiązaniem
okazało się dopiero:
1) rozwinięcie technologii monitorów ekranowych (oszczędność ogromnej
ilości papieru);
2) konstrukcja systemów operacyjnych z podziałem czasu, czyli takich, w
których wielu
użytkowników może współpracować z jednym komputerem pozornie
jednocześnie w trybie
interakcyjnym (czyli w trybie wymiany komunikatów: polecenie
użytkownika - odpowiedź
systemu) korzystając z wielu podłączonych do komputera terminali
składających się z monitora
ekranowego i klawiatury (nieco później również myszy).
Konstrukcja dobrze działających systemów operacyjnych z podziałem czasu
okazała się bardzo
trudna. Tylko w najprostszych przypadkach można było stosować cykliczny
przydział równych
kwantów czasu wszystkim użytkownikom. Na ogół stosowany jest system
priorytetów zadań
i zmienna długość oraz kolejność przydzielanych odcinków czasu.
Współczesne rozwiązania i tendencje rozwojowe
1) Wielodostęp vs. komputery indywidualne
Ogromny rozwój technologii półprzewodnikowych i związany z nim gwałtowny
spadek cen
sprzętu komputerowego umożliwił pod koniec lat 70-tych produkcję małych
komputerów
dostępnych dla dużej liczby indywidualnych nabywców
(personal computer)
.
Początkowo były
one wyposażane w bardzo proste, jednozadaniowe systemy operacyjne
umożliwiające
gospodarowanie niewielkimi zasobami komputera. W następnych latach
komputery osobiste
zrobiły nieoczekiwanie dużą karierę, zaspokajając część zapotrzebowania na
moc obliczeniową
małych firm i prywatnych osób. Współczesne PC-ty mają moc obliczeniową i
pojemność pamięci
operacyjnej oraz zewnętrznej wielokrotnie przewyższającą zasoby większości
dużych komputerów
sprzed 20 lat.
Przeciwieństwem komputerów osobistych są teraz naprawdę duże
(wieloprocesorowe, o pojem-
ności pamięci operacyjnej rzędu gigabajtów) komputery wielodostępne
(mainframe)
. Oferują one
swoim użytkownikom czasowy dostęp do zasobów znacznie większych, niż w
PC-tach.
2) Systemy skupione vs. systemy rozproszone
We współczesnych dużych komputerach coraz częściej instalowanych jest wiele
procesorów, co
umożliwia: a) rzeczywiste (nie pozorne) wykonywanie zadań wielu użytkowników
jednocześnie;
b) realizację rzeczywistej (nie pozornej) współbieżności procesów wspólnie
pracujących nad
zadaniem obliczeniowym jednego użytkownika. Systemy komputerowe
wieloprocesorowe ogólnie
dzielimy na:
a) systemy skupione (ściśle powiązane) - procesory mają wspólną pamięć
operacyjną i zegar,
odległości pomiędzy elementami są niewielkie (wspólna obudowa);
b) systemy rozproszone (luźno powiązane) - procesory mają odrębne pamięci
operacyjne i są
taktowane oddzielnymi zegarami (czyli pracują asynchronicznie), mogą być
zarówno zbiorem
oddzielnych płyt umieszczonych we wspólnej obudowie
(cluster)
, jak i zbiorem
oddzielnych
komputerów połączonych kablami lub łączami telekomunikacyjnymi w sieć.
Konstrukcja zarówno systemów operacyjnych przeznaczonych dla
wieloprocesorów, jak i rozproszo-
nych systemów operacyjnych jest zadaniem bardzo trudnym i jest obecnie
przedmiotem wielu prac
naukowych.
Wskutek gwałtownego rozwoju technologii cyfrowych łącz telekomunikacyjnych w
ostatnich latach,
model sieciowy systemu komputerowego bardzo się rozpowszechnił i
prawdopodobnie jego znaczenie
będzie nadal rosło. Obecne komputery indywidualne często pełnią rolę terminali
inteligentnych, czyli
same przetwarzają takie zadania, które nie przekraczają ich możliwości, a w
przypadku zapotrzebowania
na większą moc obliczeniową lub pojemność pamięci komunikują się przez sieć
lokalną lub Internet
z dużymi komputerami, często zgrupowanymi w farmie serwerów. Terminale
mogą komunikować się
z serwerami w trybie tekstowym, ale coraz częściej komunikują się w trybie
graficznym - są wtedy
określane jako graficzne stacje robocze.
Zaletą systemów sieciowych jest zarówno lepsze wykorzystanie sprzętu, jak i
informacji przechowy-
wanych w pamięciach komputerów. Istotne są też aspekty niezawodnościowe i
komunikacyjne.
Podział systemów operacyjnych ze względu na czas reakcji
Systemy operacyjne pracujące w trybie wsadowym (bardziej ogólnie: programy
komputerowe,
których czas reakcji na podanie danych może być dowolnie długi) nazywamy też
systemami
pracującymi
off-line
. Ich przeciwieństwem są systemy, których czas reakcji musi
zmieścić się
w z góry określonych granicach (zazwyczaj systemy interakcyjne) - nazywamy je
pracującymi
on-line
. Szczególnym przypadkiem tych drugich są systemy, od których
wymagana jest praktycznie
natychmiastowa reakcja na dane (w każdym razie przed nadejściem następnych)
- nazywamy je
systemami czasu rzeczywistego
(real-time)
. Typowymi przykładami systemów
czasu rzeczywistego
są systemy sterujące procesami technologicznymi w zakładach przemysłowych.
Podsumowanie
Głównymi celami tworzenia systemów operacyjnych są:
1) wygoda użytkowników komputerów;
2) efektywność wykorzystania sprzętu komputerowego;
3) niezawodność pracy systemów komputerowych.