3. PODSTAWOWE FUNKCJE SYSTEMÓW OPERACYJNYCH
Głównym celem istnienia systemu operacyjnego jest wygoda użytkowników
komputera. System musi
zatem umieć przyjmować polecenia od użytkowników i je wykonywać (lub
zgłaszać, że wykonać ich
nie jest w stanie, lub stwierdzać składniową niepoprawność wydanego polecenia).
Jedną z podstawo-
wych części składowych każdego systemu operacyjnego przeznaczonego do
bezpośredniego komuniko-
wania się z użytkownikiem jest interpretator poleceń (interpreter), który
współpracuje z użytkowni-
kiem w sposób interaktywny (konwersacyjny), czyli prowadząc z nim dialog.
Gdyby funkcjonowanie systemu operacyjnego porównać do funkcjonowania dużej
firmy, interpreter
poleceń pełniłby w niej rolę „biura obsługi klienta”.
Język porozumiewania się użytkownika z systemem musi podlegać pewnym
formalnym regułom
składniowym (gramatycznym). Projektanci systemów dążą do tego, aby język ten
był możliwie prosty
i wymagał jak najmniejszej wiedzy o konstrukcji systemu. Dlatego też zakładają
zawsze pewien
uproszczony, abstrakcyjny (tak zwany logiczny) model systemu komputerowego,
w którym są
pominięte różne nieistotne z punktu widzenia użytkownika szczegóły jego
fizycznej konstrukcji.
Podstawowy sposób prowadzenia dialogu użytkownika z interpreterem poleceń
to naprzemienne
wypisywanie tekstów (obecnie na ekranie monitora, kiedyś na papierze konsoli
operatorskiej).
Dążąc do maksymalnego uproszczenia porozumiewania się, w połowie lat 80-
tych zaprojektowano
pierwsze graficzne interfejsy użytkownika, które umożliwiają wydawanie
poleceń dla systemu bez
wypisywania tekstów, tylko poprzez wykonywanie operacji przy użyciu
wskaźnika
(pointer)
na
wyświetlanych na ekranie obiektach graficznych. Zaoszczędza to użytkownikom
konieczności
pamiętania składni poleceń tekstowych (która jest na ogół traktowana jako
uciążliwość) i przyspiesza
komunikację.
Tryb tekstowy wydawania poleceń w dalszym ciągu uważany jest jednak za
podstawowy tryb
porozumiewania się z systemem, gdyż daje dużo szersze możliwości, niż tryb
graficzny (na ogół
obejmujący tylko najbardziej „pospolite” czynności). Co więcej, tryb tekstowy
umożliwia
konstruowanie poleceń złożonych oraz tworzenie plików wsadowych
(skryptów) zawierających
całe ciągi poleceń, które na przykład rutynowo wykonuje codziennie
administrator systemu.
Pewną namiastką możliwości zapamiętywania ciągów poleceń w trybie
tekstowym jest możliwość
tworzenia makr w trybie graficznym.
Jakiego rodzaju typowe usługi są oczekiwane od systemu operacyjnego przez
użytkowników ?
Jest ich dużo, najbardziej typowe przykłady to:
1) ładowanie do pamięci i uruchamianie programów;
2) obsługa systemu plików (tworzenie i usuwanie plików i katalogów);
3) obsługa urządzeń zewnętrznych (na przykład drukowanie);
4) jeśli system jest wielodostępny, to umożliwienie otwarcia i zamknięcia sesji
pracy (zalogowanie
i wylogowanie się);
5) jeśli system jest sieciowy, to umożliwienie komunikacji w sieci (przesyłanie
plików, zdalne
sesje pracy, porozumiewanie się w czasie rzeczywistym);
6) jeśli system wielodostępny jest używany do celów komercyjnych, to
umożliwienie rozliczania się
z użytkownikami na podstawie rejestrowania wykorzystywania przez nich
zasobów systemowych.
Każda z tego rodzaju usług jest, z punktu widzenia programisty, czynnością bardzo
skomplikowaną.
W trakcie jej wykonywania system musi (w sposób niewidoczny dla użytkownika)
dbać o bardzo
wiele różnych jej aspektów - musi prawidłowo i bezkonfliktowo przydzielać zasoby
wielu procesom
wykonywanym współbieżnie, oszczędnie gospodarować pamięcią, chronić dane
przed zniszczeniem itp.
Ze względu na swój stopień komplikacji systemy operacyjne (tak jak każdy duży
program) mają
strukturę warstwową. Oznacza to, że konstrukcja ich opiera się na dużej liczbie
podprogramów,
które są uporządkowane hierarchicznie - na bazie zbioru najbardziej
podstawowych procedur oparte
są procedury wykonujące bardziej złożone czynności itd.
Ogólnie, zbiór podprogramów wykorzystywanych jako „elementy konstrukcyjne”
systemu
operacyjnego i wykonywanych w całości w trybie jądra systemu (czyli w trybie,
w którym mogą być
wykonywane operacje uprzywilejowane) nazywamy funkcjami systemowymi.
Najbardziej podstawowe
funkcje systemowe wykonujące bezpośrednio operacje na urządzeniach i lokatach
pamięci nazywamy
niskopoziomowymi.
Co najmniej część spośród funkcji systemowych może być wywoływanych z
poziomu procesów
działających w trybie użytkownika - następuje wtedy czasowe przełączenie z trybu
użytkownika
w tryb jądra i „fachowe” wykonanie żądanej usługi przez system operacyjny, a
następnie zwrócenie
sterowania do procesu użytkownika. Te funkcje systemowe, które są dostępne dla
programistów
tworzących programy przeznaczone do pracy w trybie użytkownika nazywane są
wywołaniami
systemowymi, a ich zbiór zaimplementowany w postaci biblioteki w konkretnym
języku
programowania (na przykład w C lub BASIC-u) - interfejsem programisty
w
danym języku.
Klasyfikacja rodzajów funkcji systemowych (według [A. Silberschatz
et al.])
1) Funkcje związane z nadzorowaniem procesów:
a) utworzenie, załadowanie, wykonanie, zakończenie (lub zaniechanie),
usunięcie procesu;
b) zawieszenie, wznowienie procesu;
c) pobranie, określenie (ustawienie) atrybutów procesu;
d) przydział pamięci, zwolnienie pamięci przydzielonej procesowi.
2) Funkcje wykonujące operacje na plikach:
a) utworzenie, usunięcie pliku;
b) otwarcie, zamknięcie pliku;
c) odczyt z pliku, zapis do pliku;
d) pobranie, określenie (ustawienie) atrybutów pliku.
3) Funkcje wykonujące operacje na urządzeniach:
a) żądanie przydzielenia urządzenia, zwolnienie urządzenia;
b) logiczne przyłączenie, logiczne odłączenie urządzenia;
c) odczyt z urządzenia, zapis do urządzenia;
d) pobranie atrybutów urządzenia, określenie (ustawienie) atrybutów
urządzenia.
4) Funkcje operujące na informacji systemowej:
a) pobranie czasu lub daty, określenie (ustawienie) czasu lub daty;
b) pobranie danych systemowych, określenie (ustawienie) danych
systemowych.
5) Funkcje komunikacyjne
a) utworzenie połączenia, usunięcie połączenia;
b) nadanie komunikatu, odebranie komunikatu;
c) nadanie, odebranie informacji o stanie połączenia;
d) przyłączenie, odłączenie urządzenia wymiennego.
Interfejs funkcji systemowych wykorzystują programiści (wymaga to dość
zaawansowanej wiedzy
technicznej), natomiast użytkownicy systemu komputerowego korzystają z
możliwości wydawania
poleceń systemowych interpreterowi poleceń, który prezentuje użytkownikom
znacznie prostszy
(będący na wyższym poziomie abstrakcji) logiczny model komputera.
Interpreter (przyjmujący
polecenia w trybie tekstowym lub w trybie graficznym) albo sam zajmuje się
obsługą wydanego
polecenia (jeśli jest to jego polecenie wewnętrzne), albo uruchamia w celu
obsłużenia go inny
program systemowy (mówimy wtedy o poleceniu zewnętrznym). W gruncie
rzeczy z punktu
widzenia interfejsu użytkownika nie ma różnicy pomiędzy wywołaniem i
wykonaniem polecenia
wewnętrznego, programu systemowego lub dowolnego innego programu
zainstalowanego lub
utworzonego przez użytkownika.
Polecenia systemowe w trakcie swojego wykonywania dokonują zazwyczaj wielu
wywołań
systemowych (na przykład otwarcie, odczyt i zamknięcie pliku).
Jest rzeczą w dużym stopniu umowną, jakie elementy określa się jako części
składowe systemu
operacyjnego. Przyjmuje się, że sterowniki urządzeń oraz jądro systemu
składające się ze zbioru
funkcji systemowych oraz abstrakcyjnych struktur danych, na których te funkcje
operują, stanowią
jego integralne elementy. Często przyjmuje się również, że programy
wykonywane na poziomie
użytkownika, ale standardowo udostępniane przez producenta wraz z jądrem
(interpreter komend
oraz stowarzyszone z nim programy, edytory tekstu, kompilatory, programy
konfiguracyjne i dia-
gnostyczne itp.) również stanowią elementy systemu.
Koncepcja maszyny wirtualnej
Systemy wielodostępne z podziałem czasu są konstruowane w taki sposób, żeby
ich użytkownicy
pracujący jednocześnie przy wielu terminalach nie mogli sobie wzajemnie
przeszkadzać. Często
system zapewnia wręcz poszczególnym użytkownikom całkowitą izolację od
innych tak, że mają
wrażenie, że są jedynymi użytkownikami komputera (co najwyżej nieco
wolniejszego i o mniejszej
pojemności pamięci). Taki logiczny obraz systemu z punktu widzenia
pojedynczego użytkownika
nazywany jest maszyną wirtualną. Każda maszyna wirtualna pozorowana przez
dany system
zapewnia taki sam interfejs programisty i interfejs użytkownika - umożliwia
wywoływanie funkcji
systemowych i ich wykonywanie w trybie jądra, udostępnia egzemplarz
interpretera komend oraz
innych programów realizujących polecenia systemowe, udostępnia wirtualny
dysk do zapisu plików
oraz inne wirtualne urządzenia zewnętrzne.
Wykonywanie programów na maszynach wirtualnych związane jest między
innymi z translacją
(przeliczaniem) adresów w wykonywanych instrukcjach programów tak, aby
niezależnie od
umiejscowienia programu we wspólnej pamięci fizycznej był on zawsze
wykonywany w taki sam
sposób, i nie powodował kolizji z innymi wykonywanymi współbieżnie
programami.