Notatki Šukasza Kidzi«skiego o wpªywie architektury komputera na

Transkrypt

Notatki Šukasza Kidzi«skiego o wpªywie architektury komputera na
Łukasz Kidzińskiego (234151)
Wpływ architektury procesora na system operacyjny (wstęp)
Wprowadzenie
Mimo że wpływ architektury jest w oczywisty sposób kolosalny: w końcu każdy program pośrednio
lub bezpośrednio korzysta z udostępnionych przez procesor instrukcji, które są bardzo zależne od
producenta. Co więcej każdy producent wymyśla coraz to nowsze ulepszenia swoich architektur. W
rezultacie przed twórcami oprogramowania stoi trudne zadanie: z jednej strony muszą tworzyć
programy niezależne od architektury, a z drugiej powinni wykorzystać jak najwięcej
architektonicznych dobrodziejstw.
Sposobów podejścia do tego tematu jest mnóstwo. W niniejszym postaram się wyjść od genezy
systemu operacyjnego – zrozumienie tego skąd on się tak naprawdę wziął wyjaśni nam w jaki
sposób wpływa na niego architektura i dlaczego ten wpływ jest tak ogromny.
Notatki te są uzupełnieniem (a miejscami rozszerzeniem) do pierwszej części (tj. wstępu)
prezentacji.
Rozwój architektury
Dane dotyczące cen podzespołów komputerowych:
Cena mocy obliczeniowej:
1959: 1 GLOPS kosztowałby 10^12 dolarów (należałoby wykorzystać 17 milionów jednostek IBM
1620)
2008: 1 GLOPS kosztuje ok. 20 centów w konsoli Play Station 3
Kiedyś przed komputerem stawiano zupełnie inne zadania, a to dlatego, że nie śniło się ludziom
stawiać zadania trudniejsze.
Każdy program był pisany dokładnie pod architekturę i bynajmniej przepisanie go nie sprowadzało
się do przekompilowania. Pierwsze komputery nie potrafiły wykonywać wielu zadań jednocześnie.
Nie potrafiły nawet wykonać automatycznie jednego zadania po drugim.
I wtedy też pojawiła się potrzeba stworzenia systemu
operacyjnego. Nie był to jeszcze śliczny Windows Vista, lecz
przełączarka zadań, której mówiono „wykonaj A, a potem B”, a
ona to właśnie robiła.
Lata 60te – rozkwit systemów
Jeśli za początek ery komputerów uznamy początek lat 50tych to
twórcy systemów operacyjnych dość znacząco zaskakują nas już dekadę później. Wtedy bowiem
pojawia się CTSS – Compatible Time-Sharing System. I bynajmniej nie bez przyczyny w nazwie
pojawia się „Time-Sharing”.
System pozwala współdzielić czas procesora, ma swój scheduler (zaimplementowany jako kolejka
wielopoziomowa). W działaniu wspiera go architektura (zmodyfikowany mainframe IBM 7094)
–
Wydzielenie 5 z 32kb pamięci operacyjnej specjalnie dla jądra systemu (pierwsza pamięć
chroniona)
Pojawiają się pierwsze przerwania zegarowe dzięki którym można podzielić czas wykonywania
danego procesu.
–
Instrukcje wyłapywane przez system operacyjny (np. exit)
System też musi zarządzać urządzeniami zewnętrznymi – CTSS obsługuje 6 urządzeń (w tym do
112 „dalekopisów” tj. terminali).
Kilka lat później pojawia się Multics – przodek Unixa. Wraz z nim przychodzi idea znana skądinąd
do dziś – patrzenie na wszystko jak na plik. Umożliwiło to wprowadzenie trochę większej
abstrakcji, tj. kolejny krok w do uniezależnienia sprzętu od aplikacji użytkownika.
Pojawiają się też kolejne problemy ze strony architektury
Maszyny wspierały tylko segmenty pamięci o rozmiarze 1MB. Trzeba było wymyślić sposób
radzenia sobie z większą ilością danych. Z drugiej strony zadanie było ułatwione o tyle, że 1MB
rzadko był wtedy osiągalny.
Pojawia się też stos dla każdego programu i każdego trybu. Wiele pomysłów jest realizowanych
programowo, ale właśnie te pomysły starają się później realizować projektanci sprzętu.
Lata 80te – rozkwit sieci komputerowych
1971 - Ray Tomlinson wysyła pierwszego w świecie maila
10 lat później pojawia się rozproszony system operacyjny Novell Nerware, który rewolucjonizuje
podejście do systemu plików. Architektura client-server pozwala na „file sharing instead of disc
sharing”.
Barkley sockets – teraz już nawet pisanie wiadomości przez kabel to pisanie do pliku.
Kolejne abstrakcje w systemach operacyjnych znów coraz bardziej oddzielają sprzęt od aplikacji
użytkownika.
Innym ciekawym rozwiązaniem, które pojawiło się w tym okresie był Lisp machine.
Komputer którego głównym językiem był język Lisp. Warto mieć na uwadze, że systemy
operacyjne oprócz funkcji zarządzania pamięcią mają za zadanie zwiększenie abstrakcji dla
piszących aplikacje – nie chcemy już pisać w assemblerze. Powstają języki programowania.
Powstają kompilatory które potrafią dostosować kod do konkretnej architektury.
Lisp machine wymagał zarówno wsparcia ze strony sprzętu jak i ze strony systemu operacyjnego.
Pomysł stworzenia maszyny zorientowanej specjalnie na język funkcyjny wydaje mi się niezwykle
ciekawy. Niestety nie jest to tematem. Zainteresowanych odsyłam wstępnie do
http://en.wikipedia.org/wiki/Lisp_machine
Co ciekawe, trwają również prace nad maszyną dedykowaną dla Javy.
Lata 90te – komputery osobiste
Mija 40 lat od powstania pierwszych
komputerów. Szybki rozwój powoduje, że to
co mieliśmy w starych mainframe'ach
możemy postawić sobie na biurku (o ile owe
biurko jest wystarczająco solidne by
udźwignąć 8kg, a portfel wystarczająco
pojemny by kupić zabawkę za $2,495 Macintosh 128K).
Okazuje się, że komputer nie musi w kółko do mnożenia macierzy – sprawdza się nawet jako
narzędzie do rozrywki.
Z początku, w komputerach typu Atarii mamy to co mieliśmy w dawnych mainframe'ach, tzn.
–
jednozadaniowość
–
prosty interpreter języka (tym razem BASIC)
–
brak systemu operacyjnego, bo szkoda zasobów
Apetyt rośnie w miarę jedzenia
Im więcej człowiek wymaga od systemu, tym lepsza musi się stać architektura.
Im lepsza staja się architektura, tym więcej funkcji w systemie.
Im więcej funkcji w systemie, tym więcej chce otrzymać użytkownik.
I tak w koło Maćku.
System nie może rozdzielić czasu dopóki nie wymyślono przerwania zegarowego.
System nie chroni procesów dopóki nie wprowadzono trybu chronionego.
System nie wyświetla grafiki 3D dopóki nie wprowadzono GPU.
Z kolei braki w architekturze muszą być nadrabiane przez system operacyjny:
System walczy ze ślamazarnością I/O poprzez odpowiednie kompilowanie kodu.
System zarządza zasobami komputera, bo architektura sama sobie z tym nie poradzi.
System stanowi interface pomiędzy sprzętem, a użytkownikiem. Człowiek, który np. chce znaleźć
minimum funkcji użyteczności z reguły nie chce się uczyć assemblera.
Pamięć
Podaż taniej pamięci ma dość specyficzny wpływ na system komputerowy.
Z jednej strony mamy oczywiste korzyści:
–
duża pamięć operacyjna pozwala nam uruchomić więcej programów
–
duże dyski twarde powodują, że nie musimy zaprzątać sobie głowy usuwaniem plików
–
można również tworzyć wszelkiego rodzaju statystyki i indeksy pomagające w wyszukiwaniu
albo nawet w algorytmach schedulera/branch prediction itp.
Z drugiej strony wraz ze wzrostem wielkości dysku nie
rośnie tak gwałtownie szybkość przesyłania danych. W
rezultacie pojawia się problem zwany „Wait state” przy
którym to procesor czeka na dane i traci czas który mógłby
wykorzystać lepiej. Do tej kwestii jeszcze wrócimy.
Ilustracja 1: wzrost objętości dysków
twardych w latach 1990-2008
Jak to jest we współczesnych systemach?
Dziś systemy operacyjne wykorzystują wiele z udostępnionych udogodnień. Postaram się wymienić
najważniejsze z nich, a następnie zastanowimy się dlaczego nie są wykorzystywane wszystkie
mechanizmy sprzętowe.
System operacyjny wykorzystuje:
–
zegar systemowy
–
specjalne atomowe operacje, jak np. test-and-set
–
przerwania i wyjątki
–
ochronę pamięci
–
tryb chroniony
–
chronione instrukcje
–
komunikacja I/O
–
bit trybu
–
TLB
–
tablica stron
Oprócz tego system może wykorzystywać rozwiązania specyficzne dla danej architektury. Np.
TSS
Trzyma informacje o zadaniu. Jest wsparciem sprzętowym dla zmiany kontekstu
–
Rejestr procesora
–
Uprawnienia wejścia/wyjścia
–
Wskaźniki do stosów
–
Link do poprzedniego TSS
Wszystkie te informacje są wyspecyfikowane przez Intela. Tym niemniej linux nie tworzy TSS dla
każdego procesu, a jedynie dla każdego CPU
PAE
Pozwala systemowi odwoływać się do pamięci większej niż 4GB na komputerach 32-bitowych.
Szczegóły na ten temat, jak i ogólnie na temat zarządzania pamięcią znajdą się w trzeciej części
prezentacji (poświęconej architekturom 32-bitowym i 64-bitowym)
MMX
Zestaw instrukcji wprowadzony przez firmę Intel. Przeznaczony do szybkiego wykonywania
podobnych operacji arytmetycznych na zmiennych całkowitych. Przydatny do algorytmów
związanych z obsługą multimediów. Zwiększał np. graficzne możliwości systemu.
Wady: System operacyjny musi dla MMX „emulować” stos.
3DNow!
Odpowiedź AMD na MMX. Operacje zmiennoprzecinkowe.
Działają analogicznie do zwykłych operacji arytmetycznych, więc system nie musi o niczym
wiedzieć – ułatwia to zdecydowanie tworzenie aplikacji kompatybilnych z tą technologią.
SSE
Odpowiedź Intela.
System decyduje czy dać użykownikowi możliwość korzystania z dodatkowych instrukcji. Jeśli nie
wie, że takie instrukcje architektura udostępnia to nic się nie dzieje.
Jak to jest z trybem chronionym?
W Intelach oprócz trybu użytkownika i trybu
chronionego wprowadzono dwa kolejne tworząc
czterostopniowy system ochrony jądra. Tryby te są
jednak używane stosunkowo rzadko.
Są dwa powody:
–
zmiana trybu jest bardzo kosztowna. Źle
wykorzystane skakanie pomiędzy trybami
mogłoby prowadzić do kolejnego zmniejszenia
efektywności.
–
nie wszystkie architektury obsługują 4 tryby.
Drugi powód jest bardziej ogólny. Tłumaczy on również po części dlaczego w Linuxie nie korzysta
się z TSS. Jako, że linux (jak i dowolny inny system) stara się przede wszystkim zapewnić
porządaną abstrakcję, łatwiej jest go dostosować do podobnych architektur. Jeżeli większość z nich
obsługuje 2 tryby, a jedna obsługuje 4, łatwiej jest korzystać tylko z dwóch.
Warto w tym momencie zauważyć, że ciągłe dodawanie/zmienianie/usuwanie instrukcji
emulowanie jednych drugimi w celu zachowania zgodności i tym podobne operacje bardzo łatwo
mogą prowadzić do tego, by architektura stała się bardzo złożona.
I tak jest w istocie. Architekturę x86 uznaje się za architekturę CISC, czyli o złożonej liście
rozkazów.
RISC vs CISC
Generalnie rzecz biorą pierwsze architektury były RISC'ami głównie ze względu na to, że
stworzenie złożonych rozkazów było technicznie niedostępne. Z czasem, gdy chcieliśmy jak
największą liczbę zadań przenieść z człowieka na maszynę, pojawiły się złożone instrukcje które
czasami np. realizowały pętle. W apogeum złożoności instrukcji powstawały właśnie takie maszyny
jak Lisp machine.
Miało to oczywiście swoje zalety, ale szybko okazało się, że ma także wady. Otóż wydajność
instrukcji złożonej była niższa niż szereg odpowiadających jej instrukcji prostych. W rezultacie
znów zaczęto odchodzić od złożonych instrukcji – postanowiono ogłupić nieco procesor na rzecz
jego szybkości. Tak powstała architektura RISC.
Tym niemniej dla zachowania zgodności nie dało się zrezygnować ze wszystkich CISCów.
Zauważono jednak, że i tak bardziej opłaca się sprzętowo przetłumaczyć instrukcję złożoną na
proste. Tak powstały nowe procesory x86.
Architektury RISC zawdzięczają swoją siłę m.in. potokowaniu instrukcji. Pozwolę sobie nie
wyjaśniać na czym to polega, gdyż wszystkich nas już tego na studiach uczono.
Wait state
Na koniec chciałbym przytoczyć jeszcze kilka szczegółów na temat jednego z większych
problemów z którymi projektanci systemów muszą się borykać, a mianowicie z Wait state.
W jaki sposób staramy się mu zaradzić?
–
instruction prefatch (pobieranie instrukcji do cache'u zanim jest ona potrzebna)
–
przewidywanie rozgałęzień (tworzenie różnych statystyk skoków itp.)
–
wielowątkowość (gdy jeden czeka, drugi może liczyć)
–
wykonywanie niezależnych instrukcji
–
hardware scout
Ostatnia z wymienionych technik polega na uruchomieniu dalszego kodu programu przy czym nie
w celu pobrania dalszych danych, a raczej w celu przewidzenia ewentualnych przyszłych skoków –
wyniki są pomijane.
Podsumowanie
Jak widać architektura z systemem operacyjnym idą niezmiennie w parze od ponad 50 lat. Dobrym
przykładem na to, jak silnym (przynajmniej ekonomicznie) może być to połączenie jest przykład:
Intel + Microsoft
Drugim nasuwającym się wnioskiem jest to, że historia uczy nas trochę przyszłości. Możemy już
teraz spodziewać się, że moc obliczeniowa niedawnych mainframe'ów zawita do naszych domów,
zaś komputery o mocy dzisiejszych desktopów niedługo będziemy mieć w kieszeniach. W raz z
nimi pojawią się analogiczne systemy operacyjne.
Bibliografia:
http://en.wikipedia.org/
http://www.x86-guide.com/
http://siyobik.info/index.php?module=x86
http://developer.intel.com/products/processor/manuals/index.htm

Podobne dokumenty