9. SYSTEMY OPERACYJNE DOS I WINDOWS
Systemy operacyjne wytwarzane przez firmę Microsoft bazują na procesorach
Intel i kompatybilnych
z nimi. Wyjątkiem od tej reguły jest system Windows NT, który posiada emulatory
listy rozkazów
32-bitowych procesorów Intel dla niektórych innych procesorów (w tym
procesorów o architekturze
RISC). Windows NT są zaprojektowane pod kątem zastosowań profesjonalnych w
zakładach pracy,
wszystkie pozostałe produkty (wcześniejsze i późniejsze) są zasadniczo
przeznaczone do zastosowań
amatorskich lub w niedużych, kilkuosobowych firmach.
Początkowe wersje systemów operacyjnych (w latach 80-tych) powstawały przy
współpracy z firmą
IBM. Najwcześniejszy produkt - DOS
(Disk Operating System)
, w wersji MS-DOS
1.00 powstał
w 1981 r. i był przeznaczony do pracy w komputerach zawierających procesor
Intel 8086 i nie
zawierających dysku twardego. Kolejne wersje DOS-a pojawiały się aż do
początków lat 90-tych,
osiągając numery 6.xx . Cały czas były to systemy jednozadaniowe, przeznaczone
do wykonywania
programów na komputerach klasy PC i wykorzystujących tryb rzeczywisty pracy
procesorów Intel.
Możliwości trybu chronionego udostępniane przez kolejne procesory Intel mogły
być pod DOS-em
wykorzystywane jedynie „niejawnie”. DOS mógł współpracować z prostym
protokołem sieciowym.
Najwcześniejsza wersja systemu DOS dysponowała prostym, jednopoziomowym
systemem plików
wzorowanym na wykorzystywanym we wcześniejszym systemie operacyjnym
CP/M. W późniejszych
wersjach pojawiła się hierarchiczna, wielopoziomowa struktura systemu plików
wzorowana na rozwią-
zaniu istniejącym w systemie Unix. Pojawiła się też możliwość wydzielania
dysków logicznych,
zwanych również strefami i oznaczanych pojedynczymi literami alfabetu (A: , B: ,
C: , ... ).
Kolejnymi „zdobyczami” systemu DOS (również wzorowanymi na rozwiązaniach
systemu Unix) były
zestandaryzowane strumienie danych i możliwość ich przekierowywania oraz
przetwarzanie potokowe
(ale tylko w wersji sekwencyjnej).
Zasadniczym interfejsem użytkownika systemu DOS był zawsze interfejs
tekstowy, udostępniający
zestaw komend wykonujących typowe czynności na plikach i katalogach (dir, cd,
type, copy, ... ).
Po pewnym czasie został on wzbogacony o komendy sterujące przydatne przy
tworzeniu prostych
plików wsadowych (odpowiedników uniksowych skryptów) - for, if, goto, shift
oraz call.
Dopiero na poczatku lat 90-tych do zestawu sterowników urządzeń DOS-a
dodano sterownik myszy
umożliwiający obsługę prostego interfejsu graficznego (podobnego do nakładki
Norton Commander).
Ponieważ DOS był oparty na trybie rzeczywistym pracy procesorów Intel, jego
obszar danych
i programów systemowych w pamięci operacyjnej nie był w żaden sposób
chroniony - użytkownik
mógł w każdej chwili dokonać odczytu lub zapisu w obszarze systemowym i
dowolnie zmodyfikować
lub uniemożliwić działanie systemu (co powodowało konieczność jego restartu).
System DOS rozpoczynając działanie korzystał ze zbioru podstawowych funkcji
obsługujących
urządzenia zewnętrzne zapisanych w pamięci stałej ROM, następnie uzupełniał
go o zbiór własnych
funkcji systemowych zapisywanych w pamięci RAM. Większa część funkcji
systemowych była
oficjalnie udostępniana programistom w postaci interfejsów do języków
Asembler, Basic, a nieco
później również Pascal i C (za podstawowy język był uważany Basic, którego
interpreter był
dołączany do każdej wersji DOS-a).
Niektóre istotne funkcje systemowe nie były oficjalnie opublikowane i
udokumentowane przez firmę
Microsoft (pod pozorem przewidywanych ich zmian w kolejnych wersjach
systemu), choć wiele firm
tworzących oprogramowanie znało je i wykorzystywało. Istniały też
nieudokumentowane struktury
danych systemowych (na przykład Lista List - LL).
Mapa obszaru pamięci wykorzystywanego przez system DOS w trybie
rzeczywistym:
Adres pola Długość pola Zawartość
00000 - 003FF 1 KB Tablica wektorów przerwań ROM BIOS
00400 - 004FF 256 B Obszar roboczy BIOS
Pamięć
00500 - 005FF 256 B Obszar roboczy DOS
konwencjonalna
0F420 - 9FFFF Programy systemowe i użytkowe
640 KB
A0000 - FFFFF Pamięć ekranu kart graficznych,
Pamięć górna
udostępniona też dla innych sterowników
384 KB
Powyżej adresu 1 MB pamięć może być wykorzystywana przez procesory
pracujące w trybie
chronionym. Istnieje biblioteka funkcji systemowych DOS umożliwiająca
wymianę bloków pamięci
umieszczonych w obszarze powyżej adresu 1 MB z blokami umieszczonymi
poniżej tego adresu
(wiąże się to z chwilowym przełączaniem procesora do trybu chronionego i z
powrotem w sposób
niewidoczny dla programów pracujących w trybie rzeczywistym), co udostępnia
programom
DOS-owym coś w rodzaju bardzo szybkiej pamięci zewnętrznej, na przykład tak
zwany RAM-disk.
Pierwsze graficzne interfejsy użytkownika oparte na systemie okien i
umożliwiające obsługę przy
użyciu wskaźnika (myszy) były opracowane przez firmę Xerox w 1981 r. i
przeznaczone dla terminali
dużych komputerów. Komputery osobiste były w tym czasie jeszcze zbyt ubogie
sprzętowo, aby
umożliwiać takie rozwiązania. Pierwszym systemem mikrokomputerowym
wyposażonym w interfejs
graficzny był Macintosh (1984 r.). W tym czasie Microsoft równolegle prowadził
własne prace nad
najwcześniejszą wersją systemu Windows (Windows 1.0 pojawił się w 1985 r. i miał
interfejs
graficzny, ale wykorzystywał tylko tryb rzeczywisty 8086) oraz, we współpracy z
IBM, nad systemem
operacyjnym OS / 2 (pojawił się w 1987 r. i wykorzystywał tryb chroniony 80286,
ale pierwotnie miał
tylko interfejs tekstowy, a graficzny uzyskał dopiero rok później).
Kolejne wersje systemu Windows pojawiające się pod koniec lat 80-tych
wykorzystywały już 16-bitowy
tryb adresowania procesorów Intel. Pierwszą wersją, która osiągnęła znaczący
sukces komercyjny, była
wersja 3.0 (pojawiła się w 1990 r.). W tym samym roku doszło do rozwiązania
współpracy pomiędzy
IBM (który przejął system OS / 2) i Microsoftem (który dalej rozwijał system
Windows). Windows 3.1
pojawiły się w 1992 r. i zawierały między innymi ulepszone sterowniki urządzeń
multimedialnych
oraz ulepszone programy biurowe (dysponujące różnymi zestawami czcionek i
mogące wymieniać
obiekty pomiędzy sobą).
Wersje 3.x systemu Windows wykorzystywały 16-bitowy tryb adresowania
oferowany przez procesory
Intel 80286 i 80386, dodatkowo od wersji 3.1 w górę mogły wykorzystywać
mechanizm stronicowania
pamięci udostępniany przez Intel 80386.
Algorytm zarządzania procesami w systemach Windows 3.x był algorytmem
niewywłaszczeniowym.
Programy użytkowe dostarczane przez producenta wraz systemem były tworzone
w taki sposób, aby
dobrowolnie przekazywały procesor innym procesom po upłynięciu określonego
czasu, natomiast
programy tworzone przez użytkowników miały możliwość „zawłaszczania”
procesora na dowolnie
długi czas.
Wszystkie systemy Windows dostarczają dość bogaty interfejs programisty API
(Application Program
Interface)
, który poza podstawowymi funkcjami systemowymi udostępnia też
funkcje obsługujące
elementy interfejsu graficznego - przesuwalnych okien o zmiennych rozmiarach,
menu rozwijalnych,
przycisków, okien dialogowych itp. Dostarczają też tekstowy interfejs użytkownika,
który wzorowany
jest na pierwotnym interfejsie DOS-a i może być uruchamiany zarówno w trybie
pełnoekranowym
(czyli trybie tekstowym sterownika karty graficznej), jak również w wielu oknach
tekstowych
symulowanych w trybie graficznym.
Procesory Intel o numerach 80286 i wyższych w ramach zapewniania
kompatybilności udostępniają
tryb rzeczywisty jako jeden ze swoich trybów pracy. Oznacza to, że programy
użytkowe przeznaczone
do wykonywania na procesorze 8086 mogą być wykonywane również na
procesorach o wyższych
numerach. Procesory te udostępniają również tak zwany tryb wirtualny 8086, w
którym wiele
programów przeznaczonych dla trybu rzeczywistego może być współbieżnie (z
podziałem czasu)
wykonywanych w oddzielnych przestrzeniach adresowych o pojemnościach 1 MB.
Własność tę wykorzystują systemy Windows, które umożliwiają wykonywanie (w
wielu oknach)
programów DOS-owych. Utrudnienie stanowi fakt, że niektóre programy DOS-
owe nie zawsze
korzystają z funkcji systemowych komunikując się z urządzeniami zewnętrznymi,
ale, w imię
przyspieszenia działania, bezpośrednio wykonują operacje na fizycznych portach
i lokatach pamięci
operacyjnej wykorzystywanych przez system. Takie programy nie mogą być
uruchamiane pod
systememami Windows, gdyż systemy te (jak wszystkie przeznaczone do pracy w
trybie chronionym)
zapewniają ochronę pamięci i sterowników urządzeń zewnętrznych.
Windows NT w wersji 3.1 pojawił się w 1993 r. i był pierwszym spośród
systemów Windows, który
wykorzystywał 32-bitowy tryb adresowania udostępniany przez procesory Intel o
numerach 80386
i wyższych. Był też wyposażony w emulatory procesorów intelowskich dla
niektórych innych
procesorów. Posiadał interfejs graficzny Windows 3.x. Z założenia był
przeznaczony do pracy
w sieciach lokalnych niedużych firm i miał mniejsze wymagania sprzętowe, niż
system Unix. Dużo
rozwiązań jest „żywcem” przeniesionych z systemu Unix do Windows NT,
również większa część
kodu jądra została napisana w języku C (utworzonym specjalnie dla Uniksa) oraz
C++. Jednocześnie
wiele wewnętrznych struktur jądra systemu Windows i funkcji systemowych jest
źle udokumentowa-
nych (lub w ogóle nieudokumentowanych).
W 1995 r. pojawił się Windows 95 - pierwszy 32-bitowy system Windows
przeznaczony dla
komputerów osobistych. Został on wyposażony w nowy interfejs graficzny
użytkownika (ale oparty
na podobnych do dotychczasowych wywołaniach funkcji systemowych, co
umożliwia wykonywanie
pod nim programów „okienkowych” napisanych dla Windows 3.x). Interfejs ten
został przejęty przez
kolejną wersję Windows NT - 4.0, oraz wszystkie kolejne wersje Windows
przeznaczone dla
komputerów osobistych (98, 2000, Millenium, XP, ... ).
Wszystkie wersje systemu Windows poczynając od Windows NT 3.1 oraz Windows
95 mają 32-
bitowy interfejs programisty Win32 API, ale umożliwiają też wykonywanie
programów napisanych
przy użyciu interfejsu DOS-owego i interfejsu 16-bitowego Win API (w takich
granicach, w jakich
pozwalają wymogi bezpieczeństwa - nie jest możliwe przełamywanie ochrony
pamięci i portów oraz
zawłaszczanie całego czasu procesora). W związku z poszerzeniem możliwości
adresowania
zwiększyły się też możliwości obsługi dużych plików na dysku i dysków o większej
pojemności.
Pomimo reorganizacji systemu plików nowe wersje Windows (poza NT) mogą
obsługiwać również
starsze systemy plików na wydzielonych dyskach logicznych. Pewnym problemem
stała się zmiana
DOS-owego interfejsu użytkownika tak, aby mógł obsługiwać dłuższe nazwy i
rozszerzenia nazw
plików (pod DOS-em nazwa mogła być co najwyżej 8-znakowa, a rozszerzenie - co
najwyżej
3-znakowe).
Wszystkie 32-bitowe systemy Windows implementują podział czasu i dysponują
wywłaszczeniowym
algorytmem szeregowania procesów. Gospodarowanie pamięcią operacyjną oparte
jest na mechanizmie
segmentacji stronicowanej.
Jedną z różnic organizacyjnych pomiędzy Windows w wersjach 16-bitowych i
Windows w wersjach
32-bitowych jest to, że te pierwsze przechowywały parametry uruchamiania
programów użytkowych
w oddzielnych plikach konfiguracyjnych (rozszerzenie ini) związanych z
poszczególnymi programami,
natomiast te drugie przechowują ustawienia we wspólnym obiekcie nazywanym
Rejestrem. Jest to
związane z faktem, że Windows 32-bitowe rozróżniają swoich użytkowników
(którzy muszą mieć
przydzielone nazwy i hasła, i logować się na początku sesji pracy, a wylogowywać
się na końcu).
Użytkownicy mogą mieć swoje indywidualne preferencje (wygląd ekranu, kolory,
czcionki itp.)
które system zapamiętuje i uwzględnia przy logowaniu i uruchamianiu programów
użytkowych.
Windows mogą korzystać z prostego protokołu komunikacyjnego Microsoft
Networking dla sieci
lokalnych (jest on protokołem nietrasowalnym i nie obsługuje systemu adresów
logicznych). Protokół
ten umożliwia wzajemne udostępnianie plików i urządzeń zewnętrznych w obrębie
sieci.
Dla wszystkich systemów operacyjnych firmy Microsoft zostały skonstruowane
programy obsługujące
protokół internetowy IP, jak również niektóre protokoły wyższego poziomu oparte
na IP. Nawet w trybie
rzeczywistym możliwe jest korzystanie (w trybie tekstowym) z usług ftp i telnet,
zaś pod Windows -
z przeglądarek internetowych oraz graficznych interfejsów ftp.
Systemy Windows NT są wytwarzane w wersjach Server (serwer) i Workstation
(stacja robocza).
Serwery NT instalowane są na sprzęcie o większych możliwościach i na ogół
przeznaczone są do
dostarczania usług sieciowych (serwer stron domowych, serwer ftp, serwer
poczty elektronicznej itp.).
W przeciwieństwie do systemów uniksowych, serwery Windows NT (do wersji 4.0)
nie umożliwiają
otwierania zdalnych sesji pracy użytkownikom nieuprzywilejowanym (zatem są
przez nich postrzegane
głównie jako serwery plików).
Systemy Windows NT charakteryzują się większym stopniem niezawodności i
bezpieczeństwa od
systemów Windows przeznaczonych dla indywidualnych komputerów PC (poza
2000 i XP). Dotyczy to
zarówno odporności na ataki w sieci komputerowej, jak i ochrony przed wadliwym
oprogramowaniem
i przypadkowym zniszczeniem danych (na przykład utratą części danych na dysku
w przypadku awarii).
Struktura systemów Windows NT jest warstwowa i wyraźnie izoluje warstwę
zależną od sprzętu
(rodzaju procesora) od warstw wyższych (operujących na obiektach logicznych). W
celu umożliwienia
wykonywania programów przeznaczonych dla innych (kompatybilnych) systemów
operacyjnych,
w strukturze Windows NT wyodrębniono tak zwane podsystemy środowiskowe,
emulujące
środowiska OS / 2, Windows 16-bitowych, DOS-a i środowisko zgodne ze
standardem POSIX.
Wszystkie wyżej wymienione podsystemy współpracują z podsystemem
środowiskowym Win32,
który jest najniższą warstwą wykonującą się w trybie użytkownika. Podsystem ten
komunikuje się
z wykonującym się w trybie uprzywilejowanym egzekutorem, który składa się z
modułów o nazwach:
- zarządca wejścia - wyjścia ;
- zarządca obiektów ;
- monitor bezpieczeństwa odwołań ;
- zarządca procesów ;
- zarządca pamięci wirtualnej ;
- udogodnienie wywoływania procedur lokalnych .
Pozostałymi (poza egzekutorem) częściami składowymi systemu wykonywanymi w
trybie uprzywile-
jowanym są:
- jądro systemu ;
- warstwa abstrakcji sprzętu
(Hardware Abstraction Layer, HAL)
.
Warstwa abstrakcji sprzętu umożliwia współpracę jądra z różnymi rodzajami
procesorów (w wersji
4.0 z układami zawierającymi nie więcej, niż 8 procesorów).
Jądro systemu Windows NT jest tak zwanym mikrojądrem, czyli zawiera
jedynie najprostsze,
najbardziej podstawowe kody funkcji systemowych (wszystkie pozostałe są już
realizowane jako
procedury w wyższych warstwach systemu i nie mają zagwarantowanej
niepodzielności wykonania).
Strony przechowujące kod i dane jądra nigdy nie są usuwane z pamięci
operacyjnej, a procesy jądra
nigdy nie podlegają wywłaszczaniu.
Jądro ma organizację obiektową, co oznacza, że ze strukturami danych jądra
(atrybutami) są
jednoznacznie związane zbiory funkcji (metod) operujących na nich. Wyróżniane
są dwa rodzaje
obiektów jądra:
- obiekty dyspozytora ;
- obiekty sterujące .
Wśród obiektów jądra Windows NT są zarówno procesy (ciężkie), jak i wątki.
Każdy proces
dysponuje pewną przestrzenią adresową, w której wykonuje się pewna liczba
(jeden lub więcej)
wątków. Wątki mają priorytety będące liczbami naturalnymi z zakresu 0 - 31.
Priorytety z zakresu
16 - 31 określają klasę czasu rzeczywistego wątków, a priorytety z zakresu 0 -
15 - klasę zmienną
wątków (choć system nie gwarantuje wątkom czasu rzeczywistego żadnych
limitów czasowych).
Obiekty dyspozytora są bezpośrednio związane z synchronizacją i zmianą
przydziału procesora. Są to:
- wątki (obiekty będące podstawowymi jednostkami szeregowania i wykonania);
- zdarzenia (obiekty odnotowujące fakt wystąpienia zdarzenia asynchronicznego);
- semafory, muteksy i mutanty (obiekty służące do synchronizacji wątków);
- czasomierze (obiekty mierzące czas wykonywania procedur i przerywające je w
razie potrzeby).
Do obiektów sterujących zaliczane są:
- procesy (obiekty zawierające informacje o właścicielu, priorytecie, przydziale
pamięci itp.);
- przerwania (obiekty kojarzące rodzaje zdarzeń z obsługującymi je
procedurami);
- obiekt stanu zasilania (odnotowuje, czy wystąpiła awaria) i obiekt informujący o
zasilaniu (wywołuje
procedurę obsługi w przypadku wystąpienia awarii);
- obiekty profilujące (mierzące czas wykonania wybranych fragmentów kodu - do
celów
diagnostycznych);
- asynchroniczne wywołania procedur (programowe przerwania wykonań
wątków).
Algorytm szeregowania wątków stosowany przez jądro systemu NT przywiązuje
dość dużą wagę do
sprawności wątków interakcyjnych, czyli takich, które obsługują procesy
bezpośredniego komuniko-
wania się użytkownika z systemem. Z tego powodu priorytety takich wątków
oczekujących w kolejce
do wykonania przyrastają szybciej, niż na przykład priorytety wątków
obsługujących komunikację
z urządzeniami dyskowymi lub sieciowymi.
Priorytet wątku zawieszonego wskutek upłynięcia przydzielonego kwantu czasu
zostaje obniżony do
poziomu priorytetu podstawowego (związanego z jego procesem). Priorytety
wątków klasy czasu
rzeczywistego nie ulegają zmianie. Każdy wątek klasy czasu rzeczywistego
umieszczony w kolejce
wątków gotowych do wykonania powoduje wywłaszczenie wykonywanego wątku
klasy zmiennej.
W systemach wieloprocesorowych wątki mogą oczekiwać na przydział dowolnego
procesora lub
wybranego procesora. Jeżeli w pewnym momencie pewien procesor nie ma
żadnego wątku, który
mógłby wykonywać, dyspozytor przydziela mu do wykonania tak zwany wątek
bezczynny
(idle)
.
Zarządzanie pamięcią stronicowaną bazuje na dwupoziomowej strukturze:
Katalog tablic stron procesu
Tablica stron nr 0 Tablica stron nr 1 Tablica
stron nr 1024
Strona Strona Strona
Strona Strona
4 KB 4 KB 4 KB 4 KB
4 KB
Zarówno katalog, jak i pojedyncza tablica stron mogą zawierać do 1024 wpisów.
Strona może przebywać w pamięci operacyjnej lub w pliku na dysku. Procesy
uprzywilejowane
mają prawo zabronić usuwania wybranych stron z pamięci do pliku. Strony
posiadają atrybuty, które
informują o stopniu ich ochrony (na przykład read-only).
Procesy mogą współdzielić obiekty pamięci, w których mogą mieć odwzorowane
fragmenty swoich
przestrzeni adresowych.
Rdzennym systemem plików systemów operacyjnych Windows NT jest NTFS.
System jest logicznie
podzielony na tomy
(volume)
. Każdy tom zawiera hierarchiczną (drzewiastą)
strukturę katalogów.
Jednostką przydziału miejsca na dysku są nie pojedyncze sektory, lecz całe ciągi
przyległych sektorów
nazywane gronami
(cluster)
. Wielkość gron jest ustalana na etapie konfiguracji
systemu (mogą być
przyjęte wielkości domyślne).
System plików na dysku jest obsługiwany przez program FtDisk, którego
założeniem jest uzyskanie
dużej odporności na skutki awarii systemu. Stosuje on kilka wariantów
(skomplikowanego) zapisu
na dysku przy uwzględnieniu pewnej nadmiarowości, która w razie awarii
pozwala odtworzyć
przynajmniej część zapisu z pewnego momentu przed awarią. W skrajnym
przypadku program ten
stosuje zapis lustrzany
(mirroring)
dublujący zapis każdej informacji przy
użyciu dwóch niezależnych
sterowników.
System NTFS posiada również wbudowaną możliwość kompresji danych w
poszczególnych plikach
w celu zaoszczędzenia miejsca na dysku.