HISTORIA ROZWOJU I OGÓLNA CHARAKTERYSTYKA SYSTEMU UNIX
System operacyjny Unix w swojej najwcześniejszej wersji powstał w 1969 roku w
Bell Telephone
Laboratories - jednostce badawczej, której firmą macierzystą była
telekomunikacyjna firma AT&T.
Na jego powstanie miały wpływ prace nad projektem systemu operacyjnego
Multics prowadzone od
1965 roku wspólnie przez Bell Laboratories, General Electric Company i
Massachusetts Institute of
Technology (Bell Labs odstąpiły od tego projektu w 1969 roku). Multics z założenia
miał być systemem
wieloprocesowym i wielodostępnym, oferującym swoim użytkownikom dużą moc
obliczeniową i dużą
pojemność pamięci, jak również łatwość współdzielenia danych.
Najwcześniejsza wersja Uniksa była napisana przez K. Thompsona dla maszyny
PDP-7. Do pracy nad
systemem przyłączyli się D. Ritchie (biorący uprzednio udział w projektowaniu
systemu Multics), nieco
później B. Kernighan i inni pracownicy Bell Labs. Thompson i Ritchie opracowali
pierwotny system
plików Uniksa i nieduży zbiór prostych funkcji systemowych.
Pomysłodawcą nazwy Unix był B. Kernighan. Nazwa ta przez długie lata była
zastrzeżonym znakiem
towarowym firmy AT&T, nabytym dopiero w latach 90-tych przez firmę Novell.
Istotnym momentem w rozwoju systemu Unix było opracowanie przez D.
Ritchi’ego języka C (pod
wpływem opracowanego przez K. Thompsona języka B) i napisanie w 1973 roku
na nowo całego
jądra systemu w tym języku. Spowodowało to, że konstrukcja systemu stała się
przejrzysta i łatwo
przenośna na wszystkie komputery, dla których opracowano kompilator języka
C oraz sterowniki
urządzeń zewnętrznych udostępniające wirtualny obraz sprzętu oczekiwany
przez jądro systemu
Unix (tak zwaną maszynę wirtualną Uniksa). Od 1973 roku Unix stał się
nierozerwalnie związany
z językiem C - kompilator C jest dostępny w każdej wersji Uniksa i wszystkie
uniksowe biblioteki
systemowe mają interfejsy programisty w języku C.
Na początku lat 70-tych firma AT&T, nie mając prawa handlowania produktami
komputerowymi,
przekazała licencje systemu Unix innym firmom komercyjnym i uniwersytetom
amerykańskim.
Spowodowało to ogromną popularyzację systemów uniksowych i rozwój prac
nad ich ulepszaniem
w wielu ośrodkach uniwersyteckich. Największy wpływ na dalszy rozwój Uniksa
miały prace
prowadzone na Uniwersytecie Kalifornijskim w Berkeley - głównie prace
związane z pamięcią
wirtualną i mechanizmem stronicowania. Spowodowały one zainteresowanie
rządu amerykańskiego
projektem i wybranie Uniksa jako standardowego systemu operacyjnego dla
potrzeb rządowych.
Prace nad systemem Unix w Berkeley były finansowane przez rządową agencję
DARPA (Defense
Advanced Research Projects Agency)
, w dużym stopniu w związku z
zapotrzebowaniem rządu na
opracowanie i implementację protokołów sieci Internet pozwalających na
komunikację pomiędzy
lokalnymi sieciami komputerowymi opartymi na różnym sprzęcie i różnych
protokołach warstwy
łącza. Spowodowało to szybki rozwój systemów uniksowych jako sieciowych
systemów operacyjnych,
jak również rozwój samego Internetu, pełniącego początkowo rolę sieci służącej do
celów militarnych
i akademickich w Stanach Zjednoczonych.
Wersje źródłowe systemu Unix były udostępniane przez AT&T bez żadnego
oprogramowania użytko-
wego. Wiele firm produkowało swoje własne oprogramowanie dla systemów
uniksowych i sprzedawało
swoje produkty pod rozmaitymi nazwami kojarzącymi się z nazwą Unix, na
przykład Ultrix, Xenix itp.
Nawet duże firmy prowadzące własne prace badawcze, takie jak Hewlett-Packard,
DEC czy IBM
decydowały się na implementacje systemów zgodnych z systemem Unix.
Na przełomie lat 70-tych i 80-tych firma AT&T zdecydowała się na
wyprodukowanie własnej komer-
cyjnej wersji Uniksa - pierwsza taka wersja pojawiła się w 1982 roku pod nazwą
Unix System III.
Różne wersje Uniksów rozpowszechniane przez różne firmy i uczelnie były ze sobą
zgodne z punktu
widzenia zwykłego użytkownika, ale nie było pełnej zgodności pomiędzy ich
interfejsami programisty
(nie oferowały jednakowych zbiorów funkcji systemowych). Przy porównywaniu ich
własności
typowymi „punktami odniesienia” były najbardziej rozpowszechnione wersje
systemów z AT&T
(System III, a od roku 1983 System V) oraz z Berkeley
(BSD - Berkeley Software
Distribution)
.
Pierwszą szeroko rozpowszechnioną wersją Uniksa z Berkeley była wersja 4.2
BSD.
Ostatnią wersją utworzoną w Bell Labs była SVR4
(System V Release 4)
, zaś na
Uniwersytecie
w Berkeley - 4.4 BSD. Spośród innych wersji Uniksa najszerzej
rozpowszechnionych na świecie
należy wymienić system Solaris firmy SUN Microsystems. Istnieją również
systemy operacyjne,
które oferują nie-uniksowy interfejs użytkownika, ale są w dużym stopniu zgodne z
Uniksem pod
względem wewnętrznej konstrukcji - typowym przykładem jest system Windows
NT firmy Microsoft.
Różnorodność i rozpowszechnienie systemów uniksowych spowodowały podjęcie
prac nad międzynaro-
dową standaryzacją Uniksa. Standard taki został opracowany przez organizację
IEEE pod nazwą
POSIX
(Portable Operating Systems Interface)
. Standaryzacji uległ także język C
(ANSI C).
Rodziną systemów operacyjnych zgodnych z systemem Unix są też
rozpowszechniane (w niektórych
wersjach nieodpłatnie) systemy Linux. Najwcześniejsza wersja Linuksa została
napisana w 1991 roku
przez Linusa Torvaldsa (studenta z Finlandii) i udostępniona w Internecie. Była
przeznaczona dla
procesora Intel 80386. Prace nad Linuksem spontanicznie podjęła
międzynarodowa społeczność
informatyków w celu utworzenia pełnowartościowego, dostępnego dla wielu
różnych rodzajów sprzętu
i niezależnego od firm komercyjnych systemu operacyjnego zgodnego z normą
POSIX. Obecnie Linux
jest rozpowszechniany zgodnie z regułami GPL
(General Public Licence)
określonymi przez międzyna-
rodową organizację FSF
(Free Software Foundation)
. Reguły te pozwalają
kopiować i rozpowszechniać
programy podlegające licencji GPL i nakazują udostępnianie kodu źródłowego (nie
tylko kodu
binarnego) każdego takiego programu.
Obecnie istnieje wiele różnych odmian systemu Linux, przy czym każda z nich
pojawia się w wielu
coraz to nowszych wersjach. Najczęściej spotykane odmiany to Red Hat, Debian i
Slackware.
Uwaga
Z Linuksem może również współpracować oprogramowanie komercyjne (nie
podlegające licencji GPL).
Ogólne założenia projektowe systemów uniksowych:
- jak największa prostota, przejrzystość i hierarchizacja konstrukcji (nawet
kosztem optymalizacji
czasowej i pamięciowej);
- prosty i spójny logicznie interfejs użytkownika dostarczający wszystkich
podstawowych usług;
- dostarczenie narzędzi ułatwiających tworzenie bardziej złożonych programów
na bazie prostszych
programów;
- korzystanie z hierarchicznego systemu plików, w którym logicznym obrazem
zarówno plików, jak
i urządzeń zewnętrznych są niesformatowane strumienie bajtów;
- wielodostęp i wieloprocesowość (przy czym każdy użytkownik może
współbieżnie wykonywać
wiele procesów);
- ochrona plików i procesów poszczególnych użytkowników;
- ukrycie przed użytkownikami szczegółów sprzętu komputerowego, na którym
funkcjonuje system,
co umożliwia tworzenie oprogramowania łatwo przenośnego do innych
systemów uniksowych.
Ogólny diagram jądra systemu Unix ( według [M. Bach] ):
Programy użytkowników
Poziom użytkownika
Biblioteki
Poziom jądra
Interfejs funkcji systemowych
Podsystem Komunikacja
plików międzyprocesowa
Podsystem Przydział
Pamięć sterowania procesora
buforowa procesami Zarządzanie
pamięcią
Znakowe Blokowe
Programy obsługi urzadzeń
Sterowniki sprzętu
Poziom jądra
Poziom sprzętu
Sprzęt
Z punktu widzenia użytkownika system umożliwia mu komunikację poprzez
urządzenie zewnętrzne
zwane terminalem. Unix powstawał w czasach, gdy podstawowym rodzajem
terminala był dalekopis -
urządzenie elektryczne posiadające klawiaturę i umożliwiające drukowanie linii
tekstu na wysuwającej
się wstędze papieru. Urządzenie takie posiadało bardzo ubogie możliwości korekty
napisanego tekstu
i nie umożliwiało żadnego innego trybu pracy nad tekstem, niż kolejnymi
wierszami. Klasyczny
terminal uniksowy (w obecnych czasach traktowany jako abstrakcyjne urządzenie
symulowane przez
zestaw złożony z klawiatury i monitora ekranowego wyświetlającego tekst)
oznaczony jest symbolem
vt100.
W miarę ulepszania sprzętu komputerowego komplikacji ulegał również logiczny
obraz terminali
użytkowników. Terminal tekstowy vt102 obsługuje klawiaturę o większej liczbie
przycisków
funkcyjnych i umożliwia bardziej zaawansowaną edycję tekstu. Obecnie
dostępnych jest wiele rodzajów
terminali, z których prawdopodobnie najpopularniejszym i udostępniającym
najbardziej typowe funkcje
trybu tekstowego współczesnego sprzętu (przesuwanie kursora we wszystkich
kierunkach, różne kolory
znaków i tła, rozszerzony kod ASCII itp.) jest terminal ansi.
Unix dość wcześnie (w latach 80-tych) został wyposażony w możliwość obsługi
terminali graficznych
(X terminal)
udostępniających graficzny interfejs użytkownika
(Graphical User
Interface - GUI)
.
X terminal składa się z klawiatury, wskaźnika (myszy) i monitora ekranowego
wyświetlającego
informację w graficznym trybie okienkowym. Pierwszy uniksowy interfejs graficzny
został
opracowany w MIT przy wspólpracy z firmą DEC.
W klasycznych systemach uniksowych terminal tekstowy był terminalem
nieinteligentnym, czyli
urządzeniem obsługującym jedynie prosty protokół komunikacji z komputerem
(mainframe)
i nie
umożliwiającym żadnego lokalnego przetwarzania. Obecnie zazwyczaj
bezpośrednio z komputerem
połączona jest jedynie konsola operatorska
(console)
, a użytkownicy
współpracują z systemem
przy pomocy graficznych stacji roboczych, będących samodzielnymi
komputerami połączonymi
z systemem uniksowym poprzez sieć lokalną i komunikującymi się z nim przy
użyciu protokołu
graficznego
(X protocol)
.
Uwaga
Graficzny tryb pracy umożliwia otwieranie wielu okien tekstowych
(pseudoterminali) jednocześnie
na ekranie jednego terminala graficznego.
Jednym z najważniejszych programów systemowych jest interpreter poleceń,
przyjmujący i wyko-
nujący polecenia użytkownika w trybie tekstowym. Uniksowe interpretery poleceń
znane są pod nazwą
powłok
(shell)
. Istnieje kilka rodzajów powłok, wzajemnie zgodnych między sobą
w zakresie podsta-
wowych poleceń:
- shell Bourne’a (sh) - najstarszy, uważany za klasyczny, o najuboższych
możliwościach;
- C shell (csh) - powstał w Berkeley, w większym stopniu przypomina język
programowania C;
- shell Korna (ksh) - shell początkowo najczęściej używany w komercyjnych
wersjach Uniksa.
W związku z opracowaniem systemu Linux, w ramach projektu GNU powstała
nowa wersja shella
Bourne’a o nazwie bash
(Bourne Again Shell)
. Wersja ta zaadaptowała większość
najkorzystniejszych
cech wcześniej istniejących powłok i obecnie jest prawdopodobnie najbardziej
rozpowszechniona na
świecie.
Poszczególne powłoki posiadają swoje charakterystyczne znaki zgłoszenia
(prompt)
, po których łatwo
jest je rozpoznać. Znakiem zgłoszenia bash’a jest znak $ .
Zbiór poleceń dowolnej powłoki może nie tylko służyć do interaktywnej pracy z
systemem, ale
również służyć jako interpretowany język programowania. Oznacza to, że
użytkownik ma możliwość
tworzenia plików tekstowych zwanych skryptami
(script)
, które zawierają ciągi
poleceń powłoki
wykonywane po uruchomieniu skryptu jako kolejne instrukcje programu. Skrypty
nie podlegają
kompilacji (tak jak na przykład programy w C), ale kolejne polecenia są z nich
wybierane i oddzielnie
interpretowane przez system.
Polecenia wydawane przez użytkownika mogą być poleceniami wewnętrznymi
shella, czyli polecenia-
mi realizowanymi przez sam program powłoki, lub poleceniami zewnętrznymi,
czyli oddzielnymi
programami wykonywalnymi, których wykonanie interpreter jedynie inicjuje.
Jednym z założeń
projektowych Uniksa jest zatarcie różnicy (z punktu widzenia użytkownika)
pomiędzy wywołaniami
poleceń wewnętrznych, wywołaniami programów skompilowanych (binarnych) i
wywołaniami
skryptów, co ułatwia szybkie konstruowanie większych programów z pewnej liczby
mniejszych.
Użytkownik ma możliwość zmiany powłoki w trakcie pracy na inną, wywołując jej
nazwę (na przykład
ksh). Zakończenie pracy z daną powłoką i powrót do poprzedniej uzyskujemy
podając polecenie exit.
W przypadku skryptu również istnieje możliwość określenia, która powłoka
powinna go wykonać.
Jednym z rodzajów obiektów abstrakcyjnych, na których operują systemy
uniksowe, są użytkownicy
(user)
. Użytkownicy są zarejestrowani w systemie, mając przyporządkowane
nazwy
(login name)
i hasła
(password)
. Wśród użytkowników wyróżniony jest użytkownik
uprzywilejowany, którego
nazwą zawsze jest root. Użytkownik uprzywilejowany ma szczególne prawa - ma
dostęp do wszystkich
zasobów systemowych, w szczególności do plików innych użytkowników i do
przestrzeni adresowych
uruchamianych przez nich procesów. Użytkownik ten pełni rolę administratora
systemu.
Użytkownicy, chcąc współpracować z systemem uniksowym, muszą otworzyć na
nim sesję pracy.
W tym celu muszą zgłosić się do systemu (zalogować), podając swoją nazwę i
hasło. System przepro-
wadza autoryzację użytkownika, sprawdzając odpowiednią pozycję w pliku
haseł. W przypadku
pomyślnym przydziela zgłoszonemu użytkownikowi terminal i uruchamia związany
z danym termina-
lem proces interpretera komend (jest to tak zwany shell zgłoszony). Proces ten w
pierwszej kolejności
wykonuje swój skrypt startowy, ustalający różne szczegóły związane ze sposobem
współpracy
z użytkownikiem (na przykład tworzący ścieżki dostępu do częściej używanych
katalogów lub
rozbudowujący znak zgłoszenia).
Sesja pracy kończy się w przypadku podania przez użytkownika polecenia exit
shellowi zgłoszonemu.
Klasycznym trybem otwierania sesji jest logowanie się w trybie tekstowym,
przebiegające według
wyżej opisanego scenariusza. Użytkownik ma prawo otwierania wielu sesji
jednocześnie (chyba, że
administrator systemu wprowadzi ograniczenie liczby sesji), przy czym może je
otwierać zarówno
z różnych terminali fizycznych, jak też (jeśli oprogramowanie lokalnego
komputera na to pozwala),
z jednego komputera - na przykład w wielu oknach tekstowych otwartych w
trybie graficznym, lub
w pełnoekranowym trybie tekstowym - wtedy do przełączania pomiędzy sesjami
służą odpowiednie
kombinacje kluczy.
Współczesne systemy uniksowe umożliwiają również otwieranie graficznej sesji
pracy - w takim
przypadku oprogramowanie stacji roboczej użytkownika musi zawierać program
X serwera, który
komunikuje się z komputerem uniksowym przy użyciu X protokołu. Logowanie
odbywa się w trybie
graficznym, przy czym X serwer „zagarnia” na czas pracy cały ekran monitora
stacji roboczej
i przekształca ją w uniksowy terminal graficzny. Odpowiednikiem shella
zgłoszonego jest wtedy
zarządca sesji
(session manager)
.
Uwaga
Zazwyczaj możliwe jest również zalogowanie się do systemu uniksowego w trybie
tekstowym, a nas-
tępnie wykorzystywanie X serwera jedynie do odbioru wyjścia graficznego
programów uniksowych.
Programy uniksowe generujące wyjście graficzne wyświetlają je na terminalu
graficznym wyspecy-
fikowanym przez zmienną środowiska DISPLAY (jeśli sam program nie definiuje
swojego terminala).
Zawartość tej zmiennej:
adres_sieciowy_komputera : numer_terminala
Adres sieciowy jest nazwą (adresem) w protokole IP lub innym protokole, na
którym oparty jest
protokół graficzny. Numer terminala jest zazwyczaj zerem (chyba, że komputer
obsługuje wiele
zestawów do pracy w grafice). Adres sieciowy może być pominięty w przypadku
pracy bezpośrednio
na konsoli komputera uniksowego.
W przypadku zalogowania się w trybie graficznym zmienna DISPLAY jest jest
ustawiana automatycz-
nie. W przypadku zalogowania się w trybie tekstowym może ona być ustawiona
przez skrypt startowy
lub „ręcznie”. Użytkownik ma możliwość przyporządkowania zmiennej DISPLAY
innego adresu
terminala graficznego, niż swój własny, a tym samym skierowania wyjścia
graficznego swojego
programu do innego komputera (jeśli użytkownik tamtego komputera wyrazi na to
zgodę odpowiednim
poleceniem).
Ważną cechą wszystkich systemów uniksowych jest utrzymywanie informacji
wbudowanej
(manual)
zawierającej opisy wszystkich programów zainstalowanych w systemie oraz
wszystkich funkcji syste-
mowych. Informacja ta jest precyzyjniejsza, niż w innych systemach operacyjnych,
ma bardziej
techniczny charakter i ściśle określony format. Jest zorganizowana w postaci kilku
tomów, przy czym
pierwszy z nich zawiera opisy standardowych poleceń systemowych (polecenia
wewnętrzne są często
zgrupowane w jednym opisie programu interpretera komend), a dalsze - opisy
funkcji systemowych
i programów niestandardowych.
Polecenie wyświetlenia informacji:
man program
W przypadku, gdy polecenie (program) i funkcja systemowa mają tę samą nazwę,
należy podać numer
tomu, na przykład
man read
wyświetli opis polecenia systemowego read, natomiast
man 2 read
wyświetli opis funkcji systemowej read.
Opisy poleceń podają:
- nazwę polecenia;
- składnię jego wywołania, w tym wykaz możliwych opcji;
- liczbę i rodzaj argumentów;
- zwracaną wartość;
- opis działania;
- ewentualny wpływ na zmienne środowiska i zależność od zmiennych
środowiska.
Funkcje systemowe są opisane zgodnie z ich interfejsem w języku C. W opisie
podane są następujące
elementy:
- nazwa funkcji;
- nazwa pliku nagłówkowego biblioteki, w której jest umieszczona funkcja;
- typ wyniku;
- liczba, kolejność i typy argumentów funkcji;
- opis działania;
- wykaz możliwych sytuacji błędnych wraz z ewentualnymi wartościami zmiennej
globalnej errno.
Do każdego systemu uniksowego dołączona jest pewna liczba standardowych
programów, których
nazwy i działanie (z punktu widzenia użytkownika) są takie same we wszystkich
wersjach uniksów.
Poza wspomnianymi wcześniej powłokami (wywoływanymi przez podane polecenia,
przykładowo csh)
i kompilatorem języka C (wywoływanym przez polecenie cc) w każdym systemie
uniksowym występuje
edytor tekstu vi (jego interfejs jest uznawany przez wielu użytkowników za
prymitywny i niewygodny,
ale posiada on zaskakująco szerokie możliwości edycji).
We współczesnych systemach uniksowych poza standardowymi programami
działającymi w trybie
tekstowym dostępnych jest zwykle bardzo dużo programów użytkowych o
interfejsie graficznym -
edytory tekstowe działające w trybie graficznym, edytory graficzne, przeglądarki
internetowe, gry
komputerowe, odtwarzacze muzyki i filmów itd. - nie są one jednak
zestandaryzowane, a ich obecność
w systemie zależy od decyzji administratora i posiadanych zasobów.