Podíváme se na operační systém a jeho roli v počítači. Tento náš pohled bude hodně nízkoúrovňový.
Proč potřebujeme operační systém
Aplikace a holé "železo"
Programový model
-
aplikace má paměť celou pro sebe
-
co když se data nevejdou do paměti?
-
co když se kód aplikace nevejde do paměti?
-
-
aplikace má procesor celý pro sebe
-
musí umět komunikovat se všemi zařízeními (všech výrobců)
-
čipová sada, klávesnice, myš, disk, grafická karta, síťová karta
-
Jak se aplikace dostane do poměti?
-
aplikace pro načítání aplikací
-
sama musí být načtena pomocí programu v ROM (BIOS)
-
Co když chci při práci poslouchat hudbu?
-
ukončím textový editor, na chvilku pustím přehrávač hudby, po chvíli ho ukončím a spustím textový editor, po chvíli …
Více aplikací na holé "železo"
Programový model
-
více aplikací sdílí jednu paměť
-
kam do paměti se má nebo může aplikace nahrát?
-
co když jedna aplikace zapíše do paměti, kde jsou data nebo kód jiné aplikace?
-
co když je paměti málo
-
-
více aplikací sdílí jeden procesor
-
musejí se vzájemně volat, aby mohly běžet (kooperativní multitasking)
-
-
všechny aplikace \(\times\) všechna zařízení \(\times\) všichni výrobci
-
nebudou si aplikace "kecat" vzájemně do komunikace se zařízeními?
-
Co když chci při práci poslouchat hudbu?
-
textový editor musí každou chvilku zavolat nějakou funkci v přehrávači hudby, ta přehraje úsek skladby a vrátí se zpět
-
jak ví textový editor, že je přehrávač vůbec v paměti a kde?
-
jak ví textový editor, kterou funkci volat a jak?
-
Programový model
-
každá aplikace má "celou" paměť jen pro sebe (nebo si to myslí)
-
do paměti jiných aplikací nemůže, proto jim nemůže uškodit
-
paměti je "neomezeně" mnoho (omezení velikostí adres počítače)
-
-
každá aplikace má procesor jen pro sebe
-
procesor vykonává její instrukce, o ostatní aplikace se nestará
-
-
pro práci se zařízeními používá abstrakce
-
streamy, soubory, síťové sockety o ==== Co když chci při práci poslouchat hudbu?
-
-
textový editor a přehrávač běží "současně"
Abstrakce a systémová volání
The purpose of abstraction IS NOT to be vague, but to create a new semantic level in wchich one can be absolutely precise.
Účelem abstrakce NENÍ být vágní, ale vytvořit novou sémantickou úroveň, v níž můžeme být naprosto přesní.
https://en.wikiquote.org/wiki/Edsger_W._Dijkstra
Operační systém poskytuje abstrakci
Skrytí složitost hardwarového rozhraní
-
soubor, adresář, síťový socket, IP adresa, stream, datagram, datum, čas
-
block na disku je určen číslem stopy, povrchu a sektoru, číst nebo zapisovat je možné jenom posloupnost sektorů
-
síťová karta umí vysílat nebo přijímat pouze rámce (bloky dat) obsahující linkové adresy a data
-
-
nezávislé na konkrétní hardwarové platformě
Systémová volání
-
služby pro přístup k poskytovaným prostředkům
-
pro každý typ prostředků je definované rozhraní
-
-
podobné volání knihovní funkce v programu
-
proč není operační systém knihovna?
-
Co to je systémové volání?
Systémové volání je volání funkce operačního systému.
-
aplikace předá řízení operačnímu systému pomocí speciální instrukce nebo posloupnosti instrukcí
-
v registrech procesoru (a na zásobníku) je předán "popis" požadavku (číslo funkce a její parametry)
-
| MIPS | x86_64 | x86 |
|---|---|---|
add $a0, $t0, $zero |
mov eax, 101h |
movzwl 12(%esp),%eax |
Proč jsou potřeba speciální instrukce?
-
Běžné volání funkce v programu
-
překladač zná adresy funkcí v programu, při volání vygeneruje instrukci pro volání funkce s přímou nebo nepřímou adresou
-
-
Jak se liší systémové volání od volání funkce?
-
aplikace neví, na kterých adresách leží OS a jeho funkce
-
aplikace nemůže jen tak volat libovolný kód OS
-
OS je někde v paměti, ale není to knihovna spojená s aplikací
-
-
neznámá adresa \(\implies\) speciální mechanismus volání
-
způsobí výjimku (trap), při které procesor skočí na (aplikaci neznámou) adresu, kde má OS svoji obslužnou rutinu
-
-
mechanismus volání způsobí přepnutí režimu procesoru
-
kód OS běží v režimu s vyšší úrovní oprávnění
-
systémové volání umožňuje přechod přes hranici mezi uživatelským programem a operačním systémem
-
-
Ukázka použití systémového volání
Jednoduchý program "hello world" zapisuje do standardního výstupu (volá systémovou funkci write) a potom končí (volá systémovou funkci exit
Takto to funguje na Linuxu architektuře x86-64. Podrobnosti zde.
global _start
section .text
_start:
mov rax, 1 ; write(
mov rdi, 1 ; STDOUT_FILENO,
mov rsi, msg ; "Ahoj, studenti!\n",
mov rdx, msglen ; sizeof("Ahoj, studenti!\n")
syscall ; );
mov rax, 60 ; exit(
mov rdi, 0 ; EXIT_SUCCESS
syscall ; );
section .rodata
msg: db "Ahoj, studenti!", 10
msglen: equ $ - msg
-
Číslo systémového volání se ukládá do registru rax.
-
Argumenty systémové funkce se ukládají do registrů rdi, rsi, rdx, rcx, r8 a r9 v tomto pořadí.
-
Operační systém se volá instrukcí syscall
-
Návratová hodnota systémového volání je v registru rax, 0 je OK. Případná chyba je signalizována vrácením -errno (záporné číslo v rax).
$ nasm -f elf64 -o hello_studenti.o hello_studenti.s (1)
$ ld -o hello_studenti hello_studenti.o (2)
$ ./hello_studenti (3)
Ahoj, studenti! (4)
$
| 1 | Překlad pomocí assembleru nasm |
| 2 | Sestavení programu linkerem ld |
| 3 | Spuštění programu v terminálu Linuxu |
| 4 | Výstup programu. |
K čemu jsou nutná oprávnění
Přístup k hardwaru z jednoho místa - z operačního systému
-
žádná aplikace nesmí přímo komunikovat s HW
-
v robustním systému nelze spoléhat na "čestné" slovo
-
HW podpora pro zajištění exkluzivity přístupu pro OS
-
Uživatelský režim procesoru
-
procesor vykonává instrukce (aplikace), pokud narazí na privilegovanou instrukci, vyvolá výjimku
-
přístup do paměti, kam jsou mapována zařízení, popř. instrukce in/out
-
další instrukce nutné ke správné funkci OS (později)
-
Privilegovaný režim procesoru
-
pro běh OS — instrukce jsou vykonávány bez omezení
-
při návratu do uživatelského programu zajistí OS přepnutí procesoru zpět do uživatelského režimu
Izolace aplikací pomocí virtualizace
Vlastní procesor, paměť a zařízení pro každou aplikaci.
Vzájemná izolace aplikací
Zjednodušuje programovací model
-
aplikace má iluzi vlastní paměti, procesoru a zařízení
-
programátor nemusí explicitně řešit sdílení
Zvyšuje bezpečnost systému
-
aplikace si nemohou škodit (úmyslně či neúmyslně)
Zvyšuje míru využití prostředků
-
OS optimalizuje přidělování prostředků
Jak souvisí izolace s virtualizací?
-
poskytuje iluzi "soukromých" výpočetních prostředků
Virtualiace procesoru
Jak mohou aplikace a operační systém sdílet procesor(y)?
-
cíl: aplikace si myslí, že systém má neomezený počet procesorů
Řešení: sdílení procesoru v čase (time sharing)
-
přepínání kontextu (kontext switch) v pravidelných intervalech
-
preemptivní - aplikace "neuvolňuje" procesor, OS si ho vezme "násilím", což znemožňuje aplikacím si procesor "uzurpovat" pro sebe.
-
-
kontext architektury: programový čítač (Program Counter), registry procesoru
-
je uložen nebo obnoven při každém přepnutí kontextu
-
co obsah paměti?
-
-
kontext implementace: cache, prediktory skoků, …
-
při přepnutí kontextu se ignoruje nebo vynuluje (flush)
-
Operační systém musí zajistit přepínání kontextu
-
jediná harwarová podpora je přerušní od časovače
Virtualizace paměti
Jak mohou aplikace a operační systém sdílet paměť?
-
cíl: aplikace si myslí, že systém má neomezené množství paměti
Aplikace může požadovat více paměti, než je v systému…
-
rozsah kódu/dat aplikace může být větší než hlavní paměť
-
hlavní paměť se musí chovat jako cache
-
(pomalý) disk představuje paměť v následující úrovni hierarchie
-
velké bloky (stránky), write-back, write-allocate, LRU (aproximace)
-
Řešení
-
1. část: zacházet s pamětí jako s cache
-
data, co se nevejdou do operační paměti se ukládají na disk (swap file)
-
-
2. část: přidáme úroveň inderekce (překlad adres)
-
aplikace pracují s jinými adresami než hlavní paměť
-
Virtualizace zařízení
Jak mohou aplikace sdílet zařízení?
-
cíl: aplikace si myslí, že mají zařízení jenom pro sebe
Řešení: opravdové sdílení, pokud je to možné
-
speciální soubory, které je možné otevřít ve více aplikacích
-
znakové zařízení místo klávesnice, myší (umožňují číst data ze zařízení ve více aplikacích) nebo například zvukové karty (čtení i zápis dat ve více aplikacích, HW při zápisu mixuje zvuk z více zdrojů)
-
Řešení: posun na úrovni abstrakce
-
místo zařízení OS poskytne aplikaci objekt s jiným rozhraním a operace s objektem převádí na operace se zařízením
-
soubory a adresáře místo disku (přístup ke stejným souborům z více aplikací už je jiný problém), síťové sockety místo síťové karty
-
tisková služba (na úrovni dokumentů) místo tiskárny (spooling)
-
Architektura OS
Hlavní část OS tvoří jádro (kernel)
Jádro je také (jenom) program …
-
je vytvořeno běžnými postupy pro návrh a tvorbu složitého software
-
jenom chyby jou více fatální než u aplikačních programů
-
-
subsystémy pro různé funkce poskytované OS
-
rozdělení zodpovědnosti, zjednodušení návrhu
-
-
různá oprávnění pro různé subsystémy
-
zvýšená odolnost proti "zlým" programům
-
Vybrané subsystémy
Správa paměti
-
spravuje fyzickou paměť a implementuje virtuální paměť s využitím hardwarové podpory procesoru MMU (memory management unit)
Správa a plánování procesů
-
poskytuje abstrakci pro běžící aplikace ve formě procesů a vláken a plánuje jejich běh na sdíleném procesoru
Souborový systém (filesystem)
-
poskytuje abstrakci pro ukládání dat ve formě souborů a adresářů, převádí operace se soubory na operace s diskem
Síťový subsytém
-
poskytuje abstrakci pro komunikaci v síti ve formě síťových socketů, streamů a datagramů, převádí operace se sockety na operace se síťovou kartou
Ovladače zařízení
Nízkoúrovňová (low-level) komunikace se zařízeními
-
vyřizuje požadavky vlastních subsystémů (souborový systém, síťové sockety, …) na konkrétní zařízení (disk, síťovou kartu, …)
-
konfiguruje zařízení, posílá příkazy, čte stav, přenáší data
-
-
používá instrukce pro čtení nebo zápis do (necachované) paměti nebo speciální instrukce pro vsup a výstup (in/out)
-
HW tyto přístupy přenáší po sběrnici k zařízení na cílové adrese
-
Konfigurace zařízení
-
způsob signalizace stavu a přenosu dat
-
polling vs. interrupt driven I/O (číslo přerušení)
-
programmed I/O vs. DMA (busmastering, scatter/gather)
-
Obsluha výjimek a přerušení
Výjimky (exceptions, traps)
-
synchronní události, způsobené běžící aplikací
-
neplatná instrukce, dělení nulou, systémové volání (trap)
-
Přerušení (interrupts)
-
asynchronní události generované mimo procesor
-
časovač, I/O požadavek nebo dopověď, …
-
Mechanismus obsluhy je stejný pro výjimky i přerušení
-
při výjimce nebo přerušení procesor skočí na oslužnou rutinu (adresa či výběr adresy je určen architekturou)
-
OS uloží stav (registry) přerušeného programu na zásobník, analyzuje příčinu výjimky/přerušení a zavolá obslužnou funkce
-
OS obnoví stav přerušeného programu a vrátí se zpět tak, aby vykonávání programu pokračovalo od stejné/následující adresy
Architektura OS
Běhové uspořádání OS
-
jeden program — monolitické jádro
-
komunikace pomocí volání funkcí
-
-
minimální jádro \+ sada programů (subsytémy)
-
komunikace pomocí zpráv
-
Dilema při volbě architektury
-
izolace subsystémů vs. efektivita OS
-
vyšší režie při komunikaci mezi izolovanými subsystémy
-
souvisí s HW latencí při změně režimu procesoru
-
-
kompromis mezi odolností a efektivitou
-
základní typy architektur operačních systémů
-
Monolitická architektura OS
Jádro OS je tvořeno jedním programem
-
hlavní důraz na efektivitu
-
všechny subsystémy mají stejná oprávnění
-
nízká režie na komunikaci mezi subsystémy
-
nevylučuje modulární design
-
-
uživatelské programy mají minimální oprávnění
-
speciální instrukce na systémová volání mění oprávnění
-
nepoužívá se u "zavaděčů" typu CP/M, MS-DOS
-
Běžně používané systémy
-
Linux
-
Solaris
-
Windows
-
FreeBSD, OpenBSD, NetBSD
Mikrojádrová architektura OS
Minimální jádro + sada programů
-
důraz na bezpečnost a robustnost
-
subsystém jako oddělené aplikace (servery)
-
subsystémy mají pouze minimální oprávnění
-
příliš se neliší od uživatelských programů
-
-
jádro poskytuje pouze nejnutnější funkce
-
obsluha přerušení, komunikace mezi programy
-
při komunikaci je zajištěna kontrola oprávnění
-
Výzkumné a embedded systémy
-
MACH, SPring, Minix, …, QNX, L4, Fiasco,…
Volání služeb OS (i po síti)
Volání služby = zaslání zprávy.
-
zprávy mohou transparentně cestovat po síti
-
na rozdíl od lokálního přenosu mohou mít výrazně vyšší latenci, s čímž nemusí program počítat
-
Shrnutí
Operační systém vs. aplikační program
| Operační systém | Aplikační program |
|---|---|
privilegovaný program |
sladká nevědomost |
spravuje a přiděluje prostředky aplikacím |
neví nic o podrobnostech HW |
má přímý přístup k alokačním mechanizmům |
neví nic o ostatních programech (a OS) |
ví o všech běžících aplikacích |
alokace prostředků a přístupk zařízením pouze skrze OS |
přímo komunikuje se zařízeními (ovladače) |
|
ví o HW detailech nutných pro implementaci OS |
Role operačního systému
Abstrakce (extended machine)
-
ooděluje apliakce od low-lewel platformy
-
poskytuje abstrakce nezávislé na hardware
Izolace (isolation through virtualization)
-
OS vitualizuje procesor, paměť a zařízení
-
virtualizace umožňuje vzájemnou izolaci aplikací
Správa prostředků (resource manager)
-
OS přiděluje a řídí sdílení prostředků
-
CPU, RAM, přenosové pásmo, disková kapacita,…
-
-
maximální výkon systému jako celku při zohlednění potřeb jednotlivých aplikací