SYSTEMY INFORMATYCZNE
SEMINARIUM
System Unix – architektura, funkcje i zastosowania.
Przygotował: Prowadzący:
Jakub Bernadowski Prof. Dr hab. Leszek Borzemski
III rok Informatyki (SiS)
Wydział Informatyki i Zarządzania
Spis Treści
1 • Historia 3
2 • Podstawy projektu 5
3 • Architektura systemu 7
4 • System plików 9
4.1 System plików od strony użytkownika 10
4.2 System plików od strony jądra 11
5 • System wejścia-wyjścia 13
6 • Zarządzanie procesami 15
6.1 Procesy interakcyjne 15
6.2 Procesy kolejkowane (batch processes) 15
6.3 Demony 16
7 • Planowanie przydziału procesora 16
8 • Interfejs użytkownika 17
8.1 Powłoki i polecenia 18
8.2 Standardowe wejście-wyjście 19
9 • Komunikacja międzyprocesowa 19
9.1 Potoki nienazwane 20
9.2 Potoki nazwane 20
9.3 Gniazda 21
9.4 Sygnały 21
10 • Krótki opis najpopularniejszych usług Unixa. 22
11 • Bezpieczeństwo w systemie Unix 23
12 • Przegląd powszechnie używanych systemów Unixowych 25
Pierwsza wersja systemu UNIX została opracowana w 1969 r. przez Kena Thompsona z zespołu badawczego Bell Laboratories, aby spożytkować bezczynną maszynę PDP-7. Do Thompsona dołączył wkrótce Dennis Ritchie. Thompson, Ritchie i inni członkowie tego zespołu opracowali wczesne wersje systemu UNIX.
Ritchie pracował uprzednio nad projektem MULTICS i ten właśnie projekt wywarł silny wpływ na nowy system operacyjny. Nawet nazwa „UNIX" jest kalamburem określenia MULTICS. Podstawowa organizacja systemu plików, pomysł potraktowania interpretera poleceń (powłoki - ang. shell) jako procesu użytkownika, użycie oddzielnego procesu do każdego polecenia, oryginalne znaki redagowania wiersza (# do kasowania ostatniego znaku i @ do kasowania całego wiersza) oraz liczne inne cechy pochodzą wprost z systemu MULTICS. Wykorzystano również pomysły z różnych innych systemów operacyjnych, jak CTSS z MIT oraz XDS-940.
Ritchie i Thompson pracowali nad systemem UNIX bez rozgłosu przez wiele lat. Praca nad pierwszą wersją systemu pozwoliła im na zaimplementowanie go na komputer PDP-11/20 w postaci wersji drugiej. Trzecia wersja powstała w wyniku przepisania większości systemu operacyjnego na język programowania systemowego o nazwie C, użyty zamiast stosowanego do tej pory asemblera. Język C opracowano w Bell Laboratories w celu zaprogramowania systemu UNIX. UNIX został także przeniesiony na większe modele komputera PDP-1l, takie jak 11/45 i 11/70. Podczas przepisywania systemu UNIX na język C oraz w związku z przenoszeniem go na komputery, które oferowały sprzętowe wsparcie wieloprogramowości (takie jak PDP-1l/45), rozszerzono go o wieloprogramowość i inne ulepszenia. Liczba instalacji w Bell Laboratories urosła do około 25 oraz powołano Grupę Użytkowników Unixa (ang. Unix System Group), której zadaniem było wspieranie systemu wewnątrz firmy.
W tym czasie AT&T nie mogło wypuszczać na rynek produktów komputerowych ze względu na podpisanie z rządem federalnym odpowiedniego dekretu w 1956 roku, lecz przekazało Unix uniwersytetom, które potrzebowały systemy do celów dydaktycznych. AT&T nie reklamowało, nie sprzedawało ani nie wspierało systemu w zgodzie z warunkami dekretu. Mimo to jego popularność systematycznie rosła. W 1974 roku Thompson i Ritchie opublikowali w Communications of the ACM artykuł opisujący Unixa, co przysporzyło mu kolejną rzeszę użytkowników. Do 1977 roku liczba instalacji Unixa urosła do około 500, z czego 125 na uniwersytetach. System zyskał popularność w firmach telefonicznych, jako że zapewniał dobre środowisko konstrukcji oprogramowania, usługi realizujące transakcje sieciowe oraz obsługę w czasie rzeczywistym. Licencje Unixa dostarczano zarówno instytucjom komercyjnym, jak i uniwersytetom. W 1977 roku firma Interactive Systems Corporation jako pierwsza zaczęła handlować Unixem rozszerzonym o udogodnienia do automatyzacji prac biurowych. W tym samym roku po raz pierwszy przeniesiono system na komputer inny niż PDP (tzn. zainstalowano go na innym komputerze dokonując tylko niewielu zmian – lub żadnych). Był to Interdata 8/32.
Coraz bardziej rosła popularność mikroprocesorów i coraz więcej firm przenosiło Unix na nowe komputery, a jego prostota i przejrzystość stanowiły pokusę dla implementatorów, którzy usprawniali system na swój sposób, co zaowocowało kilkoma wariantami systemu podstawowego. W okresie od 1977 do 1982 roku Bell Laboratories połączyło kilka wersji pochodzących z AT&T w jeden system, znany komercyjnie jako Unix System III. Nieco później w Bell Laboratories dodano do Systemu III kilka nowych udogodnień, nazwano nowy produkt Unix System V i w styczniu 1983 roku AT&T ogłosiło, że będzie oficjalnie wspierać Unix System V. Tymczasem jedna pracownicy Uniwersytetu Kalifornijskiego w Berkley dodali do Unixa kilka nowych interesujących udogodnień i zaimplementowali nową wersję systemu, której najnowszy wariant dla komputerów VAX nosi nazwę 4.3 BSD.
Historię Unixa przedstawia rysunek 1.
Rysunek 1. Historia Unixa.
Do początku 1984 roku na świecie było około 100000 instalacji Unixa, na komputerach o bardzo różnych możliwościach obliczeniowych, od mikroprocesorów do dużych maszyn, i na komputerach reprezentujących najróżniejszych producentów. Żaden inny system nie może się tym poszczycić. Można podać kilka powodów tej popularności i powodzenia systemu Unix Oto one:
· Jest napisany w języku wysokiego poziomu, dzięki czemu jest zrozumiały, łatwo się go czyta, modyfikuje i przenosi na inne komputery. Ritchie ocenia, że pierwszy system w C był od 20 do 40 procent większy i wolniejszy z tego względu, że nie był napisany w asemblerze, lecz korzyści z zastosowania języka wysokiego poziomu znacznie przeważyły te wady.
· Ma prosty interfejs, który umożliwia dostarczenie takich usług, jakich potrzebuje użytkownik.
· Zapewnia narzędzia, które pozwalają na budowanie złożonych programów z prostszych.
· Korzysta z hierarchicznego systemu plików, który ułatwia pielęgnację i efektywną implementację.
· Używa spójnego formatu plików, widzianych jako strumienie bajtów, dzięki czemu upraszcza pisanie programów użytkowych.
· Zapewnia prosty i spójny interfejs z urządzeniami peryferyjnymi.
· Jest systemem wielodostępnym i wieloprocesowym – każdy użytkownik może wykonywać równocześnie kilka procesów.
· Zasłania przed użytkownikiem architekturę komputera, dzięki czemu ułatwia pisanie programów, które są wykonywane w różnych środowiskach sprzętowych.
Filozofia prostoty i spójności leży u podstaw Unixa i to właśnie ona jest źródłem wielu z wymienionych cech.
Chociaż system operacyjny i wiele programów realizujących polecenia systemowe są napisane w C, systemy unixowe wspierają także inne języki, w tym Fortran, Basic, Pascal, Adę, Cobol, Lisp i Prolog. Unix może wspierać każdy język, dla którego istnieje kompilator lub interpretator i interfejs systemowy odwzorowujący żądania użytkowników dotyczące usług systemu operacyjnego w standardowy zbiór żądań dostępnych w systemach unixowych.
UNIX zaprojektowano jako system z podziałem czasu. Standardowy interfejs użytkownika (powłoka) jest prosty i może być zastąpiony przez inny, stosownie do potrzeb. System plików jest wielopoziomowym drzewem, w którym użytkownicy mają prawo tworzyć własne podkatalogi. Pliki danych każdego użytkownika są po prostu ciągami bajtów.
Pliki dyskowe i urządzenia wejścia-wyjścia są traktowane możliwie jednolicie. Toteż osobliwości i szczegóły związane z urządzeniami są tak dalece, jak tylko jest to możliwe, zawarte w jądrze systemu, przy czym nawet w jądrze większość z nich zamknięto w modułach obsługi urządzeń.
UNIX umożliwia wieloprocesowość. Proces może łatwo tworzyć nowe procesy. Planowanie przydziału procesora jest prostym algorytmem priorytetowym. W systemie 4.3BSD zastosowano stronicowanie na żądanie jako mechanizm wspierający zarządzanie pamięcią i podejmowanie decyzji o przydziale procesora. Jeśli systemowi zaczyna doskwierać nadmierne zastępowanie stron, to stosuje się algorytm wymiany.
Ponieważ system UNIX na początku miał służyć wygodzie jednego programisty, Kena Thompsona, do którego dołączył potem drugi - Dennis Ritchie, więc jest to system wystarczająco mały, aby można go było zrozumieć. W doborze większości algorytmów kierowano się prostotą, a nie szybkością lub wyrafinowaniem. Zamiar polegał na uzyskaniu jądra i bibliotek dających mały zbiór właściwości, lecz wystarczająco mocny, aby zainteresowani mogli zbudować na tej podstawie bardziej złożony system, gdyby powstała taka konieczność. Przejrzysty projekt systemu UNIX zaowocował wieloma naśladownictwami i modyfikacjami.
Chociaż projektanci systemu UNIX mieli sporą wiedzę o innych systemach operacyjnych, jego implementacji nie poprzedziło opracowanie starannie wyartykułowanego projektu. Ta elastyczność okazała się jednym z kluczowych czynników w rozwoju systemu. Przyjęto jednak pewne założenia projektowe, chociaż nie zostały one wypowiedziane na początku.
UNIX został zaprojektowany przez programistów dla programistów. W związku z tym od początku był systemem interakcyjnym. Udogodnieniom do opracowywania programów nadawano zawsze wysoką rangę. Do udogodnień takich należy np. program make (można go używać do sprawdzania, które pliki ze zbioru plików źródłowych programu należy skompilować, a następnie do powodowania ich kompilacji).
Większość kodu systemu operacyjnego UNIX jest napisana w języku C, który opracowano specjalnie w tym celu, ponieważ ani Thompson, ani Ritchie nie lubili programować w asemblerze. Unikanie asemblera było również konieczne ze względu na niepewność co do maszyny lub maszyn, na których UNIX miał pracować. Ułatwiło to wielce problem przenoszenia oprogramowania UNIX z jednego systemu sprzętowego na inne.
Opracowywane systemy UNIX od samego początku były dostępne bezpośrednio w postaci źródłowej, a ich twórcy mieli za podstawę działania systemy nie całkiem ukończone. Ten schemat postępowania znacznie ułatwiał tropienie i usuwanie niedociągnięć, jak również odkrywanie nowych możliwości i ich implementowanie. Doprowadziło to także do istniejącego obecnie nadmiaru wariantów systemu UNIX. Jednak zalety przeważyły wady: jeśli coś było nie w porządku, to można było to naprawić na lokalnym stanowisku, bez konieczności czekania na następne wydanie systemu. Poprawki takie, a także nowe udogodnienia można było włączyć do później upowszechnianych wersji.
Ograniczone możliwości komputera PDP-11 (i wcześniejszych komputerów używanych przez UNIX) wymusiły pewną elegancję. Podczas gdy inne systemy mają wyszukane algorytmy postępowania w warunkach patologicznych, system UNIX wykonuje po prostu kontrolowane załamanie, zwane paniką (ang. panic). Zamiast usiłować naprawiać takie sytuacje, UNIX próbuje im zapobiegać. Tam gdzie w innych systemach zastosowano brutalne metody lub rozwijanie makrowywołań, w systemie UNIX musiano postąpić znacznie subtelniej lub przynajmniej prościej.
Te wczesne zalety systemu UNIX przysporzyły mu popularności, która z kolei - rodząc nowe zapotrzebowania - wystawiła zalety te na próby. UNIX używano do zadań takich, jak organizacja pracy w sieciach, grafika i operacje w czasie rzeczywistym. Zastosowania te nie zawsze pasowały do oryginalnego, ukierunkowanego tekstowo modelu systemu UNIX. Wykonano więc kolejne zmiany pewnych właściwości wewnętrznych i pododawano nowe interfejsy programowe. Te nowe udogodnienia i inne interfejsy - zwłaszcza do pracy w systemie okien - wymagały wielkich ilości kodu, co radykalnie zwiększyło rozmiary systemu. Na przykład zarówno praca sieciowa, jak i systemy okien podwoiły rozmiar systemu. Z kolei ta sytuacja ukazała nieustającą siłę systemu UNIX. Gdy tylko w przemyśle pojawiało się nowe rozwiązanie, system UNIX z reguły wchłaniał je, wciąż pozostając sobą.
Podobnie jak większość systemów operacyjnych, UNIX składa się z dwu oddzielnych części: jądra i programów systemowych. Większość programów systemowych napisano w języku C, a dokumentacja pt. UNIX Programmer's Manual zawiera wszystkie funkcje systemowe w postaci funkcji języka C. Program systemowy napisany w języku C dla wersji 4.3BSD na komputerze VAX może być na ogół przeniesiony do innego systemu 4.3BSD i po prostu skompilowany, nawet jeśli te dwa systemy różnią się zasadniczo między sobą. Szczegóły odwołań do systemu są znane tylko kompilatorowi. Ta właściwość jest podstawowym źródłem przenośności programów systemu UNIX.
Na system operacyjny UNIX można patrzeć jak na system złożony z warstw, jak na rys. 2. Wszystko to, co znajduje się poniżej interfejsu funkcji systemowych i powyżej sprzętu fizycznego, tworzy jądro. W jądrze jest zrealizowany system plików, planowanie przydziału procesora, zarządzanie pamięcią i inne funkcje systemu operacyjnego, do których dostęp odbywa się za pomocą wywołań systemowych. W realizacji swoich działań, takich jak kompilowanie lub manipulowanie plikami, programy systemowe wspierają się odwołaniami do procedur jądra.
Rysunek 2. Diagram blokowy systemu Unix.
Wywołania systemowe określają interfejs programisty systemu UNIX. Zbiór ogólnie dostępnych programów systemowych definiuje interfejs użytkownika. Oba interfejsy definiują kontekst realizowany przez jądro. Jądro wykonuje różne operacje podstawowe w imieniu procesów użytkownika, wspierając w ten sposób interfejs użytkownika. Oto zestaw usług dostarczanych przez jądro:
· Sterowanie wykonaniem procesów, przez umożliwienie ich tworzenia, kończenia, zawieszania i komunikowania się.
· Sprawiedliwe szeregowanie procesów ubiegających się o czas centralnego procesora. Procesy korzystają z CPU na zasadzie podziału czasu – CPU wykonuje proces, jądro zawiesza go po upływie kwantu czasu i wybiera do wykonania inny, później wznawia wykonanie zawieszonego procesu.
· Przydzielanie wykonywanemu procesowi pamięci głównej. Jądro pod pewnymi warunkami umożliwia procesom współdzielenie części ich przestrzeni adresowej, lecz chroni prywatną część przestrzeni adresowej procesu przed niepowołanym dostępem z zewnątrz. Kiedy systemowi zaczyna brakować pamięci, jądro zwalnia pamięć przepisując proces czasowo do pamięci pomocniczej, zwanej urządzeniem do realizacji wymiany (ang. swap device). Jeśli jądro wysyła całe procesy na urządzenie pomocnicze to implementację Unixa nazywa się systemem z wymianą (ang. swapping system) Jeśli zaś zapisuje strony pamięci, to nazywa się ją systemem stronicującym.
· Przydzielanie pamięci pomocniczej na efektywne przechowywanie i odczytywanie danych użytkowych. Ta usługa obejmuje system plików. Jądro przydziela pamięć...
wep_2