Systemy operacyjne,
powłoki systemu operacyjnego
W każdym komputerze lub systemie komputerowym istnieje obfitość (uciążliwych) zadań, którymi użytkownik nie chciałby sobie zawracać głowy. Obróbka tych (uciążliwych) problemów organizacyjnych wewnątrz komputera jest zadaniem systemu operacyjnego.
System operacyjny jest swego rodzaju strefą buforową miedzy oprogramowaniem stosowanym i przebiegami wewnątrz komputera. Rysunek wyjaśnia dokładniej to przejście od sprzętu w górę.
. Od sprzętu do rozwiązania problemu
Z punktu widzenia użytkownika system operacyjny nie jest więc niczym innym jak koniecznym środkiem pomocniczym, aby uwolnić użytkownika od:
wprowadzania-wydawania danych
zarządzania plikami
zarządzania pamięcią oraz
zarządzania zadaniami i procesami.
Zadania systemu operacyjnego
Zadaniem systemów operacyjnych jest skuteczne zarządzanie różnymi rodzajami i przebiegami pracy komponentów sprzętowych komputera.
System operacyjny jest zbiorem programów, który oddziela użytkownika od skomplikowanego sprzętu, a więc upraszcza użytkowanie i obsługiwanie komputera.
Wynika stąd, że nie istnieje żaden pełny opis zadań systemu operacyjnego. Na pewno jednak należą do tego zadania następujące:
wprowadzanie-wydawanie danych,
zarządzanie plikami (organizacja pamięci masowej),
zarządzanie pamięcią oraz
organizacja zadań i procesów.
Wprowadzanie-wydawanie danych
Wszystkie przebiegi biegną pod reżyserię systemu operacyjnego. Jeżeli na przykład. naciskamy klawisz podczas użytkowania systemu do przetwarzania tekstu, to naciśniecie wyzwala funkcję systemu operacyjnego „weź znak z klawiatury”.
Zarządzanie plikami
Jak szuka system operacyjny?
Zadaniem logicznym, opierającym się na zarządzaniu wejściem-wyjściem, jest zarządzanie wszystkimi danymi. Przy tym system operacyjny nie może stosować metod „chaotycznych”. Z zapytaniem
„Gdzie znajdę wyliczenie zapłaty dla Kowalskiego?”
system operacyjny może dać radę sobie tylko przez ściśle hierarchiczny porządek (rysunek ).
Jak użytkownik chciałby szukać?
Do zarządzania plikami należy jednak nie tylko umiejętność ustalenia, gdzie się odpowiednie dane znajdują, ale także dysponowanie nimi wtedy, kiedy są potrzebne. Komfortowe sposoby szukania rozwiązują to przez analogiczne, „maskowane” powłoki, na których można poszukiwać prawie „normalnie”. Jednak powłoki te są w rzeczywistości dodatkowymi „nakładkami oprogramowania”, które czynią sterowanie systemu istotnie wygodniejszym
Gdzie znajdę ... (jako system operacyjny)
Wewnętrzna struktura systemów plików
Wewnętrzna struktura systemów plików wygląda podobnie jak drzewo genealogiczne. Mówi się o hierarchicznej strukturze drzewiastej (rys.). Korzeń drzewa odpowiada plikowi korzenia (root). Nie ma on żadnej własnej nazwy. Węzły odgałęzień odpowiadają katalogom (directories). Na liściach znajdują się pliki (files). Nazwa pliku jest całkowicie i jednoznacznie opisana przez absolutna nazwę ścieżki. Absolutna nazwa ścieżki składa się ze wszystkich nazw katalogów, które leżą „na śladzie” od korzenia do szukanego pliku. Dlatego na rysunku absolutna nazwa pliku texta brzmi
/usr/roemer/asterix/texta.
Plik ten jest zresztą różny od
/usr/roemer/idefix/texta.
Oba należą do różnych katalogów! Wewnątrz jednego katalogu każda nazwa powinna pojawić się tylko jeden raz.
Katalog roboczy (working directory)
Każdy użytkownik ma podczas pracy przy komputerze ciągle aktualny katalog (working directory), w którym właśnie pracuje. Wewnątrz aktualnego katalogu (np. asterix) znajdujące się w nim pliki mogą być przywoływane bez kompletnych absolutnych nazw ścieżki. Wystarcza po prostu nazwa pliku. Dla przykładu na rys. oznacza to, że aby jednoznacznie przywołać plik:
dla aktualnego katalogu asterix
wystarcza sama nazwa pliku texta
zamiast absolutnej ścieżki pliku /usr/roemer/asterix/texta.
Uregulowanie prawa dostępu (password)
Do zarządzania plikami należy także uregulowanie praw dostępu. W większości systemów operacyjnych przed „wejściem” sprawdzane się, za pomocą hasła (password), uprawnienie do dostępu. Czytanie, zapisywanie i przetwarzanie plików może być przy tym oddzielnie udostępniane lub blokowane. Uprawnienia dostępu można ustalać oddzielnie dla
właściciela plików,
grupy, której członkiem jest właściciel, oraz
innych użytkowników.
Tylko właściciel pliku i zarządca systemu mogą zmienić uprawnienia dostępu.
Struktura drzewiasta systemu plików
Zarządzanie pamięcią
Innym centralnym zadaniem systemu operacyjnego jest zarządzanie pamięcią. Najprostszą tego formą jest sztywne segmentowanie.
Organizacja pamięci podczas segmentowania sztywnego
Większość systemów operacyjnych stosuje segmentowanie zmienne. Polega ono na „wsortowywaniu” procesów „nowych” - w zależności od wymaganego zapotrzebowania pamięci. Pamięć, jaką mamy do dyspozycji, jest wtedy fragmentowana (dzielona na części). Dlatego podczas skutecznego zarządzania pamięcią procesy są „zsuwane do siebie”, ścieśniane, upakowywane
Do zarządzania pamięcią należy również bieżące przydzielanie procesowi dodatkowej pamięci głównej, jeżeli takiej potrzebuje (dynamic memory allocation). Mamy do czynienia z takim przypadkiem wtedy, gdy ilość danych do przetworzenia nie jest ustalona z góry, ponieważ zależy na przykład od użytkownika.
Bardzo ważnym zadaniem jest ochrona obszarów pamięci przed niezamierzonym zlikwidowaniem. Jeżeli ochrona taka nie istnieje, to procesy, które są równocześnie w pamięci głównej, mogą sobie wzajemnie zniszczyć dane lub kod programowy, w ekstremalnym przypadku możliwe jest nawet zniszczenie samego systemu operacyjnego (jak na przykład w DOS).
Zarządzanie zadaniami i procesami
Do zadań systemu operacyjnego należy również zarządzanie zadaniami i procesami. Wchodzące „zamówienia” trzeba przetwarzać na przykład partiami lub według priorytetów. Podczas zarządzania procesami musimy mieć pewność, że „proces” obróbki pojedynczego programu w każdym stadium przebiegnie jednoznacznie i bez „zakleszczeń”. Mogą przy tym wystąpić następujące stany:
gotowy |
program mógłby biec, ale procesor nie jest wolny; |
aktywny |
procesor przejął program i obrabia go; |
oczekujący |
program żąda zdarzenia zewnętrznego w procesorze i jest przestawiany w stan „oczekujący”; procesor jest wolny dla innych procesów. |
Oczywiście mogą przy tym wystąpić problemy, na przykład:
Proces 1 oczekuje na zdarzenie A, które powinien wytworzyć proces 2.
Proces 2 oczekuje na zdarzenie B, które powinien wytworzyć proces 1.
W tym przypadku oba procesy pozostają (na zawsze, aż do wyłączenia komputera z sieci) w stanie „oczekujący”. Taka sytuacja nazywana jest zakleszczeniem (deadlock). Może ona wystąpić nie tylko podczas zarządzania procesami systemu operacyjnego, lecz także podczas koordynacji dwóch robotów, które oczekują na określoną czynność swego sąsiada. Warunki powstania takiego „zakleszczenia” są następujące:
Wykluczenie wzajemne: Kilka procesów żąda środków pracy w celu wyłącznego ich zastosowania.
Nieprzerywalność: Środki pracy zostały przydzielone (np. drukarce nie wolno np. „mieszać” różnych procesów na jednej kartce papieru).
Łańcuch oczekiwania: Procesy miały już środek pracy i czekają na inny.
Łańcuch zamknięty: Każdy proces czeka na środek pracy, który już został przydzielony następnemu procesowi w zamkniętych łańcuchach.
Typową sytuacją zakleszczenia w życiu codziennym jest ruchu kołowy, gdzie obowiązuje zasada „nadjeżdżający z prawej przed nadjeżdżającym z lewej”:
Wykluczenie wzajemne: Każde miejsce w ruchu kołowym może być zajęte tylko przez jedno auto.
Nieprzerywalność: Zajęte miejsce nie może przejściowo być zajęte przez inne auto.
Łańcuch oczekiwania: Każde auto ma już miejsce i czeka na miejsce przed nim.
Łańcuch zamknięty: Każde auto czeka na miejsce przed sobą, które już jest zajęte w łańcuchu zamkniętym.
Zakleszczenia można rozpoznawać, można ich unikać lub się im przeciwstawiać, jeżeli się je ciągle sprawdza. Problemy te mogą występować nie tylko w systemach operacyjnych, ale zawsze wtedy, gdy kilka maszyn i urządzeń jest powiązanych z komputerami. Dlatego przy wszystkich programach użytkowych już w stadium projektu należy zwracać dokładną uwagę na możliwe zakleszczenia. Do tego nadaje się między innymi sieci Petri'ego.
Rodzaje systemów operacyjnych
Przyporządkowanie do generacji komputera
Systemy operacyjne, zasługujące na tę nazwę, pojawiły się po raz pierwszy w komputerach drugiej generacji, a więc od roku 1958. Zawierały one:
szeregowe, automatycznie sterowane rodzaje pracy z jednym procesorem i jednym programem,
części systemu operacyjnego ciągle w pamięci roboczej (resident partition), oraz
zleceniowe sterowanie dla procesów wejścia-wyjścia.
Wraz z trzecią generacją komputerów (od roku 1968) dochodziły do tego stopniowo następujące elementy:
koncepcja kanałowa,
koncepcja przerwań,
koncepcja kolejek oczekiwania wejścia-wyjścia,
koncepcje skutecznego podziału pamięci,
nieprzerywalność biegnących programów,
obszerne rutyny szukania błędów, oraz
dzienniki (log book) do wykrywania czasów liczenia itd.
Dziś również systemy operacyjne komputerów osobistych mają prawie wszystkie te elementy. Prostsze systemy operacyjne stosuje się głównie w sterowaniach maszyn i urządzeń.
Dla obszaru komputerów osobistych najbardziej rozpowszechnionym w „świecie IBM” jest system operacyjny MS-DOS.
Charakterystyczne jest to, że większość systemów operacyjnych powiązana jest z określonymi wytwórcami. Jeżeli zdecydujemy się na określony system operacyjny, to z reguły wiążemy się zarówno z wytwórcą (czy grupą wytwórców) jak również z określonym „klockami” sprzętowymi. „Sławetnym” wyjątkiem jest system operacyjny UNIX a ostatnio LINUX.
Przykład UNIX-a
UNIX był pierwszym i długi czas jedynym rzeczywiście przenośnym i niezależnym od producenta systemem operacyjnym. Przenośność dotyczy kodu źródłowego, to znaczy tylko teksty programu napisane są w wyższym języku programowania dają się przenosić bez kłopotu. Trzeba je jednak na każdym komputerze na nowo tłumaczyć za pomocą właściwego kompilatora. Natomiast znany system operacyjny komputerów osobistych MS-DOS jest przenośny w „świecie Intela” w postaci kodu binarnego. Gotowe, przetłumaczone na kod maszynowy, programy są przenośne. Nie potrzebne jest żadne nowe tłumaczenie. Ale działa to tylko właśnie w świecie IBM/Intel.
System operacyjny UNIX powstał pod koniec lat 60-tych w firmie AT&T (porównaj rysunek ) i w wersji V.4 rozwinął się do wariantu znormalizowanego na całym świecie. Do tej normalizacji przyłączyli się wszyscy wytwórcy europejscy i amerykańscy. Było to w historii rozwoju komputerów zjawiskiem niespotykanym.
Jądro (kernel) systemu operacyjnego UNIX składa się z około 10 000 linijek języka C i około 500 linijek kodu maszynowego każdorazowej maszyny. Jądro realizuje przede wszystkim interfejsy urządzeń peryferyjnych, system plików i zarządzanie procesami. Użytkownik może dotrzeć do funkcji UNIX-a zarówno przez powłokę (shell), jak i przez wywołania systemowe wewnątrz programów użytkowych.
Historia rozwoju UNIX-a
Powłoka (shell) systemu operacyjnego UNIX jest programem interpretującym (opisującym) polecenia i leży, jak sama nazwa wskazuje, wokół systemu operacyjnego. Prowadzi ona dialog z użytkownikiem.
Język C jest wśród zastosowań UNIX-a najbardziej rozpowszechnionym językiem programowania. Łączy on właściwości wyższych języków programowania i języków bliskich maszynowym (na przykład asemblera) i nie jest przy tym zależny od maszyny. Jest on właściwie kluczem do przenośności UNIX-a.
5
powłoki
system operacyjny
rodzaje pracy
sprzęt
powłoka
(shell)
Powłoki bliskie systemowi operacyjnemu
stopień
zorientowania
problemu
kompiler
asembler
edytory,
inne programy systemowe
bazy
danych
środki opisu wyspecjalizowane problemowo
systemy
ekspertowe
metody
sztucznej inteligencji
techniki
wspomagania
komputerowego
(CA..)
wyspecjalizowane
Interfejsy człowiek-komputer
G
H
I
J
K
L
A
B
C
D
E
F
Płaszczyzny hierarchii:
budynek: główny
skrzydło: wschodnie
piętro: 31
pokój: 05
regał: 2
półka: 3
skoroszyt: M
wykaz (katalog): Kowalski
dokument: naliczenie wynagrodzenia
root
file
directory
usr
users
system
dev
roemer
idefix
asterix
texta
textb
textc
texta