hw-sw okruhy

Komentáře

Transkript

hw-sw okruhy
Řešení okruhů ze stránek FELu Tématické okruhy ke státní bakalářské zkoušce pro bakalářský studijní program Elektrotechnika a informatika Teoretická část společná pro všechny obory 1. Řešení soustav lineárních rovnic, Gaussův eliminační algoritmus. Vektorový prostor řešení homogenní soustavy. Lineární závislost a nezávislost vektorů, báze vektorového prostoru. (X01ALG) 2. Matice, základní operace s maticemi. Hodnost matice a Frobeniova věta o řešitelnosti soustavy lineárních rovnic. Inverzní matice, determinant. Lineární zobrazení, jeho reprezentující matice v dané bázi. (X01ALG) 3. Posloupnosti reálných a komplexních čísel. Vztah omezenosti a konvergence posloupnosti. Číselné řady, kritéria pro absolutní konvergenci. (X01MA1) 4. Funkce jedné proměnné, limita a spojitost. Derivace, její vlastnosti a význam. Souvislost derivace s průběhem funkce. Lokální a globální extrémy. (X01MA1) 5. Primitivní funkce, určitý integrál. Metody výpočtu: substituce a per partes. Užití a význam integrálu. (X01MA1) 6. Řady funkcí. Mocninná řada, poloměr konvergence. Rozvoj funkce v mocninnou řadu o daném středu. Fourierova řada, sinový kosinový a komplexní tvar. Periodické rozšíření funkce pomocí Fourierovy řady. (X01MA2) 7. Obyčejné diferenciální rovnice 1. řádu. Metoda separace proměnných. Lineární rovnice n‐
tého řádu s konstantními koeficienty. Variace konstant a metoda odhadu. Využití Laplaceovy transformace pro řešení soustavy diferenciálních rovnic. (X01MA2) 8. Mechanika ‐ Newtonovy zákony, otáčivý pohyb, zákony zachování. Rychlost, zrychlení, hybnost, síla. Kinematika a dynamika hmotných bodů a tuhého tělesa. Pohybová rovnice a její řešení. Otáčivý pohyb (momenty sil, hybností, moment setrvačnosti). Práce a energie. Mechanické zákony zachování. (X02FY1) 9. Fyzikální pole ‐ intenzita pole, potenciál, elektrické proudy. Pojem fyzikálního silového pole, popis pole pomocí intenzity a potenciálu; vztah mezi těmito veličinami. Gravitační pole a příklady jeho působení. Elektrické pole ve statickém případě. Stacionární elektrické pole. Elektrický proud a jeho hustota. Vedení elektřiny ve vodičích, kapalinách a plynech. Joulův zákon. (X02FY1) 10. Elektromagnetické pole a jeho energie, Maxwellovy rovnice. Maxwellovy rovnice v diferenciálním a integrálním tvaru s vysvětlením dílčích zákonů (Gaussova věta, Ampérův zákon, Biot‐Savartův zákon) na jednoduchých geometrických příkladech elektromagnetických struktur) ‐ nabité koule, vodič s proudem, vyzařování z otevřeného konce vedení. Síly a energie v elektromagnetickém poli, hustota energie. Pohyb částic v silových polích. Elektrické a magnetické vlastnosti látek. (X02FY1, X17TEP, X17VVE) 11. Elementy a analýza elektrických obvodů, rezistory, kapacitory, induktory, vázané induktory, obvodové rovnice ‐ Kirchhoffovy zákony, smyčkové proudy, uzlová napětí. (X31EO1) 12. Harmonický ustálený stav, fázory napětí a proudu, komplexní imitance. (X31EO1) 13. Analýza přechodných jevů, impulsní a přechodová charakteristika, přechodný děj v obvodech prvého a vyšších řádů. (X31EO2) 14. Kmitočtové charakteristiky, souvislosti mezi časovou a kmitočtovou oblastí, amplitudové a fázové kmitočtové závislosti. (X31EO2, X37SAS) 15. Obvody s rozprostřenými parametry, bezeztrátové nekonečné vedení, vedení konečné délky, odrazy vln. (X31EO2) 16. Základní vlastnosti polovodičů, elektronika číslicových obvodů. Přechod PN, bipolární tranzistory PNP a NPN, unipolární tranzistory JFET, MOSFET. Struktury hradel, charakteristiky, parametry. Spojení více hradel. Budiče sběrnic. Klopné obvody, paměťové buňky SRAM, DRAM, EPROM, EEPROM, FLASH. (X34ELE, X34ESS) 17. Algoritmus a jeho vlastnosti, způsoby vyjádření algoritmů. Proměnná, výrazy, řídící struktury, procedury, funkce, iterační a rekurzivní výpočty. Textové a binární soubory, ukazatele, statické a dynamické datové struktury. (X36ALG) 18. Programovací jazyky: Syntaxe a sémantika, standardní datové typy, strukturované datové typy pole; funkce, a jejich parametry, procedury. Strukturované programování. Jazyk C; základní datové typy, koncepce jazyka. (X36ALG) 19. Objektově orientované programování, objekty, třídy, dědičnost, polymorfismus, výjimky. Jazyk Java, základní datové typy, koncepce jazyka. (X36ALG) 20. Programovací techniky: Abstraktní datový typ, jeho specifikace a implementace. Datový typ zásobník, fronta, tabulka, strom, seznam. Základní algoritmy řazení a vyhledávání. Složitost algoritmů. (X36ALG) Tématické okruhy ke státní bakalářské zkoušce pro bakalářský studijní program Elektrotechnika a informatika Odborné tématické okruhy státní zkoušky bakalářského oboru Výpočetní technika Pro písemnou část zkoušky se zadávají 2 odborné otázky z výpočetní techniky:
•
•
1 otázka z technického vybavení počítačů, 1 otázka z programového vybavení počítačů. Otázky ze společných tématických okruhů mohou být použity v ústní části zkoušky jako
doplňující otázky nebo jako otázky mající návaznost na odborné otázky z výpočetní techniky.
Odborné tématické okruhy: Technické vybavení počítačů Pokryto předměty: X36LOB, X36SKD, X36APS, X36JPO, X36PZA, X32PTS, X36PKO
•
Kombinační logické obvody (X36LOB) Logické funkce a formy jejich popisu: ‐ viz kapitola 2.1 (strana 17) – hardware.pdf Důležité je to, že pro n vstupních proměnných můžeme nadefinovat celkem 2 na 2n logických funkcí. Jak jsme došli k tomuto číslu? Mějme vstupní písmeno, což je libovolná kombinace hodnot všech vstupních proměnných, např. abc při vstupních proměnných a,b a c. Těchto vstupních písmen je 2n (mějme tři proměnné ‐> tabulka má 8 řádků). No a u každého řádku může mít logická funkce 2 hodnoty: 0 nebo 1. Součet kombinací hodnot u jednotlivých řádků je tedy 2x2x2... No a to nám dává výsledné číslo. Logické fce můžeme popsat pomocí pravdivostní tabulky, logickým výrazem, mapou a seznamem indexů vstupních písmen (ale to teda nevím co je). Například mějme sčítačku, která je znázorněna na obrázku. a a b jsou vstupy sčítanců a p je přenos, s je součet a q je přenos do vyššího řádu. Výsledná funkce je dána následující tabulkou (a poté logickým výrazem): Princip konstrukce funkce (například pro s) je takový, že si vezmeme, kdy je s je rovno 1 a prostě jen popíšeme hodnoty všech vstupů. Toto je popis funkce tabulkou a logickým výrazem. Další možnost, jak funkci popsat, je pomocí mapy (viz. obrázek). Na obrázku výše je znázorněna karnaughova resp. svobodova mapa pro 4 vstupní proměnné a v políčkách očíslované jednotlivé řádky tabulky (například řádek 0 tabulky je hodnota funkce pro proměnné x0 x1 x2 x3 nebo např. řádek 1 je x0 x1 x2 x3 ). Takže akorát do jednotlivých políček tabulky napíšeme, jakou hodnotu má pro daný řádek (vstupní písmeno) výstupní funkce. indexy políček map odpovídají hodnotě binárního čísla získaného z proměnných (např. ¬DC¬BA ~ 0101 ~ index 5). Minterm ‐ součinový term (x1X2 ... xn), který obsahuje všechny vstupní proměnné. Maxterm ‐ součtový term (x1 + x2 + ... + xn), který obsahuje všechny vstupní proměnné. Každý minterm/maxterm nabývá logické hodnoty 1/0 právě pro jediné vstupní písmeno →
konstrukce booleovského výrazu pro logickou funkci f. Disjunktní forma (DF) ‐ výraz ve tvaru součtu součinů termů (abc + abc + abc) Konjunktivní forma (KF) ‐ výraz ve tvaru součinu součtových termů ((a+b+c)(a+b+c)(a+b+c)) Úplná normální DF ‐ výraz ve tvaru součtu mintermů. Úplná normální KF ‐ výraz ve tvaru součinu maxtermů.
Minimalizace výrazů: K minimalizaci lze použít například DeMorganovy zákony: a + b = a ⋅ b a a ⋅b = a + b nebo dále je možno použít pravidla Booleovy algebry. Příklad: ¬(a + b) + a + ab = ¬(a + b) + a . (1 + b) {distributivita} = ¬(a + b) + a . 1 {agresivita 1 vzhledem ke sčítání} = ¬(a + b) + a {neutralita 1 vzhledem k násobení} = ¬a . ¬b + a {deMorganův zákon} = ¬b + a {absorbce negace} Dále je možno minimalizovat funkci pomocí zjednodušení v mapách (pro málo proměnných) Postup: pravdivostní tabulka (případně standardní vyjádření) → mapa → přímé implikanty → nesporné implikanty → minimální pokrytí Co to znamená: •
•
•
implikant ‐ takový term, který implikuje funkci (pokud je 1, funkce je také 1) přímý implikant ‐ už ho nelze zvětšit nesporný implikant ‐ pokrývá term, který žádný jiný implikant nepokrývá V mapě se hledají tzv. maximální smyčky ‐ jsou to čtyřúhelníky obsahující množiny sousedních stavů. Obě strany smyčky mají velikost 2x, kde x je libovolné přirozené číslo (včetně nuly) a může být pro každou stranu jiné. Pro minimalizaci v mapě se více hodí Karnaughova mapa, protože sousední stavy odpovídají sousedním políčkům v mapě. například: Obrázek a) je snad jasný, obrázek b): např. x2 + x3 = x2 ⋅ x3 , prostě bereme ty pole, kde je funkce nulová a pak to děláme logickým součtem. Obrázek c) je podobný jako obrázek a). Další možností minimalizace je metoda Quine Mc Cluskey. Ta je dobře popsaná zde Realizace pomocí hradel, univ. modulů a pomocí paměti: Máme několik typů nejpoužívanějších hradel: AND,OR,NAND, NOR, XOR či invertor. viz. obr. Hradla NAND a NOR (každé samo o sobě) tvoří úplný soubor logických funkcí. To znamená, že pro realizaci libovolné logické funkce si vystačíme s hradly jednoho typu.Rychlost kombinačního obvodu je dána zpožděním dílčích logických členů tohoto obvodu. Dejme tomu, že máme k dispozici pouze hradla NAND a NOR, která se používají nejčastěji. V případě, že máme omezený počet logických vstupů hradel, je výhodné tyto rozložit na jednotlivé logické prvky. K tomu můžeme použít Rottovy mřížky. viz obr... Rottovy mřížky využívají De Morganových zákonů, rozdělme si jednotlivé prvky na obrázku takto: a = x3 , b = x0 ⋅ x2 a c = x0 ⋅ x1 ⋅ x2 , výsledkem příkladu je, že z kombinace a + b + c uděláme pomocí rottových mřížek a ⋅ b ⋅ c , tedy v obvodu budeme moci použít pouze jeden třívstupový NAND. Jako univerzální moduly pro realizaci log. funkcí můžeme použít dekodér či multiplexor. Dekodér má ty vlastnosti, že v jednom okamžiku může být pouze jediná výstupní proměnná nastavena na hodnotu 1. Která proměnná to bude, to záleží na vstupním písmenu. Tento dekodér se nazývá Dekodér z binárního kódu do kódu 1 z N. Aktivovaná výstupní proměnná dekodéru vždy jednoznačně určuje existující vstupní písmeno.Kombinační obvod se realizuje tak, že se vytvoří logický součet hodnot výstupních proměnných odpovídajících těm vstupním písmenům, které produkují jedničkovou hodnotu logické funkce. Multiplexor má ty vlastnosti, že adresové vstupy (a0 ... a2) určují výběr jednoho ze vstup x0 ...
x7, který má být přepnut na výstup f. Vstupní písmeno Xi přivedeme na adresové vodiče. Každému vstupnímu písmenu je jednoznačně přiřazen určitý vstupní vodič, tj. na tento vstupní vodič se připojí přímo ta výstupní hodnota, která je dle realizované logické funkce přiřazena danému vstupnímu písmenu. Realizace pomocí paměti? Typické kombinační obvody používané v číslicových počítačích, jejich návrh a realizace. XOR – platí a ⊕ b = ab + ab , hradlo vypadá podle obrázku takto... Prahová funkce – nabývá hodnoty 1, jestliže algebraický součet vah vi proměnných, které mají hodnotu 1, je větší nebo roven prahu k. neboli... kde n je řád prahové funkce a platí... Tedy ten řád je vlastně součet vah všech proměnných. Takže například funkce zadaná jako F52 (a, 2b, 2c) má práh 2 a řád 5, jednotlivé proměnné mají váhy 1,2 a 2. Její tabulka může vypadat například takto (viz následující strana): Souměrná prahová funkce je taková pragová fce, kdy všechny proměnné mají stejnou váhu. Majoritní funkce – je souměrná prahová funkce s lichým řádem a prahem.Platí u ní, že n ≥ 3 a k =
n +1
.Ve vzorcích majoritních funkcí platí například... 2
M 3 (a, b, a ) = b ... tedy řád funkce je 3 a práh je tím pádem 2 (podle vzorce výše), proměnné a a a budou mít dohromady vždy hodnotu 1, proto záleží pouze na proměnné b Typické kombinační obvody používané v počítačích jsou například dekodér, multiplexor, demultiplexor, sčítačka. Příklad dekodéru... Příklad multiplexoru... Princip multiplexoru je v použití adres a dekodéru, viz obrázek... intuitivní přístup při návrhu MUXu pomocí hradel může být například tento: Demultiplexor: opačný princip –jeden vstup, ale více výstupů. prostě vstupy (adresy) a1 a a0 určují drátek, na který přejde vstup x , jinak hodnota vstupu x se kopíruje na tento drátek. Realizace pomocí hradel může být například takováto... Poloviční sčítačka – její tabulka vypadá takto: Pomocí takovýchto půlsčítaček se dá vytvořit úplná sčítačka... Barel shifter Barel shifter je digitální obvod který může v jedné operaci pousnout data o definovaný /jakýkoli/ počet bitů. Je implementován podobně jako multiplexer: každý výstup může být spojen s jakýmkoli vstupem v závislosti na vzdálenosti pousunutí. Samozrejme zalezi na typu posunu (cyklicky/logicky/aritmeticky). Obvykle je realizovano seriovym zapojenim dvouvystupovych multiplexoru, ktere v jedne vetvi cislo ponechavaji a v druhe posunuji o 2^n mist (n=cislo Muxu), cimz se na konci dosahne pozadovaneho posunu. Hazardy v kombinačních obvodech. V důsledku toho, že všechny logické členy vykazují jistá zpoždění a v důsledku existence nestejně dlouhých paralelních větví kombinačního systému, vznikají na jeho výstupech přechodové děje, které reprezentují přechodné chyby. Všechny dynamické chyby se nedají bezezbytku eliminovat, např. se nemůže nastavit přesněstejná zpoždění ve všech větvích kombinačního obvodu, což se projevuje nesoučasnými změnami hodnot výstupních proměnných. Hazard je v podstatě krátká neoekávaná změna výstupního signálu. Statický hazard – výstup má být trvale 0 nebo 1, místo toho se objeví krátká změna hodnoty na opačnou. 0‐1‐0 je statický hazard v 0, 1‐0‐1 je statický hazard v 1. Příklad statického hazardu v 1. Z tabulky lze vidět, že pokud bude x i z rovno 1, měl by být výstup roven 1 bez ohledu na vstup y. Ale ouha, není to tak – viz další obrázek... Pokud náhle změníme y způsobí zpoždění rozdílných cest změnu hodnoty výstupního signálu. Jak se toto dá vyřešit?? Přidáme prvek xz do obvodu, tento prvek vidíme v mapě zvýrazněný fialovým kroužkem. Jak to vypadá poté s časovým diagramem, znázorňuje následující obrázek... Hazard sice zmizí, ale přesune se jinam. Dynamický hazard – K dynamickým hazardům dochází tehdy, jestliž při změně vstupní proměnné a současně stabilním stavu ostatních vstupních proměnných dojde vlivem fyzikálních vlastností logických členů k několikanásobné změně výstupní proměnné ačkoliv podle zákonů Booleovy algebry mělo dojít ke změně pouze jednorázové.Za dynamický hazard je vždy zodpovědný statický hazard, který se nachází v zapojení v některém z nižších bloků → pro vyvarování se dynamických hazardů, musíme v první řadě odstranit hazardy statické.Dynamické hazardy se nedají zjistit z map, ale pouze z časového diagramu. Dynamický hazard nevzniká v obvodech sestavených dle disjunktivní či konjunktivní formy, ale v obvodech realizovaných dle smíšených forem výrazu. . Hazardy v kombinačních obvodech nejsou kritické, protože se vstupy po nějaké (krátké) době ustálí na správných hodnotách. Jsou ale kritické u sekvenčních obvodů, kde mohou způsobit přejití do jiného stavu. Řěšením je zde synchronní návrh a správný výpočet maximální hodinové frekvence. •
Sekvenční logické obvody (X36LOB) Automatový model sekvenčních obvodů, typy automatů(Mealy, Moore). Rozdíl mezi sekvenčním a kombinačním obvodem je ten, že sekvenční obvod odvozuje výstupní písmena v závislosti na současných i předchozích vstupních písmenech. Obsahuje tedy paměťové členy. V paměťových členech je uložen předchozí stav. Výstupy paměťových členů se nazývají vnitřní proměnné. Sekvenční obvod znázorňuje následující obrázek. Sekvenční obvod se dá dobře popsat automatem. Na konečný automat můžeme pohlížet jako na model chování sekvenčních systémů. Jedná se o uspořádanou šestici A = (X; Y; Q;δ;λ;Q0). X ‐ vstupní abeceda Y ‐ výstupní abeceda Q ‐ množina vnitřních stavů δ‐ stavově přechodová funkce ‐ ke každé dvojici Xi;t;Qi;t¡1 přiřazuje příští vnitřní stav Qi;t
λ ‐ výstupní funkce ‐ definuje výstupní písmeno Q0 ‐ počáteční stav rozlišujeme automaty typu Moore a Mealy. U Moorova automatu závisí výstupní písmeno pouze na vnitřním stavu, do kterého automat přejde a ne na vstupním písmenu. viz. obr. To lze vidět i v tabulce na obrázku, kde výstupy jsou kódované ke stavům (pouze jeden sloupec u výstupů). Oproti tomu výstupní písmeno Mealyho automatu závisi na vstupním písmenu i vnitřním stavu. viz. obr. Zde má tabulka na obrázku u výstupů více sloupců, výstup totiž závisí na vstupu. Mealyho automat se dá přeměnit na Moora a opačně. Příklad na tyto automaty je např. na slidech 6 a 7 z LOB. Minimalizace množiny vnitřních stavů. Základem minimalizace je ekvivalence automatů. Dva automaty jsou ekvivalentní tehdy, pokud pro každou posloupnost vstupních sybolů mají na výstupu stejnou posloupnost výstupních symbolů. Dva stavy jsou ekvivalentní, pokud 1) oba mají pro všechny vstupní symboly stejný výstupní symbol, 2) Oba stavy mají pro všechny vstupní symboly ekvivalentní následné stavy. Postup minimalizace stavů: 1. Nakreslit implikacni tabulku (jen trojúhelník), jedna osa: Q0..Qk‐2, druhá osa Q1..Qk‐1< 2. Proškrtnu buňky QiQj, kde Qi a Qj mají různé výstupy (viz tabulka výstupů) 3. Do každé buňky QiQj opsat z tabulky přechodů DVOJICE nových stavů pro všechny hodnoty vstupů 4. Buňky QiQj, ve kterých má některá DVOJICE (v závislosti na vstupech, pokud je to Mealy) různé výstupy (viz tabulka výstupů) proškrtnu 5. Zkontroluju další návaznosti vnitřních stavů, případně proškrtám další buňky 6. Stavy Qi a Qj, které svoji buňku nemají proškrtnutou, mohu sloučit
Příklad na minimalizaci... Sestrojíme si k tomuto implikační tabulku... Ta se sestrojuje takto: nejdříve si vememe stavy, které mají stejné výstupy a pro tyto stavy vyznačíme v jejich společných polích tabulky dvojice jejich následný stavů. Tyto dvojice jsou pak kandidáty na sloučení do jednoho stavu. V našem příkladě to dopadá takto... Synchronní a asynchronní sekvenční obvody Synchronní režim ‐ V synchronním režimu je přechod mezi jednotlivými vnitřními stavy uskutečňován synchronizačními impulsy. Šířka impulsů musí být kratší než nejkratší přechodový děj v kombinační i paměťové části. Výhodou synchronizace je to, že není třeba dodržovat podmínku změny pouze jedné proměnné, neboť všechny paměťové členy jsou řízeny ve stejný časový okamžik krátkým synchronizačním signálem. Všechny přechody mezi vnitřními stavy jsou vázány na podmínku. Podmínkou přechodu může být jedničková úroveň hodinového signálu nebo náběžná/závěrná hrana hodinového impulsu...Jinými slovy... Synchronní sekvenční obvody mění svůj stav a výstupní hodnotu v diskrétních násobcích času, které jsou specifikovány nástupnou nebo sestupnou hranou jejich nezávisle běžícího hodinového signálu. Asynchronní režim ‐ V asynchronním režimu vystupuje diskrétní čas jako posloupnost bodů na časové ose, v nichž se mění kterákoliv vstupní, výstupní nebo vnitřní proměnná. Časové okamžiky se nazývají takty. Asynchronní režim pracuje v základním režimu, jestliže je zaručeno, že nová změna vstupních proměnných nastává až po ustálení stavů po předchozí změně vstupních proměnných. Asynchronní = nesoučasný. Dva nezávislé děje, které probíhají bez vzájemné vazby (žádný z nich nečeká na druhý). Návrh a realizace pomocí hradel a klopných obvodů a s použitím pamětí. viz například semestrálka z LOBů nebo slidy 6 a 7 z LOB. Příklad za všechny... Navrhněte SSO s jedním vstupem x a jedním výstupem y, který bude detekovat, zda jsou v tříbitových vstupních posloupnostech čísla 4 nebo 5. Na vstupu je nejdříve nejnižší řád tříbitového čísla. 1.
2.
3.
4.
5.
6.
7.
8.
graf přechodů z grafu uděláme tabulky pro přechodovou a výstupní funkci kódování a zakódované tabulky mapy minimalizace budící funkce pro vstupy klopných obvodů a výstupy realizace časování – výpočet maximální hodinové frekvence. ad 1): ad 2‐6) ad 7) Klopné obvody uchovávají hodnoty, které kódují číslo aktuálního stavu. Tyto hodnoty se poté přeposílají na vstup. Návrh pomocí paměti je na slidech 11 z LOB. Například chceme navrhnout sčítačku (3 čísla). Uděláme to tak, že se budou sčítat první tři bity adresy do paměti a v paměti bude vždy umístěna výsledná hodnota. Kupříkladu chceme sečíst 1+1+1, tedy adresa do paměti bude 111. Na této adrese bude umístěn výsledek součtu, tedy hodnota 11 (1+1=11 binárně). Základní typy klopných obvodů. Klopné obvody mohou být buď synchronní (synchronizované buď hranou logického signálu nebo hodin) a asynchronní (na vstupní písmeno reaguje obvod ihned). Dále je můžeme dělit na statické (tvořené hradly a při zastavení synchronizačních pulsů uchovávají svůj stav) a dynamické (paměťový prvek je tvořen kapacitami, po čase ztrácí svůj stav). Základní klopné obvody jsou: R‐S klopný obvod – má dva vstupy: SET a RESET a funkce nastav 0/1 a pamatuj. Jeho tabulka a vzhled jsou takovéto: u funkce P znamená, že si pamatuje hodnotu, při kombinaci 11 obvod závisí na předchozím stavu. Obvod RS může být buď asynchronní nebo synchronní. Ve druhém případě je do obvodu přiveden synchronizační signál a obvod plní své funkce, pokud tento signál je 1. JK klopný obvod – má dva vstupy a disponuje funkcemi pamatuj, zapiš 0/1 a překlop(neboli dej na výstup negaci Q). vypadá to následovně... D‐ klopný obvod – výstup obvodu kopíruje vstup. Vypadá to takto: T‐klopný obvod – je to vlastně JK klopný obvod, kde jsou vstupy J a K sloučeny do jednoho vstupu T. Má funkce pamatuj (T=0) a překlop (T=1). Vypadá takto... Výběr klopného obvodu Q Q(present) Q(next) S R J K T D 0 0 ‐ > 0 0 X 0 X 0 0 1 0 ‐ > 1 1 0 1 X 1 1 0 1 ‐ > 0 0 1 X 1 1 0 1 1 ‐ > 1 X 0 X 0 0 1 Klopný obvod si vyberu podle toho, jakou mám mapu, abych ji pokryl minimálně. Tam kde je v tabulce 1, tak musím pokrýt; 0 nesmím, X si můžu vybrat. Například pokud chci použít klopák RS, tak pro funkci R musím v mapě pokrýt všechny tlusté nuly, tenké můžu, pokud se mi to hodí. Jedničky nesmím pokrýt žádné. Programovatelné logické struktury (PLA, FPGA).…viz http://sweb.cz/fpga/ Při návrhu nějakého logického systému nemusíme vždy vytvářet speciální struktury realizující požadovanou funkci, ale můžeme využít relativně univerzální strukturu postavenou na bázi nějakého mikroprocesoru nebo mikroprogramovatelného obvodu. Požadované funkce dosáhneme vhodným obsahem paměti. Tímto máme zaručenu výhodu, co se týče rychlosti návrhu a také snadné pozdější modifikace požadovaného chování. Návrhy integrovaných obvodů: ƒ
zákaznický návrh ‐ při výrobě se vytvářejí speciální masky ƒ
polozákaznický návrh ‐ návrhář používá předem připravené a na čipu již rozmístěné funkční celky. Návrhář ovlivňuje pouze některé konečné fáze výroby → personifikace obvodu ƒ
oddělení personifikace obvodů od jejich realizace ‐ čipy typu FPLA, PLD, PAL. U těchto obvodů může být jejich vnitřní konfigurace definována mimo výrobní závod →
odpadá spolupráce návrhář‐výrobce. Spojovací body, které požadovaným způsobem konfigurují připravené dílčí buňky jsou realizovány jako: ƒ
tavné bipolární pojistky ‐ hlavní nevýhodou je pouze jednorázové programování, tj. není možná pozdější modifikace ƒ
tranzistory CMOS ‐ slouží jako řízení spojovacích spínačů. Po vymazání ultrafialovým světlem a novým naprogramováním lze měnit konfiguraci ƒ
bistabilní klopné obvody ‐ slouží jako řízení spojovacích bodů. Po vypnutí se však jejich obsah ztrácí → po zapnutí se musí program nahrát z trvale připojené paměti ROM. Případné změny lze provést výměnou nebo přeprogramováním připojené paměti PLA – Programmable Logic Aray – je to programovatelné pole logických jednotek (AND i OR). Je znázorněno na obrázku... Každé políčko na obrázku (jednotku) můžeme nastavit a takto pole naprogramovat. Funguje to podobně jako ten příklad s pamětí. FPGA – obsahují komplexní logické bloky (Programmable logic block ‐ PLB) propojené propojovacím systémem. Je zde možnost konfigurace uživatelem a to jednak co se týče funkce každého bloku, tak jejich propojení. Popis funkce je většinou na úrovni VHDL. Princip je opět podobný paměti...viz obrázek. Určení pracovní frekvence obvodu, metastabilita. Maximální frekvence se spočítá jako 1/Tkrit, kde Tkrit je maximální možné zpoždění obvodu (při kritické cestě) Metastabilita – je to souběh hrany vstupu a aktivní hrany hodinového signálu. Výstup není definován, protože je v zakázaném pásmu. Prostě zrovna při aktivní hraně hodin se mění hodnota logického signálu a to tak, že nelze jednoznačně říct, zda je v daném okamžiku hodnota 0 nebo 1. Vypadá to asi takto: Metastabilitu nelze úplně odstranit, protože většinou vstupují do systému nějaké vstupy, které nejsou sesynchronizovány s hodinovým signálem. Řešením je jejich vliv omezit tak, že je zkusíme sesynchronizovat nějakým klopným obvodem. Prostě nějak takto. •
Analýza a testování logických obvodů (X36LOB) Modely poruchy Spolehlivost ‐ je to obecná vlastnost objektu spočívající ve schopnosti plnit požadované funkce. Zabezpečení – pravdepodobnost, že všechny poruchy budou detekovány. Je třeba systémy testovat. Testovat se dá různě, například logickou sondou, testery, dá se testovat i na dálku. Typy testů – verifikace návrhu – ověřit zda návrh odpovídá požadovaným fcím, produkční test – ověřit, zda výrobky mají vlastnosti návrhu, provozní test ‐ lokalizace poruch a jejich odstranění. Když je vadný IO dopraven do továrny, je cena nalezení a vyřazení obvodu rovna c při vstupní kontrole, 10xc při testování desek, 100xc při testu systému a 1000xc při testování v provozu. Typy poruch: porucha funkční x porucha struktury, fyzikální x logická, statické (trvalá nula, jednička, zkrat, open circuit) x dynamické (rychlost, zpoždění...) Poruchy typu t – trvalá nula a trvalá jednička – prostě předpokládáme, že vodič dává pořad jen jednu hodnotu (to může být způsobeno třeba zkratem nebo rozpojeným obvodem) Poruchy trvale přerušeno –při obvodech CMOS – dochází k nim při přerušení řídících vodičů komplementárních tranzistorů – dojde k zapamatování předchozí informace a obvod se změní na sekvenční automat. Rozpoznání tšchto poruch je obtížné. citlivá cesta, metody detekce a lokalizace poruch‐ dobře vysvětleno na http://cs.felk.cvut.cz/~kubatova/WEB/alg.htm Testování – cílem (realistickým) je detekovat valnou většinu předpokládaných poruchových mechanismů. Primárním cílem je detekce a sekundárním lokalizace chyby. Metody testování – funkční testy, RTL testy, testování zaměřené na možné (pravděpodobné) mechanismy poruch – nejznámější z nich je metoda zcitlivění cesty. Metoda zcitlivění cesty: 1. volíme poruchu která má být detekována (dejme tomu předpokládáme poruchu typu t0) 2. do místa výskytu poruchy přivedeme opačnou hodnotu (zde 1) 3. z místa výskytu poruchy na primární výstup sestavíme citlivou cestu 4. odvodíme chybějící hodnoty proměnných na primárních vstupech 5. nalezneme všechny poruchy pokryté sestaveným krokem testu. Test je úplný, pokud detekujeme poruchy na všech primárních nevětvících se vstupecha za každým bodem větvení (i uvnitř obvodu). Obrázky jsou na slidech 13 LOB. Ask Jiraak! Automatické generivání testu – řeší se heuristicky prohledávání stromové struktury obvodu směrem ke vstupům a výstupům tak, aby se v nejkratší době dosáhlo vytvoření citlivé cesty. Po každém kroku generování vzorku je třeba provést poruchovou simulaci obvodu, aby se zjistily všechny poruchy, které jsou vzorkem detekovány. Testování sekvenčních obvodů – je složitější než testování kombinačních, možná poruchová struktura může být velmi složitá. Algoritmy automatického generování jsou účinné jen do omezené složitosti obvodů. Design for Testability – prostě zakomponujeme obvody pro testování/pozorování do návrhu systému již při výrobě. Poté bude testování jednodušší a levnější. •
Základní principy organizace počítačů (X36JPO, X36SKD) Von Neumannova a Harvardská architektura a funkce hlavních jednotek. Počítač se skládá z těchto základních komponent: aritmetická jednotka (AJ, ALU), řadič, hlavní paměť (HP), vstupní a výstupní zařízení. Mezi těmito zařízeními proudí buď data nebo řídící signály. Funkce jednotlivých jednotek jsou takovéto: Aritmetická jednotka – provádí základní logické operace a základní operace s čísly v pevné řádové čárce. Nepracuje však s čísly v pohyblivé řádové čárce. Tyto operace zajišťuje buď FPU nebo jsou tyto operace realizovány programem. Řadič – načítá strojové instrukce, dekóduje je a řídí činnost procesoru při jejich provádění. Provedení instrukce spočívá v mnoha dílčích operacích (tzv. mikrooperace). Programu který řídí činnost řadiče se říká mikroprogram. Paměť – jsou v ní uložena data programů či nějaké mezivýsledky atd. Právě v ní je hlavní rozdíl mezi VonNeumannovou a Harvardskou architekturou. Von Neumannova koncepce má společnou paměť pro instrukce i pro data (viz následující obrázek), ale Harvardská má oddělenou paměť dat a instrukcí. Paměť může být vnitřní i vnější (např. disk). Vstupní a výstupní zařízení – neboli periferní zařízení – jejich funkce je jasná. Procesor (procesor = ALU +řadič) komunikuje s pamětí a s V/V zařízeními pomocí sběrnice. Organizace paměti a reprezentace dat Paměti jsou buď vnitřní (tj. registry procesoru, zápisníková paměť, CACHE či hlavní paměť) nebo vnější (paměť V/V zařízení). K nejdůležitějším vlastnostem paměti patří doba čtení /zápisu, kapacita a cena. Typy pamětí jsou různé, máme paměti měnitelné (RAM), permanentní (ROM) či semipermanentní (flash, EEPROM...) a také paměti můžeme dělit na elektricky závislé (RAM) popř. nezávislé (ROM...). Organizace je takováto: paměť obsahuje paměťové buňky, kde ke každé je přiřazena určitá adresa, pokud má adresa n bitů, pak má paměť 2n paměťových buněk. V každé buňce jsou data o určité dané kapacitě (ta závisí na procesoru). viz. obrázek Dva přístupy k uložení dat zabírajících více než jedno paměťové místo: •
•
Big‐Endian: na nižší adresu se uloží nejvýznamnější byte slova (MSB) (akronym: 'big' bits goes first) Little‐Endian: na nižší adresu se uloží nejméně významný byte slova (LSB) (akronym: 'little' bits goes first) Reprezentace dat Veškeré informace obsažené v paměti (instrukce i data všech typů) jsou zakódovány dvojkově ‐ jako čísla! Reprezentace textu Textová informace musí být uchována také jako binární čísla => použití kódů. Například kód ASCII reprezentuje každý symbol v tzv. ASCII tabulce 7‐mi bitovým číslem (u rozšířeného ASCII kódu 8‐mi bitovým). Reprezentace čísel se znaménkem •
•
•
Přímý kód ‐ jeden bit je vyhrazen pro znaménko, zbytek bitů slouží k uložení absolutní hodnoty čísla. Nevýhodou je nutnost oddělit práci se znaménky a absolutními hodnotami čísel Aditivní kód ‐ A(x) = x + K, kde x je zadané číslo, A(x) je jeho obraz v aditivním kódu a K reprezentuje posunutí nuly vzoru. Aditivním kódem lze zobrazit čísla z rozsahu ‐K ≤ x < M ‐ K, kde M je tzv. modul řádové mřížky (nejmenší číslo, teré již v řádové mřížce nelze zobrazit). Obvykle se volí K = ½ M Doplňkový kód ‐ znaménko je určeno prvním (nejvýznamnějším) bitem a je organickou součástí kódu. Platí D(x) = x pro x ≥ 0 a D(x) = M + x pro x < 0, kde x je zadané číslo, D(x) je jeho obraz v doplňkovém kódu a M je modul řádové mřížky. Doplňkovým kódem lze zobrazit čísla v rozsahu ‐½M ≤ x < ½M Reprezentace čísel s pohyblivou řádovou čárkou Používá se několik formátů, například ANSI/IEEE Std. 754, Single Precision (32 bitů na číslo): znaménko zabírá 1 bit, exponent 8 bitů v aditivním kódu (K = 127) a absolutní hodnota mantisy má 23 bitů (ve skutečnosti 24, protože se užívá princip skryté jedničky) a je v přímém kódu. Takové číslo je tedy uloženo v paměti takto: s‐A(e)‐P(M) Datové typy •
•
•
Numerická data – čísla o V pevné řádové čárce – fix point, obvykle celá čísla (integer, byte, word …) o V pohyblivé řádové čárce – floating point, racionální čísla (real, float, …) o Dvojková – binary o Desítková – decimal o Šestnáctková – hexadecimal o Bez znaménka – unsigned, pouze nezáporná (byte, word,unsigned …) o Se znaménkem – signed (integer, short int, signed …) o Různě dlouhá, různý rozsah hodnot (short int, integer, long int, byte, word, …) Znaková data o Jednotlivé znaky (char) o Řetězce (string) Ostatní o Ukazatele Základní cyklus počítače Řadič počítače obsahuje registry potřebné pro svou práci. Mezi nejdůležitější paří registr PC (program counter), který v sobě obsahuje adresu následující instrukce. Dále je to IR (instruction register), kde je kód právě prováděné instrukce. Mezi další registry patří např. SP (stack pointer) – ukazatel zásobníku či PSW (program status word) – stav programu před přerušením atd. Základní cyklus počítače je tento: Přerušení, jejich typy, priority přerušení, masky přerušení. Obsluha přerušení na úrovni technického vybavení. Přerušení může být… ƒ
ƒ
synchronní – tedy sesynchronizované s hodinami či činností procesoru. Bývá vyvolané speciální instrukcí (INT,TRAP,SVC...) nebo nějakou jinou instrukcí (což je v podstatě nežádoucí stav ) například při dělení nulou, přeplnění, nedovoleném operačním znaku atd. asynchronní – může být buď vnější ‐ způsobené periferními zařízeními nebo vnitřní – způsobené časovačem, kontrolními obvody nebo například výpadkem napájení. Priorita přerušení – každé přerušení má určitou prioritu, nejdříve jsou obsluhovány přerušení s nejvyšší prioritou. Je jasné, že například nějaké dělení nulou bude mít vyšší prioritu než například přerušení od klávesnice. Maska přerušení – Maska přerušení je dána obsahem registru, jehož každému bitu je přiřazena jedna nebo více příčin přerušení. 0 zamaskovány, 1 odmaskovány. Maska přerušení se nastavuje pomocí příslušné instrukce. Umožňuje nejen přerušení potlačit, ale v určité fázi také víceúrovňové přerušení pro příčiny s vyšší prioritou.Přerušení můžeme buď povolit nebo zakázat pomocí příznaku IF, například pomocí instrukce STI, která do IF uloží 1 přerušení povolíme, pomocí instrukce CLI, která tam vloží 0 jej zakážeme. Některá přerušení mohou být nemaskovatelná. Obsluha přerušení na úrovni technického vybavení Řadič přerušení •
•
•
HW zařízení přijímající signály z V/V zařízení Identifikuje požadavky na přerušení podle jejich priorit (IRQ) Generuje přerušovací signál INT Vektor přerušení •
•
Je to adresa podprogramu obsluhy přerušení, která je zapsána do PC V paměti obyčejně na nejnižších hodnotách je vyhrazen prostor, kde je umístěno n (INT n) vektorů přerušení, tj. adres podprogramů pro zpracování daného typu přerušení Obsluha přerušení 1.
2.
3.
4.
5.
Na zásobník se uloží informace o právě probíhajícím programu (kontext) ‐ FR, PC ... Zakáže se další přerušení PC se nastaví na začátek podprogramu, který provádí obsluhu přerušení Provede se obsluha přerušení Návrat z podprogramu obsluhy přerušení a obnovení kontextu Vnější přerušení 1. Vznikne požadavek na obsluhu přerušení 2. Řadič V/V zařízení generuje signál IRQ (Interrupt Request) 3. Řadič přerušení generuje signál INT (Interrupt) pro procesor ‐ někdo žádá o přerušení 4. Procesor rozhodne o obsluze (na základě maskování přerušení) ‐ signál INTA (Interrupt Acknowledged) 5. Identifikace příčiny přerušení (číslo typu přerušení) 6. Uložení stavové informace FR a PC (kontextu) na zásobník 7. Nalezení začátku podprogramu pro obsluhu daného typu přerušení pomocí vektoru přerušení (nová hodnota PC) 8. Provedení podprogramu obsluhy přerušení 9. Návrat do přerušeného programu a obnova PC a FR (kontextu) ...viz obrázek Jen k tomu obrázku... INT A je interrupt acknowledge – signál od řadiče přerušení, že ho zaznamenal. •
Kvantitativní principy architektury počítačů (X36APS) Kritéria výkonnosti, propustnost a doba výpočtu Dnešní PC za 1000 dolarů jsou výkonnější než počítač z roku 1980 za milion dolarů. To bylo co se týče HW způsobeno nástupem technologie VLSI (Very Large Scale Integration – 100 000 a více log. hradel v 1 pouzdře) a příchodem mikroprocesorů. Co se týče SW, pomohl vývoji přechod na programování ve vyšších programovacích jazycích. Také pomohl nástup RISC architektury a zvýšení paralelismu na úrovni zpracování instrukcí. Jak léta plynula, počítače se vyvinuly od velkých sálových počítačů (60. léta ) přes mikropočítače pro aplikace ve vědeckých laboratořích (70. léta) až po stolní a osobní počítače. Výkonnost počítače – P =
n
‐ je to počet úkonů dělený časem potřebným pro jejich T
vykonání (dobou výpočtu), výsledné číslo tedy značí počet úkonů, které je počítač schopen vykonat během jedné sekundy – analogie s frekvencí procesoru. Propustnost je šířka nějakého pásma – značí například kolik dat přepravíme kabelem za sekundu atd. Zkušební úlohy a měření výkonnosti Máme 5 základních skupin zkušebních ůloh: Eliminace slabin jedné zkušební úlohy vedla k vytvoření sad zkušebních úloh určených pro různé aplikační oblasti. Standartní sadou úloh je sada SPEC, která se dělí na... Jinak existuje mnoho dalších zkušebních ůloh pro MS Windows, jako jsou například aplikace Bussiness Winstone (testování výkonnosti pro kancelářské programy), CC Winstone (práce s většími objemy dat – Photoshop apod.), Winbench (výkonnost CPU, videosystému, disků...)atd. Dále úlohy Whetstone (FP výpočty) nebo Dryhstone (celočíselné výpočty). Jejich použití se však dnes již nedoporučuje. Výkonnost se dá vyjádřit v různých jednotkách, známé jsou jednotky MIPS (Mega Instructions Per Second?), jednotka výsledku je 106 instr./s. Počítá se to takto...vememe počet „megainstrukcí“ a podělíme jej periodou CPU. MIPS =
fCLK
IC
IC
=
=
= [106 instr./ s ] 6
6
TCPU × 10
IC × CPI × TCLK × 10
CPI ×106
MIPS závisí na ISA a programu neboť CPI závisí na programu a mixu instrukcí. Dalšími jednotkami pro měření výkonu jsou tzv. MFLOPS – to je totéž co MIPS, ale pro FP instrukce. Amdahlův zákon Je to vzoreček pro výpočet výkonového zisku, čili zrychlení S dosaženého vylepšením některé části počítače. Počítá se jako Zrychlení S značí, kolikrát je rychlejší běh úlohy na vylepšeném počítači oproti původnímu počítači. Dále definujeme… pak doba výpočtu TNEW na vylepšeném počítači bude... A celkové zrychlení odpovídající danému vylepšení bude… příklady na Amdahlův zákon jsou na slidech 1 z APS, ale stačí k tomu selský rozum. Procesorová výkonnostní rovnice Výkonnost CPU vyjádřená pomocí doby TCPU(prg) pro vykonání programu prg je… Rychlost hodin CPU se udává buď dobou trvání jednoho taktu TCLK nebo pomocí frekvence taktů fCLK. Platí vztah fCLK = 1/TCLK. Doba CPU pro vykonání daného programu prg je… kde CycCPU(prg) je počet cyklů CPU pro provedení programu. Pokud známe počet instrukcí IC (Instruction Count) pro provedení programu, můžeme vypočítat CPI (Clock Per Instruction) – průměrný počet hodinových cyklů na instrukci daného programu nebo IPC (instructions per clock cycle). potom bude platit… Přesnější metrika: budeme rozlišovat jednotlivé instrukce. Takže vzorečky budou... kde ici je počet provedení instrukcí i programu prg, cpii je průměrný počet hodinových cyklů instrukce i a konečně n je počet instrukcí v architektuře instrukčního souboru (ISA). Průměrné CPI pak bude… příklady opět na slidu 1 z APS. Amdahlův zákon x výkonnostní rovnice – výhody Amdahlova zákona jsou především jednoduchost výpočtu a možnost výpočtu zrychlení bez znalosti hodnot IC, CPI atd. Výhodou výkonnostní rovnice je, že nepotřebujeme znát celkovou dobu provádění programu. •
Architektury souborů instrukcí (X36SKD, X36APS) Základní třídy souborů instrukcí (střadačová, zásobníková, s univerzálními registry), jejich vlastnosti a použití – více v souboru skd4.pdf či aps_isa1_1s.pdf či aps_isa2_1s.pdf Co je to vlastně ISA? Je to architektura souboru instrukcí, zahrnuje typy a formáty instrukcí, instrukční set, datové typy, kódování, reprezentaci a uložení dat v paměti. Dále definuje módy adresování paměti a přístup do paměti dat a instrukcí. atd. Základní třídy ISA jsou 3: ƒ
Akumulátorově (střadačově) orientovaná ISA – je to architektura, kde implcitním zdrojovým a cílovým operandem ALU instrukce je vždy střadač (akumulátor). Je více typů střadačové ISA: 1) s absolutní adresací tzn. je jen jediný operand v instrukcích (druhým operandem je implicitně střadač) – viz. obrázek výše. Tato ISA byla nejstarší a vyvinula se z kalkulaček. 2) s indexovacími registry Index registry jsou jeden nebo více registrů pro ulehčení adresace paměti.Přináší to větší efektivitu, cenou za ni jsou však delší instrukce. 3)akumulátorově orientovaná ISA dnes – z index registrů se vyvinuly speciální registry pro nepřímou adresaci, zvláštním typem je stack pointer (ukazatel na vrchol zásobníku). Procesory také zahrnují pracovní registry (tzv. zápisníková paměť), toto pole registrů snižuje četnost přístupů do paměti. Další vlastnosti střadačové ISA: jednoduchý HW,Minimální vnitřní stav CPU → rychlé přepínaní kontextu, krátké kódy instrukce(záleží na adresaci 2.operandu), jednoduché dekódování instrukcí a řadič. Akumulátorová ISA se používala hlavně dříve(nástup X86…od 386 však GPR), dnes u některých mikrořadičů – DOP. Je nejstarší, ale stále užívaná v některých vestavěných aplikacích ƒ
Zásobníkově orientovaná ISA – využívá zásobník při vykonávání programu k vyhodnocování výrazů či vnořenému volání podprogramů. Hardwarový zásobník je vlastně sada registrů s ukazatelem na vrchol, je uvnitř CPU. Jak je vidět z obrázku, pokud je hardwarový zásobník (ten v CPU) malý, ukládají se čísla po jeho přetečení do paměti. Přesun dat mezi zásobníkem a pamětí (Stack Spilling – přelévání zásobníku) řeší automaticky řadič v CPU. Formát instrukcí zásobníkové ISA je následující… ƒ
Rozdíl oproti formátu instrukcí ve střadačové ISA je zřejmý například u instrukcí ADD či SUB, které nemají žádné operandy. Další vlastnosti zásobníkové ISA: Omezený přístup k datům uvnitř CPU, jednoduché a rychlé instrukce, hustota kódování. Zásobníková ISA je vhodná pro virtuální stroje Použítí zásobníkové ISA: Téměř vyhynuly před rokem 1980, ale nyní na tomto principu pracuje Java Virtual Machine. Zásobníková ISA umožňuje psaní jednoduchých překladačů. Využívaná je v některých řídících aplikacích a v emulačních systémech jako ISA virtuálních strojů. GPR (general purpose registers) ISA‐ Neboli ISA s univerzálnámi registry. Prostě tato arcitektura obsahuje registry pro všeobecné použití. Výhodou je, že tyto registry jsou rychlejší než paměť a lze k nim přistupovat náhodně (například zásobník je přísně sekvenční). Tím pádem lze například operaci (AxB)‐(CxD)‐(ExF) provést v libovolném pořadí. Také díky registrům je tady méně častý přístup do paměti →potenciální urychlení. Nevýhody jsou: omezený počet registrů, složitější překladač, přepnutí kontextu trvá déle, registry nemohou obsahovat složitější datové struktury a k objektům v registrech nelze přistupovat přes ukazatele. Formát instrukcí u GPR ISA se může různě lišit co do počtu operandů, to záleží na platformě a shrnuje to následující tabulka… Pro představu, vzorový formát intrukcí pro variantu 3,0 (Load‐store): GPR ISA je v současnosti nejpoužívanější, procesory po roce 1975 používají všechny nějakou formu GPR. Kódování instrukcí ƒ
Proměnná délka kódu instrukce o Lepší hustota kódování o Každý operand může mít svůj specifikátor adresního módu o Složité dekódování ƒ
Pevná délka kódu instrukce o Rýchlé a jednoduché dekódování instrukcí o Snažší implementace proudového zpracování(pipeline) instrukcí o Adresní mód je součást kódu operace o Programy zabírají více více paměti o Implementace komplexním adresních módů je obtížná Příklad kódování instrukcí: operační kód různým operacím jsou přiřazeny různé operační znaky. Operační znak je část kódu instrukce, která určuje jaká operace se má provést. viz obrázek... Instrukce je vlastně kódovaný příkaz pro processor obsahující operační znak a indentifikaci operandů nad kterými se operace ma provést. Strojové instrukce a jazyk symbolických instrukcí Je veliké množství různých strojových instrukcí, máme instrukce skoku, operace s daty, aritmetické operace... Tyto instrukce mají každá nějaký svůj kód. Kdybychom chtěli pomocí nich programovat, museli bychom psát po sobě číselné kódy instrukcí, což by asi nebylo ono. Jazyk symbolických instrukcí neboli assembler je programovací jazyk (překladač) umožňující instrukce zadávat pomocí jejich jmen a operandů, přičemž se tento kód překladačem přeloží na číslené vyjádření instrukcí, viz obrázek... Jazyk assembler obsahuje 3 základní typy instrukcí: 1) základní instrukce – tyto odpovídají instrukcím strojového jazyka. Základní typy operandů jsou registry, konstanty nebo jména (označújící konstantu – neboli proměnné). Typy základních instrukcí shrnuje obrázek 2)pseudoinstrukce (direktivy)‐ slouží jako informace pro překladač a zahrnují definice konstant, vyhrazení úseku paměti pro pole atd. Jsou to například... 3)makroinstrukce – reprezentují činnost skupiny instrukcí definované uživatelem. Makroinstrukce popisují úpravy textu programu. Rozdíl makrointrukcí oproti procedurám je ten, že veškeré úpravy proběhnou ještě před vlastním překladem. Příklad makra... Aritmetické a logické operace v souborech instrukcí – viz skd9.pdf Aritmetické operace Aritmetické operace se provádějí se čtyřmi typy čísel: • Celými čísly bez znaménka • Celými čísly se znaménkem • V BCD kódu • Ve znakovém tvaru (ASCII kódu) • Instrukce ADD cíl, zdroj (cíl := cíl + zdroj) • Cíl a zdroj jsou stejného typu jako u instrukce MOV • Operandy a výsledky lze interpretovat jako: • Čísla v doplňkovém (1B potom FF16 : (‐1) .‐12810 , 12710.) • Nezáporná čísla (1B potom FF16 : 255 .0, 25510 .) Ovlivňuje příznaky CF, OF, SF a ZF (PF a AF) • Instrukce ADC cíl, zdroj (cíl := cíl + zdroj + CF) • Instrukce SUB cíl, zdroj (cíl := cíl – zdroj) cíl, zdroj nezáporná čísla analogické ADD, až na příznak CF: cíl < zdroj potom CF := 1, CF tzv, výpůjčka [borrow] • Instrukce SBB cíl, zdroj (cíl := cíl – zdroj – CF) • Instrukce CMP cíl, zdroj (cíl := cíl ‐ zdroj) cíl, zdroj nezáporná čísla. Stejně jako SUB, ale neukládá se výsledek – nastaví se však příznaky !!! • Instrukce NEG cíl (cíl := 0 – cíl = – cíl), uvažuje se doplňkový kód Pozor nezaměňovat s instrukcí NOT!!! Příklady: MOV AL, 1 0000 0001 NEG AL 1111 1111 = 0FFH CF = 1, ZF = 0, SF = 1, OF = 0 • Instrukce INC cíl (cíl := cíl +1), nemění se příznak CF • Instrukce DEC cíl (cíl := cíl ‐1), nemění se příznak CF Logické operace ƒ Instrukce AND cíl, zdroj (cíl := cíl & zdroj) logický součin ƒ Instrukce OR cíl, zdroj (cíl := cíl | zdroj) logický součet ƒ Instrukce XOR cíl, zdroj (cíl := cíl ィ zdroj) logický součet modulo 2 o Příznaky CF := 0, SF := výsledek < 0, ZF := výsledek = 0, OF := 0 ƒ Instrukce NOT cíl (cíl := cíl) o Příklady: MOV AL, 1 0000 0001 o NOT AL 1111 1110 = 0FEH CF = 0, ZF = 0, SF = 1, OF = 0 o TEST AL,1 x CF = 0, ZF = 1, SF = 0, OF = 0 o XOR AL, AL 0000 0000 = 000H CF = 0, ZF = 1, SF = 0, OF = 0 ƒ Instrukce TEST cíl, zdroj (cíl & zdroj), neukládá se výsledek, nastaví se však FR. Adresní módy ...viz skd8.pdf Na jedné straně adresné pole v typických instrukčních formátech jsou relativně malé. Na druhé straně stojí požadavek adresovat velký adresní prostor. Potom z toho plyne používaní různých technik adresace. Adresovací techniky jsou tedy kompromisem mezi velkým adresačním rozsahem a flexibilitou. Adresní módy shrnuje následující obrázek… Způsoby uložení dat v paměti ƒ
Společná x oddělená pamět dat a programu (instrukcí)? ƒ Harvardská architektura o Oddělená pamět – možnost současného přístupu ƒ von Neumannova architektura o Společná pamět – snadná manipulace s programy ƒ
Nejmenší adresovatelná položka: o Byte(slabika) = 8 bitů – dnes standart u univerzálních počítačů. o Word(slovo) = několik slabik – dnes zřídka o Instrukční slovo – např. v Harvardské architektuře ƒ
Problémy s adresací Dlouhých operandů ve slabikově organizované paměti o Big endian – adresa MSB=adresa slova – Big end of word o Little endian – adresa LSB=adresa slova – Little end of word ƒ
Zarovnaná x nezarovnaná data o Datový element je zarovnán jeli jeho adresa dělitelná jeho velikostí •
Realizace řídicích instrukcí a podpora volání podprogramů...viz X36APS, přednáška 3, slajdy 4, 7‐19 Podmíněné a nepodmíněné skoky Způsob adresace cíle skoku •
•
•
Absolutní (dlouhé skoky a volání podprogramů) PC‐relativní (krátké podmíněné skoky) Registrová nepřímá adresace ("computed gotos") ‐ podpora "case" příkazů a dynamického volání Většina podmíněných skoků je krátká => PC‐relativní, absolutní adresace je v RISC procesorech nahrazena nepřímou registrovou Implementace pomocí 1 instrukce Jedna instrukce spočítá a vyhodnotí podmínku a zároveň provede podmíněný skok na základě výsledku. •
•
příliš mnoho práce na jednu instrukci → problém s proudovým zpracováním problém jak zakódovat konstantu pro srovnání a offset skoku do jednoho kódu instrukce Řešením je oddělení instrukce vyhodnocení podmínky od instrukce skoku → 2 instrukce. Implementace pomocí 2 instrukcí Intrukce_1 vyhodnotí podmínku a výsledek někam uloží. Instrukce_2 pak provede skok na základě výsledku podmínky. Kam uloží Instrukce_1 výsledek? •
•
Implicitní místo ‐ registr příznaků Explicitní místo ‐ dedikovaný nebo univerzální registr Explicitní místo je specifikování v instrukci vyhodnocující podmínku, zatímco implicitní místo je pevně dáno pro všechny instrukce vyhodnocující podmínku. Implementace pomocí příznakového registru Registr příznaků je nastaven jako postranní efekt ALU operace nebo pomocí dedikované instrukce (compare / test). Podmíněný skok se rozhoduje dle nastavení příslušných příznaků. Nevýhody: •
•
ne všechny instrukce nastavují příznaky stejným způsobem jeden registr příznaků se může stát úzkým hrdlem pro proudové zpracování instrukcí Implementace pomocí podmínkových a predikátových registrů Podmínkové registry (PowerPC) •
•
•
8 nezávislých příznakových registrů každá ALU instrukce a instrukce srovnání či testu specifikuje jeden z těchto registrů složitější podmínky lze vyhodnocovat logickými operacemi mezi jednotlivými příznakovými registry Predikátové registry (Itanium) •
•
•
•
128 dedikovaných 1‐bitových podmínkových registrů (tzv. predikátové registry) instrukce porovnání / test může nastavit až dva predikátové registry (jeden při splpnění a druhý při nesplnění podmínky) IA64 umožňuje podmíněné provádění každé instrukce v závislosti na stavu predikátového registru podmíněný skok je pak jen zvláštním případem podmíněné instrukce Implementace pomocí univerzálních registrů •
•
•
v instrukci podmíněného skoku je specifikován jeden z univerzálních registrů, jehož hodnota se testuje složitější podmínky mohou být testovány pomocí instrukce srovnání / testu následované podmíněným skokem na základě nulovosti / nenulovosti registru použito např. u procesoru DLX Volání a návraty z podprogramů Základní otázky: •
•
•
Kam uložit návratovou adresu? Jak předávat parametry a návratové hodnoty? Kde alokovat místo pro lokální proměnné, mezivýsledky? Odpovědi:
Tradiční (CISC) odpověď
ƒ Vše na zásobník Moderní (RISC) odpověd ƒ Především zvaž eliminaci volání pomocí inliningu ƒ Především registry, zásobník jen když nelze jinak Aktivační záznamy Kromě SP (Stack Pointer) se pracuje i s FP (Frame Pointer) - platí, že FP má stejnou
hodnotu, jako SP před zavoláním podprogramu. Při volání podprogramu se na
zásobník uloží všechny potřebné hodnoty - registry, parametry pro podprogram, starý
FP, návratová adresa, ... Pak se na zásobník přidávají lokální proměnné zavolaného
podprogramu, jeho registry, ... Důležité je, že přesná struktura položek na zásobníku
závisí na programovacím jazyku a systémových konvencích (tzv. Application Binary
Interface, ABI). Struktura uložená na zásobník při volání podprogramu se nazývá
aktivační záznam.
•
•
•
Data v aktivačním záznamu lze adresovat relativně vůči SP nebo FP Zásobník může obsahovat též odkazy na hierarchicky nadřazený aktivační záznam (tak se zpřístupní viditelné lokální proměnné hierarchicky nadřazených procedur) Tradiční architektury obsahují dedikovaný registr SP (a někdy i FP) a související instrukce PUSH a POP Softwarové konvence použití registrů Některé RISC architektury implementují zásobník jako SW konvenci (např. MIPS
DLX) - jeden z univerzálních registrů slouží jako "SP", "PUSH" je realizováno
instrukcí STORE (adresa je v tomto univerzálním registru), "POP" je instrukce LOAD.
Jedná se tedy o speciální případ aktivačních záznamů (princip je stejný, pouze
realizace "zásobníku" je odlišná).
[editovat] Registrová okna SPARC dělí GPR do následujících skupin:
•
•
•
•
8 globálních registrů (g0‐g7, g0=0) 8 vstupních registrů (i0‐i7) 8 výstupních registrů (o0‐o7) 8 lokálních registrů (l0‐l7) Princip použití: při volání podprogramu se výstupní registry volajícího stanou
vstupními registry volaného. Volaný pak získá nové výstupní a lokální registry, o6 =
SP, i6 = FP (díky mechanismu oken je tedy přiřazení FP = starý SP automatické). I7
obsahuje návratovou adresu (na volajícího) a i0 slouží k předání návratové hodnoty
volajícímu.
Další možnosti Tyto možnosti předání parametrů a ostatních údajů (FP, SP) podprogramu jsou méně
běžné:
•
•
Tabulkou v paměti Odkazem na paměť Klasifikace souborů instrukcí s univerzálními registry Registr­Registr (3,0) Load-Store varianta (typický RISC), existuje i méně běžná varianta (2,0).
Výhody:
•
•
•
jednoduché kódování instrukcí (pevná délka) jednoduché a rychlé dekódování instrukcí snadné proudové zpracování Nevýhody:
•
•
nízká hustota kódu (více instrukcí => delší program) některé instrukce lze zakódovat do méně bitů => plýtvání místem Registr­Paměť (2,1) Typická ISA procesorů CISC, existuje i méně běžná varianta (3,1).
Výhody:
•
•
přímý přístup k proměnným v paměti bez předchozí instrukce LOAD lepší hustota kódu Nevýhody:
•
•
•
operandy (2,1) nejsou ekvivalentní (jeden zdrojový operand se ztratí) => jsou potřeba další instrukce MOVE počet registrů může být omezen, protože adresa operandu v paměti může být dlouhá proudové zpracování je složitější Paměť­Paměť (2,2), (3,3) Skutečný a složitý model CISC, v současné době je vyhynulý a pravděpodobně
vyhynulý zůstane.
Výhody:
•
•
•
nejobecnější varianta registry se používají pro proudy dat kratší programy (není potřeba instrukcí LOAD, STORE a MOVE) Nevýhody:
•
•
•
je zapotřebí kódování instrukcí s proměnnou délkou paměť se stává "úzkým hrdlem" složité proudové zpracování ‐ téměř nemožné Charakteristické znaky komplexních a redukovaných souborů instrukcí (CISC a RISC). CISC (Complex Instruction Set Computers) •
•
•
•
•
důraz na hardware obsahuje komplexní vícetaktové instrukce model paměť‐paměť (LOAD a STORE je zabudováno přímo v instrukcích) krátký zdrojový kód (IC), velké CPI transistory čipu jsou využity pro uložení komplexních instrukcí RISC (Reduced Instruction Set Computers) •
•
•
•
•
důraz na software obsahuje omezený počet jednotaktových instrukcí model registr‐registr (LOAD a STORE jsou nezávislé instrukce) dlouhý zdrojový kód (IC), malé CPI tranzistory čipu jsou použity jako další registry Argumenty pro RISC •
•
•
•
•
•
•
•
•
•
•
•
komplexní instrukce a adresní módy jsou málokdy využívány 10% instrukcí je využíváno 90% času => Amdahlův zákon doporučuje soustředit se na těchto 10% instrukcí spousty chyb v komplexních mikroprogramech implementujících komplexní instrukce málo využívané komplexní instrukce vyžadují kódování instrukcí proměnlivé délky ‐ to zpomaluje provádění používaných jednoduchých instrukcí paměťová hierarchie (cache) zkrátí dobu načítání instrukcí (=> za stejný čas si můžeme dovolit načíst více instrukcí) mikroprogramování není třeba, řídicí paměť uvolní místo dalším registrům či skryté paměti (cache) snadnější implementace proudového zpracování (pipeliningu) více registrů umožní efektivnější využití překladačem jednodušší návrh je snadno a dříve dokončen jednodušší procesor může běžet na vyšší hodinové frekvenci počet instrukcí (IC) je u RISC pouze o málo vyšší než u CISC, zatímco CPI je o mnoho nižší Zobrazení dat a operace (X36SKD, X36JPO) Číselné soustavy Číselná soustava je soustava znaků a pravidel pro zobrazení čísel. Podle vlastností rozlišujeme číselné soustavy: •
•
Polyadické (poziční ‐ pozice cifry v čísle udává řád) o Standardní ‐ například destítková soustava s arabskými číslicemi o Nestandardní ‐ například soustava pro vyjádření času Nepolyadické (nepoziční) ‐ například římské číslice Standardní polyadické soustavy Tyto soustavy mají zatím v počítačích největší význam. Jsou určeny bází (základem) z, což je přirozené číslo větší než 1. Soustava s bází z se nazývá z‐adická a k zápisu čísel v ní lze využít z různých symbolů. Nejčastěji jsou používané soustavy desítková (dekadická, z = 10), dvojková (binární, z = 2) a šestnáctková (hexadecimální, z = 16). Číslo zapsané v z‐adické soustavě vypadá takto: Az = (anan‐1...a1a0,a‐1a‐2...a‐m)z Význam jednotlivých prvků tohoto zápisu: •
•
•
•
•
•
•
•
ai = z‐adická cifra (číslice, symbol) na pozici i i = řád číslice (řádové místo, pozice) n = nejvyšší řád s nenulovou číslicí (symbolem), n je přirozené číslo včetně nuly ‐m = nejnižší řád s nenulovou číslicí (symbolem), m je přirozené číslo včetně nuly , = řádová čárka z = základ soustavy cifry an...a0 tvoří celou část čísla cifry a‐1...a‐m tvoří zlomkovou část čísla Hodnotu čísla Az získáme tak, že sečteme všechny součiny ai ∙zi pro i = n..‐m Příklad: určete hodnoty čísla zapsaného v různých polyadických soustavách: Převod mezi soustavami Převod je nalezení takového čísla, které je zapsané v požadované soustavě a má stejnou hodnotu, jako původní číslo. Převádět lze buď přímo (operacemi v jedné ze soustav) nebo nepřímo (postupným převodem ‐ nejprve do desítkové soustavy a pak z desítkové soustavy do požadované soustavy). Převod se provádí zvlášť pro celou a zlomkovou část čísla! Převod z desítkové do z‐adické soustavy Celá část Provádíme postupné dělení desítkového čísla základem z soustavy, do které převádíme. V každém kroku dostaneme jeden dílčí zbytek po dělení (je to číslo menší než z => je to jedna z přípustných cifer z‐adické soustavy). Dělení ukončíme ve chvíli, kdy je podílem také číslo menší než z. Hledaný ekvivalent původního čísla v z‐adické soustavě získáme tak, že za sebe napíšeme výsledek posledního dělení a pak dílčí zbytky po dělení v opačném pořadí (to odpovídá rozkladu čísla podle tzv. Hornerova schématu). Zlomková část Od zadaného čísla oddělíme celou část, ponecháme pouze zlomkovou část ve tvaru Z = 0,a‐1...a‐m. Pak aplikujeme následující postup: 1. Násobíme zlomkovou část Z základem soustavy, do které převádíme 2. Cifru pře řádovou čárkou označíme V‐i, kde i je číslo udávající kolikáté násobení provádíme 3. Oddělníme celou část z výsledku násobení, dostaneme nové číslo Z 4. Opakujeme znovu od kroku 1 až do získání požadované přesnosti (nebo dokud nezačnou vycházet samé nuly) Hledaný obraz zlomkové části čísla v soustavě z pak je: 0,V‐1...‐k, kde k je počet násobení, která jsme provedli. Příklad: A = 0,04810, z = 5 5 ∙ 0,048 = 0,240 => V‐1 = 0 5 ∙ 0,240 = 1,200 => V‐2 = 1 5 ∙ 0,200 = 1,000 => V‐3 = 1 5 ∙ 0,000 = 0,000 => V‐4 = 0 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ A = 0,0110000000005 = 0,0115 Převod do desítkové soustavy Tento převod je jednoduchý ‐ spočívá pouze ve spočítání hodnoty zadaného čísla v zadané soustavě. Převod mezi příbuznými soustavami Soustavy se základy z1 a z2 jsou příbuzné, pokud platí: z1 = z2k pro nějaké přirozené číslo k. Mezi zápisy čísel v příbuzných soustavách je pouze formální rozdíl ‐ k‐tici cifer v z2 lze zapsat jako jednu cifru v z1 (postupuje se vždy od řádové čárky). Příklad: z1 = 2, z2 = 16 => k = 4 A = 1001101,010112 = 0100|1101|,|0101|10002 = 4D,5816 Materiály •
•
X36SKD, přednáška 2 Zobrazení dat a operace (celý okruh) Kódy pro zobrazení čísel se znaménkem ve dvojkové soustavě Přímý kód Jeden bit je použit jako znaménko (1=-, 0=+) a zbytek je využit pro uložení absolutní
hodnoty požadovaného čísla. Nevýhodou přímého kódu je nutnost oddělit práci se
znaménkem a absolutní hodnotou.
Číslo v přímém kódu má tedy hodnotu X = (-1)s · [abs. hod.]
Příklad:
P(00001110)2 = (14)10
P(10001110)2 = (-14)10
!všimni si, že pořadí čísel na číselné ose zůstává u následujících kódů vždy stejné,(tj. ‐8,‐7,‐6... a ne ‐6,‐7,‐8...), jen jsou zpřeházeny osy kladných a záporných čísel! Aditivní kód (kód s posunutou nulou – jakoby přidáme K k původní 0, proto aditivní) Aditivní kód řeší zobrazení čísel se znaménkem posunutím nuly vzoru o předem
danou hodnotu K. Obvykle se volí K = ½Z, kde Z je tzv. modul řádové mřížky
(nejmenší číslo, které již nelze při daném počtu bitů zobrazit). Obraz čísla X v
aditivním kódu tedy získáme podle vzorce A(X) = X + K a lze zobrazovat čísla z
rozsahu -K ≤ X < Z - K. Zpětný převod (pro získání hodnoty čísla X při znalosti jeho
obrazu v aditivním kódu): X = A(X) - K.
Příklad:
K = 12810
A(14)10 = (142)10
A(-14)10 = (114)10
A(0)10 = (128)10
------------------------------A(X) = 35 => X = 35 - 128 = -93
Doplňkový kód (proč doplňkový? doplněk se dá získat negací všech bitů čísla a přičtením horké 1) U doplňkového kódu je znaménko čísla určeno nejvýznamnějším bitem (jako u
přímého kódu), avšak tento znaménkový bit je organickou součástí kódu.
Získání obrazu čísla X v doplňkovém kódu (Ze opět modul řádové mřížky):
•
•
D(X) = X pro X ≥ 0 D(X) = Z + X pro X < 0 Zobrazitelná čísla jsou z rozsahu ½Z ≤ Z < ½Z
Příklad:
M = 25610
D(14)10 = (14)10
D(-14)10 = (242)10
Materiály •
•
•
X36SKD, přednáška 2, slajdy 26‐
29 (http://service.felk.cvut.cz/courses/X36SKD/studenti/prednasky/skd2.pdf) Zobrazení dat a operace (celý okruh) slidy z JPO Realizace základních operací nad dvojkovými čísly bez znaménka a v doplňkovém kódu: sčítání, odčítání, posuvy Dvojková čísla bez znaménka Sčítání Funguje podobně, jako sčítání v desítkové soustavě - sčítají se cifry příslušející
stejným řádům (sčítat se začítá od nejnižších řádů). K přenosu do vyššího řádu dochází
při překročení hodnoty "2".
Příklad (pr značí přenos do vyššího řádu):
Odčítání Funguje podobně, jako odčítání v desítkové soustavě - odčítají se cifry příslušející
stejným řádům (odčítat se začítá od nejnižších řádů). Stejně jako u děsítkové soustavy
si lze pomoci větou "X a kolik je Y?", kde X je cifra menšitele a Y cifra menšence.
Pokud je Y < X, pak dochází k výpůjčce z vyššího řádu (cifru menšence ve vyšším
řádu příště považujeme za cifru o 1 nižší).
nejdříve dáme odčítání v desítkové soust...
157
−89
068
Toto si žádá malinko vysvětlení: V prvním kroku se ptáme: 9 a kolik je 7? vzhledem
k tomu, že 7 < 9, ptáme se: 9 a kolik je 17?, přičemž v příštím kroku menšence (zde
5ku) považujeme za číslo o 1 nižší (protože jsme si desítku vypůjčili předtím). Tedy
v příštím kroku se ptáme: 8 a kolik je 4? Opět si musíme vypůjčit, ptáme se tedy: 8 a
kolik je 14. Vyjde 6 a v dalším kroku bude opět menšenec o 1 nižší. Ptáme se tedy: 0 a
kolik je 0?.
Nyní odčítání ve 2-kové soust. (br značí výpůjčku z vyššího řádu):
Vysvětlení: 1)1 a kolik je 0? nemůžeme, proto vypůjčíme a ptáme se: 1 a kolik je 10?
vyjde nám 1 přičemž v dalším kroku menšence snížíme o 1. 2) Ptáme se: 1 a kolik je
0? opět si musíme vypůjčit a ptát se: 1 a kolik je 10? 3) 0 a kolik je 0? 4) 0 a kolik je
0?
Posuvy Předpokládáme, že číslo A má ve dvojkovém zápisu hodnoty cifer a, b, c, d: A2 = abcd
Posuv vlevo:
a b c d
/ / / /
/ b c d 0
Pokud a = 1, dochází k přeplnění
Posuv vpravo:
a b c d
\ \ \ \
0 a b c \
Pokud d = 1, dochází ke ztrátě přesnosti
Dvojková čísla v doplňkovém kódu Sčítání Sčítání čísel v doplňkovém kódu funguje stejně, jako sčítání čísel v dvojkové soustavě
bez znaménka.
Odčítání Pro odčítání čísel v doplňkovém kódu máme 2 možnosti:
•
•
Odečteme doplňkové kódy obou čísel a ignorujeme výpůjčku z nejvyššího řádu Převedeme odčítání na sčítání (k menšiteli spočítáme doplněk ‐ negace všech bitů a přičtení horké 1) a ignorujeme přenos z nejvyššího řádu Příklad druhé možnosti: 3‐2, dvojková soust., Z=16 3 =011, ‐2=(~010)+1 = 101+1 = 110. Takže... 011
110
správně je výsledek 1001, ale my ignorujeme přenos z nejvyššího řádu, takže 001, což 001 je desítkove 1čka, takže je to správně. Posuvy Předpokládáme, že číslo A má ve svém obrazu v doplňkovém kódu hodnoty cifer a, b,
c, d: D(A) = abcd
Posuv vlevo:
a b c d
/ / / /
/ b c d 0
Pokud a ≠ b, dochází k přeplnění
Posuv vpravo:
a b c d
|\ \ \ \
a a b c \
Pokud d = 1, dochází ke ztrátě přesnosti
Pohyblivá řádová čárka: způsoby zobrazení čísel, provádění základních operací. Způsoby zobrazení čísel s pohyblivou řádovou čárkou Množina reálných čísel je v počítači reprezentována konečnou podmnožinou
racionálních čísel - soustava čísel s pohyblivou řádovou čárkou (Floating Point
Number System).
Každý prvek této množiny lze zapsat předpisem A = ±M · ze-t, kde:
•
•
•
•
z = základ soustavy(obvykle 2) t = přesnost M = mantisa, 0 ≤ M < zt ‐ 1 e = exponent (posunutí řádové čárky), emin ≤ e < emax Řádová mřížka má tedy 2 "podmřížky": pro mantisu (nese informaci o hodnotě čísla) a
pro exponent (nese o informaci o pozici řádové čárky). Exstuje několik možnosti, jak
do řádové mřížky mantisu a exponent zapsat, např:
!pozn. v prvním příkladě je chyba, má to být ‐25 krát 10 ná pátou. Normalizovaný tvar Normalizovaný tvar je tvar čísla, kdy už nelze mantisu posunout více doleva. Tento
tvar zjednodušuje aritmetické operace, avšak normalizovaný tvar operandů nezaručuje
normalizovaný tvar výsledku - je tedy třeba po každé operaci provést normalizaci
výsledku (převedení na normalizovaný tvar). Normalizovaný tvar nuly je takový, který
má nejmenší možný exponent.
Skrytá jednička V případě, že z = 2, M ≠ 0, A(e) ≠ 0 a použijeme normalizovaný zápis, pak v
nejvyšším bitu mantisy bude vždy jednička. Tuto jedničku lze skrýt (nezobrazovat),
avšak při všech operacích se s ní počítá! Princip skryté jedničky se používá např. u
standardu ANSI/IEEE Std. 754. Pokud A(e) = 0 nelze princip skryté jedničky použít.
Provádění základních operací s čísly s pohyblivou řádovou čárkou •
•
•
Sčítání ‐ srovnáme exponenty (aby byly stejné) a sečteme mantisy Odčítání ‐ srovnáme exponenty (aby byly stejné) a odečteme mantisy Násobení ‐ sečteme exponenty a vynásobíme mantisy ( 2 ⋅105 ⋅ 3 ⋅106 = 2 ⋅ 3 ⋅105+ 6 ) •
2 ⋅105 2 5−6
= ⋅10 ) Dělení ‐ odečteme exponenty a vydělíme mantisy (
3 ⋅106 3
•
•
Porovnání ‐ srovnáme exponenty (aby byly stejné) a porovnáme mantisy Posuv ‐ posuneme mantisu nebo zvětšíme (případně zmenšíme) exponent Materiály •
•
•
X36JPO, přednáška 5 (http://service.felk.cvut.cz/courses/X36JPO/slides/1‐jpo‐E.pdf) X36SKD, přednáška 3 (http://service.felk.cvut.cz/courses/X36SKD/studenti/prednasky/skd3.pdf) Zobrazení dat a operace (celý okruh) Alfanumerické kódy Alfanumerický kód je obecně kód, ve které jsou čísla a písmena zapsána ve formě srozumitelné počítači. Například ASCII je norma, která všem alfanumerickým (ve smyslu anglické šestadvacetiznakové abecedy) a některým dalším speciálním znakům ([email protected]#$%^&*_...) přiřazuje jednoznačnou numerickou reprezentaci (jde tedy o kódování). Příklady alfanumerických kódů: •
•
Baudotův kód (5b) ASCII (7b) , rozšířená ASCII (8b) ASCII tabulka: rozšířená ASCII •
•
•
EBCDIC (8b) kód Hollerith Unicode ‐ je původně šestnáctibitová tabulka znaků všech existujících abeced, později rozšířená na 31 bitů.Nejpoužívanější variantou Unicode je UTF‐8 Základní principy bezpečnostních kódů a jejich použití Bezpečnostní kód je kód, který slouží k bezpečnému přenosu dat z počátku do cíle. Takovýto kód dokáže detekovat chyby, ke kterým při přenosu došlo a případně je opravit. Rozdělení bezpečnostních kódů •
•
Detekční kódy = kódy zjišťující chyby. Princip zjištění (detekce) chyby spočívá ve zjištění, zda je přijaté slovo kódovým slovem nebo ne Samoopravné kódy = kódy opravující chyby. Princip opravy (korekce) chyby je nahrazení přijatého slova "nejpodobnějším" kódovým slovem příklad kódů: Principy: zjišťování chyb – slovo není kódovým slovem oprava chyb – slovo se nahradí nejpodobnějším kódovým slovem Systém pro přenos informace pomocí bezpečnostního kódu = •
•
•
•
•
•
a = původní data (k bitů) např. 11 b = kódové slovo (n bitů) např. 11110 e = chyba (n bitů) např. 00010 c = přijaté slovo (n bitů) např. 11100 s = syndrom ‐ slouží k detekci / korekci chyby (m bitů) např. 010 d = opravená data (k bitů) např. 11 Hammingova vzdálenost •
vzdálenost dvou slov = počet odlišných bitů •
kódová vzdálenost kvzd = minimální vzdálenost dvojic kódových slov, tzn. v minimálně kolika bitech se liší jednotlivá slova. Podívej se na tabulku kódů a zjistíš, že všechna slova ia např. zakódovaná kódem K1 se liší alespoň ve 2 bitech. Počet zjistitelných a opravitelných chyb Příklady bezpečnostních kódů 3. Parita ‐ přidává k datům paritní bit. Tento bit je součtem všech k bitů. Sudá parita (paritní bit) se počítá jako a1 + a2 + ... + ak , lichá jako a1 + a2 + ... + ak + 1 . U parity je sice jen minimální redundance, ale je schopna detekovat pouze jednu chybu. 5. Hammingův kód ‐ tzv. "perfektní kód pro opravu 1 chyby". Je to lineární kód (jeho kódová slova tvoří lineární prostor) Použití bezpečnostních kódů Použití bezpečnostních kódů znamená sice větší objem přenášených dat, ale na druhou
stranu se výrazně prodlužuje doba, kdy dojde k nějaké neopravitelné chybě. Taková
chyba obvykle znamená větší ztráty, než přenesení kontrolních dat bezpečnostního
kódu "navíc".
Materiály •
•
•
X36JPO, přednáška 9 (http://service.felk.cvut.cz/courses/X36JPO/slides/1‐jpo‐I.pdf) Zobrazení dat a operace (celý okruh) Paměti a jejich organizace (X36JPO, X36APS) Základní parametry pamětí, vybavovací doba a cyklus paměti Základní parametry pamětí •
•
•
•
•
•
Kapacita (velikost) = objem dat, která lze v paměti uložit Vybavovací (přístupová) doba = doba trvání cyklu paměti = doba pro nalezení požadovaného místa v paměti Šířka pásma = množství dat, které lze přenést z nebo do paměti za jednotku času Cena (obvykle za jednotku objemu dat) Typ paměti o Vnitřní (registr, zápisníková paměť, skrytá paměť, hlavní paměť) o Vnější (CD, disketa, ...) Energetická závislost o Energeticky nezávislé paměti (obsah paměti se zachová i po odpojení napájení) ƒ Permanentní (ROM, PROM) ƒ Semipermanentní (EPROM, EEPROM, Flash) o Energeticky závislé paměti ‐ měnitelné (RWM, RAM) Cyklus paměti Cyklus paměti je posloupnost událostí (aktivování signálů, ...), ke kterým dojde od
požadavku na přístup do paměti až do splnění tohoto požadavku. "Cycle Time" je
délka intervalu mezi dvěma po sobě jdoucími požadavky na paměť (je to vybavovací
doba prodloužená o vybíjecí dobu). Během této periody žádné jiné zařízení (řadič I/O,
jiný procesor, nebo procesor, který vyslal požadavek) nemůže použít paměť. V
současné době mají paměti Cycle Time do 200 ns.
Čtecí cyklus Zápisový cyklus Materiály •
•
•
X36JPO, přednáška 6 (http://service.felk.cvut.cz/courses/X36JPO/slides/1‐jpo‐F.pdf) X36SKD, přednáška 13 X36APS, přednáška 6 Rozdělení pamětí dle způsobu výběru dat (adresovatelné paměti, LIFO, FIFO, CAM), charakteristika jednotlivých typů, způsob realizace a použití v počítači Adresovatelné paměti Adresa paměťového místa je jednoznačně určena adresou.
Mohou se dělit na:
•
•
statické a dynamické jednobránové a vícebránové (n‐bránová paměť znamená, že má n adresových vstupů, n, popř. méně datových vstupů a výstupů) příklad vícebránové paměti: Použití adresovatelných pamětí •
Hlavní paměť ‐ ta může být jak vícebránová (umožňuje připojení několika procesorů) nebo jen 1bránová. Příklad vícebránové paměti s autonomními paměťovými bloky •
•
Video paměť Skrytá paměť (dnes obvykle paměť s omezeným stupněm asociativity) statické ­ SRAM Paměť se statickým přechodem, nevyžaduje periodické obnovování informace, je
rychlá (Cache), ale oproti DRAM drahá. Paměť s náhodným přístupem, ve které jsou
bity uloženy v klopných obvodech.
dynamické ­ DRAM Vyžaduje periodické obnovování informace. Adresa se posílá nadvakrát (je časově
multiplexovaná), nejprve se vybere řádek (signál not(RAS)) a potom sloupec (signál
not(CAS)) Data jsou uložena jako náboj kondenzátorů.
•
•
•
•
dílčí čtení ‐ přečte se a vymaže celý řádek, uloží se do vyrovnávací paměti dílčí zápis ‐ zapíše se celý řádek z vyrovnávací paměti ČTENÍ = dílčí čtení + dílčí zápis ZÁPIS = dílčí čtení + dílčí zápis LIFO (Last In First Out) Nebo také zásobníková či sklípková. Čte se poslední zapsaná položka
HW realizace: a) Sériově řazené registry b) Registry určené ukazovátkem to je něco jako když programujeme zásobník, tak taky máme někaké ukazovátko na TOP. Oproti předešlému případu se data mezi registry nemusí při každém PUSH (POP) přelévat. c) Adresovatelná paměť a reverzibilní čítač Použití Hw zásobník se používá u zásobníkově orientovaných procesorů (viz zásobníkově
orientovaná ISA). Pomocí zásobníku je implementována například FP jednotka Pentia.
Zásobník je dobrý například při vyhodnocování výrazů volání podprogramů apod.
FIFO (First In First Out) Nebo také fronta. Čte se nejdéle zapsaná položka HW Realizace a) Sériově řazené registry b) Registry určené ukazovátkem c) S využitím dvoubránové adresovatelné paměti Použití Vyrovnávací paměť CAM (Content Adressed Memory) Paměťové místo je určené svým obsahem. Uživatel zadá nějaká data a paměť se poté prohledá, jestli zadaná data neobsahuje. Pokud jsou data nalezena, paměť vrátí adresy, na kterých byla data nalezena, popřípadě rovnou tato data. Paměť CAM může mít různý stupěň asociativity. Klíč je vždy rozdělen na 2 části: podklíč a adresu. Pokud stupeň asociativity s = 1, pak na jednu adresu v paměti můžeme uložit pouze jednu položku.viz. obrázek Pokud stupeň asociativity s > 1, pak na jednu adresu se pak může uložit až s položek, jejichž klíče mají stejnou adresu.viz obrázek. Plně asociativní paměť může na jednu adresu uložit všechny položky, rozhoduje jen klíč. Plně asociativní paměť (bez LRU) Výběr položky, která má být nahrazena *NRU ‐ Not recently used (OSY slide 9) 2 bity R‐read,M‐modifi. 4 kategorie priorit, při výpadku náhodná z nejnižší kategorie odstaněna •
LRU ‐ Least recently used •
•
•
•
FIFO ‐ Při výpadku vyhazuje nejstarší stránku. Nezajímá, jestli je používána často. Second chance ‐ Modifikace FIFO pomocí bitu R, Nastaven při přístupu ke stránce, periodicky se nuluje. Pokud je R nula je stara a vyhodi se. RANDOM ‐ Vybere se náhodné místo. Pseudo‐LRU Použití •
•
Plně asociativní paměť o TLB (translation lookside buffer) tabulka VA‐>FA Paměť s omezeným stupněm asociativity o skrytá pamět cache ‐ L1 a L2 Paměťová hierarchie počítače Procesor •
•
provádění programů trvá řádově mikrosekundy až milisekundy – rychlý vyžaduje přístup ke kódu a k datům Disk •
•
obsahuje kód i data, velká kapacita reakční doba řádově v ms – pomalý Řešením obrovského výkonového rozdílu je přidání mezivrstvy – paměť DRAM Paměť DRAM •
•
•
menší než disk, omezená kapacita obsahuje podmnožinu kódu a dat disku, obvykle část programů, které jsou právě zpracovávány značně rychlejší než disk => přístup do paměti nezpomaluje procesor tolik jako přístup na disk. Paměť DRAM je ale stále příliš pomalá, rozdíl ve výkonnosti paměti a procesoru je asi 100x. Řešením je přidání dalších vrstev – skrytá paměť – cache. Paměťová hierarchie reálného počítače Čím blíže je paměť v paměťové hierarchii k procesoru tím musí být: •
•
•
•
rychlejší => vyšší cena za pamatovanou slabiku menší => lepší poměr cena/výkonnost podmnožinou všech nižších úrovní paměti (obsahuje nejvíce používaná data) obsahuje minimálně všechna data pamětí vyšších úrovní Nejnižší úroveň ‐ obyčejně disk ‐ obsahuje všechna data Základní pojmy Hit: zásah, požadovaná data jsou nalezena na vyšší úrovni paměti (blok X) Hit rate = četnost zásahu, podíl úspěšných přístupů do paměti vyšší úrovně k celkovému počtu přístupů Hit time = vybavovací doba vyšší úrovně, zahrnuje: samotný vybavovací čas pamětí vyšší úrovně + čas na určení hit/miss Miss: požadovaná data nebyla nalezena v dané úrovni paměti (blok X) a musela být hledána v nižších úrovních (blok Y), X 2 Y. Procesor musel čekat, dokud nebyla data načtena z nižších úrovní (blok Y). Miss rate = 1 ‐ hit rate Miss penalty = čas na získaní dat z nižší úrovně paměti (blok Y) + čas na přenesení dat do vyšší úrovně paměti (blok X) + čas na doručení dat do procesoru Princip lokality V nějaké relativně krátké době přistupují programy k relativně malé části adresního prostoru. Časová lokalita ‐ Když procesor používá nějakou položku v pameti, je vysoká pravděpodobnost, že ji bude používat znovu (smyčky, výsledky operací atd.). Doporučení: Umíst’ovat nejpoužívanější položky paměti co nejblíže k procesoru. Prostorová lokalita‐ Když procesor pracuje s nějakou položkou v paměti, položky, které jsou umístěny v paměti v blízkostí s právě používanou položkou budu s vysokou pravděpodobností také použity (instrukce,pole, atd.). Doporučení: Umíst’ovat větší bloky pamět’ových položek jdoucích za sebou do vyšší úrovně paměti (co nejblíže k procesoru). Skryté paměti – Caches Skryté paměti využívají jak princip prostorové, tak také princip časové lokality dat. S využitím těchto principů je cache umístěná mezi paměť a procesor k odstranění výkonnostního rozdílu procesor – hlavní paměť. Umístění dat •
•
•
•
•
Cache obsahuje kopie dat v hlavní paměti, která jsou používána. Cache je podmnožina paměti. Položky hlavní paměti jsou vícenásobně mapované do stejného paměťového místa cache. Hlavní paměť obsahuje kopie používaných dat z disku. Disk obsahuje všechna data. Materiály •
X36APS, přednáška 6 Skrytá paměť(cache) Princip lokality V nějaké relativně krátké době přistupují programy k relativně malé části adresního prostoru. Časová lokalita ‐ Když procesor používá nějakou položku v pameti, je vysoká pravděpodobnost, že ji bude používat znovu (smyčky, výsledky operací atd.). Doporučení: Umíst’ovat nejpoužívanější položky paměti co nejblíže k procesoru. Prostorová lokalita‐ Když procesor pracuje s nějakou položkou v paměti, položky, které jsou umístěny v paměti v blízkostí s právě používanou položkou budu s vysokou pravděpodobností také použity (instrukce,pole, atd.). Doporučení: Umíst’ovat větší bloky pamět’ových položek jdoucích za sebou do vyšší úrovně paměti (co nejblíže k procesoru). Přímo mapovaná cache [Direct mapped cache] V přímo mapované cache – Direct‐Mapped (DM) cache – každá paměťová adresa je přiřazena jedinému bloku DM cache. •
•
pokud jsou požadovaná data obsažená v cache, jsou umístěná na jediném určitém místě blok je jednotka přenosu mezi cache a procesorem •
•
Velikost bloku > než velikost 1 paměťového elementu ‐ využití principu prostorové lokality. Vicenásobné mapování různých adres hlavní paměti do jednotlivých bloků cache Problém: Který blok cache (cache index) obsahuje požadovanou položku? Řešení: Rozdělení pamětové adresy na 3 části. Index: specifikuje (adresuje) přímo index – řádek cache •
•
Offset: obsahuje specifikaci žádaného elementu uvnitř bloku Klíč: o zbývající bity po odečtení bitů offsetu a indexu o slouží k rozlišení všech paměťových adres, které jsou mapované do stejného místa cache Způsob zápisu do nižších úrovní paměti Přímý zápis ‐ Write Through: •
•
•
•
současný zápis slova do paměťového bloku cache a na odpovídající místo v paměti vždy je prováděn současný zápis do cache a do hlavní paměti jednoduchý, ale pomalý způsob udržování shodného obsahu cache a paměti zatěžuje komunikaci s pamětí, vyžaduje zapisovací buffer – write buffer Odložený zápis ‐ Write Back (Copy Back) •
•
•
•
Obnovit obsah slova jen v cache a na odpovídajícím místě v paměti ponechat původní slovo o Přidat dirty bit každé řádce cache, který indikuje potřebu zápisu slova z cache na odpovídající místo v paměti v případě, že blok obsahující slovo bude z cache nahrazen jiným slovem o OS musí před operací I/O aktualizovat obsah paměti obsahem cache!! Zápis dat jen do cache, zápis hodnoty slova z bloku cache do paměti se provádí jen když je daný blok, který je označený dirty bitem, z cache odstraňován. Rychlý, ale implementačně složitější, než write through. Problém konzistence obsahu cache a hlavní paměti. Velikost bloku Výhody větších bloků => využití prostorové lokality: •
•
větší blok obsahuje více slov v blízkosti požadovaného slova větší blok => více instrukcí jdoucích po sobě nebo více dat jednoho pole Nevýhody větších bloků: •
•
větší blok způsobuje méně výpadků, ale větší miss penalty , protože k načtení většího bloku z nižší úrovně potřebujeme více času, než k načtení menšího bloku pro velké velikosti bloků vzhledem k velikosti cache existuje jen málo bloků v cache, a tak roste miss rate Průměrná doba přístupu do paměti [Average Memory Access Time – AMAT] •
•
HT = Hit Time ‐ čas potřebný pro nalezení a získaní hledané položky v cache MP = Miss Penalty ‐ průměrný čas získání dat z nižší úrovně paměťové hierarchie při nenalezení hledané položky v cache (zahrnuje také detekci MR a předání dat procesoru) •
HR = Hit Rate ‐ poměrná úspěšnost nalezení dat v cache k celkovému počtu přístupů do paměti MR = 1 ‐ HR = Miss Rate •
Typy výpadků •
Studené výpadky [Compulsory misses] o Vyskytují se po startu počítače o Cache po startu neobsahuje žádná data => výskyt studených výpadků až do naplnění cache •
Konfliktní výpadky [Conflict misses] o Výpadky, které se vyskytují z důvodu, že 2 a více rozdílných adres paměti je mapováno na stejné místo v cache o 2 a více bloků je mapováno do téhož místa v cache (stejný index), přítomnost jednoho bloku v cache vylučuje přítomnost jiného bloku se stejným indexem Možnosti zmenšení výskytu konfliktních výpadků: 1. zvětšit velikost cache, zvětšení je ale limitováno 2. pro tentýž index mít vícenásobné umístění bloků Plně asociativní cache [Fully Associative Cache] Paměťové adresní pole •
•
•
Klíč & Offset: stejné jako u DM (přímo mapovaná) a FA (plně asociativní) cache Index: neexistuje => neexistují řádky, každý blok může být umístěn kdekoliv v cache hledat se musí pouze podle Klíče v celé cache, jestli se požadovaná data někde nenacházejí Výhoda: neexistují konfliktní výpadky (z definice), protože data mohou být kdekoliv Nevýhoda: potřeba množství HW komparátorů pro každý jednotlivý blok Kapacitní výpadky [Capacity misses] •
•
•
Základní typ výpadků pro plně asociativní cache. výpadky způsobené omezenou kapacitou plně asociativní cache zmenšení kapacitních výpadků dosáhneme zvětšením velikosti cache (limitováno) Cache s omezeným stupněm asociativity [N‐Way Set Associative Cache] !pozor! přímo mapovaná cache je vlastně cache s omezeným stupněm asociativity na 1! Paměťové adresní pole •
•
•
•
Klíč & Offset: stejné jako u DM cache nový je ale Index: Ukazuje na řádek, který obsahuje tzv. set každý set: obsahuje několik bloků! když chceme najít hledané slovo v blocích jednoho setu (ukazuje na něj index), musíme porovnat všechny klíče příslušející blokům s klíčem adresy požadovaného slova Činnost cache: •
•
•
•
•
je dána adresa požadovaného slova adresuje se set odpovídající indexu porovná se klíč žádaného slova s klíči bloků v setu výpadek, pokud není nalezena shoda ani s jedním klíčem pokud hit, potom použití offsetu k adresaci hledaného slova v daném bloku Shrnutí •
•
cache s omezeným stupněm asociativity je přímo mapovaná s ohledem na sety každý set je plně asociativní •
v podstatě N přímo mapovaných caches pracuje paralelně, tj. každý blok má svůj bit platnosti a data Výhody cache s omezeným stupněm asociativity: •
•
•
již cache s N=2 vyloučí množství konfliktních výpadků HW není o moc složitější, vyžaduje jen N komparátorů navíc atd. větší N => větší hit rate, protože více bloků paměti se stejným indexem může být pamatováno v cache Cache s omezeným stupněm asociativity N a s M bloky v setu je: •
•
DM cache pokud N = 1 plně asociativní cache pokud N = M Umisťování bloku v Cache s omezeným stupněm asociativity Strategie výběru oběti Přímo mapovaná cache: •
úplně se specifikuje blok, který má být vyměněn Cache s omezeným stupněm asociativity: •
index specifikuje set, ale blok může obsadit kteroukoliv pozici uvnitř setu Plně asociativní cache: •
blok může obsadit kterýkoliv blok v cache o když je bit platnosti nula potom nový blok na dané místo o když dané místo obsahuje blok s platným bitem platnosti, potom se musí určit pravidlo, které určí blok, který má být nahrazen novým blokem Nejméně používaná položka – LRU (Least Recently Used) •
vyměnit blok v setu, kterého slova byla nejméně čtena/zapisována Výhoda: •
•
využívá časovou lokalitu => zvyšuje hit rate při N=2 je velmi jednoduché udržovat informaci o nejméně používané položce v setu (1 LRU bit, protože v setu jsou jen 2 bloky) Nevýhoda: •
při N>2 je HW komplikovanější, časová složitost pro udržení LRU informace také roste Náhodně [Random] Při větších velikostech cache je na tato metoda téměř stejně úspěšná, jako LRU, ale nevyžaduje další logiku. Materiály •
•
•
•
X36APS, přednáška 6 (http://service.felk.cvut.cz/courses/36APS/lectures/aps7_2.pdf) X36APS, přednáška 7 (http://service.felk.cvut.cz/courses/36APS/lectures/aps8_1.pdf) http://www.pcguide.com/ref/mbsys/cache/funcComparison‐c.html http://www.fi.muni.cz/usr/pelikan/ARCHIT/TEXTY/CACHE.HTML Virtuální paměť a dynamický překlad adres Virtuální paměť Situace vypadá takto: Tedy virtuální paměť jsou stránky obsažené v operační paměti a na disku. Vlastnosti virtuální paměti: •
•
•
Umožňuje sdílení paměti (operačním systémem) Vzájemná ochana programů (v současnosti je důležitější ochrana dat než využití principu lokalit), tzn. to aby jeden program nepřepisoval druhému programu jeho data a tak. Každý běžící program pracuje se svým virtuálním adresním prostorem •
•
OS rozhoduje o umístění daných běžících programů v paměti Hardware provádí mapování virtuální adresy na fyzickou – máme viruální adresní prostor V={0,1,...,n} a fyzický adresní prostor M={0,1,...,m}, kde n>>m. Mapování V→M provádí mapovací funkce. •
•
Virtuální prostor je rozdělena na stejně velké "stránky" (pages), které se přiřazují jednotlivým běžícím procesům Fyzická paměť je rozdělena na stejně velké rámce (frames) •
•
Stránky tvoří souvislý VA prostor a jsou mapované do rámců, avšak: o Korespondující rámce jsou libovolně umístěny ve fyzické paměti (nejsou za sebou) o Ne všechny stránky jsou v každém okamžiku mapovány do nějakého rámce Stránka je jednotkou mapování a současně to je jednotka přenosu mezi diskem a hlavní pamětí ‐ fyzickou pamětí Tabulka stránek Protože není možné nalézt dostatečně jednoduchou mapovací funkci, pomáháme si tabulkou stránek. Tabulka stránek je vyhledávací tabulka umístěná v hlavní paměti. Virtuální adresa je pak rozdělena na 2 části: na číslo stránky a offset (posun) v rámci této stránky. Pomocí čísla stránky najdeme v tabulce stránek příslušný záznam (pokud tam je a pokud je tento záznam platný a pokud máme příslušná právo pro přístup k této stránce) ‐ tím získáme adresu rámce, do kterého je požadovaná stránka právě namapována. Přičtením offset najdeme požadované místo. Formát položky tabulky stránek •
•
•
•
•
•
•
Struktura tabulky stránek je dána strukturou OS (obsahuje mapování virtuálních adres na fyzické) Každý proces běžící v OS má vlastní tabulku stránek Pokud se někam ukládá stav procesu (kontext), myslí se tím PC, všechny registry a tabulka stránek OS mění tabulky stránek změnou PTBR (Page Table Base Register) ‐ PTBR obsahuje bázovou adresu tabulky stránek Pokud není požadovaný záznam v tabulce stránek platný, OS přenese příslušnou stránku z disku do hlavní paměti Stránky mají stejnou velikost => každý rámec je využit => nedochází k fragmentaci OS rezervuje Swap Space na disku pro každý proces Porovnání Virtuální paměti a Cache Výpadek stránky tj. hledáme stránku v hlavní paměti, ale ona tam není – prostě to samé jako Cache Miss ale ve Virtuální paměti. Pokud jsou data na disku: •
•
•
•
Načte se požadovaná stránka z disku do prázdného rámce v paměti Přenos prostřednictvím DMA a přepnutí na proces, který čeká Když je DMA ukončen, dojde k vyvolání přerušení a aktualizaci tabulky stránek procesu Při přepnutí zpět na původní úlohu jsou požadovaná data v hlavní paměti (načtené stránce) Když dochází paměť: •
•
•
Stránky s Dirty bitem náležící programu zapíšeme na disk (Dirty bit říká, se obsah stránky změnil, ale na disku je stále zapsaná její stará verze) Pomocí některé ze strategií výběru oběti (např. LRU) vybereme rámec obsazený stránkou a uvolníme ho Aktualizuje se tabulka stránek programu TLB Translation Lookaside Buffer je cache pro položky tabulky stránek (položkou tabulky stránek je vlastně překlad virtuální adresy na fyzickou). Doba přístupu do něj je srovnatelná s dobou přístupu do cache paměti a typicky má 128 ‐ 256 položek. Jakožto cache může být přímo mapovaná, s omezeným stupněm asociativity nebo plně asociativní. Jedna položka TLB obvykle obsahuje : •
•
•
•
•
•
•
Příznak platnosti Virtuální adresu Fyzickou adresu, na níž je virtuální adresa namapována Přístupová práva Dirty bit (TLB pracuje v režimu Write‐Back) Referenční příznak (používaný při hledání oběti LRU) ASID (identifikace procesu / uživatele) Co když je Miss TLB? Pak se HW podívá do tabulky stránek a načte nové PTE (Page Table Entry) do TLB. Víceúrovňové stránkování Při víceúrovňovém stránkování je virtuální adresa rozdělena na více částí. Například pro dvouúrovňové stránkování je virtuální adresa rozdělena na "super" číslo stránky, offset1 a offset2. "Super" číslo stránky slouží k vyhledání záznamu v "super" tabulce stránek. Ta obsahuje PTBR jednotlivých tabulek stránek druhé úrovně. K nalezenému PTBR se přičte offset1 a na tomto místě v tabulce stránek druhé úrovně nalezneme záznam o rámci, do kterého je stránka namapována. Nakonec k adrese rámce přičteme offset2 a získáme přesnou adresu ve fyzické paměti. •
•
•
Tabulky stránek 2. úrovně existují jen pro platné položky "super" tabulky stránek (to je ten hlavní fígl). Pokud máme jenom 10 % platných vstupů super tabulky stránek,
potom pro všechny tabulky stránek potřebujeme přibližně 1/10 prostoru stránek
jednoduchého stránkovaní! Při víceúrovňovém stránkování jsou jednotlivé tabulky měnší než při jednoúrovňovém a mohou být různě rozmístěny po paměti Dvouúrovňové stránkování vyžaduje 3 přístupy do paměti Inverzní tabulka stránek Vypadá takto: •
•
Jeden vstup pro každý rámec Hledání pomocí hashovací tabulky nebo hashovací funkce •
Vzhledem k tomu, že více virtuálních adres může být mapováno do stejného vstupu, je pro nalezení správné položky použit "chaining" (záznamy, které mají stejný kontrolní součet (hash), jsou zřetězeny) Segmentace Segmentace se původně ke stránkování nevztahuje, ale v mnoha systémech je se stránkováním spojena. Každý uživatelský prostor může totiž být rozdělen na různé segmenty. Tyto segmenty jsou pak určitým způsobem uloženy ve fyzické paměti. Nakonec jsou jednotlivé segmenty implementovány jako stránkový virtuální adresní prostor. Virtuální adresa je rozdělena na 3 části: číslo segmentu, číslo stránky a offset. Nejprve se v segmentové tabulce příslušného procesu na základě čísla segmentu najde PTBR tabulky stránek pro daný proces a segment. K němu se přičte číslo stránky a na této pozici v tabulce stránek nalezneme záznam s adresou hledného rámce. K této adrese přičteme offset a nalezeneme požadované místo ve fyzické paměti. Fragmentace paměťového prostoru •
•
Externí fragmentace (typická pro segmentaci) ‐ celý paměťový prostor je k dispozici (po splnění zrčitých požadavků), ale není souvisle obsazován Interní fragmentace (typická pro stránkování) ‐ alokovaná část paměti může být větší, než je požadováno Materiály •
•
Wikipedia ‐ Virtuální paměť (http://cs.wikipedia.org/wiki/Virtu%C3%A1ln%C3%AD_pam%C4%9B%C5%A5) X36APS, přednáška 8 Hlavní paměť s prokládaným cyklem Paměť s prokládanými cykly (interleaved memory) se používá ve výkonných počítačích ke snížení cyklu paměti. Hlavní paměť je rozdělená do několika bloků (bank) pracujících samostatně a schopných provádět nezávisle čtecí nebo zápisový cyklus. Jestliže procesor komunikuje střídavě s různými paměťovými bloky, mohou přenosy probíhat paralelně a komunikace mezi pamětí a procesorem se celkově zrychlí. Současně lze číst z n‐paměťových bank naráz, rychlost čtení je tedy cca n‐ násobná. Rychlost čtení je také ovlivněna střídou (co to je viz dále…) Doba potřebná k realizaci jedné komunikace mezi blokem a procesorem se nazývá cyklus bloku. Systém je vyvážený, jestliže je paměť rozdělená alespoň do tolika bloků, kolik taktů trvá jeden cyklus bloku. Znamená to, že procesor může v každém taktu provést jeden přístup do paměti. Cyklus bloku trvá ve vektorových počítačích obvykle 4 nebo 8 taktu, takže stačí, aby paměť byla rozdělená do 4 nebo 8 bloků. Paměť je rozdělena obvykle tak, aby při sekvenčním volání adres jdoucích těsně za sebou byly využívaný postupně všechny bloky paměti. Při sekvenčním zpracovávání jednotlivých složek vektoru pak procesor může zpracovávat jednu složku za jeden takt. Takže... ještě jednou... •
•
•
•
paměť je složená z bank lze číst z n paměťových bank najednou rychlost čtení je přibližně n‐krát rychlejší na rychlost má také vliv střída Střída (Stride) je číslo, které se přičte k číslu banky, z které právě čteme, abychom dostali číslo banky, z které budeme číst příště. Existují 2 možnosti: •
•
Unit stride ‐ nejrychlejší, jednotkový krok (např. získání řádků matice) Non‐unit stride ‐ konstantní krok (např. získání sloupců matice) Materiály •
•
Ing. Tomáš Zahradnický ‐ Vektorové počítače X36APS, přednáška 10 Způsoby implementace současného přístupu do paměti. Jednobránová paměť •
•
•
Obvykle připojená přes sběrnici Umožňuje připojení několika jednotek Kolize požadavků je řešena režimem přidělování sběrnice Vícebránová paměť •
•
•
•
Umožňuje připojení několika procesorů nebo jiných jednotek Řízení zprostředkovává řadič hlavní paměti (organizátor) Kolize požadavků je řešena odebíráním cyklů (na základě priority V/V požadavku) Přípojení je buď přímé, přes sběrnici nebo propojovacími sítěmi Vícebránová hlavní paměť s autonomními paměťovými bloky •
Umožňuje paralelní (současnou) práci růných bloků, pokud se požadavky týkají různých bloků (různých částí paměťového systému) Materiály •
•
X36JPO, přednáška 6, slajdy 13‐17 Řadiče a řídicí jednotky (X36APS, X36JPO) Řadič procesoru a datová cesta a vztahy mezi nimi Řadič je jednotka (sekvenční obvod), jejímiž vstupy jsou stavové signály řízených zařízení a obvodů a výstupem řídicí signály pro tyto zařízení a obvody. Je možné si jej představit jako tu část počítače, která rozkazuje všem ostatním zařízením, co mají dělat a jak to mají dělat. Řadič v podstatě provádí to, co nazýváme základní cyklus počítače. Řadič se dělí na: •
•
řídící část – je to jádro řadiče, podstatě vlastní řadič datovou část – to jsou registry řadiče, např. registr PC (programový čitač‐obsahuje adresu následující instrukce) nebo IR (instrukční registr – obsahuje kód právě prováděné instrukce) nebo SP (ukazatel zásobníku) nebo PSW (program status word – status programu před obsluhou přerušení) Rozdělení řadičů •
Řadič mikroprogramový (horizontální, vertikální, digonální) ‐ Provedení 1 operace řadiče sestává z provedení řady dílčích operací ‐ tzv. mikrooperací. Příkazy k provedení mikrooperací lze zapsat ve formě připomínající instrukce ‐ tzv. mikroinstrukce. Možná struktura mikroinstrukce je na následujícím obrázku… Mikroinstrukce tvoří tzv. mikroprogram, který lze uložit do tzv. řídící paměti. Lze navrhnout "klasický" řadič (nebo i jednodušší obvod), který bude zajišťovat postupné provádění mikroinstrukcí. "Počítač" takto řízený bude fungovat jako tzv. mikroprogramovaný řadič. Vzpomeň schválně na JPO, kde jsme jednu mikroinstrukci programovali. Mikroprogramované řadiče lze rozdělit na: •
horizontální ƒ dlouhé mikroinstrukce (typicky > 64b, např. 136b) ƒ řídicí signály jsou součástí mikroinstrukce — μOZ ƒ 1 mikroinstrukce trvá 1 takt ƒ není třeba μprogr. čítač — adresa další instrukce je součástí mikroinstrukce. ƒ Vybrané bity adresy následující mikroinstrukce lze nahradit, k tomu slouží VP (vstupní podmínka) a program tak můžeme různě větvit (pokud má VP n bitů, pak počet větvení je 2n) •
•
vertikální ƒ v podstatě velmi zjednodušený řadič počítače(jakoby malý počítač uvnitř daného počítače) ƒ krátké mikroinstrukce (typicky 16b) ƒ 1 mikroinstrukce trvá několik taktů, za tyto se provede: ƒ čtení μinstrukce obstarává μprogramový čítač, oproti horizontálnímu řadiči tedy zde je. ƒ dekódování μOZ ƒ provedení μoperace diagonální — kompromis ƒ řídicí signály jsou součástí mikroinstrukce — jsou v μOZ ƒ 1 mikroinstrukce trvá 1 takt ƒ součástí řadiče je μprogramový čítač Odbočka: Jak je to s návratovými adresami, v případě, že v mikroprogramu jdeme do nějakého programu a chceme se vrátit zpět? Ukládá se na zásobník, jak jinak… •
Řadič klasický (obvodově realizovaný) ‐ Navrhuje se jako konečný automat (graf přechodů ‐> sekvenční obvod) Například takto: •
řadič s řídícími řetězci ‐ pro každý stav automatu je určen jeden klopný obvod čili jednička značící daný stav se posunuje mezi klopnými obvody. Kód stavů je 1 z N. Jak vypadá kód 1 z N? No přece takto… Řadič tedy pro zakódování každého stavu obsahuje jeden klopný obvod. Vzpomeň na sekvenční automaty, kde jsme stavy kódovali binárním kódem (tedy například pro zakódování 8 stavů nám stačily 3 registry) Automat pro takovýto řadič může vypadat například takto... •
řadič na bázi čítače ‐ stav je reprezentovan cislem na citaci, ktery musi umoznovat nastaveni libovolneho cisla •
jinak navržený Mikroprogramovaný vs. klasický řadič Co se týče rychlosti, rychlejší je klasický řadič. Mikroprogramovaný řadič však může být levnější (záleží na složitosti) a navíc je flexibilnější, protože jeho chování můžeme změnit jednoduše přepisem řídící paměti. Řídící paměť může být buď typu RAM nebo ROM. Datová cesta Datová cesta je souhrnný název pro obvodové prvky, vodiče, registry, ..., kterými procházejí data při zpracování procesorem. Datová cesta je součástí řadiče. Příklad datové cesty je na obrázku (je barevně vyznačená) Vztah mezi řadičem a datovou cestou Řadič řídícími signály koriguje průchod dat datovou cestou a řeší případné hazardy, aktivuje příslušné signály, vstupy, výstupy, ... Zdroje •
X36JPO, přednáška 3 Obvodové řadiče a mikroprogramované řadiče: principy, struktura a návrh. Toto jsme již popsali v předchozí kapitole … Srovnání řadiče procesoru bez proudového zpracování a s proudovým zpracováním instrukcí (instruction pipelining). •
řadič proudově prac. procesoru je distribuovaný mezi stupni pipeline (tzv. Data Stationary Control) o
o
instrukce prochází stupni zpracování společně se svými daty nutné řešit datové hazardy a výjimky (přerušení) ‐ k tomu se obvykle používá nějaký klasický sekvenční řadič Řadič proudově pracujícího procesoru: •
•
•
•
•
Všechny instrukce trvají stejný nebo podobný počet taktů Jednoduché kódování instrukcí pevné délky Procesor podporuje jen zarovnaná data a instrukce Pouze instrukce LOAD a STORE mohou přistupovat do paměti Proudové zpracování instrukcí (X36APS) Rozdělení procesoru do stupňů(sekcí) proudového zpracování Jak jsme došli na pipeline? Charakteristika jednotaktového procesoru: jednoduchá implementace, CPI = 1, ale TCLK je velmi dlouhá (TCLK závisí na nejdelší cestě v kombinační logice). Chtělo by to zkrátit TCLK. Rešením je vložení dodatečných registrů do datové části. Po vložení přidaných registrů vypadá překreslené CPU takto: Nyní můžeme ukládat výsledky do těchto přidaných registrů. CPI se nám tím pádem zvedne na 4‐5, ale TCLK je jen 1/5 (pokud to bereme optimisticky) původního TCLK. Výsledný procesor lze dobře popsat konečným automatem. Jaké jsme získali zrychlení oproti původnímu procesoru? To je sice nic extra, ale vezměme v potaz, že vícetaktový procesor je univerzálnější a umožňuje implementovat složitější instrukce. Další krok: pipelining Obě dvě popsané varianty CPU (jednotaktová i vícetaktová) byly přísně sekvenční. Instrukce před započetí svého provádění musela čekat na provádění předchozí instrukce, než se toto dokončí. Komponenty datové části nebyly však plně využity. Idea je, aby je v každém taktu instrukce sdílely. Jak to vypadá, znázorňuje obrázek. Proudově pracující datová část a řadič budou vypadat následovně… Řadič proudově pracujícího procesoru •
je distribuován mezi stupni pipeline. Instrukce procházejí stupni zpracování společně se svými daty. •
Nějaký klasický (sekvenční) řadič je potřeba pro korektní obsluhu výjimek, datových hazardů a dalších funkcí •
Všechny instrukce trvají stejný počet taktů, jednoduché kódování instrukcí pevné délky. Pouze instrukce Load/Store přistupují do paměti. Pětistupňová pipeline procesoru se detailně chová takto: Materiály •
X36APS, přednáška 4 Hazardy v proudovém zpracování, jejich klasifikace a způsoby odstranění Sémantika provádění programu Proudové zpracování může narušit sémantiku provádění programu. Sémantika provádění programu na von Neumannově počítači: nechť i, j jsou dvě přirozená čísla, i < j. Potom i‐tá instrukce v programovém pořadí je provedena před j‐
tou instrukcí. Toto definuje úplné sekvenční uspořádání prováděných instrukcí a pipelining toto pořadí narušuje (jednotaktový i vícetaktový procesor toto dodržují). Existují dvě možná řešení: •
•
Změnit sémantiku ‐ bývá velmi obtížné až nemožné (toto řešení využívají VLIW a EPIC procesory) Modifikace proudového zpracování ‐ výsledek je stejný jako v případě sekvenčního provádění (to je výhodné, neboť programátor v JSA nemusí vědět o proudovém zpracování) Příklad narušení sémantiky programu: Tuto situaci nazýváme RAW (Read After Write) hazard. Další příklad: Toto byl příklad narušení sémantiky řídící instrukce (řídící hazard). Požadavky na korektnost provádění programu (závislosti) Úplné sekvenční provádění není třeba, ale musí být zachovány následující podmínky (pro i < j): 1. Datové závislosti (Data Dependencies) ‐ instrukce j je datově závislá na instrukci i instrukce i vytváří výsledek používaný instrukcí j 2. Jmenné závislosti (Name Dependencies / False Data Dependencies) ‐ instrukce j je závislá po jménu na instrukci i instrukce j používá stejné místo k uložení výsledku, ze kterého instrukce i čte nebo do něj zapisuje výsledek o Výstupní závislost ‐ instrukce j zapisuje na stejné místo, jako instrukce i o Protizávislost ‐ instrukce j zapisuje na stejné místo, z kterého instrukce i čte 3. Řídicí závislosti (Control Dependencies) ‐ instrukce j je závislá na instrukci i provedení či neprovedení instrukce j závisí na výsledku provedení řídicí instrukce i Pokud jsou tyto vlastnosti respektovány, je výsledek programu stejný jako při sekvenčním provádění. Hazardy v proudovém zpracování (nemají nic společného s hazardy v LOB) Hazard v proudovém zpracování je potenciální narušení sémantiky programu. Existence hazardu závisí na: •
•
Vzdálenosti i a j vzhledem k latencím pipeline Pořadí, ve kterém instrukce čtou a zapisují operandy vzhledem k jejich programovému pořadí Druhy hazardů •
•
•
Datové ‐ narušení datových a jmenných závislostí Řídící ‐ narušení řídicích závislostí Strukturní ‐ důsledek neúplné replikace prostředků v pipeline, kolize na sdílených prostředcích (paměť, porty registrových polí, funkční jednotky) Datové a řídicí hazardy jsou důsledkem konfliktu mezi sémantikou programu a pipeliningem, zatímco strukturní hazardy vznikají v důsledku nedokonalého pipeliningu. Datové hazardy Nechť i, j jsou přirozená čísla, i < j (intrukce i se v programu vyskytuje dříve, než instrukce j). Pak existují následující datové hazardy: •
Read After Write (RAW) o Mezi i a j je pravá datová závislost o Instrukce j chce číst novou hodnotu dříve, než ji instrukce i stihla zapsat •
•
Write After Read (WAR) o Mezi i a j je protizávislost o Instrukce j chce zapsat výsledek dříve, než instrukce i stihne přečíst předchozí hodnotu Write After Write (WAW) o Mezi i a j je výstupní závislost o Instrukce j chce zapsat výsledek dříve než instrukce i U celočíselné pipeline může dojít jen k RAW hazardu (ke čtení dochází v ID fázi, k zápisu ve WB fázi). Odstranění hazardů Kvůli zabránění strukturním hazardům procházejí u DLX všechny instrukce všemi pěti stupni pipeline. Další způsoby řešení hazardů jsou: •
•
•
•
Pozastavení pipeline – příklady...viz obr. Forwarding Podmíněný skok s vypláchnutím pipeline Zpožděný podmíněný skok Materiály •
X36APS, přednáška 4 , X36APS, přednáška 5 Pozastavování proudového zpracování, způsob řízení toku instrukcí mezi stupni Pozastavení proudového zpracování je jednou z metod odstranění datových hazardů. Spočívá v pozastavení závislé instrukce v kritické fázi tak dlouho, dokud nedojde k pominutí příčin hazardu. Toto pozastavení se realizuje vložením instrukce NOP do těch stupňů pipeline, kam by měla pozastavená instrukce vstoupit bez pozastavování. Při pozastavování proudového zpracování platí CPI = CPIideal + SPI, kde SPI je Stalls Per Instruction (průměrný počet pozastavení na jednu instrukci). Pozastavování proudového zpracování lze kombinovat s dalšími technikami pro odstranění hazardů. Příklady: viz obrázky… Materiály •
X36APS, přednáška 4 Techniky zabraňování datových a řídicích hazardů bez pozastavování Forwarding Forwarding (přeposílání nebo též Register Bypassing) slouží k předání vypočtené hodnoty instrukcí i (ze stupně MEM nebo WB) instrukci j (ve stupni EX) tak, aby nemuselo dojít k pozastavení (i < j). Jak je forwarding vyřešen hardwarově? Nelze však předávat hodnoty zpět v čase ‐ pokud j = i + 1, nelze použít forwarding ze stupně WB do stupně EX. Viz obrázek V tomto případě dochází k tzv. LOAD‐USE Delay zpoždění, které je typické pro RISC procesory. Vypadá to takto: LOAD‐USE Delay se řeší buď pozastavením závislé instrukce na 1 takt ve stupni ID a následným forwardingem, nebo vložením nezávislé instrukce mezi instrukci LOAD a závislou instrukci. Vkládání nezávislých instrukcí je typickou úlohou optimalizujícího překladače. Podmíněný skok s vypláchnutím pipeline Při vyplachování pipeline nedochází k pozastavení zpracování. Instrukce jsou sekvenčně načítány a zpracovávány v pipeline (nehledě na řídicí hazardy). Pokud dojde ke skoku, jsou instrukce sekvenčně následující po skoku z pipeline "vypláchnuty" (vymazány). např… Protože podmínka skoku se vyhodnocuje ve stupni EX a další jeden takt trvá změna PC, jsou vypláchnuty vždy tři instrukce. Vypláchování pipeline tedy znamená stejnou ztrátu taktů, jako pozastavování zpracování při řídicím hazdardu. Ale pozor, znamená ztrátu jen pro každý provedený skok. Vylepšení podmíněného skoku: 1. Výpočet podmínky dříve (přesun logiky pro vyhodnocení podmínky do stupně ID) 2. Výpočet cílové adresy a změna PC dříve (vypočet cílové adresy ve stupni ID) Implementace vylepšeného podmíněného skoku: Důsledkem vylepšení je jedno pozastavení místo tří, avšak nelze využít forwardingu do stupně EX => nárůst CPIdata. Dále se může stát, že se zvětší Tclk (v důsledku komplexnější logiky ve stupni ID). Takhle vypadá v praxi vylepšený podmíněný skok: O instrukci říkáme, že je tzv. Branch Delay Slotu, pokud v sekvenčním pořadí instrukcí následuje bezprostředně po instrukci skoku (podobně mluvíme o Load Delay Slotu). Úlohou překladače je vhodné naplnění Delay Slotů instrukcemi tak, aby nedocházelo k hazardům. Branch Penalty je počet taktů, které díky řídicímu hazardu ztratíme vykonáním instrukcí, které se provést nemají. Všechny následující varianty skoků fungují dobře pro jednoduchou pipeline, ale komplikují řešení výjimek (přerušení) a superskalární provádění instrukcí ve výkonnějších modelech pipeline. Je‐li u konvenčního a rušícího skoku instrukce v Branch Delay Slotu provedena v cestě, kudy se program nemá ubírat, nesmí tato instrukce způsobit výjimku. Zpožděný skok Instrukce v Branch Delay Slotu je provedena vždy nezávisle na tom, jestli skok bude nebo nebude proveden. Branch Penalty je tak redukována na nulu, avšak podmíněný skok nesmí datově záviset na instrukci ve svém Delay Slotu. Příklad vložení vhodných instrukcí. Branch penalty je u řešení 2 a 3 redukována pouze tehdym, pokud skok pokračuje v požadované cestě, ze které pochází instrukce v branch delay slotu. Řešení 2 a 3 jsou bezpečná pouze pokud instrukce v delay slotu může být bezpečně provedena i tehdy, pokud vede skok opačnou cestou. Instrukce v delay slotu nesmí způsobit výjimku. Řešení jsou následující… Konvenční skok Instrukce v Branch Delay Slotu je zrušena, pokud je skok proveden. Rušící skok Instrukce v Branch Delay Slotu je provedena pouze pokud se skáče, v opačném případě (pokud se sekvenčně pokračuje) je zrušena. Zpožděné skoky fungují velmi dobře pro jednoduchou pipeline, ale komplikují řešení výjimek (přerušení) a superskalární provádění instrukcí ve výkonnějších modelech pipeline. Materiály •
X36APS, přednáška 5 Proudové zpracování instrukcí celočíselných a instrukcí v pohyblivé řádové čárce Proudové zpracování celočíselných instrukcí •
•
•
pipeline se typicky skládá z 5‐ti stupňů (IF, ID, EX, MEM, WB) a všechny instrukce postupně procházejí všemi stupni v každém okamžiku může být v jednom stupni zpracování pouze jedna instrukce existují pouze RAW datové hazardy, WAR a WAW nemohou nastat Proudové zpracování instrukcí v pohyblivé řádové čárce pipeline se typicky skládá ze stupňů IF, ID a WB, přičemž mezi ID a WB jsou zapojeny různé funkční jednotky (celočíselná, FP násobička, FP sčítačka, ...) Funkční jednotky Funkční jednotka je zařízení, které umožňuje provedení nějakého úkolu ‐ obecně transformuje vstupní data na výstupní (např. sčítačka sčítá dvě vstupní čísla a výstupem je součet těchto čísel). •
Latence funkční jednotky o Počet taktů než je k dispozici výsledek o Typicky odpovídá počtu stupňů pipeline v jednotce •
Spouštěcí (opakovací) interval o Počet taktů než může další instrukce používat tuto jednotku Instrukce V souvislosti s proudovým zpracováním komplexních instrukcí se zavádějí následující pojmy: Latence instrukce •
•
Počet taktů, než je k dispozici výsledek pro datově závislou instrukci Závisí na: o Latenci funkční jednotky pro danou instrukci o Forwardovacích cestách procesoru o Typu závislé instrukce (kdy daná instrukce potřebuje data) Spouštěcí (opakovací) interval instrukce •
•
počet taktů než může být spuštěna další instrukce daného typu (bez strukturních hazardů) závisí na počtu funkčních jednotek a jejich spouštěcích intervalech Problémy u FP pipeline •
větší počet strukturních hazardů (konflikty u neproudových jednotek, zápisové porty u registrového pole) . Příklad… •
•
RAW hazardy častější (větší latence instrukcí) WAW hazardy možné (instrukce jsou dokončeny mimo programové pořadí ‐ mají různou latenci) .Příklad WAW hazardu: toto může být vyřešeno pozastavením instrukce FADD ve stupni MEM. V praxi vliv těchto hazardů na výkon není zřejmý, protože tato situace nastává zřídka. •
•
tzv. In‐Order Issue, Out‐Of‐Order Completion složitá logika detekce hazardů ve stupni ID Reálný CPU •
•
•
•
stupeň MEM u FP instrukcí nemá smysl (nezabrání odlišným latencím ‐ u celočíselné pipeline jsme nechávaly tímto stavem projít všechny instrukce, aby se zamezilo vzniku dalších hazardů) instrukce STORE nemusí mít konflikt (neboť nic nezapisuje) celočíselné instrukce nemusí mít konflikt s FP instrukcemi (separátní registrová pole) může být více zápisových portů u FP registrového pole Materiály •
X36APS, přednáška 4 , X36APS, přednáška 5 Princip proudového zpracování komplexních instrukcí Pipelining mikroinstrukcí Chceme přidat následující instrukce k DLX: Jak to vypadá detailněji? Instrukce SW Rd, (Rs + Rt) vyžaduje tři čtecí porty ve stupni ID. Instrukce LW Rt, Imm(Rs)! vyžaduje dva zápisové porty ve stupni WB. Tyto instrukce jsou užitečné, ale ne tak časté aby se vyplatilo měnit kvůli nim pipeline. Řešením je rozbít tyto instrukce na sekvenci dvou mikroinstrukcí . Rozbití instrukcí na mikroinstrukce SW (Rs + Rt), Rd nahradíme při dekódování sekvencí 1. add R32, Rs, Rt Reg(R32)=Reg(Rs)+Reg(Rt) 2. sw (R32), Rt Mem(Reg(R32))<=Reg(Rt) LW Rt, Imm(Rs)! nahradíme při dekódování sekvencí 1. addi Rs, Rs, Imm Reg(Rs)=Reg(Rs)+Imm 2. lw Rt, (Rs) Reg(Rt)=Mem(Reg(Rs)) Mikroinstrukce jsou v pipeline přímo proveditelné, R32 je programátorovi nepřístupný registr využívaný mikroinstrukcemi (tzv. microarchitecture scratch‐pad register). Výsledné instrukce budou provedeny ve dvou taktech. viz. obrázek Komplexní instrukce stráví více taktů ve stupni ID. V každém taktu je „emitována“ jedna mikroinstrukce. Dekodér ve stupni ID již musí být sekvenční obvod a procesor musí obsahovat další registry (pro implementaci komplexních instr.). Tato technika je používána např. v procesorech PowerPC. Pipelining CISC procesorů •
•
•
•
•
•
•
přímý pipelining komplexních instrukcí je obtížný nativní CISC pipeline se vyznačuje vícetaktovými stupni (pokud je třeba, stráví instrukce v daném stupni více taktů) komplexnější adresační módy a dekódování => dodatečná ALU pro výpočet efektivní adresy (Register‐Memory Pipeline pro instrukce typu Register‐Memory: IF‐ID‐
Register Fetch‐Address Calculation‐MEM‐EX‐WB) složitá detekce hazardů, forwarding (instrukce čtou a zapisují data v průběhu provádění) složité řešení přesného přerušení (schopnost přerušení a restartu uprostřed komplexní instrukce) používaná řešení jsou unikátní pro každý CISC procesor alternativou je právě pipelining mikroinstrukcí. Obrázek takovéhoto procesoru: Charakteristika proudově pracujících CISC procesorů •
•
•
•
instrukce jsou "překládány" na sekvence jedné či více mikroinstrukcí (CISC instrukce odpovídá obvykle jedné mikroinstrukci, protože komplexní instrukce se v programech vyskytují zřídka) vertikální mikroinstrukce připomínají RISC instrukce mikroinstrukce jsou vykonávány pomocí "RISC‐like" pipeline tento přístup byl zvolen u pozdějších modelů CISC počítačů VAX, IBM360, M68030 a též i 486 a u všech novějších x86 •
tento přístup je základem implementace moderních superskalárních CISC procesorů firem Intel i AMD Pokročilé proudové zpracování; superskalární, superpipelinové a VLIW procesory Paralelismus na úrovni instrukcí (Instruction Level Parallelism‐ILP) Všechny moderní procesory se snaží nějakou formou využít paralelismu mezi instrukcemi. • ILP = provádění instrukcí se může plně nebo částečně překrývat • ILP je omezeno datovými, jmennými a řídícími závislostmi které jsou v programech inherentní ILP techniky: Procesory využívající ILP •
•
•
Superpipelinové procesory o Velký počet stupňů pipeline umožňuje dosáhnout krátkého Tclk o CPI bývá horší v důsledku latencí v pipeline a paměťovém subsystému Statické superskalární procesory (Static, In‐Order Superscalar) o Zpracovávají více instrukcí paralelně ale v programovém pořadí o Typická šířka 3‐4 instrukce o Velmi závislé na kvalitním překladači VLIW procesory o Instrukce obsahuje více paralelních operací o Hazardy detekuje a řeší překladač (téměř výlučně) o Šířka instrukcí typicky 6‐10 paralelních operací Superpipeline procesory a superscalar procesory situace vypadá takto: •
•
•
•
•
Tyto dva přístupy jsou vzájemně ortogonální. Superpipeline využívá paralelismu v čase (mezi po sobě jdoucími stupni pipeline). Superscalar využívá paralelismu v prostoru (mezi paralelními stupnipipeline). Superpipeline zvyšuje hodinovou frekvenci (snižuje Tclk). Superscalar zvyšuje Instruction Per Clock ‐ IPC (snižuje CPI) HW složitost je podobná, ale je snazší přechod od skalární pipeline ke superpipeline než od skalární pipeline k superskalární pipeline Definice superskalární pipeline je jasná – IPCideal > 1 (CPIideal < 1). Definice skalární superpipeline není tak zřejmá– typicky S > 5 ‐ 6 u celočíselné pipeline znamenalo superpipeline Moderní procesory jsou často kombinace – nazývané SUPER – SUPER. Pro nejnovější procesory se S>30 se zavádí pojem hyperpipelining Superpipeline procesory Princip: Superpipelining = Více Stupňů Pipeline IF stupeň a MEM stupeň je vhodné rozdělit do více stupňů pipeline což umožní přístup do větší cache (menší MR, větší HT) bez vlivu na Tclk •
ID stupeň – pokud je dekódování složité, je možno rozdělit ho typicky do 2 stupňů: dekódování (ID) a čtení registrů (RF). •
EX stupeň ‐ je‐li některá operace příliš složitá na provedení v 1 taktu je vhodné ji rozdělit do více stupňů aby se nestala omezením Tclk. Problémy superpipeline? Zvyšování počtu stupňů v pření části (frontend) zvyšuje latenci skoku Zvyšování počtu stupňů v zadní části (backend) zvyšuje latenci provádění Vliv zkrácení Tclk na paměťový subsystém: Vybavovací doba nižších úrovní paměti = MP * Tclk Zkrácení Tclk vede k relativnímu nárůstu doby výpadku MP Výhodou superpipeliningu je, že snižování Tclk je dále posíleno díky škálování technologie a naivní uživatel ztotožňuje fclk s výkonností počítače. Tclk však neklesá lineárně s počtem stupňů pipeline a vede k nárůstu SPI a tím i celkového CPI. Superskalární procesory •
•
•
•
•
•
První superskalární procesory byly staticky plánované => pouze instrukce přesně za sebou v programu mohly být spuštěny paralelně (Statické plánování instrukcí = provádění instrukcí v programovém pořadí) Paralelní provádění může zahájit pouze limitovaná kombinace typů instrukcí Příklad – IBM Power1 – může spustit v každém taktu: ‐ 1 celočíselnou instrukci ‐ 1 FP instrukci ‐ 1 podmíněný skok ‐ 1 instrukci s podmínkovým registrem Procesor je jen o něco složitější než konvenční skalární procesor Nejtypičtější pro první generaci superskalárních procesorů bylo paralelní provádění celočíselné a FP instrukce (např. Intel 860) Superskalární Pentium (první superskalární x86) také patří mezi tutokategorii procesorů (limitované kombinace “párovatelných instrukcí” v pipelinách U a V) Takto pracuje superskalární DLX (příklad statického superskaláru): Funguje to tak, že se za jeden takt načtou 2 instrukce, 1 FP a 1 jiná (64 bitů – jedna vlevo, druhá vpravo popř. naopak). Pokud je spuštěna první instrukce, může se spustit druhá Limity staticky plánovaných superskalárů: Ačkoli spouštění celočíselné a FP instrukce paralelně je jednoduché pro HW, CPI = 0.5 bude fungovat pouze pro program kde je: ‐ přesně 50% FP instrukcí ☺ ‐ žádné hazardy ☺ Superskaláry závisí silně na kvalitním překladači (relativně slabá výkonnost na neoptimalizovaných starších programech). Pro řadu aplikací to však je vyhovující a ze staticky plánovaného superskalárního procesoru dostaneme obdobnou výkonnost jako z dynamicky plánovaného superskalárního procesoru pokud máme kvalitní překladač Problémy statických superskalárů: • Chceme‐li spouštět více instrukcí paralelně, stupeň dekódovánía spouštění (decode/dispatch/issue) se komplikuje : I pro 2‐cestný superskalár => dekódovat 2 oper. znaky, 6 čísel registrů a rozhodnout zdali bude spuštěna 0, 1 nebo 2 instrukce + detekce strukturních hazardů, RAW, WAW hazardů, řízení forwardingu ... • Superskalární CPU může mít horší Tclk kvůli komplexnímu stupni ID VLIW – Very Long Instruction Word – procesory Výkonnost statického superskaláru silně závisí na kvalitním překladači, hardware je relativně jednoduchý s výjimkou logiky detekce a řešení hazardů => Proč tedy nepřesunout tuto zodpovědnost na SW (překladač). Toto je právě přístup VLIW. Pevný formát instrukce obsahuje kód několika operací které mohou být provedeny paralelně. HW nekontroluje hazardy => je jednoduchý, rychlý a škálovatelnější (zůstává problém škálování forwardingu a vícebránového reg. pole) VLIW – problémy: •
•
•
•
Velikost programu – synchronizační NOPy jsou u VLIW navíc => nějaký mechanismus komprese / dekomprese VLIW instrukcí je užitečný Některé závislosti nejsou staticky rozpoznatelné v době překladu (např. aliasing problém ukazatelů, oddělený překlad, dynamické linkování) => překladač musí být konzervativní a výsledná výkonnost je nižší než při schopnosti rozpoznat všechny závislosti Některé latence nejsou odhadnutelné v době překladu např. latence load/store (cache hit/miss)=> Některé VLIWy používají softwarově řízenou lokální paměť místo datové cache, jinde překladač předpokládá 100% hit‐rate … VLIWy nejsou zpětně softwarově kompatibilní (ale existují cesty …) Materiály •
•
•
•
http://www.fi.muni.cz/usr/pelikan/ARCHIT/TEXTY/PARPROC.HTML X36APS, přednáška 9 X36APS, přednáška 13 Paralelní systémy (X36APS) Taxonomie paralelních systémů, Flynnova klasifikace Typy paralelismu •
paralelismus na úrovni instrukcí (ILP) – Pipelining instrukcí (ILP procesory), superskalární a superpipelinové procesory. •
datový paralelismus‐ pipelining datových operací – SIMD a vektorové koprocesory •
paralelismus na úrovní procesů (vláken, threadů) – symetrické multiprocesory (SMP), distribuované multiprocesory (DMP), vícevláknové procesory, svazky (clustery), metapočítače a další Terminologie Proces vs. vlákno ‐ Pojem procesu původně znamenal jednu instanci kódu, dat, zásobníku a stav registrů (viz původní UNIX proces) ‐ Procesem dnes vnímáme kolekci výpočetních vláken (společný kód, část dat, ale zvláštní zásobník a stav registrů pro každé vlákno) Procesor vs. procesorové jádro ‐ Procesor tradičně je tvořen jednou datovou částí a řadičem vykonávajícím jedno výpočetní vlákno (dříve proces) a je typicky realizován na jednom čipu. Dnes jsme na čipu schopni realizovat více takových procesorů a původní pojem procesor je nahrazován pojmem procesorové jádro (core) ‐ Procesorové jádro navíc je často schopno současně zpracovávat více vláken (dříve procesů) – tzv. multithreaded core Multiprocesorové systémy ‐ klasifikace podle HW realizace: •
•
•
•
•
SMP ‐ Symetrický multiprocesor ‐> procesory se sdílenou hlavní pamětí – procesory jsou připojeny k centrální sdílené paměti. DMP ‐ Distribuovaný multiprocesor ‐> Autonomni PE (Processing elements) propojené sítí .PE může být procesor nebo SMP. Dělí se na modely SAP (sdílená paměť) a DAP (oddělená paměť) vektorové počítače ‐ SMP nebo DMP s vektorovými uzly Svazky nebo SAN (System Area Network) ‐ uzly propojené rychlou LAN, uzly mohou být pracovní stanice, standardní PC nebo SMP Metapocitace ‐ Distribuované systémy sjednocené virtuálně softwarem podle programátorského pohledu: •
•
SM ‐ sdílená paměť – Shared Memory MP ‐ předávání zpráv – Message Passing přirozená je implementace SM na SMP a MP na DMP,svazcích a metapočítačích. Oba programátorské modely lze implementovat na libovolném HW. Flynnova Taxonomie Pro klasifikaci počítačů se používá nejčastěji Flynnova taxonomie, dělící počítače podle toku instrukcí a proudů dat. Flynnova taxonomie dělí počítače na čtyři hlavní typy: •
•
•
•
SISD (Single Instruction Single Data Stream) ‐ tradiční von Neumannův model, Jeden procesor provádí jeden instrukční proud nad daty uloženými v 1 paměti. Příkladem tohoto modelu je klasické PC. SIMD (Single Instruction Multiple Data) – 1 instrukční proud, ale více datových proudů. Příkladem je vektorový nebo maticový počítač. MISD (Multiple Instruction Single Data) – obecně se má za to, že více instrukčních proudů bude potřebovat ke své činnosti také více datových proudů. Tento typ architektury je však dobře využitelný, pokud dojde na redundantní paralelismus. Prostě když potřebujeme data třeba paralelně nějak zálohovat atd. MIMD (Multiple Instruction Multiple Data) ‐ více instrukcí probíhá na několika proudech dat ‐ každý procesor tak může vykonávat vlastní program. Příkladem mohou být distribuované systémy. Na obrázku vypadají architektury takto: Z těchto čtyř typů jsou pro paralelní výpočty rozšířeny systémy SIMD a MIMD. V SIMD systému vysílá řídicí jednotka stejný kód ke všem procesorům a není tudíž třeba se starat o jejich synchronizaci. Systém MIMD je flexibilnější, ale mohou u něj nastat problémy se sladěním úrovní procesu i dat, nebo s alokací procesorů. U tradičního počítače je veškerá paměť adresována procesorem, u SIMD a MIMD systémů máme na vybranou, zda dovolit každému procesoru přístup k celé paměti, nebo přidělit každému jen její část. První způsob se dá nazvat sdílená paměť, druhý rozdělená paměť. Při rozdělené paměti nenastávají kolize, ale je potřeba zřídit síť pro komunikaci mezi procesory, které jinak mohou komunikovat přes sdílenou paměť. Pro zabudování sítě je instalován zvláštní hardware a software, což komunikaci zpomaluje Materiály •
•
•
Flynnova klasifikace na Wiki: http://en.wikipedia.org/wiki/Flynn's_taxonomy Architektury paralelních počítačů http://service.felk.cvut.cz/courses/36APS/lectures/aps_parallel_comp1_1s.pdf Vektorové počítače Problémy konvenčního přístupu Hranice využití ILP 1. Hodinová frekvence pipeline: od určité úrovně každé zvyšování hodinové frekvence způsobuje zvýšení CPI (skoky a jiné hazardy) 2. Načtení a dekódování instrukcí: od určité hranice je obtížné načítat a dekódovat více instrukcí za jeden takt 3. Cache hit rate: pro dlouhodobě běžící (vědecké) aplikace s rozsáhlými datovými soubory je malý cache hit rate způsobený slabou prostorovou lokalitou dat; souvislé datové řetězce (multimédia) mají slabou časovou lokalitu dat Vektorový procesor •
•
•
•
•
•
•
•
•
•
•
Je to koprocesor, který je speciálně navržen pro provádění vektorových výpočtů Je často používaný ve vektorových superpočítačích, také může být připojen k nějakému skalárnímu CPU Vykonává operace na vektorech, např. jeden průchod smyčkou ( 64‐prvků FP vektor), počet načtených instrukcí s pomocí něj rapidně klesá Vektorové instrukce: výpočet jednoho prvku výsledního vektoru je nezávislý na výpočtu jiných prvků vektoru→ „hluboká“ pipeline je bez datových hazardů Vektorové prvky mají známy formát přístupu do paměti M → prokládaná paměť M pracuje efektivně (nahrazuje cache) M latence je jen jednou pro první prvek vektoru Prokládaná paměť M je dražší než paměti cache Řídící hazardy přítomné u skalárního zpracování se zde nevyskytují Vektorové proudové zpracování může být u… o Aritmetických operací o Paměťových operací Efektivní výpočet adres pro jednotlivé elementy vektoru Současné vykonávání několika vektorových operací Základní architektura vektorových počítačů (VP = obyčejná proudově pracující jednotka + vektorová jednotka) •
•
Paměť – paměť VP: neúspěšná architektura Procesor s vektorovými registry (L/S architektura) Vektorové počítače s výhodou používají paměť s prokládaným cyklem – paměť je rozdělena na několik paměťových bank a lze z nich číst prakticky současně. Komponenty vektorového počítače •
•
•
•
•
Vektorové registry: pevná délka, uchovává jeden vektor (to je typicky 64‐128 64‐bitových prvků) ‐ minimálně: 2 čtecí a 1 zapisovací port u každého registru ‐ typicky je ve vektorovém počítači 8‐32 vektorových registrů Vektorové funkční jednotky ‐ Vector Functional Units (FUs): plně proudově pracující, každý takt je startována nová operace ‐ Typicky: 4 až 8 FUs: FP add, FP mult, FP reciprocal (1/X), integer add, logical, shift; může být i více stejných jednotek Vektorové Load‐Store Units (LSUs): plně proudově pracující jednotka, provádí load, nebo store nějakého vektoru; může být i více stejných jednotek LSUs Skalární registry: jeden element pro FP skalár (celé číslo) nebo adresu Cross‐bar ‐ propojuje FUs, LSUs, registry Typy instrukcí vektorového procesoru 1. vektor ‐ vektor, 1 nebo 2 operandy f1: Vi → Vj V2 = sin(V1) f2: Vi x Vj → Vk V3 = V1 + V2 2. vektor ‐ skalár f3: s x Vi → Vj V2 = s.V1 3. vektor – paměť f4: V →M f5: M → V 4. vektorová redukce f6: Vi → s f7: Vi x Vk →s 5. gather (sběr) f8: M x V0 → V1 6. scatter (rozložení) f9: V1 x V0 → M Max, min, sum, střední hodnota Skalárnísoučin s = V1 . V2 nenulové prvky řídkého vektoru V1 jsou načtené z M s použitím předpisu ve vektoru V0 prvky hustého vektoru V1 jsou uložené do řídkého vektoru v M (paměti) s použitím předpisu ve V0 7. maskování f10: V0 x Vm → V1 komprese/expanze vektoru vektor Operace s pamětí u vektorového počítače – adresace stride (střída) – vzdálenost sousedních elementů jednoho vektoru zapsaného v paměti. Se střídou je nutno zacházet opatrně, protože může způsobit konflikty paměťových bank (například stride 32 a 16 bank). V závislosti na stride máme 3 typy adresace: •
unit stride (jednotkový krok) – tento režim je nejrychlejší •
non‐unit stride (konstantní ale nejednotkový krok) •
indexový režim (gather a scatter) – každému prvku vektoru je dán index (adresa), kam se má umístit, tyto adresy nemusí (a nejsou) být od sebe konstantě vzdáleny. Tento režim je vhodný pro řídké rozložení dat. A jak vlastně vypadá struktura adresy do paměti? Vektorové proudové zpracování •
proudové zpracování – v tomto řešení se nevyskytují žádné datové hazardy a tím pádem není potřeba ani žádný speciální HW k jejich řešení. •
paralelní zpracování •
proudové & paralelní zpracování Jak je provedeno proudové zpracování u vektorového počítače? Je použita technika tzv. chainingu (zřetězení) – to je vlastně způsob forwardingu rozšířený na vektorové registry. Příklad… Proč nemůže být další instrukce MULV také ihned zřetězena? Máme pouze jednu vektorovou násobičku, proto je nutné počkat, než se spočte výsledek předchozí instrukce.viz dále… Doba vektorových výpočtů •
•
•
Initiation rate (četnost spouštění): míra schopnosti FU zpracovat více vektorových elementů současně (= # lanes; obyčejně 1, nebo 2 na Cray T‐90) Convoy (konvoj): množina vektorových instrukcí, které mohou začít vykonávat v tom samém čase (žádné strukt. nebo datové hazardy), konvoje se nepřekrývají Chime: přibližný čas pro vektorovou operaci: m convoys take m chimes; když délka vektorů je n, potom potřebuje přibližně m x n taktů na provedení výpočtu (ignoruje se overhead; dobra aproximace pro dlouhé vektory) Příklad konvojů (bez zřetězení) ‐ první konvoj je oddělen od druhého kvůli datovému hazardu u registru V1 (RAW hazard). Druhý od třetího kvůli hazardu na V2 a koneně třetí od čtvrtého kvůli hazardu u registru V4. Následuje příklad stejných instrukcí, ale se zřetězením…všimněte si, že nyní jsou instrukce rozděleny do 3 konvojů, ale ne proto, že by jim dělaly problém nějaké datové hazardy/stally (ty jsou zřetězením odstraněny), ale proto, že L/S jednotka může v 1 okamžiku provádět pouze jednu instrukci a v každém z těchto 3 konvojů je 1 L/S instrukce. Ty nemohou být prováděny dohromady, proto jsou konvoje 3. Stejné instrukce se zřetězením a přidáme ještě 2 L/S jednotky ‐ celkem tedy budou 2 Load jednotky a 1 Store. Tím pádem se program může provést jako jeden konvoj… Délka vektoru Co dělat v případě, že vektorová délka není přesně 64 (DLXV)? • z tohoto důvodu je tu vektor‐length register (VLR) ‐ má v sobě uchovánu délku vektoru a řídí vektorové operace podle délky vektorů jako: vektor load/store. (délka vektoru ≤ kapacita vektorového registrů ) • vektor je delší než MVL (Max Vector Length – maximální povolená délka vektoru)→ strip mining technika – strip je vektorový segment, takový, že každý vektorová operace je vykonávána pro velikost ≤ MVL. Probíhá to takto: 1.
2.
3.
4.
Do VLR (Vector Length Register) uložíme hodnotu n mod MVL Provedeme jeden krok výpočtu s tímto VLR Do VLR uložíme hodnotu z MVL Provedeme zbylé kroky Celý cyklus při Strip Mining proběhne tedy n/MVL krát. Výkonnostní rovnice f = taktovací frekvence, n = vektorová délka, c = # konvojů TSTART = doba potřebná pro start, TLOOP = čas potřebný pro strip mining Vektorová metrika •
R∞ o
o
•
N½ MFLOPS odhadnutá na nekonečně dlouhém vektoru reálné problémy nemají nekonečně dlouhé vektory a navíc čas potřebný pro "nastartování" mají větší •
o
o
vektorová délka potřebná pro dosažení poloviny R∞ vhodná pro měření vlivu času potřebného pro nastartování o
vektorová délka potřebná pro učinění vektorového zpracování rychlejším, než je zpracování sekvenční (skalární mód) zahrnuje čas potřebný pro start a také kvalitu spojení vyjadřuje zrychlení skalárního zpracování oproti vektorovému Nv o
o
Výhody vektorového zpracování •
•
•
•
umožňují lehce získat velký výkon (n operací) o nezávislé o používají stejnou funkční jednotku o přístup k odděleným registrům o přístup k sousedním paměťovým slovům nebo ke slovům se známým vzorem o možnost využívat velké propustnosti při přístupu do paměti o skrytá paměťová latence (a další typy latencí) škálovatelnost ‐ možnost zvýšit výkon, když máme k dispozici více HW kompaktnost ‐ zápis n operací 1 krátkou instrukcí multimédia ‐ možnost výběru N ∙ 64b, 2N ∙ 32b, 4N ∙ 16b, 8N ∙ 8b Aplikace •
•
•
•
•
•
•
•
•
•
Multimedia Processing ((De)Compress, Graphics, Audio Synth, Image Processing, ...) Standardní behnchmarková jádra (násobení matic, FFT, konvoluce, ...) Ztrátová komprese (JPEG, MPEG, ...) Bezeztrátová komprese (Zero Removal, RLE, LZW, ...) Kryptografie (RSA, DES/IDEA, SHA/MD5) Rozeznávání řeči a písma OS/Networking (memcpy, memset, parity, checksum) Databáze (hash / join, data mining, image / video serving) Language Run‐Time Support (stdlib, Garbage Collector) SPECint95 Materiály •
•
•
http://linux456.vsb.cz/~las034/pa/index.html X36APS, přednáška 10 vector.pdf, aps_cv11.pdf Architektury multiprocesorových systémů se sdílenou a distribuovanou pamětí Symetrický multiprocesor (SMP) – zjednodušený příklad: Core2Duo •
•
•
•
pomůcka k tomu jak to vlastně vypadá: představ si obrázek více procesorů přistupující k jedné společné paměti – tento obrázek bude symetrický PE (Processing Element)= výkonné procesory s velkými Cache. Symetrický multiprocesor obsahuje mnoho takových PE. paměť SMP je Centrální sdílená (jedna či více bank) Nutnost synchronizace přístupu ke sdíleným datům •
Škálovatelnost je limitována propustností paměťového rozhraní •
•
•
•
•
Vícejádrové procesory (Core 2 Duo třeba) se také označují jako SMP na čipu Propojení procesor‐paměť (P‐M): multiprocesorová sběrnice, křížový přepínač Dominují na trhu v oblasti serverů Atraktivní jako DB; podnikové či výpočetní servery Jednoduchý model pro programátora ‐ výměna dat provádění operací READ a WRITE nad buňkami sdílené paměti Základní otázka v SMP je: jak provést rozšíření paměťové hierarchie podporující paralelní přístupy do sdílené paměti: •
•
musíme zajistit koherenci skrytých pamětí (Cache) jednotlivých procesorů a konzistenci paměti vzhledem ke sdíleným datům (o tom bude povídání v následující kapitole) to řeší HW primitivy podporující synchronizační operace (zámky, bariéry) Cache v SMP: Siruace vypadá takto…každý procesor má vlastní Cache a ze sdílené paměti do ní načítá data. Multiprocesor s distribuovanou pamětí (DMP) – jsou to počítače propojené sítí •
•
•
•
•
pomůcka: distribuované do různých končin – klidně od sebe daleko vzdálené – propojené sítí PE = výkonné samostatné počítače s lokálními (soukromými) paměťmi; mohou to však být také SMP Všechny procesory mohou současně přistupovat do svých lokálních pamětí V/V jsou distribuované a škálovatelné podobně jako paměť Škálovatelnost je mnohem vyšší, protože je limitována celkovou propustností spojovací sítě a ta je závislá na rychlosti kanálů a vlastnostech topologie (stupeň souvislosti, bisekční šířka, ...) Existují dva různé paměťové modely systémů DMP: Paměťový model sdílená paměť (SAP) •
•
•
•
•
Fyzicky oddělené paměti jsou adresované jako globální společný adresový prostor (jako v SMP) Jakýkoli PE se může odkázat přímo na jakoukoliv adresu adresového prostoru 2 stejné adresy na 2 různých PE odkazují na totéž paměťové místo Meziprocesorová komunikace je implicitně skryta v operacích READ a WRITE (LOAD‐
STORE) Jazyková podpora: OpenMP standard Paměťový model oddělená paměť (DAP) •
•
•
•
•
Každý PE má privátní fyzický adresový prostor, do kterého nemají ostatní PE přímý přístup Neplatí, že jakýkoli PE se může odkáza přímo na jakoukoliv adresu adresového prostoru 2 stejné adresy na 2 různých PE odkazují na různá paměťová místa Meziprocesorová komunikace je založena na explicitním zasílání zpráv (standard MPI) Zasílání zpráv má sémantiku volání vzdálených funkcí (Remote Procedure Call ‐ RPC) Materiály •
X36APS, přednáška 12 Koherence skrytých pamětí a paměťová konzistence v multiprocesorovém systému se sdílenou pamětí Koherence skrytých pamětí Problém koherence je dobře znázorněn na příkladu na slidech 13 – 19 / aps_parallel_comp1_1s.pdf. Je jsou tam mimochodem i dobře ukázány módy zápisu do Cache Write Through a Write Back. Jde tam mimo jiné o to, že procesory si nahrají do své Cache nějakou hodnotu z hlavní paměti. Poté jeden procesor tuto hodnotu změní (při strategii Write Through se okamžitě změna zapíše i do hlavní paměti). Jak se ostatní procesory dozví, že hodnota, kterou mají ve své Cache byla pozměněna? Před řešením tohoto problému bude užitečné si ujasnit nějaké definice… Definice: Řekneme že multiprocesorový paměťový systém je koherentní jestliže výsledek jakéhokoli provádění programu je takový, že pro každé paměťové místo je možné sestavit myšlené sériové pořadí čtení a zápisů k tomuto paměťovému místu a platí 1. Paměťové operace k danému paměťovému místu pro každý proces jsou provedeny v pořadí, ve kterém byly spuštěny tímto procesem. 2. Hodnoty vracené každou operací čtení jsou hodnotami naposledy provedené operace zápis do daného paměťového místa vzhledem k sériovému pořadí. Rozbor: Požadavek koherence definuje, že paměťový systém nemůže změnit pořadí provádění čtení a zápisů daného paměťového místa z hlediska každého procesu (toto musí být ostatně splněno i na jednoprocesorovém počítači). Požadavek možnosti sestavit sériové pořadí čtení a zápisů znamená, že pořadí přístupů ke každému paměťovému místu je vnímáno všemi procesy (procesory) stejně. Vzhledem k tomu, že čtení nemění stav paměťového místa, vynucuje tato definice propagaci zápisu (všichni se o zápisu musí dozvědět jinak neplatí podm.2) a serializaci zápis k danému paměťovému místu (jinak různé procesory chápou jinak co je poslední provedená operace zápisu a nelze sestavit sériové pořadí operací). K zajištění koherence slouží tzv. koherenční protokoly… Koherenční protokoly Odposlech (Snooping) Write Through Write Non Allocate (WTWNA) protokol je to v podstatě jen protokol Write Through protokol s implementací snoopingu (odposlech sběrnice). Dobrý příklad protokolu WTWNA je na slidech 23 – 27 / aps_parallel_comp1_1s.pdf. Jinak jde v podstatě o toto: •
Bloky skryté paměti mají 2 stavy: o Platný (V = Valid) ‐ blok je ve skryté paměti a je platný •
•
•
•
o Neplatný (I = Invalid) ‐ blok není ve skryté paměti nebo není platný PrRd / PrWr ‐ čtení / zápis dat z / do daného bloku procesorem Transakce na sběrnici: o BusRd ‐ čtení bloku z hlavní paměti o BuWr ‐ zápis změněné hodnoty do paměti Vhodný pro opakovaně načítaná, ale zřídka zapisovaná data (např. filtry, zpracování signálů, proudová zpracování, ...) U WTWNA je jedinou událostí na sběrnici, kterou je třeba monitorovat, transakce BusWr, která způsobí zneplatnění daného bloku ve všech ostatních skrytých pamětech Protokol WTWNA má obecně špatnou škálovatelnost, protože každá operace Write jde na globální paměťovou sběrnici a tím spotřebovává její kapacitu. Modified ‐ Exclusive ‐ Shared ‐ Invalid (MESI) protokol Dobrý příklad protokolu MESI je na slidech 32 – 37 / aps_parallel_comp1_1s.pdf. Jinak jde v podstatě o toto: •
•
•
•
Bloky skryté paměti mají 4 stavy: o Změnený (M = Modified) ‐ blok ve skryté paměti procesoru byl tímto procesorem změněn; tento paměťový blok je ve skrytých pamětech ostatních procesorů ve stavu I a v hlavní paměti je stále ještě stará hodnota o Výlučný (E = Exclusive) ‐ hodnota je pouze ve skryté paměti tohoto procesoru a v hlavní paměti o Sdílený (S = Shared) ‐ hodnota je v hlavní paměti a ve skrytých pamětech několika procesorů o Neplatný (I = Invalid) ‐ hodnota buď ve skryté paměti vůbec není, nebo je neplatná Operace procesorů jsou PrWr a PrRd Transakce sběrnice: o BusRd ‐ po lokálním Read Miss (jako pomoc existuje vodič, který řídá, zda někde existuje sdílená kopie dat) o BusRdX ‐ po lokálním Write Miss (žádost o blok + zneplatnění) o BusUpgr ‐ po lokálním Write Hit na sdíleným blokem (zneplatnění) o CacheFlush ‐ dochází k "vypláchnutí" změněného bloku na sběnici o MemSup ‐ hlavní paměť dodává požadovaný blok skryté paměti Existují podobné protokoly MSI a MOESI Paměťová konzistence Proč je nutná? nestačí jen koherence? Zopakujme si ve zkratce definici koherence: Koherence v podstatě to znamená, že každá operace čtení vrátí hodnotu naposledy zapsanou do této položky. Ale!Stačí koherence k rozumnému chování sdílené paměti? Odpověď je NE. Příklad… Proměnná f indikuje, že proměnná x byla změněna. Očekáváme, že print(x) vytiskne 1. Paměťová koherence ovšem nijak nespecifikuje v jakém pořadí jednotlivé procesy P1 a P2 spouštějí své paměťové operace (read, write) a nijak nespecifikuje v jakém pořadí uvidí P2 zápisy do x a f. Koherence pouze zajistí, že P2 se nakonec dozví nové hodnoty x a f, ale nijak nespecifikuje v jakém pořadí tyto nové hodnoty obdrží. Proto ani na počítači s koherentním paměťovým systémem není vyloučeno, že P2 vytiskne starou hodnotu x (tj. 0). Takže koherence nestačí. Je nutné zajistit ještě konzistenci. Její definice a popis je níže… Definice a popis sekvenční konzistence Paralelní počítač je sekvenčně konzistentní, jestliže výsledek provedení paralelního programu je stejný, jako kdyby všechny operace na všech procesorech byly provedeny v nějakém sekvenčním pořadí a operace každého individuálního procesoru se v této posloupnosti objevují v pořadí daném jeho programem. HW a/nebo SW musí implementovat 2 požadavky: •
•
Požadavek programového pořadí ‐ paměťové operace procesu i se musí jevit tomuto i ostatním procesům v programovém pořadí procesu i Požadavek atomicity paměťových operací ‐ jedna paměťová operace se musí jevit dokončena vzhledem ke všem procesům dříve, než je začata další paměťová operace v celkovém pořadí (tzn., že v daném okamžiku se zdá být globálně prováděna pouze jedna paměťová operace) Požadavek atomicity operace WRITE je rozšířením požadavku serializace operace WRITE koherenčního modelu. Konzistence tedy oproti koherenci specifikuje v jakém pořadí jednotlivé procesy spouštějí paměťové operace (či jak se toto pořadí jeví ostatním procesům). Dále specifikuje, že všechny paměťové operace lze sestavit do myšleného sekvenčního pořadí. Koherence požaduje možnost sestavení myšleného sekvenčního pořadí pouze vůči jednotlivým paměťovým místům (nikoliv mezi přístupy do různých paměťových míst). Sběrnice zajišťuje serializaci paměťových operací, propagaci výsledků a za určitých podmínek i atomicitu paměťových operací (záleží na protokolu sběrnice) ‐ proto jsou sběrnicové SMP rozšířené. Myšlené pořadí operací požadované v definicích koherence a konzistence je pořadím těchto operací na sběrnici. K zajištění konzistence se používají synchronizační události: •
Vzájemné vyloučení (výlučný přístup do kritické sekce) – Nechť aL je sdílená proměnná typu zámek: •
Dvoubodová synchronizace •
Synchronizační bariéra – je to logický bod v posloupnosti instrukcí prováděných skupinou procesorů, ke kterému musí všechny procesory této skupiny dorazit. Poté se bariéra prolomí a mohou zase všechny pokračovat. Materiály •
•
X36APS, přednáška 11 X36APS, přednáška 12 Instrukční primitivy pro synchronizaci procesů Komponenty synchronizační události •
Metoda žádání – metoda, kterou se procesor snaží získat oprávnění se synchronizovat (například vstoupit do kritické sekce) •
Metoda čekání – metoda, pomocí které procesor čeká, než je mu sesynchronizování poskytnuto (například než se kritická sekce uvolní) •
Metoda uvolnění – metoda, kterou procesor, jenž ukončil svou synchronizační činnost (např. vystoupil z kritické sekce) umožní ostatním procesorům v synchronizaci pokračovat. Nejsložitější k implementaci je metoda čekání. Metod jak ho provést je více… Metody čekání synchronizační události •
Aktivní čekání ‐ čekající procesor provádí cyklus, ve kterém opakovaně testuje sdílenou proměnnou, zda nezměnila svou hodnotu. Když jiný proces provede •
uvolnění synchronizačního prostředku, změní tuto proměnnou, aby čekající proces mohl vyskočit z cyklu. Aktivní čekání je vhodné, pokud se očekává kratší čekací doba (pár cyklů). o Výhody: nevolají se funkce jádra OS o Nevýhody: čekání spotřebovává hodinové cykly procesoru a kapacitu sběrnice skryté paměti Blokování ‐ čekající proces se pozastaví (je uspán), uvolní procesor a bude probuzen a připraven znovu běžet po provedení metody uvolnění jiným procesem. Blokování je lepší volbou, pokud se očekává, že doba čekání bude delší a pokud mnoho procesů soupeří o získání synchronizační události. Blokování je základem funkce semaforů. o Výhody: nedochází k plýtvání cykly procesoru a ten může mezitím provádět užitečnou práci o Nevýhody: pozastavení a probuzení procesu vyžaduje volání funkcí jádra OS •
Hybridní dvoufázová metoda 1. Proces zahájí čekání aktivně 2. Pokud doba čekání překročí určitou danou hranici, uspí se RMW (Read‐Modify‐Write) primitivy Instrukce RMW M[adr] atomicky přečte, změní a zapíše zpět hodnotu paměťové buňky M[adr]. Atomicita zaručuje, že ostatní procesy nemohou během provádění RMW instrukce k této paměťové buňce přistoupit. Existují algoritmy, které slouží k realizaci synchronizačních událostí. Jsou však příliš složité a proto jsou všechny synchronizační metody založené na nějaké variantě atomické operace RMW. Naivní SW algoritmus ‐ viz také slide 10/OSY prednaska 4 – problem je v tom ze v oznacenem miste na slidech OSY mohou promennou zamknout oba procesy – testovani a nastaveni promenne by mělo byt provedeno dohromady a atomicky Instrukce T&S (Test & Set) T&S r,M[aL] ‐ nacte obsah slova z pameti do registru a nastavi hodnotu slova v pameti na nenulovou. – je to atomicka instrukce – CPU zamkne pametovou sbernici, aby znemoznilo ostatnim pristupovat do pameti dokud se operace nedokonci – slide 19 – pote se otestuje hodnota v registru r, jestli je nenulova, muze procesor vstoupit do kriticke sekce – slide 20 Instrukce SWAP Swap r,M[aL] ‐ prohodi hodnotu v registru s hodnotou v pameti – opet atomicky Instrukce F&I (Fetch & Inc) F&I r,M[aL] ‐ zvysi hodnotu nejakeho slova v pameti Instrukce C&S (Compare & Swap) C&S r1,r2, M[aL] = porovnej hodnoty M[aL] a r1 a pokud se rovnaji, uloz do M[aL] hodnotu z r2 Další varianty Existují další varianty uvedených instrukcí ‐ například Test‐and‐T&S, T&S s odkladem, ... Instrukční pár LL‐SC Moderní procesory podporují tvorbu RMW primitiv pomocí instrukcí LL (Load Linked) a SC (Store Conditional), které umožňují efektivní implementaci synchronizačních operací v systémech se skrytými paměťmi. LL r1, M[x] – uloz do r1 hodnotu z pameti (nyní pokud v r1 je 0, pokracuj a nastav r2 = 1) SC M[x], r2 – store r2 ‐> M[x] , pokud zadny procesor mezi tvym LL a SC sve SC neprovedl, pak r2 =1 (pristup do kriticke sekce je volny) jinak r2 = 0 (pristup není volny) – v podstate… ta hodnota v pameti je zamek, pokud je 0 (otevreny), muzeme se ho pokusit zamknout (pomoci SC ho nastavit na 1), pokud ho uz někdo mezitim zamknul před nami, pomoci SC to zjistime a proste mame smulu a musime provest cele LL‐SC znovu – další popis na str 30 , provadeni na 31‐37 a shrnuti na 38 Naivní SW algoritmus pomocí dvojice LL‐SC procedure Lock(aL) ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ Z: LL r1, M[aL] BNZ r1, Z MOVi r2, #1 SC M[aL], r2 BEQZ r2, Z RET procedure Unlock(aL) ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ STORE M[aL], #0 RET •
•
•
•
•
Mnoho procesů může provádět LL téhož zámku současně, ale pouze ten první, který prosadí svůj SC na sběrnici, jej získá Pokud SC uspěje, dvojice LL‐SC provedla RMW sekvenci atomicky Pokud SC selže, neboť byla detekována cizí operace zápisu do téže proměnné, nedělá nic a negeneruje žádné zneplatnění => celá dvojice LL‐SC musí být provedena znovu Pokud procesor přepně kontext uprostřed dvojice LL‐SC, pak SC také selže Posloupnost instrukcí vložená mezi LL a SC: o je provedena nepodmíněně a neměla by modifikovat programové proměnné o typicky modifikuje pouze tu hodnotu, kterou načetla LL o by měla být krátká, jinak je ohrožena atomicita dvojice LL‐SC Implementace LL a SC •
•
•
•
•
•
Každý procesor má registr zámku adresy (LAR) a příznak uzamčení (LF) LL instrukce: nastav LF a LAR, blok načtený do paměti se stává rezervovaným (Exclusive) Kontrolér skryté paměti: adresy BusUpgr srovnávej s LAR ‐ pokud došlo ke shodě, vynuluj LF SC instrukce: zkontroluj LF. Je‐li LF=1, pak proveď uložení do paměti, jinak vrať příznak selhání Přepnutí kontextu: vynuluj LF Vypláchnutí bloku ze skryté paměti: je‐li LF=1, nedovol vypláchnout rezervovaný blok (jinak by mohlo dojít k aktivnímu zablokování (LiveLock): LL, výplach, selhání SC, LL, výplach, selhání SC, ...) Bariera v SMP se vetsinou sklada ze zamku , sdileneho citace ( všechny procesy ho mohou modifikovat – proto je sdileny) a priznaku (0 – zavrena, 1‐otevrena ), probiha to takto: První proces barieru zavre a zvysi a zvysi citac (ten byl predtim 0 – bariera byla otevrena – ted po zvyseni bude 1), každý další zvysi hodnotu citace, pokud hodnota dosahne poctu procesu, vynuluje se citac a bariera se otevre (unlock, priznak = 1) – slide 39 Podle slidu 40 hrozi zablokovani – pokud rychle procesy nepockaji na pomale (proste ten rychly kod za barierou provede, ale nez ho ten pomaly provede, tak uz ten rychly tu barieru staci znova zamknout), proto je tu vymyslen zlepseny algoritmus 2‐fazova bariera – popis slide 41, Shrnutí •
Pro synchronizaci v paralelních počítačích se sdílenou pamětí je vhodné definovat sekvenčně konzistentní paměťový systém. •
•
•
•
Synchronizační operace jsou vzájemné vyloučení, dvoubodová synchronizace a synchronizační bariéra. Základem implementace synchronizačních operací jsou atomické RMW primitivy. V ISA procesorů se vyskytují RMW instrukce T&S, SWAP, F&I, C&S Novější procesory podporují tvorbu RMW primitiv pomocí instrukcí LL a SC, které umožňují efektivní implementaci synchronizačních operací v systémech se skrytými paměťmi Materiály •
•
X36APS, přednáška 12 Komunikace procesoru s okolím (X36JPO, X36PZA) V/V (periferní) jednotky a jejich řízení ‐DMA, kanály a V/V procesory Pojmy V‐V podsystém – Von Neumannova představa byla taková, že spolu přes V/V podsystém bude komunikovat operátor a stroj, dnešní představa je, že kromě již výše zmíněného tam bude navíc sledování aktuálních přenosů, rozhodování o momentálním přiřazení HW a podpora moderních periferií mezi periferní zařízení patří V/V zařízení + vnější paměti (=externí HDD, CD‐ROM,ZIP…) V/V podsystém = periferní zařízení + HW a SW podporující jeho činnost Jako periferní zařízení (periferie) se chápe vlastní zařízení + řadič (ten obsahuje nějaké snímací a ovládací obvody, řadič samozřejmě nemusí být (a většinou není) součástí periferního zaízení )...viz obrázek… Rozhraní (interface) = komunkační cesta Komunikace zařízení s kompem probíhá většinou přes nějakou tu adresní, datovou a řídící sběrnici Příklad periferie = vnější paměť – tzn. nějaký externí HDD, CD‐ROMka... Další příklad = zobrazovací systém = grafárna(!toto je vlastně řadič pro monitor) + monitor – grafárna má nějakou paměť, kde přijímá a uchovává obrazová data od CPU, dále čip, který tyto data vyhledává a převádí je na digitální obraz a dále DAC (digitálně analogový převodník) – ten převádí obraz na analog a posílá ho do monitoru Programování V/V Vycházejme z toho, že procesor neumí nic jiného než pracovat podle předem připraveného programu nebo reagovat na přerušení obslužným programem. jaké prostředky mají procesory k dispozici? Interface = rozhraní, propojení, styk, je to sdílená část dvěma systémy, zařízeními nebo programy, zahrnuje i prvky této hranice a doplňkové řídící obovody sloužící k jejich propojení Sběrnice x dvouvodový spoj sběrnice je jakoby linka na kterou se zařízení připojují, přesněji je to soubor vodičů a pravidel určený k propojení jednotek počítače. Při detailnějším dělení se sběrnice se dělí na podsběrnice. Podsběrnice jsou adresová, datová (někdy jen společná sběrnice pro adresy a data – tzv. multiplexovaná sběrnice), řídící (přes ni proudí řídící a stavové signály). Příkladem sběrnice je třeba PCI‐X, PCI, USB... Sběrnice se mohou různě dělit, např. na procesorovou , lokální , systémovou , V/V dvoubod. spoj (PTP – point to point ‐ !neplést s peer to peer)= propojení pouze jednoho zařízení s druhým – ale nemusí to být jen jedním drátem:‐) Multiplexovaná sběrnice – Společná sběrnice pro více datových toků. Například po ní proudí jak adresy, tak data. Adresy a data jsou časově multiplexované – nejdříve jde například jeden tik adresa a pak třeba 8 tiků data. To jestli jdou adresy nebo data je rozlišeno signálem (např. DEVSEL#)– (viz slide 21/1), příkladem je např. spoj Grafická karta – AGP,terminál – modem ... Komponenty sběrnice – dělíme je na adresové komponenty (V/V, paměťová adresa), datové komponenty a řídící/stavové komponenty (přerušení, DMA ...) Brána ( port ) Je to buňka v adresovatelném prostoru V/V zařízení nebo paměti, je to stavební prvek interfejsingu, obecně je to 8/16/32b buňka/registr, ale někdy se obejde i bez klopných obvodů. V/V modely instrukcí 1) in/out model ‐ (slide 31/1), formát instrukcí in/out bude IN(dest, source), OUT (dest,source), jeden operand bude registr procesoru a druhý adresa V/V brány. PŘÍKLAD IN:keyboard ‐> keyboard controller ‐>CPU‐>memory. Typy instukcí jsou IOWR, IORD, MEMWR,MEMRD, každá komponenta sběrnice má svůj vlastní adresový prostor, viz obr. 2) mov model – místo IN/OUT je jen instrukce MOV (dest,source) – jedním operandem je registr procesoru a druhým adresa v paměti. Obrovskou výhodou jsou nejrůznější adresovací módy, které tato instrukce podporuje.Typy instrukcí jsou jen MEMWR,MEMRD mov používá společný adresový prostor… 3) SIO model – využívá tzv. kanálový podsystém, viz. obrázek… Instrukce jsou: SIO (start IO – zahájení vstupu nebo výstupu na “adresa kanálu”), její formát je např. SIO X00E (touto instrukcí se spustí provádění kanálového programu pro kanál 0 a periferii 0E), dále TIO (Test IO – zjištění stavu kanálu a periferie) adrk,adrz (má vlil na program status word, testuje stav adresované V/V aktivity), HIO (Halt IO – provádění programu pro kanál se násilně ukončí) adrk,adrz (násilně ukončí adresovanou V/V aktivitu). Všimněte si že instrukce V/V aktivitu spouští, ale neprovádí, samotný přenos údajů touto instrukcí provádí kanál podle kanálového programu (ten tvoří posloupnost kanálových příkazů), dále HDV (Halt Device. Z programu se ukončí činnost adresované periferie) Synchronizce přenosu údajů rozhraním možnosti: synchronní, asynchronní, pseudosynchronní přenos údajů 1) Programovaný V/V (PIO) – Zjišťování, zda je zařízení, kam zasíláme data, schopno spolupracovat (zesynchronizovat se), probíhá programově. Toto zjišťování provádí CPU podle programu, a sice tak, že přistupuje do paměti periferního zařízení. Programovaný V/V si ještě detailně popíšeme dále 2) V/V s přerušením –Oproti programovanému I/O dá podnět k synchronizaci periferie a ne procesor. Každá periferie vyvolá při pokusu o komunikaci přerušení, které kontroluje řadič. Problémy? Procesor musí uložit stav probíhajícího programu (aby se po zprac. přerušení mohl vrátit) a to stojí nějaký čas, Řadič přerušení vnutí procesoru vektor přerušení, ze kterého se odvodí startovací adresa obsluhy, i to stojí nějaký čas. Propustnost počítačového systému častými přerušeními utrpí, tento typ přenosu se hodí tak možná pro nepravidelný znakově orientovaný přenos údajů 3) V/V s pomocí DMA –DMA je část HW, která umožňuje přístup do hlavní paměti bez toho, aby k tomu byl potřeba procesor. Možnosti implementace DMA jsou: a) zastavovaným procesorem, b) kradením cyklů, c) transparentní DMA. U PC je používáno zastavení procesoru. Problémem by mohlo být to, že při dlouhém DMA přenosu by byl zastaven procesor dlouho, proto se cykly DMA a procesoru střídají – to snižuje efektivitu přenosu DMA. DMA se u PC používá jen pro diskety a zvukovky, IDE DMA je vyřešeno jinak. Tento typ přenosu se hodí pro pravidelně blokově orientovaný přenos údajů 4) V/V s pomocí specializovaného procesoru Signaling (obvodové řešení) Tedy jak vlastně řešit přijímání a posílání signálů zařízením? Konflikt na sběrnicovém vodiči – na výstupech je zkrat (představ si, že chcou číst dva výstupy ze sběrnice naráz, mezi těmito dvěma se vytvoří zkrat) řešením je otevřený kolektor nebo třístavový výstup (66/1) OC (otevřený kolektor) – je otevřený v tom smyslu, že není připojen na pozitivní napětí uvnitř logického čipu a místo toho potřebuje externí resistor. V logickém stavu 1 má OC vysokou impedance znemožňující tok proudu. V logickém stavu 0 OC vysává proud, který je vytvářený napěťovým zdrojem skrz zmíněný resistor. Užitečnou věcí je, že resistor nemusí být připojen k napětí Vcc a místo toho může být použito nižší nebo vyšší napětí. Obvody s otevřeným kolektorem jsou proto použity jako rozhraní mezi dvěma zařízeními, které mají jiné úrovně napětí pro logické hodnoty. Další výhodou je to, že vice zařízení s OC může být připojeno ke stejnému drátu…viz http://www.wisc‐online.com/objects/index_tj.asp?objID=DIG3203 několik jednotek může současně vysílat signál (agresivní nulu na týž vodič) – hodí se pro neadresované signály typu REQ, ACK,IRDY,TRDY,DEVSEL..., 3S‐vysílá pouze ta jednotka, která to má povoleno. Je to digitální logika, která má 3 stavy hodnot – 0,1 a Z (stav vysoké impedance) záměr tohoto třetího stavu je, aby mohlo vice obvodů sdílet ten samý výstup (výstupní drat, sběrnici) bez toho, že by se navzájem ovlivňovaly. Více na http://en.wikipedia.org/wiki/Three‐state_logic Symetrický a nesymetrický vstup/výstup – sl 69/1 zjistit co to je a jejich vztah k rychlosti
NESymetrický v/v je nejjednodušší metoda přenosu elektrických signálů přes dráty .Přes jeden drát se přenáší měnící se napětí, které reprezentuje signál, zatímco druhý drát je připojen k referenčnímu napští, obvykle na zem. Hlavní výhodou symetrického v/v oproti nesymetrickému je že je potřeba méně drátů k přenosu více signálů. Pokud máme n signálů ,pak je zapotřebí n+1 drátů – jeden na každý signál + 1 zem. (Nesymetrický potřebuje aspoň 2n drátů.) Hlavní nevýhodou je pak to, že návratové proudy pro všechny signály sdílí ten samý drát, což může způsobit interferenci. Toto limituje propustnost symetrických v/v systémů.Symetrický v/v je široce používaná technika, použíá se např. v TTL, CMOS logických obvodech, ve VGA konektorech, PS/2 konektorech... Symetrický v/v – dva doplňkové signály jsou poslány na dvou oddělených drátech – technika je používaná při analogovém přenosu (audio systémy), tak i digitálním (PCI‐X, USB). Na konci spoje přečte přijímací rozhraní rozdíl mezi dvěma signály, srovnej to se symetrickým v/v, kde přijímací strana porovná signál s nějakým fixním napětím. Materiály •
•
•
•
X36JPO, přednáška 7 (http://service.felk.cvut.cz/courses/X36JPO/slides/1‐jpo‐G.pdf) X36PZA, přednáška 1 (http://service.felk.cvut.cz/courses/X36PZA/slides/2007/lectures/X36PZA_2007_01.
pdf) Jiří Peterka DMA (http://www.earchiv.cz/a93/a325c120.php3) Jiří Peterka DMA ‐ kradení cyklů Sběrnice ‐typy, režimy činnosti a přidělování Typy sběrnic Podle účelu: •
•
jednoúčelové ("soukromé", Dedicated) sdílené (Shared, Non‐Dedicated) o systémové o lokální o V/V Podle způsobu přenosu dat: •
•
paralelní sériové ‐ ty se používají zpravidla pro systémové účely nebo jako záložní sběrnice pro případ poruchy paralelních sběrnic Podle způsobu řízení: •
•
jednosměrně řízené (One‐Way Control) ‐ řídicí jednotka nečeká na potvrzení příkazu k provedení operace obousměrně řízené (Two‐Way Control) Komponenty sběrnice Podsběrnice: •
•
•
adresová (přenáší adresu) řídící (řídící signály) datová (samotná data) Někdy bývá adresová a datová sběrnice sloučena (adresa a data jsou časově multiplexována): •
•
stačí jedna sběrnice pro data i adresy existuje signál, který říká, zda jsou právě přenášena data nebo adresa Typické operace na sběrnici •
•
•
•
•
•
•
čtení (Read) zápis (Write) čtení – změna – zápis (Read – Modify – Write) zápis – čtení (Read After Write) přenos bloku (Block Data Transfer) broadcast ‐ příkaz všem jednotkám broadcall ‐ vyžádané informace od všech jednotek (popř. od určených jednotek) Režimy činnosti sběrnice •
•
•
•
synchronní (řízené hodinami) ‐ hodinový signál je přenášen na příslušném vodiči; jedná se o jednosměrné řízení pseudosynchronní (semisynchronní, polosynchronní) ‐ řízené hodinami + možnost zařadit čekací signály (např. WAIT); jedná se o obousměrné řízení izosynchronní ‐ údaje se přenáší s konstantní průměrnou rychlostí asynchronní ‐ korespondenční režim (tzv. Handshake); obousměrně řízené Korespondenční režim (handshake) Rozeznáváme tři typy Handshake režimu (podle toho, jak na sebe signály navazují ‐ jak jsou vázány): 1. Jednoduše vázaný (Non‐Interlocked) 2. Středně vázaný (Half Interlocked) 3. Plně vázaný (Fully Interlocked) Příklad zápisu dat na sběrnici v těchto režimech handshaku Přidělování sběrnice •
centralizované ‐ přidělování řídí arbitr (speciální obvod pro přidělování sběrnice zařízením), avšak někdy jeho funkci zastává procesor o cyklické výzvy (Pooling) ‐ přidělovač nabízí postupně a adresně sběrnici jednotlivým jednotkám, které o ni žádají o paralelní (nezávislé žádosti a potvrzení ‐ Independent Request And Grants) o
sériové (Daisy Chain) o
kombinované ‐ paralelní a sériové •
distribuované (bez přidělovače) o round‐robin ‐ jednotky si cyklicky předávají právo přístupu na sběrnici o prioritní ‐ jednotkám jsou přiděleny adresy. Čím vyšší adresa, tím vyšší priorita. Jednotky o prioritu určuje adresa jednotky o vysílání negovaných bitů na sběrnici; vyhrává jednotka, která prosadí všechny bity své adresy o velké zatížení sběrnice + může dojít k "vyhladovění" (Starvation) = jednotky s nízkou nemají šanci získat sběrnici o řešení Starvation problému: Fairness ‐ přidáme jeden vodič (někdo potřebuje sběrnici) + každá jednotka má klopný obvod, ve kterém si pamatuje, jestli už dostala sběrnici. Přednost mají jednotky, které sběrnici ještě nedostaly (i když mají nižší prioritu než jednotky, které sběrnici už dostaly přidělenu) o FCFS (First Come First Serve ‐ něco jako FIFO) Adresování jednotek připojených na sběrnici Probíhá to takhle: vyšle se na sběrnici adresa (číslo) jednotky, která je vybrána pro komunikaci. Jak ale daná jednotka zjistí, že je to právě ona? Každá jednotka má v sobě adresový dekodér, který ji to řekne. viz. obrázek… Materiály •
X36JPO, přednáška 8 Standardní systémové a V/V sběrnice Dělení sběrnic •
•
•
•
Procesorová ‐ je přímo připojená k procesoru (FSB ‐ Frontside Bus, BSB ‐ Backside Bus) Lokální ‐ propojuje procesor přímo (nebo téměř přímo) s jedním či více sloty na rozšiřující sběrnici (FSB) Systémová ‐ propojuje procesor s pamětí a větví se z ní V/V sběrnice (FSB) V/V ‐ umožňuje připojení V/V zařízení (PCI, ISA) architektura sočasného PC (nebo PC ze začátku milénia) vypadá asi takto: Systémové sběrnice FSB •
•
propojuje procesor a severní můstek (Northbridge) maximální teoretická propustnost se získá jako součin její šířky, hodinové frekvence a počtu datových přenosů připadajících na jeden hodinový takt HyperTransport •
•
•
•
procesory AMD Hammer výhradně spojuje dvě jednotky (dvoubodový spoj) provádí sériový přenos po paketech vysoká propustnost (max. 9,6GB/s) UNIBUS •
•
•
•
•
procesorově závislá, paralelní oddělená adresová a datová část obousměrná asynchronní arbitrace pomocí signálů SACK (potvrzení výběru), BBSY (sběrnice obsazena), NPR (žádost o DMA) a NPG (potvrzení žádosti o DMA) VME, VMX, VMS Jedná se o hierarchii sběrnic. VME je globální a paralelní, VMX lokální a paralelní, VMS globální a sériová. •
•
TTL kompatibilní asynchronní přenos rychlostí cca 40MB/s •
•
•
•
•
multiprocesorová paralelní, nemultiplexovaná, obousměrná centralizovaný arbitr čtyři podmnožiny signálů: o arbitrační o přerušovací o pro datový přenos o utility arbitrace o sběrnici se účastní signály BR0‐BR3 (žádost o přidělení sběrnice), BG0IN‐
BG3IN (vstup podřízené jednotky), BG0OUT‐BG3OUT (výstup podřízené jednotky ‐ odtud do vstupu další zřetězené), BCLR (uvolnit sběrnici ‐ vydává arbitr) a BBSY (sběrnice obsazena ‐ vydává jednotka, která právě řídí sběrnici) MULTIBUS •
•
•
•
jednalo se o ucelený soubor modulárního HW (všímej si, že na zásuvných kartách byly i řadiče či procesor) asynchronní nemultiplexovaná paralelní V/V sběrnice PCI •
•
•
•
•
•
•
•
•
•
•
•
•
•
•
procesorově nezávislá (oddělené hodiny procesoru a sběrnice) 33 nebo 66 MHz, 32 nebo 64bit propustnost až 528 MB/s pseudosynchronní přenos multiplexovaná datová a adresová sběrnice paralelní podporuje DMA režim napájení ‐ TTL úrovně (3,3V nebo 5V nebo mix) ‐ dnes výhradně 3,3V podporuje burst mód (souvislý přenos dat) ‐ lze ho přibrzdit vkládáním čekacích taktů každé sběrnicové transakce se účastní 2 zařízení: iniciátor (Initiator, Bus Master) a cíl (Target, pořízený = Slave) ‐ toto dělení nesouvisí s tím, kdo bude data vysílat a přijímat multimaster sběrnice ‐ existuje více potencionálních Bus Masterů ‐ o tom, kdo se stane aktuálním Masterem rozhoduje arbitr sběrnice (centralizovaný ‐ jedno zařízení ‐ nebo decentralizovaný) pro časování je vztažným bodem náběžná hrana hodin sběnicový cyklus má obvykle adresovou a datovou fázi předčasné ukončení přenosu údajů (sběrnicového cyklu) je možné délku přenášeného bloku určuje signál Frame PCI‐X •
•
•
•
•
zpětně kompatibilní s PCI šířka sběrnice typicky 64 bitů maximální frekvence 533MHz (1 slot) maximální propustnost 4266MB/s řešení vhodné pro servery •
multiplexovaná, paralelní, pseudosynchronní PCI Express •
•
•
•
využívá sériový přenos po paketech multiplexovaná dvoubodový spoj (soustava přepínaných dvoubodových spojů) Proud (lane) se určuje 4 vodiči. Podle počtu proudů se určuje link (x2). maximální propustnost (PCIe x16) je 10GB/s (efektivně 8GB/s ‐ kvůli kódování) ISA •
•
•
synchronní 8bit, 16bit DMA Sběrnice / rozhraní •
SCSI je to dnes univerzální obousměrné asynchronní/synchronní sběrnicové rozhraní, původně bylo zavedeno jako rozhraní pro připojování vnějších disků. Je univerzálnější, ale i dražší než IDE, používá se ale i na jiných platformách než jen na PC (tady není moc časté). Architektura je taková, že každému zařízení se přiděli unikátní adresa – ID. Toto rozhraní má asi tak 15 různých typů konektorů. Kabel má 25 párů vodičů, topologie je většinou sběrnicová, jen zřídka hvězda. Za posledním zařízením musí být terminátor (ukončení řetězce), ty mohou být pasvní i aktivní. •
USB sériová obousměrná sběrnice s maximálním dat. tokem 12 (USB 1.1) resp. 480 (USB 2.0) Mb/s. Rozhraní je symetrické (co to znamená? – viz symetrický a nesymetrický V/V), kódování je NRZI, informace o jednčkách a nulách nese vzájemná polarita D+ vůči D 1čka/nula je tehdy, když je D+ o 200 mV vyšší/nižší než D‐ .. toto však závisí na módu, při “low‐speed” módu je to opačně), je možnost si vybrat z high (480 Mb/s), full (12 Mb/s) a low speed (1.5 Mb/s) módu . Tu rychlost si určí samo zařízení, které k USB připojíme. Materiály •
•
•
•
•
•
X36PZA, přednáška 1 , X36PZA, přednáška 2 Sběrnice pro PC (http://www.fi.muni.cz/usr/pelikan/ARCHIT/TEXTY/BUSPC.HTML) FSB na wiki (http://cs.wikipedia.org/wiki/Front_Side_Bus) PCI na howstuffworks (http://computer.howstuffworks.com/pci.htm) PCI na wiki (http://cs.wikipedia.org/wiki/PCI_%28sb%C4%9Brnice%29) ISA na wiki Metody a techniky připojování V/V zařízení V/V programování Existují 3 modely: •
•
•
IN/OUT model MOV model SIO model (s kanály) Typy signálových vodičů Otevřený kolektor: •
•
•
na vodiči je napětí kterékoliv z připojených zařízení může vodič uzemnit vhodné, pokud má být připojeno více zařízení (např. žádost o arbitraci) ‐ mohou vysílat zároveň a nedojde k přetížení Třístavový výstup •
•
•
zařízení může na vodiči nastavit ref. napětí, nulu, popř. hodnotu na vodiči nechat beze změny (uvede se do třetího stavu ‐ stav vysoké impedance ‐ a tváří se, jako by vůbec nebylo ke sběrnici připojeno) nemůže komunikovat více zařízení zároveň vhodné pro adresní a datové signály Synchronizace zařízení a CPU •
•
•
V/V s přerušením ‐ CPU uloží stav, přeruší činnost, zpracuje příchozí data (vhodné pro nepravidelný, znakový přenos) V/V pomocí DMA ‐ přenos mezi zařízením a pamětí řízen nezávisle na CPU (vhodné pro pravidelné blokové přenosy) V/V pomocí specializovaného procesoru (pouze ten má pak přístup k řadiči zařízení) Adresace periferních zařízení •
logická •
adresa zařízení nastavena hardwarově přímo v zařízení (případně v řadiči zařízení) o v každé jednotce je unikátní dekodér adresy geografická o adresa je dána místem (slotem), do kterého je zařízení umístěno o do konektorů je přidána informace o pozici o místo dekodéru má zařízení komparátor adres o
Materiály •
X36JPO, přednáška 8 •
V/V zařízení (X36JPO, X36PZA) Displeje Jak vzniká barevný obraz? Jak vzniká barevný obraz? – skládáním (aditivním míšením) několika obrazů v základních barvách. V CRT i LCD se používá aditivní míšení v barevném modelu RGB.Je to Aditivní barevný model ‐ vzniká skládáním jednotlivých barevných složek. V aditivním modelu se světlo vytváří a vzniká ze 3 barevných kuželů světla. Chromatický diagram ‐ Nástroj pro vyjádření resp. pro porovnávání barvy různých barevných podnětů obvod trojúhelníka tvoří křivka čistých spektrálních barev. Ten trojúhelník v diagramu se nazývá Maxwellův a v něm leží v podstatě barevné spektrum, co umí CRT monitor zobrazit. Vrcholy trojúhelníka jsou v bodech reprezentující základní barvy k míchání použité. Tím pádem, pokud by bylo barev k míchání n, nejedná se o trojúhelník ale o ‐úhelník Jaké jsou jiné barevné modely? např. CMYK,YUV, HSL, HSV ... Barevný model CMYK (Cyan, Magenta, Yellow, blacK (Key))– používá se v tiskárnách. – popsán detailně u nich. Barevný model YUV – jeho základními složkami jsou Y – luminace (jasová složka) a U,V – chrominace (barevné složky). Používá ho např. televizní norma PAL. YUV se dá z RGB přetransformovat pomocí násobení urč. maticí Displeje CRT (Cathode Ray Tube) CRT od Catode ray tube. Klasická vakuová obrazovka. CRT obrazovka obsahuje miliony červených, zelených a modrých bodů, které zazáří, když jsou zasaženy elektronovým paprskem. Zblízka obrazovka barevného CRT tak, jak ukazuje obrázek dole. Vedle je znázorněn princip monitoru •
Obraz se vytváří pomocí svazku 3 elektronových paprsků (všechny paprsky stejné, neexistují žádné barevné elektrony) , které jsou vytvářeny elektronovým dělem. Elektronika vytváří obraz pro každý bod zvlášť a musí projet displej odshora dolů po řádcích. Číslo, kolikrát tuto operaci zvládne za vteřinu se nazývá obnovovací frekvence. •
•
Barevné body (RGB) vznikají po dopadu elektronového paprsku na daný fosforový bod (luminofor). Luminofory jsou látky vyzařující světlo, jsou jimi tvořeny ty malinké bodíky na obrazovce. Barevné CRT displaye potřebují tzv. masku (delta, trinitron, štěrbinová), což je vlastně tenký kovový plát s dírami, který pomáhá elektronům přesně dopadnout na jednotlivé luminofory obrazovky. •
Při výrobě se pro nanášení fosforu příslušné barvy (luminoforů) využívá fotografická cesta ‐ nanese se všude, rozsvítí se patřičný paprsek a projde se celá obrazovka (paprskem). Poté se vypláchne, neosvícená místa se vyplaví. Proces se opakuje pro každou barvu. CRT na EN wiki (http://en.wikipedia.org/wiki/Cathode_ray_tube) CRT na howstuffworks (http://computer.howstuffworks.com/monitor.htm) SED (Surface‐Conduction Electron‐Emitter Display) Využívá stejného pricnipu jako CRT, ale nevyžaduje hluboku baňku. Používá jakoby miliony maličkých CRTček. To jsou právě ty Surface‐Conduction Electron‐Emitters. Je plochá, ale ne tak tenká jako LCD. K vytváření obrazu se využívá studené elektronové emise. SED na EN wiki (http://en.wikipedia.org/wiki/Surface‐conduction_Electron‐emitter_Display) SED na howstuffworks (http://entertainment.howstuffworks.com/sed‐tv1.htm) LCD (Liquid Crystal Display) Jak se vytváří obraz na LCD? principem je modulace procházejícího polarizovaného světla kapalnými krystaly... vysvětlení pojmů... •
•
Polarizované světlo: Světlo je příčné elmag vlnění. Vektor intenzity E elektrického pole je vždy kolmý na směr, kterým se vlnění šíří. V rovině kolmé k paprsku světla se směr vektoru E nahodile mění – tomu říkáme nepolarizované světlo (obrázek vedle ‐
a), oproti tomu polarizované světlo (obrázek vedle ‐b) má vektor intenzity E veden stále jedním směrem. K tomu abychom určili orientaci roviny polariz, světla, používáme zařízení zvané „analyzátor“...viz obrázek vedle dole Kapalné krystaly – jsou to anizotropní kapaliny (látky s různými vlastnostmi v různých směrech). V tomto případě využíváme takové, které jsou anizotropní vzhledem k procházejícímu světlu. Tekuté krystaly umí přenést a měnit polarizované světlo. Změnou jejich struktury se mění i přenášené světlo. Mění se jeho rovina polarizace. Struktura tekutých krystalů lze měnit elektrickým proudem. Ke každému subpixelu obrazovky existuje skupina tekutých krystalů a každou tuto skupinu můžeme měnit nezávisle na skupinách ostatních subpixelů. Je to uděláno tak, že ke každé této skupině jsou přivedeny neviditelné vodivé cesty, jimiž proudí proud a tak mění strukturu daných krystalů. Ty pak podle toho propouští jen určité množství světla. Vypadá to zhruba takto: Každý subpixel je vlastně polarizační filtr, který úplně propouští jen světlo s určitou rovinou polarizace. Podle toho, jak je rovina dopadajícího světla otočená, tolik ho propustí. STN – Super Twisted Nematic je variantou TN LCD elektrooptického mněniče. Poskytuje kontrastnější obraz. Rovina polarizace se v kapalině natáčí o násobky 90 stupňů TFT – pokročilejší způsob ovládání jasu jednotlivých subpixelů (R,G,B – tyto dohromady vytvářejí barvu – ta závisí na jejich jasu) barevného LCD pomocí tenkovrstvých tranzistorů (Thin Film Tranzistor). Obvykle se kombinuje s technologií STN Podsvícení displeje – mnoho malých a jednoduchých LCD displejů (vzpomeň kapesní LCD hry nebo jednoduché digitálky) využívá externí zdroj světla (tzn. denní světlo:‐), který se odráží od zrcadla vzadu za displejem. Počítačové monitory potřebují vlastní zdroj (aby mohly fungovat i ve tmě), proto jsou v nich vestavěny podsvětlovací trubice. LCD na EN wiki (http://en.wikipedia.org/wiki/LCD) LCD na howstuffworks (http://electronics.howstuffworks.com/lcd.htm) PDP (Plasma Display Panel) Plasma se někdy považuje za čtvrté skupenství hmoty. Tento display využívá speciálních komůrek, které tvoří jednotlivé barevné subpixely. Zde se vytváří plasma při vývoji ve vzácných plynech (neon, xenon). K přeměně na příslušnou barvu opět potřebuje luminofory. Nevyžaduje podsvícení Plasma na wiki (http://en.wikipedia.org/wiki/Plasma_display) Plasma na howstuffworks (http://electronics.howstuffworks.com/plasma‐display.htm) LCOS (Liqid Crystal On Silicon) je to prý vycházející hvězda mezi technologiemi, protože údajně nemá nějaká velká omezení ohledně zvyšování počtu pixelů a pozorovacích úhlů. Je to technologie digitální, je škálovatelná a jasově dostatečná. Podrobněji: je to LCD vrstva na pixlovém reflexním substrátu, elektronika je v substrátu a nepřekáží v průhledu...viz slide 49... prostě to má být extra super •
•
•
•
•
•
plně digitální, škálovatelná a jasově dostatečná technologie, které se také říká "Cayley" LCD vrstva na pixelovém reflexním substrátu elektronika je v substrátu (nepřekáží v průhledu) podpora od Intelu vyšší kontrast, vynikající barevné podání (kvalita obrazu je "filmová") obrazové rolišení 1280x768, 1920x1080 a více pixelů LCoS na wiki (http://en.wikipedia.org/wiki/Liquid_crystal_on_silicon) LCoS na howstuffworks (http://electronics.howstuffworks.com/lcos.htm) ELD (Electro‐Luminiscent Display) Principem ELD je emise světla (fotonů) v silném elektrickém poli. Další typy displejů •
•
•
HTPS ‐ inovovaná implementace LCD, používá se mikrodisplejích (datové projektory) DLP ‐ využívá se v projetorech, používá se mikroskopických zrcadel vyrobených přímo na chipu (technologie DMD) o DMD na wiki (http://en.wikipedia.org/wiki/Digital_Micromirror_Device) o DLP na howstuffworks (http://electronics.howstuffworks.com/dlp.htm) OLED (Organic Light‐Emitting Diode) o OLED na wiki (http://en.wikipedia.org/wiki/Organic_light‐emitting_diode) o OLED na howstuffworks Tiskárny
Dělení tiskáren: •
•
•
•
•
•
Úderové nebo bezúderové Konturové nebo bodové Tisk po řádcích nebo po znacích Podle kvality tisku (NLQ, LQ) Černobílý a barevný tisk Podle technologie tisku (laserové, jehličkové, inkoustové, s tepelným přenosem) Jak se tiskne… Při barevném tisku se používá substraktivní princip míchání barev. Pro barevný tisk se používá model CMYK. Je to subtraktivní barevný model –způsob míchání barev, kdy se s každou další přidanou barvou pohlcuje (na rozdíl od aditivního, který světlo vytváří) část původního světla. Pokud například skládáme na sebe barevné filtry nebo mícháme pigmentové barvy, mícháme je subtraktivní metodou.Světlo prochází jednotlivými barevnými vrstvami a je stále více pohlcováno. Výsledná barva se skládá z vlnových délek, které zbudou po odrazu nebo průchodu filtrem. Základní barvy subtraktivního míchání jsou komplementární (doplňkové) k základním barvám při jejich aditivním míchání. Smícháním modrozelené (azurové) a žluté barvy vznikne barva zelená, žluté a purpurové barva červená a purpurové a modrozelené barva modrá. Smícháním všech tří základních barev dostaneme barvu černou. Důvod, proč se používá ještě černá navíc, je ten, že v reálném případě nedostaneme složením těch tří barev černou, ale jen tmavě šedou. Černá je navíc barva u tisku nejpoužívanější důvod proč se nepoužívá RGB je ten, že se tiskne na bílou, ne na černou (monitor) plochu a tedy z bílého (odraženého) světla se musí odfiltrovat jeho základní složky (pokud odfiltrujem všecky, bude to černé svělo) …jak zajistit různé odstíny Většina tiskáren není schopna dávkovat množství barvy do jednoho bodu, proto se využívá tzv. polotónování = dithering ‐ například do matice 6x6 se tisknou jen některé body a tím jsme schopni poporovatele jakoby oblafnout, aby si myslel, že vidí různé odstíny té barvy. Na příkladu je obrázek, kdy jsme s pomocí ditheringu 2 barev „vytvořili“ různé odstíny šedé. Dále je tam obrázek různých odstínů (pomocí ditheringu) barevného modelu CMYK. Alternativním řešením je změna velikosti tiskového bodu (toto se nepoužívá u klasických počítačových tiskáren). Typy tiskáren Konturové tiskárny Konturové tiskárny tisknou pouze znaky, které jsou na typové páce / válci / pásku / kolečku. Prostě si představ psací stroj… Rozdělení: •
•
•
•
s typovými pákami (psací stroj) s typovým kolečkem (Daisy Wheel) ‐ moderní psací stroj s typovým válcem (používá se u rychlotiskáren u sálových počítačů) s typovým páskem nebo řetězem Jehličkové tiskárny •
•
•
tisknou pomocí matice jehliček, které jsou elektromagneticky vystřelovány a přes barvicí pásku vytvářejí obraz rozdělení podle počtu jehliček (9, 18, 24) => i podle kvality tisku (NLQ, LQ) mohou tisknout i barevně (4 barvy) ‐ k tomu se používá čtyřbarevná páska a adaptér pro její nastavování Laserové tiskárny •
•
•
•
využívají principu fotokoduktivity (schopnost látky vést elektrický proud v závislosti na osvětlení) ‐ vodivost látky se měni v závislosti na vnějším osvětlení o fotokonduktory jsou v temnu izolanty a na světlu vodiči ‐ například selen (vyžaduje kladný náboj) nebo OPC (Organic Photo Conductor; vyžaduje záporný náboj) využívají koronární výboj, který emitovanými elektrony ionizuje okolní plyn o korona produkuje jedovatý ozon používají bezúderový, bodový tisk (říká se ale stránkový tisk, protože díky rychlosti tisku to tak vypadá) fáze tisku: nabíjení ‐> expozice ‐> vyvíjení ‐> přenos ‐> fixace ‐> čištění Pracuje to takto: 1) nejdříve si z obrázku (textu), který se má tisknout vytvoříme rastr – matici bodů… na obrázku je rastr písmene W 2) Nabíjení ‐ nabijeme tiskový rotační buben elektrickým nábojem 3) Expozice ‐ pomocí laserového paprsku na tento buben vypálíme rastr (neutralizujeme náboj v určitých místech) 4. Vyvíjení ‐ máme toner, což jsou vlastně částečky barvy. Tyto částečky nabijeme negativním nábojem a přejedeme s nimi celý buben. Částečky se na bubnu přichytí jen tam, kde není žádný náboj. 5. přenos – částice toneru jsou z bubnu přeneseny na papír 6. fixace – toner „rozpustíme“ do papíru pomocí tepla a tlaku 7. čištění – náboj je odstraněn z bubnu. Dobře, teď jsme popsali černobílý tisk, ale jak se tiskne barevně? Máme více možností: a) 4 fotokonduktivní válce (C,M,Y,K), 4 tonery, 1 průchod. b) 1 fotokonduktivní válec, 4 tonery, 4 průchody LED tiskárna Podobné jako u laserové tiskárny, jen se k osvitu válce používají diody, které jsou v řadě po celé délce válce a světlo prochází čočkami. Inkoustové tiskárny Hlava tiskárny na žádost vystříkne inkoust. Levné typy tiskáren mají tiskovou hlavu v jednom celku se zásobníky inkoustu ‐ je pak nutné měnit obojí (zvýšení nákladů na tisk). Inkoustové tiskárny se vyrábí i jako velkoformátové tiskárny, které dnes nahrazují plottery. Kvalita tisku je velmi závislá na druhu papíru ‐ při použití kvalitního papíru je výsledek srovnatelný s laserovou tiskárnou. Obvyklá rychlost tisku je cca 4 strany za minutu (při rozlišení až 1200dpi). Inkoustové tiskárny se podle principu dělí na… •
Bubble jet ‐ Komůrky jsou naplněny inkoustem. Pokud je potřeba přenést inkoust na papír, zahřeje se topné tělísko v komůrce a vytvoří bublinku (vypařováním). Bublinka tlakem vytlačí inkoust z komůrky na papír a pomocí kapilárních sil se komůrka opět naplní. •
Ink jet ‐ Pomocí piezo‐elektrického jevu (přivedením napětí) se stěny komůrky roztáhnou a podtlakem dojde k naplnění inkoustem. Při požadovaném přenosu inkoustu na papír se změní polarizace napětí, stěny se stáhnou k sobě a inkoust vytlačí. Termotiskárny •
Se speciálním tepelně citlivým papírem o polovodičová tělíska po celé délce tiskového řádku vytvářejí na teplocitlivý papír obraz o tisk se po čase ztratí o používají se např. ve faxech nebo pokladních tiskárnách o spolehlivé a tiché •
S běžným papírem a speciálními barvivy o
používají termoplastická barviva nanesená ve formě proužků na nosné folii barvivo je v kontaktu s papírem, k jeho přenosu dochází pomocí zahřátí příslušného místa o
speciálním případem je ablativní (termosublimační) tiskárna Termosublimační tiskárna: o barvivo není v kontaktu s papírem, k jeho přenosu dochází sublimací po ohřátí a jeho zkondenzování na papíře o termosublimace = přeměna pevného skupenství přímo na plynné o umožnují dávkování o například tiskárna Canon Selphy o
•
Ovládání tiskáren Jaké je SW rozhraní pro tvorbu tiskových stran je takové, že se nepřenášejí obrazy k tisku, ale jen příkazy k jejich vytvoření. Máme k tomu k dispozici různé jazyky: •
•
•
Escape sekvence o posloupnost znaků začínající ASCII znakem 1BH, která má význam příkazu o tiskárna dostává příkazy postupně (nový řádek, ...) a také je postupně provádí Vektorový jazyk PCL o snaží se všechno popsat jako vektory o co neumí popsat jako vektor, popíše bitmapou => závislý na druhu tiskárny (ovladači) o pomalejší než Postscript, ale velmi spolehlivý Postscript o složitější než PCL o nezávislý na zařízení a jeho rozlišovací schopnosti zapisovače Zapisovač je přístroj používaný k zápisu různých procesních a elektrických signálů. Většina tradičních zapisovačů zapisuje data na papír. Papír se pohybuje pod perem, které se pohybuje nad papírem úměrně signálu. Výsledkem je graf zobrazující závislost veličiny v čase. Zapisovače se dodávají jako jednokanálové nebo vícekanálové (s jedním nebo více pery) v různém uspořádání. Mnohé z dnešních zapisovačů mohou informace zaznamenávat kromě toho i v digitálním formátu pro přenos do počítače. Například to může být přístroj pro zápis srdečního tepu v medicíně atd. Grafické zapisovače se dělí na vektorové a rastrové zapisovače. Součásti grafického zapisovače •
Řadič Interpolátor ƒ Spojitý ƒ Diskrétní Kreslící zařízení o Zařízení pohybující kreslící hlavou Kreslící hlava a nosič pisátek Pohyb média Interface k nadřazenému počítači o
•
•
•
•
Princip vytváření obrazu •
•
vektorový (dnes na ústupu ‐ používá se jen pro speciální aplikace) o vyřezávání o vrtání či frézování rastrový ‐ dnes nejběžnější o xerografická inkoustová hlava o elektrostatická hlava Řízení pohybu kreslící hlavy •
•
inkrementální s krokovým motorem (tzn. takový digitální způsob) o nevyžaduje zpětnou vazbu o umí vystavit kreslicí hlavu jen do určitých bodů rastru spojité (analogové) se servomotorem o vyžaduje zpětnou vazbu o kresbu tvoří potenciálně všechny body plochy (pouze začátek a konec je možný jen "odněkud někam") Interpolátor •
•
spojitý ‐ generuje signál pro polohový servomechanismus, který řídí pohyb pisátka (nebo média) diskrétní ‐ čáru tvoří diskrétní množina bodů … příklad na spojitý (vpravo) a diskrétní interpolátor (vlevo)… Realizace •
•
analogový o s integrátory o s integrátory a s analogovou pamětí o exponenciální interpolátor digitální o DDA interpolátor o Bressenhamův algoritmus (určuje, zda bude příštím bodem přímky diagonální nebo horizontální soused ‐ rozhodující je přitom vertikální (kolmá) vzdálenost) Materiály •
•
•
X36PZA, přednáška 10 Teorie tisku Tiskárny Klávesnice, digitizéry a tablety, skenery, funkce řadiče Klávesnice Mají spoustu kláves a bla bla…, podstatnější je, jak jsou vyřešené. Každá klávesnice obshuje pod klávesami matici obvodů. Když klávesu zmáčknu, zkompletuje se spínačem určitý obvod a proud je přenesen do určitého místa. Spínače •
Kontaktní spínače o Membránový ‐ membrána vymezuje také mechanický odpor. Prostě membrána je potažená pod celou klávesnicí a je na ni vytisknut vzorek. Pokud stlačíme klávesu, membrána se prohne a vzorek zkompletuje obvod. o
S vodivou gumou (odporový) ‐ velmi levné, ale má značné mechanické nevýhody, většina dnešních klávesnic využívá těchto spínačů o
Jazýčkový spínač (společně s magnetem) ‐ princip je snad jasný – magnet vykazuje nějaký odpor, proto se klávesa po stisku vrátí zpět. Spínač sepne obvod. U většiny kontaktních spínačů je problémem to, že sepnuté kontakty vibrují. Přechodový jev pak trvá typicky 1 až 20 ms podle typu spínače. Filtruje se to elektronicky, ale je to drahé řešení. •
Bezkontatní spínače o Kapacitní o S Hallovým prvkem o S transformátorovou vazbou Reprezentace kláves •
•
se společným vodičem (cca do 16 kláves) matice s posuvnými registry o
problém ‐ ghosting a masking (při stisku více kláves to nelze správně rozpoznat) Připojení •
•
•
DIN PS/2 ‐ stejné signály, jiný konektor USB Přenosový protokol rozhraní PC klávesnice •
•
sériový, asynchronní (izosynchronní) ‐ avšak není to RS232 jeden start bit (vždy 0), potom 8 datových bitů a nakonec jeden stop bit (vždy 1) => celkem tedy 10 bitů Digitizéry a tablety •
•
opačná funkce ke grafickým zapisovačům: odměřování a vstup souřadnic bodu do počítače. Digitizér je například část PDA, která zaznamenévá jednotlivé doteky stylusem a vyhodnocuje je. Grafický zapisovač převáděl číselný údaj na polohu, digitizér převádí polohu na číselný údaj. digitalizují se i technické výkresy, fotografie, rentgenové snímky. Jak to probíhá? Například právě u technických výkresů přesuneme digitizér nad bod přímky a zmáčkneme tlačítko k digitalizaci…viz obr. •
výrazně vyšší přesnost než při použití světelného pera, rovný povrch pracovní plochy Rozdělení: •
•
•
velkoplošné digitizéry o digitalizace dat z velkých výkresů o využití grafického zapisovače se změněnou kreslicí hlavou stolní digitizéry (=tablety!) o domácí použití o snímacím čidlem ručně pohybuje operátor specializované digitizéry o 2D s pohyblivým médiem o 3D užívané na pracovištích CAD/CAM Složení digitizéru: •
•
•
•
•
snímací čidlo a tlačítko, kterým operátor určuje okamžik digitalizace pracovní plocha a převod sloužící ke snímání polohy čidla řadič a připojovací elektronika může být i displej, na němž se zobrazují informace o souřadnicích při nespřažené práci digitizéru vnější paměť digitalizovaných dat Druhy snímání •
•
absolutní o v každém okamžiku lze zjistit polohu snímače o používá binární (může poskytovat falešné informace) nebo Grayův (mění se vždy jen jeden bit) kód přírůstkové ‐ využívá dvojici čidel kvůli zjištění směru pohybu, snímací zařízení si musí pamatovat předchozí polohu Převod polohy na číselný údaj •
odporový princip o využití potenciometrů ‐ snímací číslo se spojeno s běžcem o měřené napětí se převádí AD převodníky o nevýhoda: malá rozlišovací schopnost o výhoda: nízké náklady o někdy se pravoúhlý snímací systém nahrazuje dvoupákovým mechanismem polárního systému o v provedení pro absolutní nebo přírůstkové snímání se používají kódové kotouče •
elektromagnetický princip s rastrem o pod pracovní plochou je mřížka vodorovných a svislých vodičů o při stisknutí tlačítka snímací čidlo indukuje napětí do vodičů, nad kterými se právě nachází •
elektromagnetický princip s meandrem o pod pracovní plochou jsou dva dlouhé vodiče složené do meandru ("had") a pootočené vůči sobě o 90° o umožňuje pouze přírůstkový režim činnosti o jednodušší konstrukce •
elektrostatický princip o využívá se kapacity mezi vodiči rastru a snímacím čidlem o určení polohy čidla se provádí na základě relativní hodnoty signálu (příspěvky od jednotlivých vodičů rastru) •
akustický o využívá šíření zvukových vln vzduchem o používá se pro prostorovou 3D digitalizaci Scanery Scaner je externí zařízení připojitelné k počítači umožňující převést předlohu do digitální podoby pro pozdější počítačové zpracování. Dělení scanerů: •
•
•
•
•
podle technologie snímacího prvku o CCD senzor (Charged Coupled Device) o CIS senzor (Contact Image Sensor) o PMT senzor (Photo Multiplier Tubes) o laserový scaner podle technologického provedení podle rozlišení podle barevných vlastností podle připojení k počítači Principy barevného snímání: •
•
•
•
scanování s barevnými filtry scanování barevným světlem scanování paralelním rozkladem scanování s využitím barevných CCD senzorů CIS scanery (Contact Image Sensor) •
•
používají pouze jeden řádek senzorů, který je umístěn co nejblíže snímané předloze zdrojem světla jsou tři řádky LED diod v základních barvách, které jsou přímo integrovány do čtecí hlavy Výhody oproti CCD: •
•
•
•
•
•
nemají složitý optický systém snížené napájecí napětí (5V) nevyžadují ustálení světelného toku jsou levnější mají vyšší živostnost snímací hlavy jsou lehčí Nevýhody oproti CCD: •
•
•
neumožňují snímat transparentní předlohy (diapozitivy a filmy) mají nižší rozlišovací schopnostna tmavších plochách předlohy při větší vzdálenosti předlohy od plochy scaneru (např. hřbet vázaného dokumentu) rychleji klesá osvícení PMT scanery (Photo Multiplier Tubes) •
•
•
na každou barvu mají jeden senzor (RGB model) => odpadají barevné chyby a tolerance, které mohou vzniknout použitím tisíců jedotlivých prvků senzory jsou kalibrovatelné fotonásobiče (díky zesilování světla postihnou odstíny i velmi tmavých částí) konstruují se v bubnovém provedení (Bubnový scaner) •
•
•
scanovaná předloha se umisťuje z vnitřní strany průhledného scanovacího bubnu (bez uchycování) polohu fixuje odstředivá síla a vrstvička oleje, které po roztočení bubnu vytvoří tenkou vrstvu mezi předlohou a sklem bubnu scanované materiály není nutné precizně čistit ‐ nečistoty vytlačí odstředivá síla a souostředí je v horní části bubnu Laserový scaner Je to vlastně jiné zařízení než klasický skener. Jeho účelem je… •
•
snímání čárových kódu nebo 3D snímání vyrábějí se v těchto provedeních: o aktivní bezkontaktní snímač o pasivní bezkontaktní snímač o kontaktní tužkový snímač Červený laserový paprsek kmitá vpravo, vlevo přes čárový kód, vzdálenost může být až několik metrů. Vlastnosti scanerů •
•
rozlišení ‐ udává se v bodech na palec (DPI ‐ Dots Per Inch) o hardwarové (optické) ƒ rozlišení, jakého je scaner schopen fyzicky dosáhnout ƒ horizontální rozlišení je dáno počtem snímacích prvků v řadě ƒ vertikální rozlišení je dáno velikostí kroku mechanismu, který posunuje snímací hlavu o softwarové (interpolované) ƒ hodnota bývá vyšší než rozlišení optické ƒ předloha se snímá v optickém rozlišení ‐ vyššího rozlišení se dosáhne softwarovým dopočítáním obrazu a barev ƒ scaner se nesnaží o dokonalejší kvalitu obrazu, ale o jeho zvětšení (může dojít k rozostření obrazu) možnosti připojení o paralelní port o SCSI řadič o USB řadič o bez připojení k počítači ‐ pracují i samostatně Materiály •
•
•
•
•
X36PZA, přednáška 11 X36PZA, přednáška 13 Klávesnice na HowStuffWorks Scannery na HowStuffWorks Popis funkce CCD Vstup obrazové a zvukové informace pro digitální zpracování Vstup obrazové informace Snímací prvky: •
•
•
•
•
CCD sezor (Charged Coupled Device) CMOS senzor (Complementary MOS) Super CCD ‐ každá buňka je rozdělena na dvě ‐ tím se simuluje rozdělení filmu na oblasti s vysokou citlivostí a s nízkou citlivostí Foveon ‐ tři vrstvy pixelů, které přímo zachycují všechny barvy CIS (Contact Image Sensor) a PMT (Photo Multiplier Tubes) ‐ pouze u scanerů CCD snímač CCD je elektronická součástka používaná pro snímání obrazové informace. Uplatnění má například ve videokamerách, digitálních fotoaparátech, faxech, scannerech, čtečkách čárových kódů, ale i řadě vědeckých přístrojů, jakými jsou například astronomické dalekohledy (včetně například Hubbleova teleskopu). Zkratka CCD pochází z anglického Charge‐Coupled Device, což v překladu znamená zařízení s vázanými náboji. CCD využívá podobně jako všechny ostatní světlocitlivé součástky fyzikálního jevu známého jako fotoefekt. Tento jev spočívá v tom, že částice světla foton při nárazu do atomu dokáže přemístit některý z jeho elektronů ze základního do tzv. excitovaného stavu. Činnost CCD se skládá ze tří fází: Příprava CCD Během této fáze jsou z CCD bez přístupu světla odebrány všechny volné elektrony, čímž je z něj smazán jakýkoliv zbytek předchozího nasnímaného obrazu. Expozice obrazu Na elektrody označené na obrázku číslem 1 se přivede kladné napětí a na CCD se nechá působit světlo (například v digitálním fotoaparátu se otevře závěrka). Dopadající fotony excitují v polovodiči elektrony, které jsou pak přitahovány ke kladně nabitým elektrodám. Po elektronech zbydou v polovodiči tzv. díry, které vůči svému okolí vykazují kladný náboj a ty jsou naopak přitahovány elektrodou na spodku CCD. Hranice pixelů jsou na obrázku znázorněny svislými tečkovanými čarami. Protože na pixel vlevo dopadlo více fotonů, je u jeho elektrody shromážděno více elektronů než u pixelu vpravo. Snímání obrazu Po uzavření závěrky se začne na množiny elektrod 1, 2 a 3 přivádět trojfázový hodinový signál (existují i CCD se čtyřfázovým nebo naopak dvoufázovým čtením). To v praxi znamená, že na elektrodách 2 se začne pozvolna zvyšovat napětí, zatímco na elektrodách 1 se souběžně snižuje. Díky tomu jsou shluky elektronů přitahovány pod elektrody 2. Následně se celý děj opakuje mezi elektrodami 2 a 3, dále mezi 3 a 1 a tak stále dokola. Shluky elektronů z jednotlivých pixelů se tak posouvají přes sousední pixely směrem k výstupnímu zesilovači (na obrázcích vpravo). Tento zesilovač pak zesílí malý proud odpovídající počtu nachytaných elektronů v jednotlivých pixelech na napěťové úrovně vhodné pro další zpracování obrazu. Toto byl popis tzv. lineárního CCD. To znamená, že v praxi snímá jeden řádek, z něhož jednotlivé body postupně putují ke snímacím prvkům. Většinou je však nutné snímat plošný obraz a ne jen jeden řádek. Základní konstrukce dvojrozměrného CCD je pouhým spojením mnoha lineárních CCD na jediném čipu. Namísto toho, aby náboje na koncích řad vstupovaly do obrazových zesilovačů, vstupují ovšem do dalšího lineárního CCD, které je k řadám kolmé a tímto CCD teprve postupují k jedinému zesilovači na jeho konci. Vypadá to v podstatě takto… Na konec jen připomenu to, že CCD je MOS (Metal Oxid Semiconductor – SiO2 je metal oxid) struktura. Výhody CCD: •
•
vysoký výkon a kvalita "zaběhnutost" výroby Nevýhody CCD: •
•
•
více různých napětí a vysoká spotřeba postupné čtení žádná integrovaná logika CMOS snímač V CCD je náboj obsahující obrazovou informaci přenášen přes celý čip a tyto náboje jsou tak čteny v podstatě jako stream. V CMOS je u každého pixelu několik transistorů, které zesílí a přemístí náboj. CMOS přístup je flexibilnější, protože každý pixel může být čten individuálně CMOS je jiná technologie výroby MOS struktur ‐ stejná, jakou se vyrábí běžné procesory. Díky tomu je CMOS mnohem levnější než CCD. CMOS má ale díky tomu, že je u každého pixelu ještě transistor, menší citlivost na světlo. Pokud to shrneme CCD je drahé, ale produkuje velice kvalitní obraz, oproti tomu CMOS je levné a má malou spotřebu. Výhody CMOS: •
•
do snímače můžeme integorvat i obvody pro úpravu nebo kompresi signálu potřeba jen jedné napěťové úrovně Nevýhody CMOS: •
menší citlivost na světlo (řeší se integrací miniaturních čoček) Vstup zvukové informace Zvuk je periodické vlnění prostředí, kterým se šíří. Představují ho spojité změny akustického tlaku, které přijímáme uchem a zpracováváme sluchovým ústrojím. Digitalizace spojitého signálu Je to vlastně vzorkování a kvantování. viz. obr. Diskretizace / digitalizace způsobuje: •
změny ve frekvenční oblasti (tzv. Aliasing) o
při nevhodné vzorkovací frekvenci nezískáme vzorky, které vhodně reprezentují analogový signál. Jak vypadá aliasing znázorňuje následující obrázek. Shanonův vzorkovací teorém ‐ vzorkovací frekvence musí být alespoň dvakrát větší, než nejvyšší frekvence obsažená ve vzorkovaném spektru. Toto stačí k odstranění aliasingu. změny v aplitudě (tzv. kvanitzační chybu) o kvantum je nejmenší hodnota, o kterou se v jednom okamžiku mohou lišit hodnoty dvou různých digitalizovaných signálů. Prostě nejsme analog, amplitudu zaznamenáváme digitálně, to znamená nemáme nekonečno čísel pro její vyjádření ‐> nižší přesnost…viz. obr. o
•
A/D převodníky •
•
•
•
•
s přímým převodem (video) kaskádní (měřicí přístroje) s postupnou aproximací (běžné aplikace) integrační (pomalá měření) sigma delta (audio) Sigma‐delta převodník Schéma je na obrázku: Řekl bych, že to funguje asi takhle: Vstupní signál Uin je sečten s referenčním napětím Uref (toto napětí řekl bych určuje hranici logické 1 a log. 0) Zjistí rozdíl mezi nimi, to jde do integrátoru, který z toho vyloudí „zubatý“ signál. Ten jde poté do komparátoru, který z toho vyrobí nuly a jedničky. Decimátor je vlastně takový buffer – nuly a jedničky do něj proudí a on z nich po čase vytvoří několikabitové číslo. Příklad vstupu a toho, co se s ním děje je zde: Výsledný výstup vypadá například takto… vlastnosti sigma‐delta převodníku: •
•
•
•
•
ideální technologie pro VLSI obvody zpracovávající spojité i diskrétní signály (Mixed Signals) posouvají kvantizační šum pomocí modulátoru do vyššího frekvenčního pásma realizují převzorkování digitálně filtrují signál decimátorem o decimátor zpracovává (oslabuje) příliš kategorické jednobitové reakce sigma‐
delta modulátoru na vstupní signál tím, že je "průměruje" o decimátor čítá po delší čas o decimátor tedy slouží jako zádrž pro vysoké frekvence změn výstupu (je tedy vlastně digitálním dolnopropustným filtrem) umožňují realizaci převodníků s velkým rozlišením Materiály •
•
•
•
•
o
o
X36PZA, přednáška 12 X36PZA, přednáška 13 Wikipedia ‐ CCD Digitální fooaparát ‐ CCD na HowStuffWorks CCD vs. CMOS 1 CCD vs. CMOS 2 ADC na wiki Typická standardní rozhraní Centronics (Paralelní port) Paralelní port je původní název rozhraní, které je kompatibilní s počítači IBM. Byl navržen pro komunikaci s tiskárnou , která užívá 8bitovou prodlouženou ASCII sadu znaků. Název odvozený od řádkové tiskárny byl běžný všeobecný termín pro různé druhy tiskáren. Grafické tiskárny se spoustou jiných zařízení byly navrženy pro práci se systémem. Ve skutečnosti to byl průmyslový standard po dlouhou dobu až do roku 1990, kdy byl normován jako IEEE 1284. Dnes je používání paralelního portu v útlumu a to příchodem USB (Universal serial bus) a FireWire (IEEE 1394). Časem byla rozšířena zařízení navržená ke zpracování na paralelním portu. Nejvíce bylo jednosměrných zařízení, pouze informace poslané z počítače. Nicméně některá zařízení jako Zip byla schopna pracovat v obousměrném režimu. Tiskárny také časem začaly pracovat v obousměrném režimu dovolujícím posílat různé stavové informace. LPT port má 8bitovou paralelní datovou sběrnici + 4 piny pro ovládání výstupu (Strobe, Linefeed, Initialize, and Select In) a 5 pinů pro ovládání vstupu (ACK, Busy, Select, Error a Paper Out). Přenosová rychlost je 12000 kbit/s. Ve většině případů nahrazuje paralelní port USB rozhraní. Nejnovější tiskárny jsou propojeny přes USB a nemívají paralelní port. Na spoustě nových počítačů je paralelní port vynechán kvůli úspoře nákladů a protože jsou považovány za zastaralé. V laptopech je paralelní port obvykle dostupný kvůli rozšiřujícím stanicím. Příklad nějakého konektoru… Vlastnosti •
•
•
•
•
•
•
dvoubodový spoj paralelní rozhraní ‐ tiskárna, 8bit nesymetrické napájení původně jednosměrné (PC ‐> Printer) ‐ označení SPP asynchronní ‐ oboustranné potvrzení, nesymetrické TTL maximální délka kabelu 2m signály o datové ƒ D0 až D7 = výstup dat o řídicí ƒ ¬STROBE = potvrzení platnosti dat ƒ ¬AUTOFEED = odřádkování papíru ƒ ¬INIT = inicializace tiskárny ƒ ¬SELECT = výběr tiskárny stavové (vstupní) ‐ od tiskárny ƒ ¬ACK = potvrzení převzetí dat ƒ BUSY = tiskárna není připravena převzít data ƒ PE = v tiskárně došel papír ƒ SELECT IN = potvrzení výběru tiskárny ƒ ¬ERROR = chyba při aktivaci signálu ¬ACK je možné vyvolat přerušení (IRQ7) => tisk na pozadí význam signálů lze upravit pro vlastní zařízení dnes se používá ve variantách EPP (Enhanced Parallel Port ‐ Intel, Xircom, Zenith Data Systems) a ECP (Extended Capability Port ‐ HP, Microsoft), které jsou obousměrné o
•
•
•
RS 232C (Sériový port) Standard RS‐232, resp. jeho poslední varianta RS‐232C z roku 1969, (také sériový port nebo sériová linka) se používá jako komunikační rozhraní osobních počítačů a další elektroniky. RS‐
232 umožňuje propojení a vzájemnou sériovou komunikaci dvou zařízení, tzn. že jednotlivé bity přenášených dat jsou vysílány postupně za sebou (v sérii) po jediném vodiči podobně jako u síťové technologie Ethernet nebo rozhranní USB. V současné době (2006) se v oblasti osobních počítačů od používání sériového rozhranní RS‐
232 již téměř definitivně ustoupilo a to bylo nahrazeno výkonějším Univerzálním Sériovým Rozhranním (USB). Nicméně v průmyslu je tento standard, především jeho modifikace ‐ standardy RS‐422 a RS‐485, velice rozšířen a pro své specifické rysy tomu tak bude i nadále. Na rozdíl od komplexnějšího USB, standard RS‐232 pouze definuje, jak přenést určitou sekvenci bitů a nezabývá se už vyššími vrstvami komunikace. V referenčním modelu ISO/OSI tak představuje pouze fyzickou vrstvu. ( takže konektor RJ 45 je vlastně realizací RS 232) Základní technický popis Standard definuje asynchronní sériovou komunikaci pro přenos dat. Pořadí přenosu datových bitů je od nejméně významného bitu (LSB) po bit nejvýznamější (MSB). Počet datových bitů je volitelný, obvykle se používá 8 bitů, lze se také setkat se 7 nebo 9 bity. Logický stav „0“/„1“ přenášených dat je reprezentován pomocí dvou možných úrovní napětí, které jsou bipolární a dle zařízení mohou nabývat hodnot ±5 V, ±10 V, ±12 V nebo ±15 V. Nejčastěji se používá varianta při které logické hodnotě 1 odpovídá napětí ‐12 V a logické hodnotě 0 pak +12 V. Základní tři vodiče rozhranní (příjem RxD, vysílání TxD a společná zem GND) jsou doplněny ještě dalšími sloužícími k řízení přenosu (vstupy DCD, DSR, CTS, RI, výstupy DTR, RTS). Ty mohou a nemusí být používány (zapojeny), nebo mohou být použity pro napájení elektronických obvodů v zařízení, jako je například počítačová myš. Výstupní elektronika je vybavena ochranou proti zkratu, kdy po překročení proudu 20 mA proud již dále neroste. Asynchronní komunikace I když komunikující zařízení znají rychlost, jakou se data přenášejí, musí přijímač začít přijímat ve správný okamžik, tedy musí proběhnout synchronizace. V případě synchronní komunikace souběžně s datovým vodičem existuje i synchronizační vodič, na kterém vysílač oznamuje přijímači „teď jsem poslal data“, viz LPT a signál STROBE. Naopak u asynchronní komunikace se synchronizační vodič nepoužívá, pouze vysílač pošle nějaká definovaná data po datovém vodiči, po jejichž přijetí se přijímač zasynchronizuje. V případě RS232 každé sekvenci datových bitů předchází jeden start bit, kterým se logická hodnota na lince přepne (původně v klidovém stavu) do opačného stavu. Po datových bitech následuje paritní bit a za ním jeden nebo více stop bitů, během kterých je linka opět v klidovém stavu. Je tak možné pro komunikaci použít méně vodičů na úkor určitého snížení rychlosti způsobeného synchronizací. K podobné synchronizaci dochází i u Ethernetu, kde na začátku každého rámce vyšle vysílač několik bajtů, ve kterých se střídají bity 0 a 1. Příklady některých konektorů pro rozhraní RS 232… Vlastnosti RS 232 •
•
•
•
•
•
•
•
•
dvoubodový spoj s maximální rychlostí 38,4kbps sériové rozhraní symetrické napájení plně duplexní (obousměrný), oboustranné potvrzení asynchronní (není synchronizováno hodinovým signálem) nepoužívá TTL úrovně o "0" = +3V až +25V o "1" = ‐3V až ‐25V izosynchronní přenos ‐ bity se přenáší synchronně, byty asynchronně (přenos konstantní průměrnou rychlostí) hodiny na zařízení jsou spouštěny start bitem maximální délka vodičů 15m IDE (neboli ATA) Je to zkratka Integrated Device Electronic. Tato zkratka v podstatě říká, proč bylo IDE vyvinuto. V minulosti byla zkušenost s připojováním disků taková, že na řadič zařízení byl na desce, výrobci využívali tento standart, ovšem jeho implementace v jednotlivých discích mohla být různá. To vedlo k nepkříjemným konfliktům. Integrated Device Electronics znamená, že řadič je součástí připojeného zařízení. Kabely s konektory jsou na obr. Vlastnosti IDE •
paralelní dvoubodové rozhraní původně pro připojení vnitřních disků •
•
•
•
•
•
•
•
•
později bylo modifikováno i pro paměťová zařízení jiných technologií, jako jsou CD‐
ROM, zálohovací pásky, diskety, apod. IDE signaling: nesymetrické napájení signálových linek při přenosové rychlosti dat nad 33,3 MB/s se používá standardní 40‐pinový konektor, ale 80‐ti vodičový kabel EIDE je inovací IDE ATA – AT Attachement ‐ je protokol pro přenos dat, řídicích a stavových informací mezi PC a diskem ATAPI je nový protokol lišící se od ATA: módy přenosu jsou jako u ATA, ale příkazy se vysílají v paketech (připomíná SCSI interface) existuje i duální varianta (se dvěma ATA kanály) délka plochého kabelu nesmí přesáhnout 18" (necelých 50cm) k jednomu IDE rozhraní (k jednomu kabelu) se mohou připojit dvě jednotky ‐ jedna z nich bude primární (Master) a druhá sekundární (Slave) => kabel může mít až 3 konektory . Master a Slave byly nuté kvůli arbitraci mezi řadiči zařízení. Samozřejmě to fungovalo tak, že Slave mohl vysílat data po kabelu jen tehdy, pokud nevysílal Master. Vývoj rozhraní: •
•
•
•
•
Mód PIO – zaměstnává procesor, opakovaná instrukce REP IN a REP OUT. Mód Third Party DMA o starý a pomalý o pouze na ISA, VLB o využívá neefektivní DMA základní desky Mód First Party DMA o periferie přebírá řízení sběrnice o obsahuje tedy svůj řadič DMA a stane se masterem sběrnice o je jen na PCI. Ultra DMA – data se přenáší při obou hranách hodin SATA – sériová ATA ‐ budoucnost tohoto interface, ale vyžaduje jiný řadič USB Sériová obousměrná sběrnice s maximálním dat. tokem 12 (USB 1.1) resp. 480 (USB 2.0) Mb/s. Rozhraní je symetrické (co to znamená? – viz symetrický a nesymetrický V/V), kódování je NRZI, informace o jednčkách a nulách nese vzájemná polarita D+ vůči D 1čka/nula je tehdy, když je D+ o 200 mV vyšší/nižší než D‐ .. toto však závisí na módu, při “low‐speed” módu je to opačně), je možnost si vybrat z high (480 Mb/s), full (12 Mb/s) a low speed (1.5 Mb/s) módu . Tu rychlost si určí samo zařízení, které k USB připojíme. Konektorů USB je docela hodně… Vlastnosti USB •
•
•
•
•
•
•
sběrnice sériový obousměrný přenos maximální datový tok: o USB 1.1 ‐ až 12 MB/s o USB 2.0 ‐ až 480 MB/s symetrické použito NRZI kódování, 4 vodiče informaci o "0" a "1" nese vzájemná polarita D+ vůči D‐ (dokonce ještě v závislosti na rychlosti) datový přenos může v závislosti na možnostech zařízení probíha rychlostí: o low (1,5 MB/s) o full (12 MB/s) o high (480 MB/s) SCSI je to dnes univerzální obousměrné asynchronní/synchronní sběrnicové rozhraní, původně bylo zavedeno jako rozhraní pro připojování vnějších disků. Je univerzálnější, ale i dražší než IDE, používá se ale i na jiných platformách než jen na PC (tady není moc časté). Architektura je taková, že každému zařízení se přiděli unikátní adresa – ID. Toto rozhraní má asi tak 15 různých typů konektorů. Kabel má 25 párů vodičů, topologie je většinou sběrnicová, jen zřídka hvězda. Za posledním zařízením musí být terminátor (ukončení řetězce), ty mohou být pasvní i aktivní. Příklad konektorů je na obrázku. Vlastnosti SCSI •
•
•
•
•
•
•
univerzální sběrnice obousměrná, paralelní, asynchronní / synchronní univerzálnější (ale i dražší) než IDE, v PC méně časté každé zařízení unikátní ID zařízení jsou připojena přes SCSI Controller, zakončení pasivním nebo aktivním terminátorem (za posledním zařízením) maximálně 8 nebo 16 zařízení (závisí na šířce paralelní sběrnice) nejčastější topologií je sběrnice, vyjímečně se používá i zapojení do hvězdy Materiály •
•
•
•
•
•
•
•
•
•
X36PZA, cvičení 3 X36PZA, cvičení 4 Wikipedia ‐ Paralelní port (http://cs.wikipedia.org/wiki/Paraleln%C3%AD_port) Wikipedia ‐ RS 232 (http://cs.wikipedia.org/wiki/RS‐232) Wikipedia ‐ IDE (http://en.wikipedia.org/wiki/Integrated_Drive_Electronics) Wikipedia ‐ USB (http://en.wikipedia.org/wiki/Universal_Serial_Bus) Wikipedia ‐ SCSI (http://en.wikipedia.org/wiki/Scsi) Wikipedia ‐ DIN (http://en.wikipedia.org/wiki/DIN_connector) Wikipedia ‐ PS/2 Vnější paměti (X36PZA) Magnetický a optický záznam, jeho organizace, kódování; zabezpečení proti chybám. Základní Pojmy Sektor: •
•
•
je nejmenší adresovatelná položka je to blok o velikosti 256B nebo 512B (obykle u magnetických disků), případně 1KB nebo 2KB (obvykle u optických disků) kromě dat obsahuje záhlaví, kontrolní bajty umožňující zjištění (popřípadě i opravu) chyb a další informace. typický formát sektoru disku je na obrázku Doba přístupu k datům na disku (Disc Access Time): •
•
obvykle 10‐20ms závisí na době potřebné k přestavení hlaviček (Seek Time), rotační latenci a době potřebné k samotnému přenosu dat (Transfer Time) Reverzace: •
•
magnetická ‐ jedná se o změnu uspořádání magnetických domén optická Magnetické paměti – technologie záznamu a čtení •
•
•
magnetické disky mají několik ploten a stejný počet hlaviček (nebo jich mají více, pokud je použit oboustranný záznam) každá plotna je rozdělena na stopy (soustředné kružnice) a každá stopa je rozdělena na sektory množina stop, které se nacházejí na plotnách nad sebou, se nazývá cylindr Zápis •
informaci nese magnetická reverzace – co to je? Vysvětlení…Způsob záznamu spočívá v použití vlastností magnetického pole a magnetických materiálů. Záznam ale i čtení se provádí magnetickou hlavou. Je to cívka navinutá na jádře, které je v místě, kde se nejvíce přibližuje záznamové vrstvě přerušena štěrbinou. Když cívkou necháme procházet elektrický proud (jde o záznam na disk), vytvoří se v jádru odpovídající magnetický tok, který se uzavírá přes štěrbinu v jádře. Jelikož je štěrbina velmi blízko magnetické vrstvě média (řádově několik mm), ovlivňuje tento tok i záznamovou vrstvu média, které se v místě styku magnetuje. Změnou směru elektrického proudu v cívce se mění i magnetický tok jádrem cívky a její štěrbinou a tím na záznamové vrstvě vznikají části magnetované jedním či druhým směrem. Mezi těmito dvěma směry magnetizace vznikají oblasti, kde se magnetizace mění, a ty se nazývají magnetické reverzace. Právě ty jsou důležité pro magnetický záznam. Obrázek ukazuje, jak k reverzaci dochází (všimněte si, že v druhém případě cívkou prochází opačný proud). •
zapisuje se indukcí ‐ změnou záznamového proudu dochází ke změně uspořádání magnetických domén Čtení Při čtení z magnetického média se postupuje opačným způsobem. Cívka navinutá na jádře se pohybuje po povrchu disku. Magnetické reverzace, na které hlavička při svém pohybu narazí, uzavírají s jádrem cívky magnetický tok. Ten vyvolá podle směru magnetizace elektrický impuls v cívce, který je dále zpracován přídavnou elektronikou. Způsob uložení magnetických reverzací závisí na použitém kódování dat. Nejběžnější a nejznámější jsou technika záznamu FM (frekvenční modulace), MFM (modifikovaná frekvenční modulace) a tzv. RLL kódy. Při běžném induktivním čtení mu vadí posun reverzací a malá amplituda přečtených změn (=> je potřeba kompenzace), tu zajistí PRML čtení. PRML (Partial Response Maximum Likelihood) Nečte se induktivně, ale magnetorezistivně. U PRML nejsou vyhodnocovány vrcholy čteného signálu, ale tvar signálu (Invitation Computer Conference 1998 ‐ Fitjusi). Kód PRML spočítá a uloží každý datový bit ne jako sled jedniček a nul, ale jako sumu z několika dříve uložených bitů. Je‐li na některém místě čitelná jen část informací, umí si software spočítat chybějící bit. Mezi procesorem a hlavou je tedy už jen A/D převodník. Zpracování je i statistické a používá tzv. Viterbiho přijímač, který bere ohled na závislosti signální posloupnosti... •
další vylepšení: GMR hlavička oproti MR hlavičce detekuje slabší magnetické pole => lze použít vyšší hustotu dat Následující obrázek ukazuje, jak vypadajá rozmístění hlaviek ve čtecím mechanismu… Optický záznam Stopa na optických discích má podobu spirály, která je rozdělena na sektory. Technologie optického záznamu: •
•
•
lisováním (CDDA, CDROM, DVD) vypálením nevymazatelného záznamu ‐ tato média dnes využívají technologii Dye Recording (tedy záznam změnou barvy aktivní vrstvy), např. CD+R a DVD+R vypálením na přepisovatelné médium ‐ tato média dnes využívají technologii PR (Phase Change Recording), méně často MO (Magneto‐Optical Recording), např. CDMO, CD+RW a DVD+RW Barevný záznam (Dye Recording) Zahřátím mění některé látky optické vlastnosti (průhlednost, barvu), takže se laserový paprsek nemůže odrazit od reflexivní vrsty. Tento proces je nevratný a na jeho principu pracují všechna optická média ±R. Takže prostě laserem zahřejeme některé částečky CDčka. Záznam fázovou změnou Proces je podobný jako Dye Recording, ale je vratný. Na tomto principu pracují všechna optická média ±RW. Ve smazaném stavu je vrstva průhledná, v zapsaném stavu je neprůhledná. Prostě je na médiu nanesena látka, která mění svou strukturu. Po zahřátí (zápisu) urč. místa látka zkrystalizuje a tím vlastně obsahuje informaci. Magneto‐optický záznam Využívá objevu Pierra Curie a Kerrova magneto‐optického jevu. princip je takový: látky můžeme vzhledem k jejich chování k magnetickému poli rodělit na feromagnetické(mají vlastní magnetické pole), paramagnetické(snadno se podřizují vnějšímu poli) a diamagnetické(vnější pole zeslabují). Pierre Currie objevil, že některé látky se změnou teploty přechází z feromagnetického stavu do paramagnetického a naopak. Při urč. teplotě (nad Currieho bodem) lze tyto látky snadno vnějším polem přemagnetovat, zatímco při nižší na ně stejně silné vnější mag. pole nemá vliv. Dále John Kerr objevil, že světlo mění své chování v silném elektr. popř. magnetickém poli ‐> polarizované světlo mění rovinu polarizace při odrazu od zmagnetovaného povrchu. Magneto – optický záznam vypadá takto: Čtení optického média Laserový paprsek jede po stopě a naráží na landy a pity. Jedny z nich jsou průhledné a jedny neprůhledné, takže se buď paprsek odráží nebo ne a to je právě ta informace. Laser čte zespoda CDčka, protože zvrchu je potisk, nějaká ochranná vrstva a pak ještě odrazivá (reflexní vrstva) – od ní se odráží laserový paprsek. Kódování FM (Frequency Modulation) •
•
použití u disketových jednotek a starších disků pro zápis jednoho datového bitu se spotřebuje minimálně jedna a maximálně dvě reverzace => příliš plýtvá šířkou pásma MFM (Modified Frequency Modulation) Reverzace probíhá jen uprostřed intervalu, pokud je tam jednička a ještě pokud jsou za sebou dvě nuly, tak na začátku (pozor, ne uprostřed) intervalu té druhé nuly. •
•
•
•
použití u disketových jednotek a starších disků (jako FM) snižuje minimální a maximální počet reverzací => spoří šířku pásma pro zápis jednoho datového bitu je potřeba minimálně žádná reverzace a maximálně jedna reverzace => dvojnásobná úspora oproti FM o je možné zkrácení bitového intervalu na polovinu o je možná dvojnásobná hustota záznamu než u FM nevýhody: o je nutné přesnější časování čtecích obvodů o samotná nula nemá žádnou reverzaci (nemá synchronizační značku) o reverzace, které jsou příliš u sebe, je třeba kompenzovat NRZI (Non Return to Zero Inverted) •
•
•
•
používá se např. u 100BASE‐FX fiber Fast Ethernet, USB nevýhoda: nepozná dlouhé posloupnosti nul k reverzaci záznamového proudu dochází pouze uprostřed bitového instervalu, ve kterém byla přenesena jednička (takže to samé jak MFM až na ty dvě nuly) pozor na to, ve slajdech o kódování (a na mnohých cvičeních) je to špatně (na začátku bitového intervalu s jedničkou) ‐ u zkoušky jsem to konzultoval se Šnorkem a správně je tedy to, že reverzace je uprostřed ‐ viz. slajd 46 u páté přednášky z PZA, kde to je jako na jediném místě správně RLL (Run Length Limited) •
•
•
RLL(A, B) minimální vzdálenost dvou jedniček je A a maximální vzdálenost dvou jedniček je B jedna reverzace kóduje skupinu až několika bitů => nelze rozpoznat, jakým způsobem jsou kódovány jednotlivé bity kódování předepisuje tabulka (nebo strom) , získanou posloupnost pak zakódujeme kódováním NRZI Zabezpečení proti chybám Proč vlastně zabezpečovat? Protože takovýto systém dokáže poté přečíst data z disků s poškrábaným povrchem. Jak můžeme data zabezpečit?… •
•
•
vkládáním nadbytečných údajů prokládáním údajů víceúrovňovým zabezpečením Hammingova vzdálenost Hammingova vzdálenost r dvou kódových slov = počet míst, v nichž se kódová slova liší Příklad: r(000,001) = r(000,010) = r(000,100) = 1 r(000,101) = 2 r(000,111) = 3 Hammingova vzdálenost je metrika a charakterizuje odolnost kódů proti poruchám a schopnost identifikovat, popř. opravit chyby. kódová vzdálenost kvzd = minimální vzdálenost dvojic kódových slov, tzn. v minimálně kolika bitech se liší jednotlivá slova. Podívej se na tabulku kódů a zjistíš, že všechna slova ia např. zakódovaná kódem K1 se liší alespoň ve 2 bitech. Počet zjistitelných a opravitelných chyb… Redundance Myšlenka kontrolních součtů je takováto: Ve vnějších pamětech se počítají kontrolní součty jako paritní bajty RS kódu (Reed & Solomon). Existuje i vícestupňová redundance ‐ redundantní paritní bajty se (po prokládání) počítají a přidávají znovu. Například CD‐DA používá dva stupně (tzv. CIRC kódování) a CD‐
ROM používá tři úrovně zabezpečení (RSPC+CIRC). RS (Reed ‐ Solomon) kód Reed‐Solomonův kód RS (n, k) kóduje k datových symbolů pomocí n symbolů. RS (26, 24) je tedy konkrétně kódem, ve kterém : m = 8, n = 26, k = 24 (m je počet bitů/symbol ) • K původním 24 B přidává 2 B parity a kóduje je jako 26 B. • Paritní bajty počítá (speciální) aritmetikou definovanou nad Galoisovým tělesem. Víceúrovňová redundance Redundantní paritní bajty se (po prokládání) počítají a přidávají znovu. Tak například médium CD‐DA (audioCD) používá 2 úrovně zabezpečení. Toto kódování je známo jako CIRC. Médium CD‐ROM používá úrovně 3 RSPC+CIRC. CRC (Cyclic Redundancy Check) Cyklický redundantní součet (označovaný také CRC) je speciální hašovací funkce používaná k detekci chyb během přenosu či ukládání dat. CRC je vypočten před operací, u níž jsou předpokládány chyby. Je odeslán či uložen spolu s daty. Po převzetí dat je z nich nezávisle spočítán znovu. Pokud vyjde různý CRC, je přenos prohlášen za chybový. V určitých případech je možné chybu pomocí CRC opravit. Prokládání Prokládání (Interleaving) využívá předpoklad, že chyby se nacházejí ve shlucích. Sudá 8mi bitová slova jsou zdržena o dva kroky a proházena => podaří se obnovit část informace. RSPC (RS Progressive Coding) Zabezpečuje data pomocí parity. Nejdříve se jednotlivá slova uspořádají do matice, pak se vypočítají P‐parity (ze sloupců) a Q‐parity (z diagonál). Ochrana nejpoužívanějších médií BER (Bit Error Rate) ‐ Hodnota BER udává, na kolik bitů teoreticky připadne 1 neopravitelná chyba. •
•
•
CD‐ROM: BER = 1014 při použití tříúrovňové ochrany (RSPC + CIRC) CD‐DA: BER = 109 při použití dvouúrovňové ochrany CIRC DVD‐ROM BER = 1015 při použití jednotúrovňové ochrany RSPC (avšak generuje se více bitů parity, takže jsme schopni zajistit o něco lepší ochranu než poskytuje tříúrovňová ochrana u CD‐ROM) o PO = Parity of Outer Code o PI = Parity of Inner Code Struktura CD – DA Sektor na CD‐DA se vytváří takto… Struktura CD – ROM CD‐ROM je rozšíření formátu CD‐DA pro širší použití. Audio chyby na CD‐DA by mohly mít na CD‐ROM podstatně větší dopad (např. na funkčnost softwaru). Oproti CD‐DA (zákl. jednotkou rámec s 24 B) tvoří základní strukturní jednotku na CD‐ROM 98 rámců sloučených do struktury nazvané SEKTOR (= 2352 B). Existují 3 různé módy: •
•
•
Mód 0 – nezajímavý. Mód 1 ‐ standartní Mód 2 – více B pro data za cenu snížené schopnosti opravy. Mód 1 poskytuje úrovňovou ochranu (RSPC+CIRC) – obsahuje synchronizaci, hlavičku, 2048 bytů pro uživatelská data a zbylých 288 bytů tvoří data paritní Pole EDC (Error Detection Code) je cyklický kód redundance, který se aplikuje na bajty 0‐
2063. Pole Space je vyplněno nulami. Pole ECC (Error Corecting Code, Pparita a Qparita) jsou pole, která dodá RSPC (viz dále). Struktura DVD DVD používá pouze 1 úroveň ochrany – RSPC. RSPC zde je sice jednodušší, ale důmyslnější –
generuje více bajtů parity, proto je schopen zajistit ještě o něco lepší ochranu než tříúrovňové zabezpečení CD‐ROM. Struktura DVD se také člení na rámce. RÁMEC obsahuje 2064 B, uspořádaných do 12 řad po 172 B. První řada začíná poli ID (Identification Data), IED (ID Error Detection Code) a CPR‐MAI (Copyright Management Information) následuje 2048 uživatelských dat a rámec uzavírají 4 B EDC. V rámci se napřed vypočtou IED a EDC. Rámce se poté promíchají a 16 po sobě jdoucích promíchaných rámců se seskupí do pole, které obsahuje 192 řad (16 x 12) po 172 B. Toto pole se nazývá ECC blok a je základem pro výpočet parity. Výpočet parity zajišťuje RSPC: pro 192 B v každém sloupci se vypočítá 16 B parity vnějšího kódu, tzv. PO‐parita (Parity of Outer Code)• pro 172 Bytů v každé ze 192+16 řad se vypočítá 10 B parity vnitřního kódu, tzv. PI‐parita (Parity of Inner Code). Materiály •
•
•
•
•
•
X36PZA, přednáška 5 (http://service.felk.cvut.cz/courses/X36PZA/slides/2007/lectures/X36PZA_2007_05.pdf) Wikipedia ‐ HDD (http://cs.wikipedia.org/wiki/Hard_disk) Pevné disky a standardní rozhraní (http://richie.webzdarma.cz/Bakule/Pevne_disky.pdf) HowStuffWorks ‐ vypalování CD (http://computer.howstuffworks.com/cd‐burner.htm) DVD referát (http://logout.sh.cvut.cz/~jaryn/pz/referat/referat.html) Magnetické i optické disky (http://richie.webzdarma.cz/Bakule/Diplomka‐disky.pdf) •
•
Wikipedia ‐ NRZI (http://en.wikipedia.org/wiki/NRZI) Wikipedia ‐ MFM (http://en.wikipedia.org/wiki/Modified_Frequency_Modulation) •
X36PZA, přednáška 7 (http://service.felk.cvut.cz/courses/X36PZA/slides/2007/lectures/X36PZA_2007_07.pdf) X36PZA ‐ přehled kódování (http://service.felk.cvut.cz/courses/X36PZA/slides/2007/seminar/kodovani.pdf) Wikipedia ‐ CRC (http://cs.wikipedia.org/wiki/CRC) X33KUI ‐ Hammingův kód •
•
•
Typická standardní rozhraní vnějších pamětí. Rozhraní vnějších pamětí •
•
ST 506/412 IDE / ATA (PATA) / SATA •
•
•
SCSI FireWire USB Detaily některých z těchto rozhraní jsou popsány v části Typická standardní rozhraní. Speciální případy: •
•
SAN (Storage Area Network) NAS (Network Attached Storage) ST 506/412 •
•
•
•
•
dvoubodový spoj sériový fyzické řízení disku ‐ nastavování pozice hlavy čtení dat z disku řízeno řadičem ‐ umístěn na samostatné kartě zařízení jsou připojena pomocí dvou kabelů ‐ datového a řídicího SATA (Serial ATA) •
•
•
dvoubodový spoj symetrické rozhraní (±0,125 V) méně vodičů (méně interferencí) => vyšší frekvence => rychlejší přenos SAN (Storage Area Network) Jedná se o celou zvláštní síť jen pro paměťový podsystém. NAS (Network Attached Storage) Velmi odpovídá dřívějšímu modelu centralizovaného úložiště. Počítače jsou mocí rychlého rozhraní Ethernet připojeny do společné sítě, ve které se nachází i úložný prostor. Materiály •
X36PZA, přednáška 6 (http://service.felk.cvut.cz/courses/X36PZA/slides/2007/lectures/X36PZA_2007_06.pdf) •
•
•
•
Wikipedia ‐ SATA (http://en.wikipedia.org/wiki/Serial_ATA) Wikipedia ‐ FireWire (http://en.wikipedia.org/wiki/FireWire) Wikipedia ‐ SAN (http://en.wikipedia.org/wiki/Storage_area_network) Wikipedia ‐ NAS •
Přenosové a datové sítě (X36PTS) Vlastnosti přenosových kanálů, metody kódování a modulace Základní pojmy •
•
•
•
•
•
kanál (telekomunikační kanál) – soubor technických prostředků umožňující jednosměrný přenos signálu mezi dvěma místy bez ohledu na druh použitých prostředků okruh – to samé jako kanál, ale obousměrný přenos kód – soustava pravidel pro přeměnu zprávy na signál, resp. jiný název pro abecedu zdroje zpráv, resp. soubor převodních vztahů mezi různými abecedami zdrojů zpráv kódování zprávy – proces, při kterém se jednotlivým prvkům zprávy (binárním prvkům, slabikám, písmenům, číslicím, obrazovým prvkům, apod.) přiřazují stavy určitých parametrů signálu (amplituda, frekvence, délka impulsu, šířka impulsu, skupina dvoustavových impulsů, apod.), Kódování zprávy lze rozdělit do dvou skupin: o zdrojové kódování – kódování, při kterém dochází k redukci objemu původní zprávy, resp. dochází k odstranění redundantních (nadbytečných) informací obsažených ve zprávě, které umožňují následné snížení přenosové rychlosti nutné pro přenos o kanálové kódování – úprava signálu redukovaného zdrojovým kódováním, která umožňuje zabezpečit přenášený signál proti chybám a shlukům chyb dekódování zprávy – opačný proces procesu kódování modulace – proces, při kterém se, v závislosti na změně signálu nesoucího zprávu, vyvolává změna určitého parametru elektromagnetického vlnění; používá se zejména pro změnu formy elektrického signálu na vysílací straně kanálu. Příkladem může být pulsně kódová modulace – metoda převodu analogového zvukového signálu na signál digitální, viz. obr. •
demodulace – proces fyzikálně shodný s modulací → používá se zejména ke změně formy elektrického signálu na přijímací straně kanálu Jednotlivé fáze komunikace: kódování ‐> modulace ‐> přenos ‐> demodulace ‐> dekódování Vlastnosti přenosových kanálů •
•
•
•
•
•
•
•
kvalita přenosu rychlost přenosu propustnost (kapacita) kanálu zpoždění signálu při průchodu kanálem kolísání zpoždění četnost chyb (Bit Error Rate ‐ BER) => ztrátovost informace (Packet Loss Rate) – prostě počet chybně přenesených bitů ku počtu všech přenesených bitů míra využítí přenosového kanálu (např. pro telefonii 50%) symetrie poskytované služby (stejná rychlost od a k účastníkovi) Kódování Kódování je prostě vyjádření informace nějakým kódem. Vzpomeň na FM, MFM...Pro přenos informace kanálem se používají linkové kódy. Používané typy linkových signálů můžeme klasifikovat podle tří hledisek: 1. Podle počtu úrovní: (podívej se na kód HDB3 a dojde ti, co jsou 3 úrovně) o dvouúrovňové signály (Manchester, CMI) o tříúrovňové signály ƒ bipolární (pseudotrojkové) – AMI, HDB3 ƒ trojkové – 4B3T o víceúrovňové (2B1Q) 2. Podle použité polohy signálových prvků: o unipolární ‐ signálové prvky pouze jedné polarity o polární ‐ signálové prvky dvojí polarity 3. Podle toho, zda se průběh v jednotkovém intervalu vrací k nulové úrovni nebo přechází přímo k druhému charakteristickému stavu: o signály s návratem k nule RZ (Return to Zero) o signály bez návratu k nule NRZ (Not Return to Zero) Kód AMI (Alternate Mark Inversion) Je charakterizován třemi úrovněmi: •
•
symbolu 0 odpovídá nulová úroveň symbolu 1 odpovídají střídavě úrovně ±U Při dlouhé posloupnosti symbolů 0 se nepřenáší informace o taktu a může nastat narušení synchronizace => řešení pomocí skrambleru nebo vkládání speciálních kódových posloupností na místa výskyti dlouhé posloupnosti symbolů 0 Kód HDB3 (High Density Bipolar) •
•
•
•
je založen na kódování AMI, ale snaží se nějak řešit posloupnost nul za sebou, proto vkládá používá se pro linkové systémy PCM30/32 zajistí maximálně tři symboly 0 jdoucí za sebou je standardizován pro linková rozhraní E1, E2, E3 evropské plesiochronní digitální hierarchie (PDH) Skupina kódů 1B2B Jedná se o dvouúrovňové polární kódy NRZ kódující původní symbol dvojicí symbolů tak, že dochází ke změně mezi +A a ‐A v polovině charakteristického intervalu (½T). Kód CMI (Coded Mark Inversion) Vznike překódování z kódu AMI tak, že nulu kódujeme jako dvojici po sobě následujících stavů ‐A, +A se změnou v polovině charakteristického intervalu. Kód CMI se používá v rozhraní PDH 4. řádu (E4) a pro optická rozhraní (v unipolární variantě). •
•
nule odpovídá změna z ‐A na +A v ½T (vzestupná hrana) jedničce odpovídá střídavě úroveň ‐A nebo +A trvající celý interval T Kód Manchester Používá se v sítích LAN na rozhraních Ethernet 10BASE‐T s rychlostí 10Mbit/s. Existuje i jeho diferenční varianta (kódování změny mezi 0 a 1). •
•
nule odpovídá změna na +A v ½T (vzestupná hrana) jedničce odpovídá změna na ‐A v ½T (sestupná hrana) Kód 2B1Q Dva bity (dibit) jsou vyjádřeny podle dané tabulky jednou ze čtyř napěťových úrovní (quad). Binární hodnota Odpovídající úroveň napětí 0 0 ‐3 V 0 1 ‐1 V 1 0 +3 V 1 1 +1 V Metody modulace Modulace se používá, pokud je potřeba dále snížit požadavky na šířku kmitočtového pásma. Pro přenost digitálního signálu v přeloženém pásmu se používají digitální modulace založené na ovlivňování fáze, kmitočtu nebo aplitudy nosného signálu. Při digitální modulaci nabývá modulační signál pouze omezeného počtu diskrétních hodnot ‐ specifický způsob ovlivňování nosné vlny diskrétním signálem (v nejjednodušším případě nabývajícího dvou stavů) se nazývá klíčování (Shift Keying). Digitální modulaci lze rozdělit podle toho jaký parametr nosného signálu ovlivňuje na: •
amplitudové klíčování (ASK, Amplitude Shift Keying) – měnění amplitudy vstupního signálu •
frekvenční klíčování (FSK, Frequency Shift Keying) – měnění frekvence signálu •
fázové klíčování (PSK, Phase Shift Keying) ‐ nejvíce rozšířené, změna fáze signálu Rozdělení modulačních metod podle počtu využitých nosných frekvencí: •
•
modulace s jednou nosnou (SCM, Single Carrier Modulation) ‐ patří sem PSK, QAM, CAP modulace s více nosnými (MCM, Multiple Carrier Modulation) ‐ patří sem DMT, OQUAM (Orthogonally Multiplexed Quadrature Amplitude Modulation), OFDM (Orthogonal Frequency Division Multiplexing; použito např. u DVB vysílání) PAM (Pulse‐Aplitude Modulation) Pulsně‐amplitudová modulace je označení pro vícestavové metody pro přenos v základním pásmu. Používá se osmistavová 8‐PAM a šestnáctistavová 16‐PAM. QASK (Quadrature Amplitude Shift Keying) Kvadraturní amplitudové klíčování je někdy také označováno kvadraturní amplitudová modulace (QAM, Quadrature Aplitude Modulation) nebo také jako amplitudově‐fázové klíčování bez nosné (CAP, Carrierless Aplitude and Phase). Jedná se o kombinaci aplitudového a fázového klíčování. Kvadraturní amplitudová modulace (např. 4‐QAM, 16‐QAM, ...) kóduje dvojice bitů z každé čtveřice bitů pomocí PAM, u druhé dvojice navíc posunuje fáze o 90°. DMT DMT se používá např. u DSL. Jedná se o modulaci s více nosnými, které využívá inverzní Fourierovy transformace. Materiály •
•
•
•
Ivan Pravda, Jiří Vodrážka ‐ Principy telekomunikačních systému, strany 40‐46 X32PTS, přednáška 1 (http://www.comtel.cz/files/download.php?id=2195) Wikipedia ‐ Modulace (http://cs.wikipedia.org/wiki/Modulace) Modulace v e‐archivu p. Peterky Metalické, optické a rádiové spoje. Metalické spoje •
•
•
•
•
symetrické páry (telefonní páry v místních kabelech, vnitřní rozvody budov – UTP a STP kabely) nesymetrické páry (koaxiální kabely – sítě kabelové televize, počítačové sítě sběrnicového typu) silová vedení (současné využití pro sdělovací signály – systémy PLC) frekvence: jednotky Hz až stovky MHz telekomunikační vedení lze zjednodušeně považovat za homogenní vedení (ve všech svých částech má stejné elektrické vlastnosti) s rovnoměrně rozloženými elektrickými parametry Náhradní schéma vedení Primární parametry vedení: •
•
•
•
měrný odpor R [Ω/km] měrná indukčnost L [mH/km] měrná kapacita C [nF/km] měrný svod G [µS/km] Při průchodu harmonického signálu vedením: •
•
průchodem proudu I podélnou větví dochází k úbytku napětí ΔU = I ∙ (R + jωL) ∙ Δx příčná větev způsobuje úbytek proudu ΔI = U ∙ (G + jωC) ∙ Δx Sekundární parametry vedení: •
•
charakteristická (vlnová) impedance (je to komplexní veličina): Zc = U / I = ΔU / ΔI = SQRT((R + jωL) / (G + jωC)) = |Zc| ∙ ejφc měrná vlnová míra přenosu γ o je to relativní změna napětí a proudu v libovolném elementu vedení vztažená na jednotkovou délku o γ = ΔU / (U ∙ Δx) = ΔI / (I ∙ Δx) = SQRT((R + jωL)(G + jωC)) = α + jβ o α je měrný vlnový útlum [dB/km] o β je měrný fázový posuv [rad/km] Problematika korektnosti zakončení vedení Amplituda napětí i proudu závisí na vlnové impedanci vedení Zc a na impedančním zakončení vedení impedancí Z2 a skládá se ze dvou složek: •
•
hlavní (postupná) vlna ‐ šíří se od počátku vedení zpětná (odražená) vlna ‐ šíří se od konce vedení Pokud Zc = Z2, tak odražená vlna nevzniká a vedení je bezodrazově (korektně zakončeno) ‐ to je žádoucí stav. Pokud Zc ≠ Z2, tak odražená vzniká a dochází ke vzniku tzv. stojatých vln, což je nežádoucí stav. Nekorektně zakončené vedení je náchylné ke příjmu rušivých signálů. •
•
•
koeficient odrazu k0 = ABS((Z2 ‐ Zc) / (Z2 + Zc)) udává stupeň korektnosti impedančního zakončení útlum nepřizpůsobení Ak0 = 20 ∙ log (1 / k0) = 20 ∙ log ABS((Z2 + Zc) / (Z2 ‐ Zc)) [dB] činitel stojatých vln ČSV = (1 + k0) / (1 ‐ k0) Rozdělení •
podle uspořdádání o symetrické vedení – telefonní kabely, UTP… o koaxiální vedení – ukázka rozdílu mezi symetrickým a koax. •
•
podle kontrukčního provedení o nadzemní (vesměs symetrická vedení) o kabelová (tvořena symetrickými nebo koaxiálními páry) podle způsobu instalace ‐ závlačná, úložná, závěsná, samonosná, říční, podmořská Parametry ovlivňující přenos •
útlum vedení A = Lm1 ‐ Lm2 = α ∙ x [dB; dBm, dBm; dB/hm, km] o Lm1 je vstupní absolutní úroveň výkonu P1 na vstupu (vztažena k 1 mW) o Lm2 je výstupní absolutní úroveň výkonu P2 na vstupu (vztažena k 1 mW) o α je měrný útlum vedení vztažený na délku 1 km o x je délka vedení •
•
vzájemné vazby mezi páry v profilu kabelu rušivé vlivy z okolí o přeslechy ƒ na blízkém konci NEXT (Near End Cross Talk) ƒ na vzdáleném konci FEXT (Far End Cross Talk) o
vysokofrekvenční rušení RFI (Radio Frequency Interference) o
impulsní rušení ‐ způsobováno zdroji generujícími krátké přechodové jevy Optické spoje •
•
optické vlákno optické směrové spoje (využívají volného prostoru) Skládají se ze tří částí: •
•
•
emitor (zdrojú záření ‐ např. LED nebo laserová dioda) přenosové médium ‐ optické vlákno detektor (přijímač) záření ‐ např. fotodioda Optické vlákno •
jsou to vlákna z křemenného skla, tvoří je hlavně jádro a obal •
•
numerická apertura NA udává rozmezí úhlů, pod kterými může světelný paprsek dopadat na optické vlákno tak, aby byl celý odražen zpět (a nebyl zčásti pohlcen obalem) NA = n0 ∙ sin νm = SQRT(n1² + n2²) o n0 = index lomu okolí o n1 = index lomu jádra o n2 = index lomu pláště o νm = úhel, pod kterým dopadá paprsek na optické vlákno •
•
•
je to vždy simplexní (jednosměrný) spoj ‐ pro vytvoření duplexního spoje jsou třeba dvě optická vlákna velmi citlivé na mechanické namáhání a ohyby výhody: vysoká přenosová rychlost odolnost vůči elektromagnetickému rušení (průmyslové aplikace) vysoká bezpečnost proti odposlechu malý průměr kabelů a nízká hmotnost nevýhody: o poměrně vysoká cena o vysoké nároky na výrobní proces (je třeba tzv. šestidevítková čistota ‐ 99,9999% ‐ prostě vlákno nesmí obsahovat nečistoty) o
o
o
o
•
Rozdělení optických vláken podle způsobu vedení paprsku (vidu) •
jednovidová optická vlákna SM‐SI (Single Mode Fiber) o nejvyšší přenosové rychlosti ze všech typů vláken (až Gbit/s na 1km) o schopnost vést pouze jediný vid (mód) bez odrazů (respektive ohybů) ‐ buď velmi malý průměr jádra nebo velmi malým poměrným rozdílem indexů lomu jádra a pláště o výrazně dražší než mnohovidová vlákna o použití pro přenosy na velké vzdálenosti (až 100km bez nutnosti opakovače) o pro buzení vyžadují laserové diody •
mnohovidová optická vlákna o relativně nízká výrobní cena o snažší mechanismus spojování jednotlivých optických vláken o velká hodnota numerické apertury => snažší navázání paprsku do optického vlákna o možnost buzení luminiscenční diodou LED o rozdělení: ƒ se skokovou změnou indexu lomu MM‐SI (Multi Mode Fiber) ƒ s gradientní změnou indexu lomu MM‐GI (Gradient Index Fiber) ‐ plynulá změna indexu lomu mezi jádrem a pláštěm (ohyb přenášených vidů) Klíčové přenosové parametry •
měrný útlum optického vlákna α [dB/km] o s přibývající vzdáleností od zdroje postupně klesá výkon přenášeného paprsku (signálu) o způsoben následujícími vlivy: ƒ vlastní absorbce ‐ ztráty na vlastních molekulách optického materiálu ƒ nevlastní absorbce ‐ ztráty na nečistotách ƒ lineární rozptyl ‐ materiál jádra a pláště není ideálně homogenní; je to hlavní složka útlumu optických vláken (roste s čtvrtou mocninou vlnové délky) ƒ nelineární rozptyl ‐ u části optického záření dochází ke změně jeho vlnové délky ƒ ztráty mikroohyby ‐ kritické pro jednovidová vlákna ƒ ztráty makroohyby ‐ minimální katalogová hodnota •
disperze optického vlákna o charakterizace optického vlákna z hlediska maximální přenosové rychlosti o podél trasy se mění tvar impulsu ‐ rozšiřuje se a snižuje se jeho amplituda => na konci vedení může být signál nepoužitelný o rozdělení: ƒ vidová disperze (u mnohavidových vláken) ‐ každý optický paprsek dorazí díky rozdílnosti délek drah na konec vlákna v rozdílných časových okamžicích ƒ chromatická disperze ‐ je způsobena rozdílnou rychlostí šíření dílčích složek zdroje světla (rozdílnými vlnovými délkami) •
šířka pásma Optické přenosové systémy (WDM) •
•
•
•
•
•
princip: sdružit několik optických kanálů, které byly dříve přenášeny každý jedním vláknem zvlášť, do jednoho vlákna na základě vlnového (Wavelength) čili v podstatě frekvenčního dělení základní požadavky: o výkon o přenosová rychlost o nominální poloha středu spektrální čáry o šum o mechanická odolnost o teplotní stabilita o spolehlivost o nízká cena o dlouhá životnost zdroje: luminiscenční diody LED a laserové diody optické zesilovače o klíčová komponenta WDM technologie o není nutný převod optického signálu na elektrický a zpět => bitová a protokolová nezávislost o vláknový zesilovač EDFA (Erbium Doped Fiber Amplifier) ‐ zesílení světla stimulovanou emisí záření multiplexory a demultiplexory o soustava dielektrických filtrů o vlnovody uspořádané do mřížky AVG (Arrayed Waveguide Grating) o vláknová Braggova mřížka FBG (Fibre Bragg Grating) detektory pro optické přijímače: fotodiody PIN a lavinové fotodiody APD (Avalanche Photo Diode) Radiové spoje Spojení pomocí radiových vln, uplatňuje se tam, kde by bylo složité např. klást vedení atd. Podle vlnových délek rozlišujeme různá frekvenční pásma radiových vln. Například televize operují v pásmu desítek až stovek MHz, mobily a družice v GHz (např. 1800 MHz). Radiové prostředky můžeme dělit podle různých kritérií, více následující tabulka… Nejpoužívanější radiové technologie •
radioreleové směrové spoje o spojení bod‐bod (Point‐to‐Point) o individiální spoje na přímou viditelnost a s úzce směrovými anténami o použití dvoukmitočtového plánu (na jedné stanici pracují vysílače v horní polovině pásma a přijímače v dolní polovině pásma, na dalším úseku naopak) pro bezchybný příjem musí přijímací cesta obsahovat adaptivní korekční obvody ƒ korektor ve frekvenční oblasti FEQ (Frequency Domain Equalizer) ‐ před demodulátorem ƒ kotektor v časové oblasti TEQ (Time Domain Equalizer) ‐ za demodulátorem distribuční a přístupové systémy (FWA – Fixed Wireless Access) o spojení bod‐mnoho bodů (Point‐to‐Multipoint) označované též LMDS (Local Multipoint Distribution Systems) o založeny na pevném bezdrátovém připojení realizovaném pomocí základnových stanic BS (Base Station), k nimž je pomocí radiového rozhraní připojena řada pevných koncových stanic uživatelů SAS (Subscriber Access System) vybavených směrovými anténami namířenými na základnové stanice o dvoufrekvenční plán o zvyšování kapacity pomocí zvýšení počtu sektorů (nejjednodušší způsob) nebo přidáním nových frekvencí (pokud jsou k dispozici) o WLAN, WiMAX, ... o
•
•
mobilní sítě o digitální sítě GSM (Global System for Mobile Communication) ‐ druhá generace mobilních systémů ƒ lze je rozdělit na tři základní části: ƒ subsystém základnových stanic BSS (Base Station Subsystem) ƒ síťový spojovací subsystém NSS (Network Switching Subsystem) ƒ operační subsystém OSS (Operation Subsystem) ‐ zabezpečuje provoz subsystémů BSS a NSS ƒ standardy: GSM 900, GSM 1800, GSM 1900 ƒ přenos dat: ƒ paketový způsob přenosu ‐ GPRS (General Packet Radio Service) ‐ asymetrický přenos dat ƒ pomocí přepojování okruhů ‐ HSCSD (High Speed Circuit Switched Data) ƒ systém EDGE (Enhanced Data for GSM Evolution) o třetí generace mobilních systémů ‐ UMTS (Universal Mobile Telecommunications System) ƒ na nejvyšší úrovni použita páteřní síť CN (Core Network) ƒ dále směrem k uživatelům je použita rádiová přístupová síť UTRAN (UMTS Terrestrial Radio Access Network), která propojuje do UMTS sítě jednotlivé uživatelské terminály UE (User Equipment) o buňkové mobilní telefonní sítě ‐ výslednou sestavu tvoří soustava pevných (základnových) stanic BTS (Base Transceiver Station) a stanic mobilních MS (Mobile Station) ‐ účastnických terminálů o pokryté území je rozděleno na buňky o provoz s automatickým přepojením – Handover – tzn. pokud se dostanu do jiné buňky, automaticky jsem přepojen na BTS dané buňky. o vícenásobný přístup MS k BTS: ƒ metoda FDMA (Frequency Division Multiple Access) ‐ dané frekvenční pásmo rozdělíme na subpásma ƒ metoda TDMA (Time Division Multiple Access) ‐ vytvoření časového rámce v daném frekvenčním pásmu ƒ
•
metoda CDMA (Code Division Multiple Access) ‐ datová posloupnost každého komunikačního kanálu je na vysílací straně podrobena procesu dalšího kódování družicové systémy o pevná družicová služba (obdova redioreléových spojů) o pohyblivá družicová služba (obdoba mobilních sítí) Materiály •
•
•
X32PTS, přednáška 4 (http://www.comtel.cz/files/download.php?id=2198) X32PTS, přednáška 9 (http://www.comtel.cz/files/download.php?id=2204) X32PTS, přednáška 14 Přenosové sítě,přístupové sítě, rádiové sítě, sítě ISDN a ATM. Telekomunikační sítě dělíme na přístupové, páteřní(přenosové) sítě a na zařízení síťových uzlů. Přenosové (páteřní) sítě •
•
•
•
•
•
•
•
přeprava uživatelských informací (Payload) mezi jednotlivými uzly sítě přenos signálů přenosovými rychlostmi řádově stovky Mbit/s až stovky Gbit/s transport signálu obvykle na značné vzdálenosti přenosová zařízení bývají umístěna přímo v objektech provozovatelů (operátorů) v současnosti se budují na základě optických přenosových médiích (v případě potřeby jsou doplňovány radioreléovými, případně družicovými spoji) => s metalickými kabely se nepočítá vysoké nároky na spolehlivost přenosu realizovány systémy SDH na optických vláknech použití systémů vlnového dělení WDM Přístupové sítě Charakteristika ‐ vlastnosti: •
soustřeďují provoz z dané oblasti k obslužnému uzlu telekomunikační sítě •
•
•
přenášejí různorodé signály rychlostmi od desítek kbit/s (pomalý přenos dat, telefonní hovory) do stovek Mbit/s (digitální video, multimediální služby) přenášejí data na krátké a střední vzdálenosti přenosové zařízení v přístupových sítí je dislokováno u uživatelů (problémy s napájením, ochranou proti neoprávněnému zásahu, hustotou městské zástavby) Přístupová síť musí ze systémového hlediska plnit tyto funkce: •
•
•
•
přenos, resp. transport signálu mezi velkým počtem účastnických koncových zařízení a síťovými uzly poskytovatelů služeb sdružování, resp. multiplexování signálů vedoucí k efektivnímu využívání přenosových médií a prostředků a pružnému přizpůsobování potřebné provozní kapacity podle proměnných požadavků účastníků i služeb třídění provozní zátěže (tzv. grooming) umožňující směrovat sdružené signály v přístupové síti na příslušná rozhraní poskytovatelů dostupných služeb přizpůsobení, resp. adaptaci účastnického rozhraní a rozhraní poskytovatele služeb Radiové sítě Rozebráno u otázky Metalické, optické a rádiové spoje ISDN ISDN pracují na starých telefonních sítích, ale přenos je kompletně digitální. Na obrázcích je historický vývoj od telefonních sítí k sítím ISDN. Podmínky pro vytvoření digitální sítě integrovaných služeb ISDN (Integrated Services Digital Network) ze sítě telefonní: 1. náhrada analogového frekvenčního multiplexu FDM (FrequencyDivisionMultiplex) za digitální časový multiplex TDM (TimeDivisionMultiplex) => vytvoření sítě IDN 2. zavedení centralizované signalizace SS7 do vytvořené sítě IDN => digitální přenos signalizačních zpráv 3. integrace nových typů služeb => identifikace účastníků (CLIP), tarifikace (AoC), přesměrování (CFB), konferenční hovor (CONF), přidržení spojení (HOLD), atd. Základní koncepce Datový tok je rozdělen na kanály.Pro přenos uživatelské informace se používá tzv. kanál B a pro oddělený přenos signalizace pak tzv. kanál D •
•
B‐kanál: o je základem pro vlastní uživatelskou komunikaci, přenáší se po něm uživatelská data o přenosová rychlost digitálního signálu je 64 kbit/s o umožňuje přenosy s přepojováním okruhů i s přepojováním paketů => přenos digitalizovaných telefonních a videotelefonních signálů, signálů datových služeb, aj. D‐kanál: o slouží především pro přenos řídicí signalizace, který využívá paketový princip komunikace o může sloužit i pro přenos uživatelské informace, ale pouze v paketovém přenosovém režimu o jsou definovány dva typy D‐kanálů: ƒ kanál D16 s přenosovou rychlostí 16 kbit/s ƒ kanál D64 s přenosovou rychlostí 64 kbit/s Způsob připojení účastníků •
•
Základní přístup BRA (Basic Rate Access): o účastník má k dispozici dva kanály B a jeden kanál D16 => přístup 2B+D o pro oba kanály B je signalizace přenášena po kanálu D16 o pro připojení k veřejné ústředně se nejčastěji využívá dvoudrátových metalických přípojných vedení Primární přístup PRA (Primary Rate Access): o účastník má k dispozici třicet kanálů B a jeden kanál D64 => přístup 30B+D o
o
o
o
v rámci časového mutliplexu TDM jsou přenášeny jednotlivé kanály, ale i řídicí informace => celková přenosová rychlost je 2,048 Mbit/s struktura rámce v podstatě odpovídá struktuře rámce PCM 1. řádu (PCM 30/32) tento způsob připojení se používá pro připojování pobočkových ústředen nebo sítí LAN na veřejné ústředny ISDN pro připojení k veřejné ústředně je nejčastěji využíváno čtyřdrátové metalické vedení nebo optický kabel Sítě ATM (Asynchronous Transfer Mode) Technologie ATM pouziva pro prenos uzivatelske informace tzv. Bunky(cells), prostrednictvim virtualnich kanalu s pouzitim casoveho multiplexovani (TDM), casovy rastr je zaplnen bud bunkami nesoucimi uzivatelskou informaci nebo sluzebni informaci nebo prazdnymi bunkami. Asynchronni mod – vyjadruje nepravidelnost vyskytu bunek nesoucich informaci Kazda ATM bunka ma zahlavi (5 bytu) ktere nese identifikacni, smerovaci a ridici informace, informacni pole je dlouhe 48 bytu a obsahuje vlastni data. •
•
•
•
•
•
•
technologie ATM používá pro přenos uživatelské informace tzv. buňky (cells), prostřednictvím virtuálních kanálů s použitím časového multiplexování (TDM) časový rastr v multiplexním rámci je buď zaplněn buňkami nesoucími uživatelskou nebo služební informaci anebo prázdnými buňkami => souhrnný tok buněk na přenosové cestě je plynulý asynchronní mód => vyjadřuje nepravidelnost výskytu buněk nesoucích uživatelskou nebo služební informaci každá ATM buňka má záhlaví o délce 5 bytů, které nese identifikační, směrovací a řídící informace informační pole buňky dlouhé 48 bytů pak obsahuje vlastní data => data z pohledu ATM sítě, ve skutečnosti se může jednat o služební data protokolů nad vrstvou ATM (spojová vrstva – 2.vrstva RM‐OSI) datová, resp. informační část se při průchodu ATM přepínačem nemění, obsah záhlaví je však při každém průchodu změněn ATM síť může mít proměnnou i konstantní přenosovou rychlost, změna je plynulá. Materiály •
•
•
•
•
•
•
X32PTS, přednáška 5 (http://www.comtel.cz/files/download.php?id=2199) X32PTS, přednáška 7 (http://www.comtel.cz/files/download.php?id=2201) X32PTS, přednáška 8 (http://www.comtel.cz/files/download.php?id=2202) Sítě ISDN (http://www.earchiv.cz/a92/a204c110.php3) Sítě ATM 1 (http://www.earchiv.cz/a96/a621k150.php3) Sítě ATM 2 Počítačová komunikace (X36PKO) Ochrana proti chybám přenosu, potvrzovací schémata. Ochrana proti chybám přenosu Odesílaná data se zabezpečují bezpečnostní kódy (např. kontrolní součty, parita, Hammingův kód...) ‐ nezabezpečují se však jednotlivé znaky, ale celé bloky několika znaků. K bloku dat jsou přidány kontrolní informace navíc (získané z bloku dat aplikováním bezpečnostního kódu) a tyto informace jsou odeslány společně s původním blokem dat. Na straně příjemce je opět z přijatého bloku dat spočítána kontrolní informace a porovnána s přijatou kontrolní informací. Pokud se obě shodují, jsou data prohlášena za správná (nebyla během přenosu poškozena), v opačném případě musí dát příjemce odesílateli na vědomí, že blok dat byl během přenosu porušen a je třeba ho zaslat znovu. K tomuto oznamování chyb v přenosu slouží tzv. potvrzovací schémata. Potvrzovací schémata Potvrzování se děje na linkové (spojové) vrstvě. Existují 3 základní způsoby infomování odesílatele o stavu přijatých dat: 1. odesilatel odesílá data včetně kontrolního součtu, příjemce po přijetí dat přepočítá kontrolní součet a pošle odesílateli potvrzení nebo zamítnutí (ACK / NAK) přijatých dat 2. odesilatel odesílá pouze data, avšak pamatuje si jejich kontrolní součet. Příjemce z přijatých dat spočítá kontrolní součet a ten pošle zpět odesílateli 3. odesilatel odesílá data včetně kontrolního součtu, příjemce přijatá data (včetně kontrolního součtu) vezme a odešle zpátky Pozitivní potvrzování Vysílací stanice vyšle paket a přijímací stanice pošle potvrzení, zda paket došel v pořádku. Jestliže se vysílací stanice nedočká po určenou dobu (Time‐out) potvrzení, tak paket vysílá znovu (nezávisle na tom, jestli se poškodil / ztratil paket nebo potvrzení). Dochází k plýtvání kapacitou sítě (v jednom okamžiku se v kanále nachází pouze jeden packet nebo jedno potvrzení). Čistě negativní potvrzování Pokud příjemce detekuje příjem poškozeného paketu, odpoví odesilateli negativním potvrzením ("tento packet byl poškozen"). V opačném případě se neodesílá nic. Pokud příjemce po předem stanovenou dobu (Time‐out) neobdrží negativní potvrzení, považuje odeslaný paket za správně doručený a posílá další paket => pokud se ztratí negativní potvrzení, považujeme špatně přijatá data za správná! Na obrázku jsou dva druhy křížků ‐ přerušovaný označuje poškozený paket, nepřerušovaný křížek označuje ztracený paket / potvrzení. Negativní potvrzování Kombinace pozitivního a čistě negativního potvrzování. Příjemce potvrzuje správně přijaté pakety pozitivním potvrzením (ACK) a poškozené přijaté pakety odmítá (REJ). Pokud odesilatel nedostane po předem stanovené době (Time‐out) žádné potvrzení (ani negativní, ani pozitivní), zopakuje odeslání posledního paketu. Číslování rámců Odesilatel čísluje pakety (rámce) s daty. Příjemce po přijetí a zkontrolování přijatých dat odpovídá číslem rámce, který má následovat (tj. pokud přišla data v pořádku, tak číslem o 1 vyšším, než je číslo právě přijatého rámce; v opačném případě odpovídá stejným číslem, jako je číslo rámce, který právě přišel). Pokud příjemce do pevně stanovené doby (Time‐out) nedostane potvrzení, opakuje odeslání posledního odeslaného rámce. Go‐Back‐N Odesilatel se stará o to, aby v kanále bylo neustále maximálně N nepotvrzených zpráv, příjemce potvrzuje data jejich číslem. Pokud odesilatel neobdrží v předem stanovené době (Time‐out) žádné potvrzení nebo pokud obdrží potvrzení, které neočekával (tzv. mezi dvěma potvrzenými zprávami existuje alespoň jedna nepotvrzená), vrátí se N kroků zpátky (znovu odešle všechny nepotvrzené packety, kterých je z principu funkce Go‐Back‐N maximálně N). Metoda klouzavého okénka Klouzavé okénko je speciálním případem protokolu Go‐Back‐N. U metody klouzavého okénka potvrzovací číslo vždy potvrzuje N předchozích zpráv. Jak odesilatel tak příjemce si každý udržují "okénko" o velikosti N. U odesilatele toto okénko obsahuje N zpráv počínaje první zprávou, která ještě nebyla potvrzena. U příjemce okénko obsahuje N pozic pro očekávané zprávy, případně obsahuje maximálně N‐1 zpráv, které následují po zprávě, kterou příjemce ještě nedostal. Výborný příklad na klouzavé okénko je na http://www2.rad.com/networks/2004/sliding_window/ (vyžaduje Flash) Selektivní odmítání Příjemce i odesilatel mají každý své okénko. Pokud příjemce obdrží poškozený paket, potvrdí ho negativním potvrzením s číslem tohoto paketu. Pokud není přijatý paket poškozený, existují dvě možnosti: existuje paket s nižším číslem, který byl potvrzen negativně (v tomto případě nic neposíláme) nebo takový paket neexistuje (v tomto případě paket potvrdíme pozitivním potvrzením). Odesilatel při přijetí pozitivního potvrzení posunuje své okénko (potvrzení opět potvrzuje až N předchozích paketů). Piggybacking Piggybacking přidává k datovým paketům také samotné potvrzení, které potvrzuje N posledních přijatých paketů. Datový přenos se pak řídí třemi pravidly: •
•
•
pokud chce chce jeden z komunikujících odeslat data i potvrzení, pošle obojí pokud chce jeden z komunikujících odeslat pouze potvrzení, odešle pouze potvrzení pokud chce jeden z komunikujících odeslat pouze data, přidá k nim poslední potvrzení, které odesílal ‐ toto duplicitní potvrzení je druhou stranou ignorováno Materiály •
•
•
•
•
•
•
X36PKO, přednáška 3, Potvrzovací schémata Jiří Peterka: Zabezpečení dat při přenosech Demo ‐ Metoda klouzavého okénka Selektivní odmítání a další potvrzovací schémata Demo ‐ Selektivní odmítání Několik potvrzovacíh schémat ‐ vysvětlení a demo Wikipedia ‐ Piggybacking Algoritmy a mechanismy směrování Algoritmy a mechanismy směrování Statické směrování Při statickém (též neadaptivním) směrování se směrovací tabulka nijak nemění. Je dána konfigurací počítače a případné změny je třeba v ní provést ručně. Tato varianta vypadá jako nepříliš atraktivní, ve skutečnosti ale drtivá většina zařízení v Internetu směruje staticky. Patří sem například skoro všechny uživatelské počítače, které jsou zpravidla v natolik jednoduché síťové situaci, že cokoli složitějšího nemá smysl. Většinou se nacházejí v koncové podsíti, z níž vede jediná cesta ven přes odchozí směrovač. Jejich směrovací tabulka obsahuje dva záznamy: adresy ze stejné podsítě doručovat přímo, všechno ostatní předávat na odchozí směrovač. Tyto informace se nastaví manuálně či automaticky prostřednictvím DHCP a není třeba na nich nic měnit. tedy ve zkratce: •
•
ruční (statické) nastavení směrovacích tabulek o při návrhu sítě o při změně topologie nereaguje na změnu topologie o možnost nastavení alternativních směrů o využití při výpadku nebo přetížení •
•
nepodporuje řízení toku ‐ řešením je stochastické směrování (na základě pravděpodobnosti) může být v kombinaci s předchozími metodami Dynamické směrování Dynamické (adaptivní) směrování průběžně reaguje na změny v síťové topologii a přizpůsobuje jim směrovací tabulky. Podle způsobu, jakým si jednotlivá zařízení vyměňují informace o stavu sítě, lze dynamické algoritmy rozdělit do základních skupin (které se vzájemně prolínají a kombinují): •
Centralizované: Zde všechny směrovače posílají informace o stavu okolní sítě do jednoho směrovacího centra. To sestaví mapu sítě, spočítá z ní směrovací tabulky a rozešle je směrovačům. Z pohledu směrovače je tento přístup velmi jednoduchý (pošle hlášení a za chvíli dostane směrovací tabulku). Navíc centrum má kompletní mapu sítě, takže dokáže určit globálně optimální tabulky. Hlavním problémem centralizovaného přístupu je, že špatně škáluje – na linkách vedoucích do centra se kumulují zprávy o stavu sítě a odesílané tabulky. Velikost sítě, kterou lze takto směrovat, je proto omezená. Dílčí problém představuje i synchronizace tabulek – směrovače poblíž centra je dostávají dříve. Centralizované směrování se proto nedočkalo širšího uplatnění. •
Izolované: Jsou postaveny na ryzím individualismu. Nikdo nikomu neposílá žádné informace o stavu sítě, každý směrovač se rozhoduje zcela samostatně. Do této skupiny patří například záplavový algoritmus •
Distribuované (=Adaptivní): Představují standardní přístup ke směrování v síti Internet. V nich se informace o změnách v síti předávají postupně mezi sousedními směrovači, až se rozšíří do celé sítě. Tento přístup je dostatečně pružný a robustní, aby zvládl i dost rozlehlé sítě. Skutečnost, že Internet stojí na distribuovaných algoritmech, je nejlepším vysvědčením životaschopnosti tohoto konceptu. Konkrétní přístupy a mechanismy se výrazně liší. Nejvýznamnějšími představiteli distribuovaných protokolů jsou: o RIP o OSPF o BGP •
Hierarchické: Řeší problém rozlehlých sítí a neuměrné velikosti směrovacích informací tím, že autonomní systém rozdělují do několika relativně samostatných oblastí (area). Záplavové informace o změně v topologii sítě se šíří pouze v rámci oblasti. O výměnu souhrnných informací mezi oblastmi se starají hraniční směrovače (propojující jednotlivé oblasti mezi sebou). Jedna oblast tedy dostává o ostatních oblastech pouze souhrnné informace (s agregovanými prefixy). Tento způsob nabízí např. protokol OSPF. Pojďme si nyní probrat některé dynamické směrovací algoritmy dopodrobna… Směrovací algoritmy izolovaného směrování… Záplavové směrování Každý směrovač rozešle přijatý paket do všech směrů, kromě toho odkud přišel. Tím vzniká jakási záplava, která dříve či později dorazí na místo svého správného určení. Současně je ale nutné správně a korektně eliminovat duplicitní pakety, které při záplavovém rozesílání vznikají, aby na místo svého určení dorazil každý paket jen jednou. Výhodou je velká robustnost ‐ pokud existuje alespoň nějaká cesta k cíli, je tímto způsobem nalezena. A vlastně bez toho, aby směrovače vůbec potřebovaly nějaké směrovací tabulky. •
•
•
odesílání paketu na všechny výstupy nevýhodou je zahlcení sítě potřeba likvidovat nadbytečné pakety, proto je použito TTL o TTL (Time To Live) o informace na směrovači o informace v paketu Náhodné směrování Zdánlivě nesmyslný způsob, avšak občas se používá v případě zahlcení směrovače, který nestíhá prohledávat routovací tabulku, a tak pakety, které by normálně zahodil, pošle náhodným směrem a má částečnou šanci se s paketem trefit do správné cesty (tudíž odesílatel nebude možná muset ztracený paket znovu po síti posílat). •
•
•
odesílání paketu na náhodný výstup nezaručuje omezenou dobu doručení potřeba dodatečné informace Horký brambor Ta se začíná používat (jako náhradní varianta) v situaci, kdy jinak používané směrování se dostává do problémů a směrovači hrozí zahlcení. Když se v některém odchozím směru začínají hromadit pakety, které směrovač nestíhá odeslat, může nastoupit právě směrování metodou horké brambory ‐ směrovač volí odchozí směr nikoli podle toho, kudy by měl paket správně pokračovat, ale podle toho, který odchozí směr je právě nejméně vytížený (tj. kde se "horké brambory" dokáže co nejrychleji zbavit). Když se pak nebezpečí zahlcení podaří odvrátit, směrovač se zase vrací ke svému původnímu způsobu směrování. •
•
•
odesílání paketu do nejkratší fronty nezaručuje omezenou dobu doručení potřeba dodatečné informace Zpětné učení Funguje podobně jako přehazování paketů na switchi na linkové vrstvě. Pokud router obdrží paket s příjemcem, o kterém neví, kde se nachází, pošle ho dál na všechna rozhraní (s výjimkou toho, odkud paket přišel). Avšak současně s každým procházejícím paketem si poznamenává, na jaké rozhraní přišel paket s daným odesílatelem. Tímto způsobem se učí topologii sítě (na kterém rozhraní jsou kteří hostitelé). •
•
•
•
využití informací o času / počtu průchodů v paketu tabulka obsahuje odesilatele, nejkratší čas a směr odkud paket přišel nutné kombinovat s jinou metodou pomalá konvergence při chybě ‐ potřeba zapomínání Směrovací metody distribuovaného směrování… Co jsou Distance Vector algoritmy? Distance Vector Algoritmy označované někdy jako RVP (Routing Vector Protocols) pracují tak, že si sousední směrovače mezi sebou vyměňují obsahy směrovacích tabulek (vektorem se míní jedna položka směrovací tabulky). Obdržím‐li jednotlivé vektory ze směrovací tabulky svého souseda, pak si z nich mohu vybrat vektory, které ve vlastní směrovací tabulce nemám a doplnit je do vlastní směrovací tabulky. Nesmím zapomenout u takto doplněné položky zvýšit metriku (tou může být například počet směrovačů, přes které se na uzel dostanu). Tyto protokoly jsou jednoduché a snadno se implementují. Jejích nevýhodou je, že ve větších rozsáhlých sítích může výměna vektorů oscilovat a pak některé vzdálenější sítě mohou být chvilku dostupné a za okamžik již nikoliv. Většími sítěmi se rozumí sítě o více jak 10 LAN. Příkladem protokolů RVP jsou protokoly RIP a RIP 2. Jelikož jsou protokoly RVP vhodné pro menší rozsáhlé sítě, pak je vždy otázkou, zda‐li se bude konfigurace sítě opravdu natolik dynamicky měnit, nebo se sice pracněji, ale lépe nakonfigurují směrovače ručně pomocí statických položek ve zkratce… •
•
•
•
•
výměna kompletních směrovacích tabulek velké zatížení sítě pomalá konvergence ‐ obzvlášť při výpadku (lze vyřešit metodami Poison Reverse a Split Horizon (u RIPu)) Ford‐Fulkersonův algoritmus typické příklady Distance Vector algoritmů: RIP, IGRP, EIGRP, BGP RIP (Routing Information Protocol) Jeho metrikou je počet směrovačů, přes které se jde k cíli. Spoléhá na komunikaci se sousedy, prostě si směrovače mezi sebou (pomocí bradcastů) vyměňují obsahy směrovacích tabulek. Při směrování je nalezena pouze jedna cesta (ta nejkratší) od odesílatele k cíli. Nevýhodou je, že v tomto protokolu není v položce směrovací tabulky uváděna síťová maska. Proto lze protokol RIP použít jen tehdy, když v síti používáme pouze sítě se standardní maskou. Vylepšením je RIP2, který pracuje navíc s maskou podsítě, požaduje autorizaci a podporuje multicast. RIP výpočet (viz slidy 18‐28): Tento algoritmus vytváří přímo routovací tabulky.Tabulky směrovačů i uzlů obsahují identifikaci směrovačů (ve slidech písmenem) a vzdálenost k nim. Původně má v tabulce směrovač sám sebe a se vzdáleností 0. Takže, nyní: 1) každý směrovač vyšle do všech směrů iformace o své tabulce. Ty informace co k němu v „prvním kole“ dojdou identifikují bezprostředně okolní směrovače (tedy ty se vzdáleností 1) 2) Opakuje se bod 1 s tím, že nyní proudí již od každého směrovače informací (každý směrovač pošle tzv. update) více. Podle toho si předělá ten který směrovač svou tabulku. Prostě například E ví, že mu B poslalo update, v němž je informace, že H je od B vzdálené o 1. Jelikož E ví, že B je od něj o 1, musí být H od B vzdálené o 2 3) To se opakuje celkově tolikrát, kolikrát je to zapotřebí, prostě směrovače tu tam rozešlou update. RIP – výpadek linky – může způsobit problém – dobře je to popsáno ve skriptech na str. 93. Podívejte se na obrázek... Problém je ten, že pokud vypadne ze sítě uzel A, uzly si postupně navyšují jeho vzdálenost Dejme tomu, že situace na počátku je 0 1 2 3 4, Nyní se A čko je odpojí, takže vzdálenost B od A uvedená v tabulce B je neplatná, proto čeká na informaci od C, to mu pošle, že A je od něj vzdáleno o 2, proto si B zapíše do své tabulky vzdálenost 3, nyní proběhne další update: B pošle C to, že je od něj A vzdáleno o 3, C si zapíše 4...a vzdálenosti stoupají ... Aby si tuto vzdálenost nenavyšovaly donekonečna, je nutné zavést nějakou max hranici, po kterou se bude zvyšovat (tzv. nekonečno), tato hranice je u RIP stanovena na 16. Proto tedy trvá docela dlouho, než se RIP adaptuje na výpadek linky. Ze stanovení nekonečna také plyne to, že uzel se vzdáleností 16 a více je označen jako nedostupný.Naopak adaptace RIP na „dobré zprávy“ (změna v síti) je rychlá. Pro rychlejší adaptaci na „špatné zprávy“ lze zavést algoritmus split horizon (v našem příkladě to znamená, že uzel C vdálenost od A, kterou získal od B, béčku zpět nepředá, tzn. B přijme pouze aktualizace z jiného uzlu), dalším zrychlením je algoritmus reverse poisson( C béčku předá vzdálenost od A rovnou jako nekonečno) RIP ve zkratce… •
•
•
metrika = počet směrovačů komunikace se sousedy pouze jedna cesta •
výpadek linky: o definice nekonečna (16) ‐ omezení maximálního průměru sítě o problém s pomalou konvergencí (obzvlášť při výpadku) ‐ řešení: ƒ Split Horizon (pouze aktualizace získané z jiného uzlu) ƒ Poison Reverse (pouze aktualizace získané z jiného uzlu, jinak 16) Směrovací algoritmy hierarchického směrování… Co jsou Link State algoritmy (protokoly)? Link State Protocols ‐ Protokoly LSP pracují na zcela odlišném principu. Každý směrovač si zjistí, jaké směrovače má za své sousedy a v pravidelných intervalech testuje jejich dostupnost. Celou síť pak zaplavuje svými oběžníky o tom, koho má za své sousedy. Takže každý směrovač má od všech ostatních směrovačů zprávu o tom jaké mají sousedy. Takže každý směrovač má seznam všech cest v síti. Na tento seznam se pustí algoritmus nejkratší cesty, kterým se zjišťuje směr kam se má IP‐
datagram odeslat. Tj. položky směrovací tabulky se počítají algoritmem nejkratší cesty z dat obdržených od ostatních směrovačů. U rozsáhlých sítí je problematické zaplavovat je velkým množstvím informací ze směrovačů, proto se takové sítě rozdělí na oblasti a zmíněný postup se aplikuje pouze v rámci této oblasti. Na hranicích se sousedními oblastmi jsou hraniční směrovače, které si pak vyměňují informace o celých oblastech. Protokoly LSP jsou oproti protokolům RVP nesrovnatelně stabilnější a lze je aplikovat i u velmi rozsáhlých sítí. Nevýhodou je, že návrh sítě, tj. rozdělení sítě na oblasti musí provést zkušený odborník, rovněž konfigurace je netriviální. Pokud se použije protokol typu LSP bez větších zkušeností, tak je také možné, že některými linkami data prostě nepotečou a jiné budou přetížené. Příkladem protokolu LSP je třeba protokol OSPF (popsaný dále). ve zkratce… •
•
•
•
•
•
•
výměna změn sítě každý uzel má informace o síti ověřování linek rychlá konvergence nízké zatížení sítě algoritmus pro výpočet tabulek = Dijktrův algoritmus typický příklad Link State algoritmu: OSPF OSPF (Open Shortest Path First) •
•
•
•
•
•
•
síť je rozdělena na oblasti (Area) oblast 0 je páteřní síť směrovače se rozdělují na interní, hraiční a externí rozlišujeme směování uvnitř oblastmi a mezi oblastmi (vždy přes oblast 0) zprávy ‐ OSPF Advertisements ‐ jen ve své oblasti typy paketů: hello, popis databáze, požadavek stavu linky, aktualizace stavu linky, potvrzení stavu linky metriky (při výpočtu se nerozlišují): o automatické ƒ
ƒ
ƒ
o
o
automaticky vypočtené směrovači nemusí být implementovány mohou se dynamicky měnit implicitní ƒ v celé síti stejné ƒ vhodné pro homogenní prostředí manuální ‐ pevně nastavené Exterior algoritmy – protokoly EGP a IGP Protokoly IGP jsou určeny pro činnost v rámci autonomního systému. Již zmíněné protokoly RIP, RIP2, OSPF jsou vesměs protokoly IGP.Ovšem poskytovatelé Internetu si mezi sebou potřebují také vyměňovat směrovací informace. Poskytovatelé Internetu pro výměnu směrovacích informací mezi autonomními systémy používají protokoly EGP. V dnešní době používají protokol BGP (Border Gateway Protocol) verze 4.Protokoly EGP se liší od protokolů IGP zejména tím, že ve směrování umožňují zohlednit směrovací politiku (tj. kdo komu platí). •
•
•
•
•
•
•
směrování v páteři Internetu výměna informací mezi autonomními systémy přepoklad různých směrovacích algoritmů směrovací politika (kdo komu platí) agregace (slučování adres) redistribuce (propagace informací z jiného protokolu) typické Exterior algoritmy: EGP, BGP BGP (Border Gateway Protocol) Border Gateway Protocol – zajišťuje směrování a řízení provozu mezi autonomními systémy, přiděluje autonomním systémům jednoznačné identifikátory. Používá Distance Vector Algoritmus. Směrovače jsou propojeny pomocí TCP. Slouží k připojení zákazníků s více cestami do internetu. •
•
•
•
•
směrování a řízení provozu mezi autonomními systémy přidělání jednoznačných identifikátorů autonomním systémům jedná se o Distance Vector algoritmus směrovače jsou propojeny pomocí TCP přenos inkrementálních změn v tabulkách •
slouží i k připojení zákazníků s více cestami do Internetu řízení toku v uzlech sítě a koncových zařízeních. Řízení toku •
•
•
•
QoS (Quality of Service) a plánovací mechanismy pomocí specfikace TOS v hlavičce IP protokolu (obvykle se ale ignoruje) pomocí pozdržení potvrzení, což zvýší RTT (Round Trip Time = doba, za kterou přijde potvrzení odeslaného datového segmentu) pomocí změny velikosti TCP okénka Quality of Service Kvalita služeb – je to opatření snažící se zaručit koncovému uživateli doručení dat v potřebné kvalitě. Uplatňuje se u přenosu multimédií, IP telefonii atd. Kvalita služby je ovlivněna stanicemi (uživatelé a servery), směrovači, přepínači a linkami (mezi směrovači nebo na LANce) Sdílení kapacity sítě – v jednoduché síti typu Internet se všichni uživatelé dělí o prostředky sítě stejným dílem (100 uživatelů a linka 100 Mbit/s ‐> 1 Mbit/s na každého), většinou není rychlost problém, některé aplikace (např. IP telefonie) nemusí fungovat. Jaké jsou možnosti Qos v tomto případě? •
•
•
Rezervovat přenosovou kapacitu jen pro daný kanál Nastavit vyšší prioritu některým službám a zkrátit jejich odezvu Omezit přenos na definovaný limit (např. omezení FTP tak, aby bylo možno při tom surfovat) • Definovat maximální zpoždění dat ‐ vemte si například, že sledujete video – tam je žádoucí, aby zpoždění dat bylo minimální, naopak u HTTP nějaké to zpoždění moc nevadí Příklad sítě bez a s QoS: bez: – tok se dělí rovnoměrně mezi kompy s: – komunikace mezi 2 počítači si žádá tok 1 Mbps. Tak jim ji dáme a ostatním rozdělíme ten zbytek. Parametry tvořící QoS: šířka pásma (= rychlost přenosu dat), jednosměrné zpoždění (tzn. čas potřebný pro přenesení paketu přes fyzické médium, což zahrnuje i čas způsobený řazením paketů do front), rozptyl zpoždění (to jak zpoždění kolísá), ztrátovost paketů. K tomu aby to celé funcovalo co nejlépe, je nutno zavést nějaké... Plánovací mechanismy FIFO Nejjednodušší přístup ‐ pakety jsou zpracovávány v pořadí jejich příchodu. Prioritní FIFO Pakety jsou rozděleny do dvou prioritních tříd: důležité pakety a "méně důležité" pakety. Pro každou třídu existuje speciální fronta, přičemž platí, že libovolný paket z fronty důležitých paketů má přednost před libovolným paketem z fronty méně důležitých paketů. Vzájemné pořadí mezi všemi důležitými pakety (a stejně tak i mezi těmi "méně důležitými") je jednotlivými frontami zachováno. Front (a tím pádem i prioritních tříd) může být i více než 2. Round Robin Round Robin funguje jako bariéra v datovém přenosu. Mechanismus Round Robin postupně po dobu krátkého časového kvanta propouští pakety z jednotlivých datových toků, které dorazily k bariéře. WFQ (Weighted Fair Queuing) Máme N front, z nichž každé je přidělena váha wi > 0. Pokud máme kanál o kapacitě R, rozdělí se tato kapacita mezi jednotlivé fronty úměrně jejich vahám: spočítá se průměrná kapacita (na jednotku váhy) Ravrg = R / (w1 + ... + wn) a následně se spočítá kapacita přidělená jednotlivým frontám (například pro první frontu: R1 = Ravrg ∙ w1). Všechny fronty jsou obsluhovány najednou, avšak každá má přidělenu jinou část kapacity kanálu (=> jinou rychlost zpracování). Token Bucket Máme "kýbl", který dokáže pojmout maximálně T tokenů a každou vteřinu do něj proudí r tokenů. Pokud přijde token ve chvíli, kdy je kýbl plný, je token zahozen. Je dána konstanta X, která říká kolik tokenů je potřeba pro propuštění 1 paketu z kýblu do sítě. Pokud přijde paket do kýblu a v kýblu je alespoň b * X tokenů, je tento počet tokenů z kýblu odebrán a paket propuštěn. V opačném případě je paket označen jako nevhodný. S nevhodnými pakety můžeme nakládat následovně: •
•
•
zahodit je nechat je v kýbli až do chvíle, kdy bude k dispozici dostatek tokenů poslat je dál do sítě s příznakem, že jsou nevhodné ‐ v případě přetížení sítě jsou pak zahazovány přednostně nevhodné pakety Token Bucket + WFQ Jedná se o kombinaci předchozích dvou mechanismů. Existuje n různých kýblů, z nichž každý má přiřazenu váhu. Pakety vytékající z těchto kýblů se řadí do front s příslušnou vahou a je aplikován mechanismus WFQ. Další mechanismy •
•
•
•
Leaky Bucket Leaky Bucket + WFG Weighted Round Robin ... Řízení toku a IP Protokol IP protokol má v hlavičče informační pole ToS (Type of Service), jehož hodnoty znamenají toto: hodnota: význam 1000 minimalizuj zpoždění 0100 maximalizuj propustnost 0010 maximalizuj spolehlivost 0001 minimalizuj finanční náklady 0000 normální služba ToS v aplikacích ‐ ... viz slide 16, tam je napsané, pro jaké aplikace se používají jaká nastavení ToS. Např. pro telnet je to 1000 (minimalizacee zpoždění), pro ftpdata je to 0100 (maximalizuj propustnost)... je to celkem logické nastavení nebo ne?... TCP protokol a řízení toku Efektivně lze omezovat pouze odchozí tok dat, pro příchozí musíme použít nepřímé metody. Můžeme například pozdržet odeslání potvrzení a tím prodloužit RTT (Round Trip Time – co to je viz dále ), ale pozor na timeout, který by po vypršení způsobil opětovné odeslání dat. Dále můžeme měnit velikost okénka. RTT v TCP – Zpoždění je čas, který uplyne od odeslání zprávy zdrojovým uzlem po její přijetí na uzlu cílovém. Zahrnuje zpoždění v přenosové trase a na zařízeních, které jsou její součástí. Je nutné rozlišit zpoždění jednosměrné (čas mezi odesláním paketu zdrojem a jeho přijetí cílem) a zpoždění obousměrné, tzv. round‐trip latency, zahrnující dobu cesty paketu tam i zpět plus čas jeho zpracování cílem. Round‐trip latency nebo také Round Trip Time (RTT) se v síťové praxi požívá nejčastěji, protože jej lze změřit z jednoho místa (uzlu). Od RTT se odvozuje timeout. Jenže...jak dopředu zjistit hodnotu RTT? Mějme SampleRTT = posledně naměřený RTT, EstimatedRTT = očekávaný RTT. Pak platí: EstimatedRTT = (1 − α ) ⋅ EstimatedRTT + α ⋅ SampleRTT kde α = 0,125 Pěkný graf na SampleRTT a EstimatedRTT je na slidu č.19. TCP Timeout – jak se odvozuje od RTT? DevRTT = (1 − β ) ⋅ DevRTT + β ⋅ ( SampleRTT − EstimatedRTT ) kde β = 0, 25 DevRTT popisuje proměnlivost RTT. Nyní konečně ten vzoreček pro timeout: Timeout = EstimatedRTT + 4 ⋅ DevRTT ... timeout se po každé ztrátě paketu zdvojnásobí TCP technika okna ‐ Nyní je naším problémem případ, kdy klient potřebuje odeslat velké množství dat. Klient (resp. Server) může odesílat data druhé straně aniž by jejich příjem měl potvrzen až do tzv. okna (Window – zkratkou WIN). Představme si (viz obrázek), že klient se serverem navázal spojení a vzájemně se dohodli na maximální velikosti segmentu (MSS) o velikosti 1 K (tj. 1024 B) a vzájemné velikosti okna 4 K (tj. 4096 B). Klient začne s odesíláním dat, odešle segmenty 1, 2 a 3. Poté obdrží od serveru potvrzení (4), které potvrzuje segmenty 1 2 a 3. Klient v zápětí odesílá segmenty 5, 6 a 7. Jenže server data mezitím nedokázal zpracovat a data mu zaplnila vyrovnávací pamě;, proto segmentem 8 sice potvrdí příjem segmentů 5, 6 a 7, ale zároveň klientovi uzavře okno, tj. klient nemůže s odesíláním dat pokračovat. Poté co server zpracuje část dat (2 KB), tak umožní klientovi pokračovat v odesílání, ale neotevře mu segmentem 9 okno celé – pouze 2 KB, protože všechna data ve vyrovnávací paměti ještě nezpracoval a pro více dat nemá místo. Prozkoumejme na obr. 9.16 jak vidí klient okno po přijetí segmentu 4... První 2 KB jsou již potvrzeny, okno je tedy posunuto za bajt 2048. Tato potvrzená data již klient nemusí udržovat v paměti. Odeslaná, ale nepotvrzená data (segment 3) tvoří 1 KB. Klient může tedy odeslat bez dalšího potvrzení 3 KB dat. IPv6 a QoS QoS v dnešním internetu funguje nepovinně, je jen jeho částech. Zajištění QoS mezi jednotlivými uživateli je tedy obtížné, IPv6 by měl tento nedostatek odstranit, protože má v hlavičce nová pole definující způsob zpracování a identifikace informací přenášených v síti. Materiály •
•
•
•
•
X36PKO, přednáška 5 X36PKO, přednáška 6 Wikipedia ‐ Směrování Jiří Peterka: Směrování v TCP/IP sítích Jiří Peterka: Síťová vrstva a směrování Transportní, relační a presentační služby. Transportní vrstva Síťová vrstva zabezpečí spojení mezi vzdálenými počítači, tak se transportní vrstvě jeví, jakoby tam žádne modemy nebo opakovače ani nebyly. Mezi dvěma počítači může být několik spojení na transportní vrstvě současně (jedno třeba pro mail a jedno pro ssh). Transportní vrstva poskytuje rozklad dat na pakety (pozor, data v paketech mohou být různé délky – viz obr. uspořádání dat podle pořadí, multiplexuje a demultiplexuje data mezi transportními spoji, poskytuje transportní adresy (adresa, port) a koncové řízení toku. Příklady:UDP,TCP •
•
•
•
•
rozklad dat na pakety uspořádání dat podle pořadí multiplexuje a demultiplexuje data mezi transportními spoji poskytuje transportní adresy (adresa a port) ‐ umožnuje komunikovat více programům na jednom PC na síti koncové řízení toku •
pro komunikaci na transportní vrstvě slouží protokoly TCP (potvrzovaný, spojový) a UDP (nepotvrzovaný, nespojový) Relační vrstva poskytuje vytváření logického rozhraní pro aplikace, synchronizaci spojení (transakce), stará se o relace. Dobře představitelnou relací je např. sdílení síťového disku. Tato relace existuje po celou dobu, ovšem spojení na transportní vrstvě se navazuje jen tehdy, když je třeba s diskem pracovat. Základní jednotkou přenosu relační vrstvy je relační paket. Příklady: RPC, sdílení disků •
•
•
•
vytváří logické rozhraní pro aplikace synchronizuje spojení (transakce) např. sdílení disků, RPC (Remote Procedure Call) smyslem funkce sem patří například protokol SIP (Session Initiation Protocol) používaný pro navázání spojení v internetové telefonii Prezentační vrstva •
•
•
•
•
•
sjednocení prezentace informací šifrování komprese transformace dat dohoda o syntaxi např. kódování ASCII / EBDIC nebo služby XDR a ASN.1 Materiály •
•
•
X36PKO, přednáška 1 PePa ([email protected]) ‐ Předběžná verze této otázky Jiří Peterka ‐ Aplikačně orientované vrstvy Kryptografická ochrana počítačových komunikací. Principy kryptografie Kryptovat se začalo už za Caesara, moderní techniky šifrování se používají cca 30 let. Šifrovací algoritmus umožňuje odesilateli zašifrovat otevřený text (na šifrovaný) a příjemci text rozšifrovat. Máme šifroací klíče – jeden pro šifrování (označme ho KA) a jeden pro dešifrování (KB). Pokud K A = K B , pak je šifrování symetrické, pokud K A ≠ K B , pak je šifrování asymetrické (klíč pro zašifrování může být veřejný). (
)
Označme otevřený text jako m. Pak K A ( m ) je šifrovaný text a K B K A ( m ) je dešifrovaný (neboli opět otevřený) text. Text se zašifruje, odešle šifrovaný a příjemce ho rozšifruje. Symetrické šifry používají substituce (nahrazení písmenek) nebo transpozice (změna pozice písmenek ) •
•
•
•
•
Caesarova šifra – mějme klíč K=n, posuneme celou abecedu o n písmenek, takže například slovo ahoj nám to při K=3 zašifruje jako dkrm. Logicky počet klíčů je roven počtu písmen v abecedě – 1 (protože kdybychom to posunuli moc, jsme zas tam, kde jsme byli). Monoalfabetické šifry – náhrada jednoho písmena abecedy jiným písmenem. Je 26! klíčů. Na šifry tohoto typu lze aplikovat statistický útok. Polyalfabetické šifry – náhrada jednoho písmena abecedy různými písmeny – něco jako Caesarova šifra s více možostmi nahrazení Transpozice – napíšeme si text do řádků a každý sloupeček označíme číslem (ale pozor – na po řadě, ale zpřeházeně) – nyní čteme písmena podle čísel sloupců...ale obrázek na slidu vydá za tisíc slov Data Encryption Standard – neboli DES, je to šifra která byla publikována v roce 1977. Má 56b symetrický klíč (+8b parita), byl to několikrát obnovený stadnard (prodloužení klíče, triple DES), ale v současnosti je to slabá šifra. Její prolomení trvalo v roce 1997 4 měsíce, ale v roce 1999 to bylo už jen 22 hodin. Proto byl v roce 2001 přijat nový standard AES (Advanced Encryption Standard) – kde jsou 128b, 192b nebo 256b klíče...více o DES je na slidu 10 a zde, o AES pak zde. Asymetrické šifry Klíč na zašifrování a dešifrování je odlišný, existuje množství klíčů při komunikaci různých subjektů. Je veřejný klíč (označme ho např. K B + ) – ten slouží k zašifrování textu a je veřejně známý, a pak je privátní klíč (označme ho K B − ) ‐ ten slouží k dešifrování textu. Tyto klíče je složité vzájemně odvodit. (
)
(
)
Platí rovnice: K B − K B + ( m ) = K B + K B − ( m ) = m . Přenos probíhá tak, že odesílael zašifruje text veřejným klíčem, a příjemce na přijatý text aplikuje svůj privátní klíč. RSA Je to algoritmus pro vytváření klíčů, název odvozen z příjmení jejich vynálezců (Ron Rivest, Adi Shamir, Leonard Adleman). Princip je tento: máme dvě prvočísla: p a q. (velikost cca 1024b a 768b). Mějme čísla n = p ⋅ q ; z = ( p − 1) ⋅ ( q − 1) ; a číslo e, které je nesoudělné se z a menší než n (
)
dále číslo d, kde musí plait, že ( e ⋅ d ) mod z = 1 Pak platí K B + = ( n, e ) a K B − = ( n, d ) . Algoritmus pro šifrování je c = me mod n a pro dešifrování je m = c d mod n (kde m je otevřený text a c je zašifrovaný text). Příklad na RSA je na slidu 14. Neděste se toho, první tabulka je zašifrování – první sloupeček je původní text, druhý sloupeček je operace me a třetí sloupec je me mod n . Analogicky probíhá dešifrování (druhá tabulka). Autentizace Provádí se před použitím dalších protokolů a často se provádí oboustranně. •
Autentizační protokol 1.0 – pouze zadání jména (nebo nějaké jiné identifikace). Tento je samozřejmě nedostatečný, taky se můžu představit jako někdo jiný, že... •
•
•
•
•
Autentizační protokol 2.0 – kontrola uživatelského jména a IP adresy, ze které se uživatel připojuje. Zde je ovšem možnost podvržení IP adresy Autentizační protokol 3.0 – uživatel se přihlašuje jménem a heslem. Toto používají například protokoly telnet nebo ftp. Zde je ovšem možnost heslo odposlechnout a někdy ani zašifrování nepomůže. Autentizační protokol 4.0 – to samé jako 3.0, ale pokaždé uživatel použije jiné heslo. Zde ovšem musíme nějak pošéfovat to, jak hesla generovat tak, aby to bylo bezpečné, protože, jak někdo na algoritmus generování příjde, tak jsme v pr... Autentizační protokol 4.1 – uživatel zadá heslo, podle tohoto hesla se zašifruje výzva ke komunikaci která se uživateli předá. Uživatel výzvu klíčem rozluští a odpoví na ni. Tento protokol je bezpečný, ale je tu problém, jak uživateli předat klíče. Autentizační protokol 5.0 –výzvu zašifrujeme asymetrickou šifrou (předpokládejme, že uživateli jsme jeho privátní klíč předali už předtím), poté pošleme uživateli dotaz na to, jaký je veřejný klíč? on nám odpoví a tím pádem můžeme přijatý text rozšifrovat. Nojo, ale problémem je to, že hacker může mít svůj privátní i svůj veřejný klíč – a pokud přijímá zprávy od uživatele (Alice) a tváří se jako server (Bob), je prakticky nemožné jeho hrozbu odhalit. Jinak ještě u protokolu 5.0 je asymetrická šifra, což je výpočetně složitější ‐ dá se to obejít tak, že budeme mít symetrickou šifru a klíč k ní bude jen dočasný (budeme ho po nějaké době měnit). Integrita a digitální podpis integrita je zaručení, že dokument nebyl změněn, dá se zaručit podpisem zodpovědého subjektu. Zde se dá využít asymetrického šifrování a podpis zašifrovat soukromým klíčem, druhá strana si ho rozšifruje veřejným klíčem. Odesilatel vytvoří otisk (hash) odesílaných dat, zašifruje se a odešle společně s daty. Příjemce také vytvoří otisk dat, dešifruje přijatý otisk a porovná je. Distribuce klíčů – řešení je jak pro symetrické tak i pro asymetrické klíče. •
symetrické: KDS(Key Distribution Center), Kerberos (každý uživatel má vlastní klíč, kerberos přiděluje dočasné komunikační klíče) Řekl bych, že to je ta situace, kdy přistupujeme v prohlížeči na nějakou zabezpečenou stránku, tak se nás to ptá, jestli chceme povolit certifikát a tak…distribuce veřejného klíče probíhá elektronicky. •
asymetrické: CA ‐ Certification Authority – nejdříve se ověří uživatel dle nějakého průkazu totožnosti a pak se mu vystaví certifikát podepsaný CA, jak to probíhá, je na obrázku… myslím si, že to je například situace internetového bankovnictví. V bance je vám vytvořen příslušný certifikát a musí tam proběhnout nějaké to ověření totožnosti. Materiály •
•
•
X36PKO, přenáška 10 Wikipedia ‐ Symetrické kódování Wikipedia ‐ Asymetrické kódování Protokoly Internetu. Protokol IP (verze 4) Internet Protocol. Jeho úkolem je dopravovat data mezi dvěma libovolnými směrovači v internetu (tzn. i přes mnohé LAN). IP‐protokol je protokol, umožňující spojit jednotlivé lokální sítě do celosvětového Internetu. Od protokolu IP dostal také Internet své jméno. Zkratka IP totiž znamená InterNet Protocol. IP‐protokol je tvořen několika dílčími protokoly: •
Vlastním protokolem IP •
•
•
Službním protokolem ICMP sloužícím zejména k signalizaci mimořádných stavů Služebním protokolem IGMP sloužícím pro dopravu adresných oběžníků Služebními protokoly ARP a RARP, které jsou často vyčleňovány jako na IP nezávislé protokoly, protože jejich rámce nejsou předcházeny IP záhlavím IP má podporu fragmentace (co to je zjistíte zde nebo zde), podporu komunikace přes směrovače, vytváří IP pakety z paketů vyšší vrstvy. IP adresa má velikost 4B. IP protokol pracuje s koncovými uzly a směrovači a je to základní protokol rodiny TCP/IP. Fragmentace Umožňuje vložení IP paketu do kratších rámců nižší vrstvy (MTU (Maximal Transfer Unit) Ethernet II je např. jen 1500B – takže si vemte, že máme třeba 64 KB velký IP datagram (64 KB je max velikost IP datagramu), jak ho Směrovač vloží do rámce, který může mít třeba max 1500B? Směrovač není schopen takový IP‐datagram poslat dále. Směrovač se rozhoduje co dále na základě příznaku „Fragmentace možná” (DF bit) v záhlaví IP‐datagramu. Příznak „Fragmentace možná” může být buď nastaven nebo ne. Jsou tedy dvě možnosti: •
•
Fragmentace je možná, pak se fragmentace provede (viz dále) Fragmentace není možna – pak směrovač IP datagram zahodí a odesílatele o tom pomocí ICMP informuje signalizací „Fragmentace zakázána“ (a pokud to směrovač umí, pošle nám, jaké nejmenší MTU je po cestě) Pokud je fragmentace povolena, pak pak směrovač dělí delší IP‐datagramy na fragmenty, jejichž celková délka (total length) je menší nebo rovná MTU následující linky ... viz obr Každý IP‐datagram má ve svém záhlaví svou identifikaci, kterou dědí i jeho fragmenty. Díky identifikaci příjemce pozná, ze kterých fragmentů má datagram složit. Nikdo jiný než příjemce není oprávněn z fragmentů skládat původní datagram, tj. ani např. směrovač ze kterého vede linka s takovým MTU, do kterého by se celý datagram již vešel. Důvod je prostý, Internet negarantuje, že jednotlivé fragmenty půjdou stejnou cestou (ani negarantuje pořadí v jakém dojdou). Takže směrovač, který by se pokoušel datagram sestavit by mohl být na závadu spojení, protože fragmentů, které by šly jinou cestou by se nikdy nedočkal. Každý fragment tvoří samostatný IP‐datagram. Při fragmentaci je nutné vytvořit pro každý fragment nové IP‐
záhlaví. Některé údaje (jako protokol vyšší vrstvy, či IP‐adresa odesílatele a příjemce) se získají ze záhlaví původního IP‐datagramu. Při fragmentaci vstupuje do hry pole „Posunutí fragmentu od počátku IP‐datagramu (fragment offset)”, které vyjadřuje kolik bajtů datové části původního IP‐datagramu bylo vloženo do předchozích fragmentů. Pole „Celková délka IP‐datagramu (total length)” obsahuje délku fragmentu, nikoliv délku původního datagramu. Aby příjemce poznal jak je původní datagram dlouhý, tak je poslední fragment opatřen příznakem „Poslední fragment”. Celý mechanismus je znázorněn na obrázku. Síť nerozlišuje mezi přenosem fragmentu a přenosem celého (nefragmentovaného) IP‐
datagramu. Nefragmentovaný datagram je fragment s posunutím nula a příznakem „Poslední fragment”. Proto se často slova IP‐datagram a fragment zaměňují. Mechanismus fragmentace umožňuje i fragmentovat fragment dorazí‐li na směrovač jehož odchozí linka má ještě menší MTU. Směrování Existuje buď přímé směrování (směrování na uzly ve stejné síti), nebo nepřímé směrování (uzly v různých sítích). Implicitní směrování probíhá přes defaultní bránu. Směrování může být podle směrovacích tabulek rozděleno na statické (informace jsou do tabulky uloženy ručně při konfiguraci směrovače) a dynamické (směrovací uzly si pravidelně vyměňují informace a podle toho tvoří sěrovací tabulky – použito u velkých sítí ). Služby směrovače: podpora předávání paketů (forwarding – viz zde), kontrola a snižování TTL (Time to live‐viz zde), přepínání kontrolního součtu, zohlednění ToS(Terms of Service – viz zde) podle priority (precedence ‐ pole o 3b), nízkého zpoždění (delay ‐ 1b) a vysoké propustnosti (throughput – 1p). Struktura IP datagramu Tvoří ji hlavička(záhlaví) a data. Hlavička IP datagramu – je v ní: •
•
•
•
•
•
•
•
•
•
•
•
verze IP protokolu (4b) délka záhlaví – je udávána ne v bytech, ale ve čtyřbytech (32b) typ služby (ToS – 5b je to položka, která nenašla v praxi svého naplnění, měla označovat IP datagramy tak, aby byly některé předávány přednostně a byla tak zaručena rychlá odezva), celková délka IP datagramu (omezeno na 64KB) identifikace IP datagramu (tato položka je společně s příznaky a posunutím fragmentu využívána mechanismem fragmentace datagramu) příznaky (DF =1 ‐> nefagmentovat, MF = 0 ‐> poslední fragment) posunutí fragmentu TTL (pokud je 0 ‐> likvidace paketu) protokol vyšší vrstvy (1‐ICMP,2‐IGMP,6‐TCP,17‐UDP...) ‐ je to číselná identifikace protokolu vyšší vrstvy, který využívá IP datagramu ke svému transportu . V praxi je použit např. TCP/UDP nebo ICMP, IGMP – tyto dva jsou sice součástí protokolu IP, ale chovají se jako protokoly vyšší vrstvy, tzn. v přenášeném paketu je záhlaví IP následováno záhlavím ICMP resp. IGMP . dále kontrolní součet záhlaví‐ všimni si – je to pouze kontrolní součet záhlaví nikoliv z datagramu celého, význam tohoto pole je tedy pochybný – navíc když směrovač změní nějakou položku záhlaví, změní se i kontrolní součet, což přináší určitou režii IPadresy příjemce a odesílatele volitelné položky (max 40B např. může být nastavena položka zaznamenávej směrovače či zaznamenávej čas, což může být snadno zneužitelné hackery.Dále jsou tam položky jako explicitní směrování (vyjádřeno, přes které směrovače se má směrovat), striktní explicitní směrování (vypsány všechny směrovače, přes které se směruje), upozornění pro směrovač...viz slide 8) viz obrázek... IP adresa Zajímavosti – jedno síťové rozhraní počítače může mít více IP adres. První adresa se pak obvykle nazývá primární a další adresy pak sekundární nebo aliasy. Využití sekundárních IP‐
adres je běžné např. pro WWW‐servery, kdy na jednom počítači běží WWWservery několika firem a každý se má tvářit jako samostatný WWW‐server. Přidělení IP adresy počítači – může být buď statickéí(IP adresa je trvale přidělena ) nebo dynamické (IP adresa se přidělí jen na dobu připojení). Pro přidělování adres se používají protokoly: •
•
•
RARP ‐Reverse Address Resolution Protocol – přidělení adresy bezdiskové stanici, moc se nepožívá. BOOTP ‐ Bootstrap Protocol – využívá protokolu UDP, slouží ke statickému přidělování parametrů, dokáže přidělit adresu, jméno, masku, směrovače, DNS, time server, forwarding, MTU (co to je MTU viz zde)... DHCP – Dynamic Host Configuration Protocol Protokol DHCP vychází ze zkušeností a částečně v sobě zahrnuje i podporu starších protokolů z této oblasti, tj. protokolů RARP, RARP a BOOTP. V protokolu DHCP žádá klient DHCP‐server o přidělení IP‐
adresy (případně o další služby). DHCP‐server může být realizován jako proces na počítači s operačním systémem UNIX, Windows NT atp. Nebo DHCP‐server může být realizován i jako součást směrovače. DHCP se používá k dynamickému přidělování parametrů narozdíl od BOOTP Protokol ICMP Internet Control Message Protocol.Protokol ICMP je služební protokol, který je součástí IP‐
protokolu. Protokol ICMP slouží k signalizaci mimořádných událostí v sítích postavených na IP‐protokolu. Protokol ICMP svoje datové pakety balí do IP‐protokolu, tj. pokud budeme prohlížet přenášené datagramy, pak v nich najdeme za linkovým záhlavím záhlaví IP‐
protokolu následované záhlavím ICMP paketu. Protokolem ICMP je možné signalizovat nejrůznější situace, skutečnost je však taková, že konkrétní implementace TCP/IP podporují vždy jen jistou část těchto signalizací a navíc z bezpečnostních důvodů mohou být na směrovačích mnohé ICMP signalizace zahazovány. Formát ICMP Paketu Záhlaví ICMP‐paketu je vždy osm bajtů dlouhé (viz obr. 5.10). První čtyři bajty jsou vždy stejné a obsah zbylých čtyř závisí na typu ICMP‐paketu. První čtyři bajty záhlaví obsahují vždy typ zprávy, kód zprávy a šestnáctibitový kontrolní součet. Formát zprávy závisí na hodnotě pole Typ. Pole Typ je hrubým dělení ICMP‐paketů. Pole Kód pak specifikuje konkrétní problém (jemné dělení), který je signalizován ICMP protokolem...viz obrázek Typy ICMP paketů – určují se typem a kódem, tady jsou: typ kód popis paketu 0 0 echo odpověď 3 x nedoručitelny IP datagram – důvod udává kód...viz dále 3 0 nedosažitelná síť 3 1 nedosažitelný uzel 3 2 nedosažitelný protokol 3 3 nedosažitelný UDP port 3 4 fragmentace zakázána 3 5 chyba explicitního směrování 3 6 neznámá síť 3 7 neznámý uzel 3 9 administrativně uzavřená síť 3 10 administrativně uzavřený uzel 3 11 nedosažitelná síť pro službu 3 12 nedosažitelný uzel pro službu 3 13 komunikace administrativně uzavřena filtrací 4 0 sniž rychlost odesílání 5 x změň směrování ... pro co určuje kód 5 0 pro síť 5 1 pro uzel 5 2 pro síť pro daný typ služby 5 3 pro uzel pro daný typ služby 8 0 echo požadavek 9 0 odpověď na žádost o směrování 11 x čas vypršel... proč viz kód 11 0 TTL 11 1 defragmentace 12 x chybný parametr...jaký viz kód 12 0 chybné IP záhlaví 12 1 schází volitelný parametr 13 0 časová synchronizace – požadavek 14 0 časová synchronizace ‐ odpověď 17 0 žádost o masku 18 0 odpověď na žádost o masku Některé typy zpráv ICMP •
•
•
•
•
•
nástroj Echo ‐ Je jednoduchý nástroj protokolu ICMP, kterým můžeme testovat dosažitelnost jednotlivých uzlů v Internetu. Žadatel vysílá ICMP‐paket „Žádost o echo“ a cílový uzel je povinen odpovědět ICMP‐paketem „Echo“. Používá se např. u programu PING nedoručitelný IP datagram – pokud nemůže být IP datagram doručen adresátovi, pak je zahozen a odesílatel je o tomto informován přesně touto zprávou sniž rychlost odesílání – jestliže je síť mezi odesílatelem a příjemcem přetížena a směrovač není schopen předávat všechny IP datagramy, pak odesílatele informuje touto zprávou, ať je odesílá pomaleji. změň seměrování – pomocí tohoto ICMP se provádějí dynamické změny ve směrovací tabulce – například touto zprávou upozorní směrovač (koho, co?) další směrovač nebo počítač tehdy, pokud má příchozí paket odeslat na tu cestu, ze které paket přišel. čas vypršel – například když TTL bylo sníženo na 0 (kód zprávy 1), nebo se signalizuje, že počítač adresáta není schopen z IP fragmentů sestavit celý IP datagram. ICMP paket čas vypršel používají ke své činnosti programy TRACERT (WIN) a TRACEROUTE (Linux) ... ... ... Protokol IGMP O něm jen krátce, na slidech to není, ale je to dobré vědět... Protokol IGMP je podobně jako protokol ICMP služebním protokolem (podmnožinou) protokolu IP.Pakety IGMP protokolu jsou baleny do IP‐datagramů. Protokol IGMP slouží k šíření adresných oběžníků (multicasts) – To znamená, že si do toho paketu IGMP napíšeme explicitně adresy, na které chceme paket (vyšší vrstvy – např. UDP) poslat a on se nám skutečně pošle na více adres – na tom principu funguje například VLC na Strahově a dobře to šetří síť. Multicasty jsou ale v internetu víceméně nepoužitelné, protože nelze zajisti to, že je všechny směrovače po cestě budou podporovat. Pokračujeme v povídání o IP ... užitečný protokol, jež IP využívá je protokol ARP Protokol ARP Address Resolution Protocol ‐ řeší problém zjištění linkové adresy protější stanice ze znalosti její IP‐adresy. Řešení je jednoduché, do LAN vyšle linkový oběžník (linková adresa FF:FF:FF:FF:FF:FF) s prosbou: „Já stanice o linkové adrese HW1, IP‐adrese IP1, chci komunikovat se stanicí o IP‐adrese IP2, kdo mi pomůže s nalezením linkové adresy stanice o IP‐adrese IP2? Stanice IP2 takovou žádost uslyší a odpoví. V odpovědi uvede svou linkovou adresu HW2. ARP‐paket je balen přímo do Ethernetu, tj. nepředchází mu žádné IP‐záhlaví. Protokol ARP je vlastně samostatný, na IP nezávislý protokol. Proto jej mohou používat i jiné protokoly, které s protokoly TCP/IP nemají nic společného. Jak ARP funguje, resp. to, co bylo popsáno na předešlých řádcích je na obrázku IPv6 (Internet Protocol verze 6) Historie a požadavky Počátkem 90, let se objevila studie o vyčerpání adres IPv4 do 10 let, 1995 vznikl IPv6, poté pomalu pronikal do praxe. Požadavky na tento protokol byly: větší adresní prostor, zvýšení bezpečnosti, QoS, automatická konfigurace a mobilita. Formát datagramu IPv6 IP‐datagram verze 6 se skládá ze čtyřicet bajtů dlouhého základního záhlaví následovaného rozšířeními. Čtyřicet bajtů základního záhlaví se může zdát hodně, ale je třeba si uvědomit, že jen IP‐adresy odesílatele a příjemce zaberou 32 bajtů. Struktura základního záhlaví je zobrazena na obr. účelem struktury bylo minimalizovat položky a udržet konstantní délku hlavičky. Bylo odstraněno přepočítávání kontrolího součtu (ponecháno na nižší vrstvě), délka hlavičky (je vždy stejná), rozšiřující volby a fragmentace (přesunuta do dalších hlaviček) . Volitelné položky jsou umístěny do samostatných hlaviček. Zpracování datagramu je tedy zjednodušeno. Takže co tedy zbylo vlastně v té hlavičce? •
•
verze protokolu (ta je samozřejmě 6) třída dat resp. ‐ podpora pro QoS – skládá se ze 4 bitů, tzn. nabývá hodnoty 0‐15‐ Hodnoty 0‐7 jsou určený pro klasický provoz (0‐nespecifikovaná data, 1‐provoz na pozadí (např. news), 1‐automatický provoz (např. mail), 4 – velké přenosy dat (např. ftp ,...)) Hodnoty 8 – 15 jsou určeny pro přenosy v reálném čase (např. audio). Datagramy s nižší hodnotou (to však platí jen pro interval 8‐15) si přeje uživatel zahodit dříve než datagramy s vyšší hodnotou. Prostě třída dat specifikuje přenášená data pro případ rozhodování v okamžiku zahlcení sítě. • identifikace toku dat – toto je naprosto neotřelá myšlenka. Spolu s adresou odesílatele se jednoznačně identifikuje dílčí tok dat v internetu. Doposud se směrování provádělo pouze na základě adresy příjemce. Nevýhodou směrování v intenetu je, že jednotlivé IP datagramy se dopravují samostatně, tj. pokud Internetem prochází tok IP datagramů mezi 2 aplikacemi, pak směrovače na cestě řeší směrování pro každý datagram samostatně. Prostě pokud posíláme megabajty dat a během přenosu nedojde ke změně v topologii sítě, pak směrovače po cestě řeší tu samou úlohu s tím samým výsledkem pro tisíce datagramů. Myšlenka spočívá v tom, že datagramy jednoho toku dostanou svou identifikaci. Pak stačí, aby směrovač vyřešil úlohu (do kterého rozhraní datagram předat) pro první datagram toku a do paměti si poznamenal výsledek. Pro další datagram nejprve prohlédne paměť a pokud by tam nenašel poznamenaný tok, tak řeší úlohu směrování. Další datagramy •
•
stejného toku pak bude předávat do stejného rozhraní aniž by řešil úlohu směrování pouze na základě údajů v paměti. Položka v paměti směrovače nesmí zůstat déle než 6 vteřin. Nebezpečí číhá totiž v tom, že odesílatel resetuje svůj počítač. Zavede znovu operační systém a shodou okolností vygeneruje stejnou identifikaci pro jiný tok. Nepředpokládá se, že by uživatel stihl provést reset počítače do 6 vteřin. Jinou možností je využít identifikaci toku dat k zajištění šířky přenášeného pásma. Směrovače na cestě od odesílatele k příjemci se nakonfigurují tak, aby pro datový tok o jisté identifikaci zajišťovaly určitou šířku pásma. Datagramy docházejí na směrovač, kde se umísťují do vyrovnávací paměti. Za normálních okolností se jedná o frontu datagramů, která z jednoho konce přibývá a z druhého konce se datagramy odebírají (odesílají). Směrovač však nemusí frontu zpracovávat sekvenčně, ale může přednostně vybírat datagramy tak, aby zajistil dohodnutou šíři pásma. V tomto případě pochopitelně nelze hrát na šestivteřinový limit. délka dat (počet bytů za hlavičkou) – specifikuje délku IP datagramu bez základního záhlaví (to má totiž délku vždy stejnou – 40B). Jelikož je toto pole dlouhé 2B, tak největší délka přenášeného IP datagramu je 65535B. Je však možné použít volbu „ohromný datagram“ v další hlavičce, která umožňuje posílat ještě větší datagramy (Jumbogramy) další hlavička – specifikuje typ následující (zřetězené) hlavičky. Následující hlavičky mohou být například tyto: Pouze typy, které jsou uvedeny tučně jsou součástí IP protokolu. Ostatní typy jsou typy protokolů vyšších vrstev •
dosah (počet hopů) toto poslední pole odpovídá položce TTL v IPv4 Řetězení hlaviček – viz slide obrázek Pole další hlavička v základním záhlaví ukazuje jaký typ dat (“jaká hlavička”) následuje za základním záhlavím. Teoreticky může ukazovat již na TCP segment nebo jiný protokol vyšší vrstvy. Avšak může také ukazovat na další rozšiřující hlavičky IP‐protokolu. Pokud ukazuje na další rozšiřující hlavičku, pak i tato hlavička má pole „další hlavička”, která ukazuje na další hlavičku. Hlavičky tak tvoří řetězec. Řetězec obsahuje jen ty hlavičky, které jsou nutné. Je to rozdíl od IP‐protokolu verze 4, který ve svém záhlaví často přenáší nadbytečné informace. Za polem další hlavička je pole délka hlavičky. Pole délka hlavičky specifikuje posunutí jaké je třeba udělat k další hlavičce. Základní záhlaví délku nemá, protože je dlouhé vždy 40 bajtů. Rovněž u záhlaví fragmentů se délka nepoužívá, protože tato hlavička je vždy 8 bajtů dlouhá. Dále popíšu některé typy dalších hlaviček: •
Informace pro směrovače –obsahuje jednotlivé informace (volby), které jsou určeny pro směrovače přepravující datagram. Každý směrovač, který datagram předává se musí těmito volbami zabývat. Volba se skládá z pole typ dlouhého 1 B, pole délka dlouhého 1 B a pole obsahujícího vlastní volbu. Obrázek uvádí některé volby. Pokud je volba délka rozsáhlého datagramu použita, pak délka datagramu v základním záhlaví je nastavena na nulu a používá se délka uvedená v této volbě. Zatímco v základním záhlaví jsou pro délku určeny 2 bajty (tj. datagram může být dlouhý až 64 KB), pak 4 bajty volby rozsáhlý datagram umožňují délku až 4 GB. •
směrovací informace ‐ Hlavička směrovací informace používá tč. jedinou volbu (Typ=0), kterou je explicitní směrování. Kdy odesílatel specifikuje IP‐adresy směrovačů, přes které má být datagram dopravován záhlaví fragmentu ‐ Fragmentovat IP‐datagramy verze 6 může pouze operační systém na straně odesílatele. Směrovače, kterými datagram prochází na své cestě od odesílatele k příjemci fragmentovat na rozdíl od IPv4 již nesmí. Jak vypadá tato hlavička, je znázorněno na obrázku •
Na rozdíl od IP‐protokolu verze 4 neobsahuje každý IP‐datagram (např. v základním záhlaví) identifikaci IP‐datagramu. Identifikace IP‐datagramu je nutná jen pro fragmentaci, aby příjemce zjistil, které fragmenty patří do stejného datagramu. V IPv6 je identifikace datagramu pouze v dalším záhlaví, tj. není součástí každého IP‐
datagramu.Pole posunutí od počátku datagramu slouží k sestavení datagramů. Pomocí tohoto pole příjemce zjistí pořadí v jakém má fragmenty skládat za sebe. Pole posunutí od počátku datagramu neudává posunutí v bajtech, ale v násobcích osmi bajtů (v „osmibajtech”), proto se při fragmentaci musí zajistit, aby fragmenty byly odřezávány v délce, která je dělitelná osmi.A konečně pole M (More Fragment) indikuje poslední fragment. Jednobitové pole M je nastaveno na jedničku, pouze v případě posledního fragmentu na nulu. •
•
autentizační hlavička ‐ Pomocí autentizační hlavičky odesílatel autentizuje data, tj. prokazuje, že data odeslal on. Datagram je tak zabezpečen proti změně IP‐datagramu útočníkem i proti záměně celých IP‐datagramů odesílatele za IP‐datagramy vložené útočníkem. Základní autentizace je za využití algoritmu MD‐5 (RFC‐1321) pro výpočet kontrolního součtu. bezpečnostní hlavička – umožňuje přenášená data šifrovat – musí to být poslední přenášená hlavička datagramu, protože data jsou již dále šifrovaná, tj. nedostupná ke zpracování směrovačům dopravujícím IP datagram. Řetězení hlaviček je znázorněno na obrázku... Fragmentace Provádí se pouze u odesílatele, informace o fragmentaci je uložena v rozšiřující hlavičce. Hlavičky až po tu fragmentační jsou nefragmentovatelné. Doporučené MTU (Maximum Transfer Unit) pro IPv6 je 1280B. Vyhledávání MTU cesty se děje pomocí ICMPv6 – nemusí se implementovat. Jumbogramy to budou asi nějaké ty velké datagramy:‐) Jumbogramy jsou popsáný detailněji u dalších hlaviček. Jejich maximální délka je až 4GB. Ale uzly s menším MTU nemusí Jumbogramy podporovat. Pár slov o ICMPv6 Podobně jako v případě IP‐protokolu verze 4 se pro signalizaci chybových stavů a pro diagnostiku v IPv6 používá protokol ICMP. Protokol ICMPv6 v mnoha případech přináší zcela odlišné funkčnosti oproti protokolu ICMPv4. Řeší např. překlad IP‐adres na linkové adresy. (Na tento problém jsou v IPv4 určeny samostatné protokoly ARP a RARP. ) Z hlediska struktury paketu se ICMP paket jeví jako protokol vyšší vrstvy, tj. je předcházen základním záhlavím IP‐protokolu i případnými dalšími hlavičkami. Jinak ICMPv6 slouží samozřejmě pro diagnostiku a signalizaci zpráv. Pokud by to někoho zaajímalo, tak tabulka různých typů ICMPv6 paketů je v bibli na straně 207. Adresace IPv6 Délka adresy je 128b, tedy 16 8‐bitových polí (oproti IPv4, kde byly jen 4 pole – 147.32.113.229). Rozeznáváme tři druhy adres: •
•
unicast – jednoznačná adresa síťového rozhraní anycast – adresa skupiny síťových rozhraní. IP datagram adresovaný adresou anycast bude doručen jednomu z těchto rozhraní. • multicast – neboli oběžník • !Broadcast adresy nejsou podporovány! Používají se různé zápisy IP adresy: •
•
normální zápis ‐ např. FEDC:1234:0000:ABCD:0F12:0000:0000:4567 – vedoucí nuly (to jsou nuly,kterými čtyřčíslí začíná) se uvádět nemusí, takže zápis této adresy může vypadat např. FEDC:1234:0:ABCD: F12:0:0:4567 zkrácený zápis pomocí zvolené dvojtečky – zvolená dvojtečka se může v adrese vyskytovat pouze jednou a nahrazuje tam libovolné množství čtveřic null, např. pokud máme adresu 1234:0:0:0:0:0:0:0:14, pak ji pomocí zvolené dvojtečky můžeme napsat jako 1234::14 Adresy sítí: viz obrázek... Oběžníky resp. Skupinové adresy: Oběžníky mají prefix obsahující v prvním bajtu samé binární jedničky, tj. šestnáctkově FF (viz obrázek). Také viz slide 12 – koukni, kde se vyskytuje bit T – to udává, zda je oběžník přidělen trvale (0), nebo jen dočasně (1). Dalším polem je rozsah (4b), to je, jak jsme si řekli něco jako TTL, hodnoty dosahu: rozhraní (1), linka (2), podsíť (3), správa (4), místo (5), globální (E) – na slidu 12 jsou ještě příklady pro adresy, ale myslím, že je to jasné. Adresy rozhraní – uzel – má lokální linkovou adresu, loopback, individuální a výběrovou, může být skupinová adresa pro všechny uzly, také skupinová pro skupiny, jichž je uzel členem a také skupinová pro vyzývaný uzel. směrovač – má adresy jako uzel + navíc skupinové pro všechny směrovače, výběrové pro směrovače v podsíti a také všechny přidělené výběrové adresy. Objevování sousedů ‐ k tomuto slouží protokol, jež je rozšířenou náhradou ARP (vzpomeň si na zjišťování MAC). Tento protokol využívá ICMPv6 pro výzvu směrovači, odhlášení směrovače, výzvu sousedovi, ohlášení souseda, přesměrování.Tento protokol poskytuje: zjišťování linkových adres v lokální síti, rychlou aktualizaci změn a neplatných položek, hledání směrovačů, přesměrování, detekci duplikových adres, ověření dosažitelnosti sousedů a zjišťování údajů pro automatickou konfiguraci. Hledání linkové adresy: ‐ pošleme výsvu sousedům pomocí skupinové adresy, posledních 24b necháme samé Fka – tam se doplní ty hledané linkové adresy (jestli to chápu správně). Pokud se nám soused s linkovou adresou ohlásí, aktualizujeme si jeho adresu. Automatická konfigurace – viz http://www.ipv6.cz/v6about/autokonf/ Jedním z požadavků na IPv6 je automatická konfigurace. Představa, že člověk jednoduše připojí počítač k síti a bude mu fungovat síťování, aniž by kdokoli cokoli konfiguroval, je velmi lákavá (a z pohledu správce sítě částečně děsivá). stavovou konfiguraci obstarává DHCPv6, nevyužívá však broadcast (jak by taky, když je zakázaný). DHCP unique identifier (DUID) je záznam, který jednoznačně identifikuje uzel ‐ je v něm obsažena linková adresa a čas, je přiděleno výrobcem. Identity Association je zázam jednoznačně idenifikující rozhaní ... zbytek slidu nechápu (???) bezestavovová konfigurace – nevyžaduje konfiguraci... Jejím základním pilířem je tak zvané objevování sousedů (neighbor discovery). Základní myšlenka je celkem prostá: každý směrovač v určitých intervalech rozesílá do sítí, k nimž je připojen, tak zvané ohlášení směrovače. V něm jsou obsaženy základní informace ‐ především prefixy adres dané sítě a zda on sám může sloužit pro předávání paketů ven (jako implicitní směrovač, default gateway).Z ohlášení směrovačů (o které může při startu aktivně požádat pomocí výzvy směrovači) se počítač dozví, jaké adresy používá zdejší síť. K nim si doplní zbývající část (typicky 64 bitů), která se jednoznačně generuje z jeho Ethernetové adresy. Tak získá platné IPv6 adresy pro své rozhraní. Také si vytvoří seznam implicitních směrovačů, kterým bude předávat pakety směřující mimo síť. Pokud je jich víc, zpočátku je prostě střídá a směrovací tabulku si postupně vylepšuje na základě jejich upozornění (ICMP přesměrování), pokud paket k určitému cíli poslal nevhodným směrovačem.Zní to dost dobře, přesto však má bezstavová konfigurace dost velkou pihu krásy. Vůbec totiž neřeší otázku DNS. Počítač se z ní nedozví adresy zdejších DNS serverů a jak již bylo řečeno, bez DNS se v IPv6 žije velmi velmi těžko.
Bezpečnost IPv6 Je povinná implementace IPsec, autentizace je prováděna pomocí Authentication header, šifrování pomocí ESP (Encapsulating Security Payload). Při transportním režimu se bezpečnostní hlavičky jednoduše vloží, při tunelujícím režimu se datagram zabalí da datagramu s bezpečnostními hlavičkami. Bezpečnostní asociace – Security Association (SA) – obsahuje informace potřebné pro šifrované spojení –bezpečnostní protokol, šifrovací algoritmus, klíče, čítače, doba životnosti... SA je jednosměrná a vytváří se ve dvojicích, pro AH (Authentication Header) i ESP je jedna dvojice. Na jeden paket se vztahuje svazek SA. Databáze bezpečnostní politiky – je to sada pravidel uplatňovaná na všechny pakety. Říká, jestli pakety zahodit, zpracovat bez IPsec (tedy jen odeslat a přijmout) a nebo zpracovat s IP sec (tehdy databáze vydá svazek SA). Tuto databázi můžeme buď nakonfigurovat manuálně nebo automaticky pomocí ISAKMP Authentication Header – složí pro autentizaci odesílatele, umožňuje ochranu proti opakování. Postup je takový: Nejdříme vložíme AH hlavičku, potom vyplníme položky (autentizační data se vyulují) a poté se autentizační data vypočtou. Encapsulation Security Payload (ESP) ‐ slouží k šifrování obsahu (i služby AH). Obsahem ESP hlavičky jsou data a další hlavičky. Postup je takový: Umístění ESP hlavičky, vycpávky a šifrování, vytvoření pořadového čísla, vytvoření autentizačních dat (je li požadována autentizace a kontrola integrity), fragmentace až po šifrování. Transportní protokoly Jak je zřetelné z názvu, operují na transportní vrstvě. Slouží k přenosu dat mezi aplikacemi, mají podporu aplikačního multiplexu (asi že když máme spuštěné 2 stejné aplikace, tak to neva a data se multiplexují) pomocí portů, podporu řízení toku. K transportním protokolům patří nepotvrzovaný UDP a potvrzovaný TCP. Protokol UDP Něco o tomto protokolu... UDP = User Datagram Protocol. Protokol UDP je jednoduchou alternativou protokolu TCP. Protokol UDP je nespojovaná služba (na rozdíl od protokolu TCP), tj. nenavazuje spojení. Odesílatel odešle UDP datagram příjemci a už se nestará o to, zdali se datagram náhodou neztratil (o to se musí postarat aplikační protokol). Záhlaví UDP Z předchozího obrázku je patrné, že záhlaví UDP protokolu je velice jednoduché. Obsahuje čísla zdrojového a cílového portu – což je zcela analogické protokolu TCP. Opět je třeba dodat, že čísla portů protokolu UDP nesouvisí s čísly portů protokolu TCP. Protokol UDP má svou nezávislou sadu čísel portů. Pole délka dat obsahuje délku UDP datagramu (délku záhlaví + délku dat). Minimální délka je tedy 8, tj. UDP datagram obsahující pouze záhlaví a žádná data. Zajímavé je že pole kontrolní součet nemusí být povinně vyplněné. Výpočet kontrolního součtu je tak v protokolu UDP nepovinný. Pakliže se kontrolní součet počítá, pak
se podobně jako pro protokol TCP počítá ze struktury (pseudozáhlaví)znázorněné na obrázku Fragmentace I u UDP datagramů je možná fragmentace v IP‐protokolu. Avšak u UDP protokolu se zásadně snažíme fragmentaci vyhýbat. Oběžníky Na první pohled by se zdálo, že protokol UDP je chudým příbuzným protokolu TCP. Může však existovat něco, co umí protokol UDP a nelze to udělat protokolem TCP? Právě zvláštností protokolu UDP je skutečnost, že adresátem UDP datagramu nemusí být pouze jednoznačná IP‐adresa, tj. síťové rozhraní konkrétního počítače. Adresátem může být skupina stanic – adresovat lze i oběžník. Adresovat lze všeobecné oběžníky (broadcast), ale podstatně zajímavějším případem je adresování adresných oběžníků (multicast). Např. u aplikací typu RealAudio navazuje každý klient spojení se serverem. Kdežto u ProgresiveRealAudio se šíří data pomocí adresných oběžníků, tj. dochází k ohromné úspoře kapacity přenosových cest. A právě to je příležitost pro UDP. Pomocí UDP multicast pracuje i přenos televize na Strahově Kecy ze slidů... User Datagram Protocol, je to nepotvrzovaná služba bez spojení, umožňuje broadcast, pracují přes něj DNS, Bootp, TFTP, SNMP... Formát datagramu UDP Budu říkat jen to barevné, zbytek je z IP paketu. Takže hlavička obsahuje volitelné položky hlavičky, zdrojový a cílový port UDP, délku dat a kontrolní součet (nepovinný, ale aplikace jej mohou vyžadovat, vypočítává se z pseudohlavičky). Pseudohlavička neobsahuje volitelné položky hlavičky a z toho IP je tam mnohem méně…viz obr. Protokol TCP Něco o tomto protokolu TCP = Transmision Control Protocol. Zatímco protokol IP přepravuje data mezi libovolnými počítači v Internetu, tak protokol TCP dopravuje data mezi dvěma konkrétními aplikacemi běžícími na těchto počítačích. Protokol IP adresuje IP‐adresou pouze síťové rozhraní počítače. Pokud bychom použili přirovnání k běžnému poštovnímu styku, pak IP‐adresa odpovídá adrese domu a port (adresa v protokolu TCP) pak odpovídá jménu konkrétního obyvatele domu. Protokol TCP je spojovanou službou (connection oriented), tj. službou která mezi dvěma aplikacemi naváže spojení – vytvoří na dobu spojení virtuální okruh. Tento okruh je plně duplexní (data se přenášejí současně na sobě nezávisle oběma směry). Přenášené bajty jsou číslovány. Ztracená nebo poškozená data jsou znovu vyžádána. Integrita přenášených dat je zabezpečena kontrolním součtem. Konce spojení (“odesílatel” a „adresát”) jsou určeny tzv. číslem portu. Toto číslo je dvojbajtové, takže může nabývat hodnot 0 až 65535. Základní jednotkou přenosu v protokolu TCP je TCP segment. Někdy se také říká TCP paket. Proč segment? Aplikace běžící na jednom počítači posílá protokolem TCP data aplikaci běžící na jiném počítači. Aplikace potřebuje přenést např. soubor velký 2 GB. Jelikož TCP segmenty jsou baleny do IP datagramů, který má pole délka dlouhé 16 bitů, tak TCP segment může být dlouhý maximálně 65535 minus délka TCP‐záhlaví. Přenášené 2 GB dat musí být rozděleny na segmenty, které se vkládají do TCP paketu – přeneseně se pak místo TCP paket říká TCP segment. TCP segment se vkládá do IP‐datagramu. IP‐datagram se vkládá do linkového rámce. Použije‐li se příliš velký TCP‐segment, který se celý vloží do velkého IP‐datagramu, který je větší než maximální velikost přenášeného linkového rámce (MTU), pak IP protokol musí provést fragmentaci IP‐datagramu. Nyní nějaká fakta ze slidů... Transmission Control Protocol – je to spolehlivá spojovaná služba, podporuje multiplex i duplexní přenos (piggybacking), dále také proudový přenos (stream – navážeš spojení, vytvoří se nějaký tunel a přes to to běží), umožňuje potvrzování a opakování segmentů, adaptivní přizpůsobení parametrů, má implementované sliding window, umožňuje vytváření a rušení transportních spojení, příjem dat z vyšší vrstvy a vytváření TCP paketů, koncové řízení toku. TCP využívají protokoly http, ssh, telnet Hlavička (záhlaví) TCP viz obrázek... Hlavička TCP má tyto pole: •
zdrojový a cílový port TCP‐ je to port odesílatele a port příjemnce. Pětice zdrojový port, cílový port, zdrojová IP, cílová IP a protokol (typ protokou) jednoznačně identifikuje v daném okamžiku spojení v internetu. • pořadové číslo odesílaného bytu (číslo prvního bytu) – TCP segment je část z toku dat tekoucích od odesílatele k příjemci. Pořadové číslo odesílaného bytu je pořadové číslo prvního bajtu TCP segmentu v toku dat od odesílatele k příjemci (TCP segment nese bajty od pořadového čísla odesílaného bajtu až do délky segmentu) • pořadové č. očekávaného bytu(poslední dobře přijatý byte + 1) vyjadřuje číslo následujícího bytu, který je příjemce připraven přijmout, tj. příjemce tak vlastně potvrzuje, že úspěšně přijal data do (pořadové_číslo_očekávaného_ bytu ‐ 1) • délka záhlaví – vyjedřuje délku TCP záhlaví, je v násobcích 32b • rezerva • příznaky (URG – TCP segment nese urgentní data, ACK – potvrzení, PSH – TCP segment nese aplikační data, RST‐odmítnutí TCP spojení, SYN – Odesílatel začíná s novou sekvencí číslování, FIN – odesílatel ukončil odesílání dat) • délka okna – vyjadřuje maximální přírůstek čísla přijatého bytu, který bude příjemcem ještě akceptován • kontrolní součet TCP • ukazatel naléhavých dat – může být nastaven pouze tehdy, je‐li nastaven příznak URG. Přičte li se tento ukazatel k pořadovému číslu odesílaného bytu, pak ukazuje na konec úseku naléhavých dat. Odesílatel si přeje, aby příjemce tato data přednostně zpracoval. K poli volitelné položky: oproti položkám UDP se používají a přenáší. Volitelná položka se skládá z typu volitelné položky, délky volitelné položky a hodnoty. Na tyto položky zbývá 40B TCP záhlaví. Mezi volitelné položky patří např.: maximální délka segmentu, zvětšení okna, časové razítko, čítač spojení. Navázání TCP spojení Klient začíná navazovat spojení odesláním prvního TCP segmentu. Tento TCP segment klient vloží do IP‐datagramu jehož IP‐adresa odesílatele bude „Klient” a IP‐adresa příjemce „Server”. Klient vygeneruje náhodné číslo v intervalu 0 až 232‐1, které použije jako startovací pořadové číslo odesílaného bajtu (tzv. ISN). V našem případě bylo vytvořeno ISN=145165778. Skutečnost, že klient právě vytvořil startovací pořadové číslo odesílaného bajtu vyznačí v TCP segmentu nastavením příznaku SYN (….S.). Během spojení již pořadové číslo odesílaného bajtu bude vždy vyjadřovat číslo odesílaného bajtu, tj. nemůže být znovu vygenerováno. Obrázek navazování spojení je tady: Segment (1) je prvním segmentem v TCP komunikaci, proto nemůže potvrzovat žádná přijatá data. Pole pořadové číslo přijatého bajtu nemá platný význam (bývá vyplněno binárními nulami) a nemůže být tedy ani nastaven příznak ACK (příznak ACK je nastaven ve všech dalších TCP segmentech až do ukončení spojení). Součástí segmentů (1)a (2) byla volitelná položka záhlaví TCP segmentu MSS (Maximum segment size). Tato položka oznamuje druhé straně maximální délku datové části TCP segmentu jakou si přeje přijímat (aby se pokud možno zamezilo fragmentaci IP‐datagramu). Implicitně se MSS používá 536 bajtů. Tato hodnota je používána pro spojení mimo lokální síť (přes WAN). Pro náš příklad jsme použili spojení v rámci lokální sítě protokolem Ethernet II. Pro linkový protokol Ethernet II je maximální délka datové části rámce rovna 1500. Pokud od 1500 odečteme 20 pro IP‐záhlaví a dalších 20 pro TCP záhlaví, pak dojdeme k hodnotě z našeho příkladu (1460). Takže pokud to shrneme...,tak... stavy při navazování spojení jsou : LISTEN (server je připraven na spojení s klienty), SYN_SEND (klient odeslal první TCP segment) a SYN_RCVD (server přijal od klienta první TCP segment, tj. segment s příznakem SYN), potom je spojení ESTABLISHED, tedy ustanoveno...viz obrázek Ukončování spojení TCP Zatímco spojení navazoval v architektuře klient/server zpravidla klient, tak ukončit spojení může libovolná strana. Strana, která první odešle TCP segment s příznakem FIN (ukončení spojení) provádí tzv.aktivní ukončení spojení (active close), druhé straně nezbývá než provést pasivní ukončení spojení (pasive close). Teoreticky je možné i současné ukončení spojení. Stavy při ukončování spojení: •
•
•
•
•
•
FIN_WAIT1 (strana zjistila, že už všechna data odeslala, a potřebuje např. signalizovat konec souboru, tak v TCP segmentu nastaví příznak FIN, čímž signalizuje aktivní ukončení spojení ) CLOSE_WAIT (druhá strana obdržela aktivní uzavření spojení a nezbývá jí nic jiného než potvrdit segmentem přechod do pasivního uzavření spojení – tomuto stavu odpovídá právě CLOSE_WAIT) FIN_WAIT2 ( toto je stav poté, co strana obdrží potvrzení aktivního uzavření spojení od protějšku. Ve stavu FIN_WAIT2 strana zůstává do té doby, dokud protějšek nezašle TCP segment s příznakem FIN, tj. do přechodu do stavu TIME_WAIT. Pokud aplikace nepočítá s přenosem dat v polouzavřeném spojení, a spojení je nečinné po 11,25 minuty, pak operační systém automaticky změní stav spojení na CLOSED.) LAST_ACK – druhá strana již odeslala všechna data a signalizuje úplné končení spojení TIME_WAIT ‐ všechna data oběma směry již byla přenesena. Je nutné pouze potvrdit úplné uzavření spojení. Odesláním TCP segmentu ) je potvrzeno úplné ukončení spojení. Tento segment již není potvrzován, proto strana zůstává ve stavu TIME_WAIT po dobu 2 minut (některé implementace TCP/IP zkracují tuto dobu až na 30 s).
CLOSED – druhá strana obdržela potvrzení úplného uzavření spojení a přechází do stavu CLOSED. Strana, která odeslala toto potvrzení (segment) přechází do CLOSED až po uplynutí zmíněného intervalu.
Stavy při uzavírání spojení jsou dobře vidět na obrázku... Vylepšení provozu TCP sloučení dat a potvrzení (piggyback), technika okna (viz bible strana 234), vyhnutí se zahlcení sítě a výpadku segmentu (jak, to je na slidech, ale já to teda nechápu...), nastavení správného timeoutu. Protokol SCTP Stream Control Transmission Protocol – jedná se o komnikační protokol transportní vrstvy (tedy něco jako TCP), byl původně navržen pro telefonní signalizaci po IP. Odstraňuje nedostatky TCP a propůjčuje si některé vlastnosti UDP. V současnosti je podporován v Linuxu , Free BSD, MacOS, Solarisu ... , tedy skoro všem kromě Windows. Vlastnosti SCTP Po navázání spojení můžeme komunikovat ve více streamech najednou. V rámci každého proudu (streamu) protokol garantuje doručení dat ve správném pořadí (tedy jako TCP, ale více streamů), případný výpadek v jednom streamu neovlivní ostatní streamy. SCTP lze tedy přirovnat ke svazku spojení TCP, ale má menší režii a několik vylepšení. Formát SCTP paketu Paket začíná univerzální hlavičkou (zdrojový + cílový port, ověřovací značka, kontrolní součet), následují tzv. kousky (chunks), které obsahují řídící informace či data pro jednotlivé proudy (typ, příznaky, délku, další hlavičky a data...). Počet nebo struktura těchto kousků nejsou pevně dány. Formát SCTP paketu je na obrázku. Jak probíhá u SCTP potvrzování dat? Citelné změny v porovnání s TCP zaznamenalo potvrzování. SCTP k němu využívá pořadová čísla (jak také jinak), která zde najdete na dvou úrovních: Transmission Sequence Number (TSN) slouží k číslování jednotlivých datových kousků (na úrovni asociace), zatímco Stream Sequence Number (SSN) určuje číslování v rámci jednoho konkrétního proudu.Hlavní předností potvrzování v SCTP je, že dokáže ohlásit chybějící kusy dat. Slouží k tomu speciální kousek nazvaný selektivní potvrzení. Ten obsahuje nejvyšší pořadové číslo přijatého datového kousku a zároveň vyjmenovává chybějící úseky dat. Díky tomu je odesilatel přesně informován, která data dorazila a která ne. Navíc pokud vysílající dostane čtyři potvrzení ohlašující stejnou díru v datech, na nic nečeká a chybějící část rovnou pošle znovu (tzv. rychlé opakování). Multi Homing komunikující stanice má několik IP adres, během komunikace je vybrána jedna brána jako privátní a z ní jsou odesílána data. Pro opakování je vybrána jiná brána. Pokud jsou s komunikací přes primární bránu větší problémy, přejde se kompletně na jinou bránu. SCTP monitoruje všechny cesty a udržuje si přehled o jejich stavu ... více o mutlihomingu je zde Iniciace spojení SCTP Oproti TCP se posílá cookie – SCTP má 4 cestný handshake – init, init‐ack,cookie‐echo,cookie‐
ack. Formátování do zpráv SCTP garantuje, že příjemce dostane zprávy rozdělené tak, jak je odesílatel odeslal (podobně jako UDP – to taky posílá data po kouscích – vzpomeň na sliding window, oproti tomu TCP odesílá se chová v podstatě jako proud bitů – zprávy nejsou nijak rozdělené) Ukončení spojení SCTP – oproti TCP uzavřou všechny stanice spojení najednou viz obr. Budoucnost SCTP Jedná se o velmi mladý protokol (RFC z roku 2000), je velmi vhodný pro běžné služby jako je FTP a HTTP. Zatím se čeká na podporu SCTP ve Widows a taky ve směrovačích. Pak to příjde a to nezachápeš, woe! více zde Pomocné protokoly •
•
•
•
•
•
•
•
•
•
ICMP (Internet Control Message Protocol) rfc792 IGMP (Internet Group Management Protocol) ARP (Address Resolution Protocol) rfc826 RARP (Reverse Address Resolution Protocol) BOOTP (Bootstrap Protocol) rfc951 DHCP (Dynamic Host Configuration Protocol) RIP (Routing Information Protocol) rfc1721 OSPF (Open Shortest Path First Routing Protocol) EGP (Exterior Gateway Protocol) rfc827 BGP (Border Gateway Protocol) rfc1771 Materiály •
•
•
•
•
•
X36PKO, přednáška 2 X36PKO, přednáška 4 X36PKO, přednáška 7 ‐ Protokol SCTP Network Sorcery ‐ IP Suite Wikipedia ‐ Sada protokolů Internetu Podpora distribuovaného výpočtu (X36PKO) Technologie klient‐server, rozhraní protokolů UDP a TCP. Klient‐Server Server •
•
•
pasivní (slave) čeká na žádosti obsluhuje zádosti a zasílá zprávy (odpovědi) Klient •
•
•
aktivní (master) posílá žádosti čeká na odpovědi Řešení problému souběžného zpracování: •
•
•
funkce select() ‐ Pro práci s více sokety najednou slouží funkce select. Funkce select je schopna pracovat se třemi skupinami soketů. V první skupině hlídá, zda v některém soketu nejsou příchozí data, která je možno číst. Ve druhé skupině hlídá, zda do některého soketu je možné data zapisovat. Sokety ve třetí skupině jsou kontrolovány, zda se nenacházejí v chybovém stavu. pomocí vláken nebo procesů neblokující čtení Detailní popis funkcí Soket Soket je mechanizmus pro komunikaci. Je to v podstatě jeden konec navázaného spojení. Poprvé se objevil v operačním systému BSD. Soket je velice obecný nástroj. Stejné funkce můžeme používat pro komunikaci pomocí různých protokolů. Soket je jednoznačně identifikován trojicí IP adresa, port a typ protokolu. FUNKCE ‐ KLIENT Vytvoření soketu Soket je reprezentován svým identifikátorem, který je celé číslo int. K vytvoření soketu slouží funkce socket. •
int socket(int domain, int type, int protocol); ‐ prvním parametrem je doména – většinou má hodnmotu makra AF_INET. Druhým parametrem je typ soketu. Chceme‐
li používat protokol TCP (spojová služba, "proud" dat), předáme jako druhý parametr hodnotu makra SOCK_STREAM, naopak SOCK_DGRAM udává, že se bude jednat o nespojovou datagramovou službu. Posledním parametrem je identifikátor protokolu. Chceme‐li používat protokol TCP předáme jako parametr hodnotu makra IPPROTO_TCP.Funkce vrací identifikátor soketu. V případě, že došlo k chybě (soket není možné vytvořit), funkce vrací ‐1. Navázání spojení Máte tedy vytvořen náš konec "hadice" (pomocí funkce socket). Teď by to chtělo vložit druhý konec hadice do nějakého počítače. K tomu slouží funkce connect. Její hlavička je: •
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); ‐ prvním parametrem je identifikátor soketu. Druhým je adresa TCP serveru. Vytvoříme instanci struktury sockaddr_in a ukazatel na ní přetypujeme na ukazatel na strukturu sockaddr. Posledním parametrem je velikost adresy. V případě, že spojení bylo navázáno, funkce vrací 0, jinak ‐1. Odeslání dat K odeslání dat slouží funkce send. Funkce send je deklarována v hlavičkovém souboru sys/socket.h. Její hlavička je: •
int send(int s, const void *msg, size_t len, int flags); ‐ funkce odešle data. Prvním parametrem je identifikátor soketu, druhým parametrem je ukazatel na blok dat (zpráva ‐ message) určený k odeslání. Třetím parametrem je velikost bloku dat v bytech. Posledním parametrem jsou flagy. My budeme prozatím používat 0. Funkce vrací počet odeslaných bytů, nebo ‐1 v případě chyby. Příjem dat K příjmu dat slouží funkce recv. Funkce recv je deklarována v hlavičkovém souboru sys/socket.h. Její hlavička je: •
int recv(int s, void *buf, size_t len, int flags); ‐ funkce přijme data. Prvním parametrem je identifikátor soketu, druhým parametrem je ukazatel na souvislý blok paměti, který je určen k zaplnění příchozími daty. Třetím parametrem je maximální počet dat, které je možné do bufferu přijmout. Typicky je to číslo, které udává velikost na kterou je alokován buffer (v bytech). Posledním parametrem jsou flagy. My budeme prozatím používat 0. Funkce vrací počet skutečně přijatých bytů, nebo ‐1 v případě chyby. FUNKCE ‐ SERVER NAVÍC Pojmenováni soketu •
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); ‐ funkce "pojmenuje" soket. Prvním parametrem je identifikátor soketu. Druhým parametrem je ukazatel na strukturu sockaddr. Ve struktuře je obsažená adresa i s portem. Posledním parametrem je délka struktury předávané v druhém parametru. Funkce bind je deklarována v hlavičkovém souboru sys/socket.h. Funkce v případě selhání vrací ‐1. V opačném případě vrací 0. Vytvoření fronty •
int listen(int s, int backlog); ‐ vytvoří frontu požadavků na připojení. Prvním parametrem je identifikátor soketu, druhým parametrem je maximální délka fronty. Jestliže je fronta plná a nějaký klient se pokusí k serveru připojit, bude spojení odmítnuto. Funkce v případě selhání vrací ‐1. V opačném případě vrací 0. Přijmutí spojení ‐ vyzvednutí požadavku z fronty •
int accept(int s, struct sockaddr *addr, socklen_t *addrlen); ‐ vybere požadavek na spojení z fronty požadavků a potvrdí ho. Funkce accept zablokuje provádění programu, dokud nepřijde nějaký požadavek na spojení. Pro každé přijaté spojení se vytvoří nový soket. Prvním parametrem je identifikátor soketu. Druhým parametrem je ukazatel na nám již známou strukturu sockaddr, která obsahuje adresu vzdáleného počítače, který se připojil k serveru. Třetím parametrem je ukazatel na proměnnou udávající velikost struktury, která je předána jako druhý parametr. Struktura, na kterou se odkazuje druhý parametr bude při volání funkce zaplněna. Před zavoláním funkce nemusí obsahovat žádné smysluplné hodnoty. Musí ale být alokována. Třetí parametr se musí odkazovat na proměnnou obsahující velikost struktury předávané jako 2. parametr. Po zavolání funkce bude obsahovat skutečnou velikost zaplněné struktury. Je jasné, že funkce accept nezaplní větší část paměti, než kolik jsme předali pomocí 3 parametru. Funkce accept vrací identifikátor nového soketu. Komunikaci s klientem provádíme pomocí tohoto nového soketu. "Starý" soket slouží pouze pro navazování spojení. V případě chyby funkce accept vrací ‐1. v UDP spojení nenavazujeme, místo funkcí send a recv používáme funkce sendto a recvfrom Posloupnost příkazů pro vytvoření TCP komunikace Server Klient ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ socket() socket() bind() /* pokud chce klient určit specifický port, použije také bind() */ listen() ... accept() <============== connect() ... ... recv() <================ send() ... ... send() ================> recv() ... ... ... close() close() Pozn: Místo funkce send(), resp. recv(), může být použita funkce write(), resp. read() Posloupnost příkazů pro vytvoření UDP komunikace Server Klient ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ socket() socket() bind() bind() ... ... sendto() ==============> recvfrom() ... ... recvfrom() <============ sendto() ... ... close() close() Realizace klienta socket() connect() write(socket, zadost) nebo sendto() do { read(socket, &odpoved) nebo recvfrom() } while(!prisla_cela_odpoved && !chyba) Realizace serveru while cyklem socket() bind() listen() while(1){ accept() recv(send(s)) nebo recvfrom()+sendto() close(s) } Realizace serveru vlákny nebo procesy socket() bind() listen() while(1){ accept() if(fork()==0){ /*komunikace*/ close(s) exit() } } Realizace serveru funkcí select socket() bind() listen() while(1){ napln_fdset r=select(fdset, tout) if (event) { obsluha } } Materiály •
•
X36PKO, cvičení 1 Wikipedia ‐ Technika klient‐server Procedurální komunikace (RPC, Java RMI, SOAP). RPC Remote procedure call (RPC, vzdálené volání procedur) je technologií dovolující programu vykonat proceduru, která může být uložena na jiném místě než je umístěn sám volající program. Příkladem budiž výpočet funkce na jiném počítači v síti. Postup •
•
Nejprve proběhne jednoduché zabalení parametrů a identifikátorů procedury do formy vhodné pro přenos mezi počítači (tzv. marshalling) Poté se balíček prostě odešle. •
•
•
•
•
•
Balíček se na vzdáleném místě rozbalí, zjistí se o jakou proceduru nám jde. (unmarshalling) Samotné zavolání a provedení procedury Výsledek procedury se opět zabalí. A odešle zpět. První počítač výsledek opětovně rozbalí A přijatá hodnota se předá proceduře. Hlavní nevýhoda pro programátora je patrná, nejde předávat ukazatele protože v druhé proceduře nemají žádný smysl. Původně vyvinuta roku 1976 firmou Xerox, první Unixová implementace Sun's RPC. Na tomto paradigmatu jsou založeny technologie CORBA, SOAP, REST, RMI nebo Web Services. JAVA RMI RMI (Remote Method Invocation) umožňuje objektu z jednoho Javoveho Virtualního Stroje (JVM) vyvolávat metody na jiném objektu, který se může nacházet v jiném JVM. RMI se stará v zásadě o tři věci : •
•
•
dokáže lokalizovat vzdálený objekt komunikuje se vzdálenými objekty ‐ komunikace na nižší úrovni je před programátorem skryta v případě dodržení podmínek dokáže přenést mezi danými objekty jiný objekt ve tvaru bajtového kódu Uvažujeme‐li, že jeden objekt (vzdálený objekt) je ve funkci serveru (poskytuje pouze své metody jiným objektům) a druhý (lokální objekt) je ve funkci klienta (vyvolává metody na vzdálených objektech, ale žádné své metody jiným objektům neposkytuje), vypadá fungování RMI následovně. Vzdálený objekt implementuje tzv. vzdálený interface, který musí lokální objekt znát v okamžiku kompilace. Při vyhledání vzdáleného objektu klientem se v klientském JVM vytvoří zástupný objekt odpovídající vzdálenému interface. Klient vyvolává metody na tomto zástupném objektu, který se pak stará o jejich následné vyvolaní na vzdáleném objektu.
SOAP (Simple Object Access Protocol/Service Oriented Architecture Protocol) SOAP je protokol pro posílání zpráv XML a je základem webových služeb. Ostatní standardy jako WSDL a UDDI vznikly až později po uvedení SOAPu a jen dále rozšiřují jeho možnosti a snadnost použití. SOAP umožňuje zaslání XML zprávy mezi dvěma aplikacemi a pracuje tedy na principu peer‐to‐peer. Zpráva je jednosměrný přenos informace od odesílatele k příjemci, ale díky kombinování několika zpráv můžeme pomocí SOAPu snadno implementovat běžné komunikační scénáře. Nejčastěji se SOAP používá jako náhrada vzdáleného volání procedur (RPC), tedy v modelu požadavek/odpověď. Jedna aplikace pošle v XML zprávě požadavek druhé aplikaci, tak požadavek obslouží a výsledek zašle jako druhou zprávu zpět původnímu iniciátorovi komunikace. V tomto případě bývá webová služba vyvolána webovým serverem, který čeká na požadavky klientů a v okamžiku, kdy přes HTTP přijde soapová zpráva, spustí webovou službu a předá jí požadavek. Výsledek služby je pak předán zpět klientovi jako odpověď. První verze (1.0) protokolu SOAP vznikla na konci roku 1999 jako výsledek společné práce firem DevelopMentor, Microsoft a UserLand, které chtěly vytvořit protokol pro vzdálené volání procedur (RPC) založený na XML [3]. Protokol navazoval na o rok mladší, jednodušší a méně flexibilní protokol XML‐RPC. V průběhu roku 2000 se k podpoře přihlásila i firma IBM a nová verze SOAPu 1.1 byla zaslána W3C konsorciu [4]. Verze SOAPu 1.1 je dnes nejpoužívanější a v diplomové práci se budeme zabývat právě jí. Na půdě W3C konsorcia nyní probíhá práce na uvolnění prvního skutečného standardu SOAP 1.2 v rámci pracovní skupiny pro XML protokol. Pracovní verze specifikace je dostupná v [17]. •
•
•
protokol pro komunikaci mezi metodami RPC prostřednictvím XML dnes jako balík API prakticky v každém používanějším programovacím jazyku komunikační rozhraní pro Web Services Web Services (JAX‐WS, dříve JAX‐RPC) Web Service je služba, které pošleme vstup v očekávaném formátu a ona vrátí výstup (v očekávaném formátu). Pro transfer je použit protokol SOAP. Používá se hlavně v B2B komunikaci mezi IS, které mohou běžet na úplně jiné platformě (např. C++ a JAVA). WSDL (Web Services Description Language) popisuje co nabízí webová služba za funkce a způsob, jak se jí na to zeptat. Zapisuje se v XML formátu. Srovnání web service a RMI Web Services: •
•
•
•
komunikace mezi enterprise entitami nezávislé na programovacím jazyce firewall‐friendly neefektivní RMI: •
•
•
•
enterprise entity nejsou podmínkou závislé na programovacím jazyku firewall‐unfriendly efektivní Materiály •
•
X36TJV, přednáška 2 X36TJV, přednáška 8 Odborné tématické okruhy: Programové vybavení počítačů Pokryto předměty: X36TIN, X36DSA, X36OSY, X36PJP, X36DBS, X36SIN
•
Složitost algoritmů (X36DSA, X36TIN) Asymptotická složitost. Co to vlastně je? Každému algoritmu lze jednoznačně přiřadit rostoucí funkci, zvanou asymptotická složitost, která charakterizuje počet operací algoritmu. Čím pomaleji tato funkce roste, tím je algoritmus rychlejší. Složitost může být vnímána buď jako: a) celkový počet operací, b) celkový počet operací nad daty, c) celkový počet porovnání nad daty. Většinou složitost vnímáme jako c), protože je to maximálně zjednodušený pohled a přece nepotřebujeme počítat každou jednotlivou operaci. Dobré příklady na složitost různých algoritmů jsou na slidech 6‐27/X36DSA, přednáška 1 Řád růstu funkcí Ω(f(x)) –Omega notace V množině Ω(f(x)) se octne každá funkce g(x), která od určitého bodu x0 (není nijak předem předepsáno, kde by x0 měl být) a) je už vždy větší než funkce f(x) b) sice větší než f(x) není, ale po vynásobení nějakou kladnou konstantou (hodnota konstanty také není nijak předepsána) je už vždy větší než funkce f(x). Takže: pokud najdeme nějaké x0 a c>0 takové, že c∙g(x) > f(x) všude napravo od x0, (někdy stačí c=1), je jisto, že g(x) Є Ω(f(x)).
situace vypadá následovně…vlevo definice a vpravo příklad O(f(x)) –Omikron notace V množině O(f(x)) se octne každá funkce g(x), která od určitého bodu x0 (není nijak předem předepsáno, kde by x0 měl být) a) je už vždy menší než funkce f(x) b) sice menší než f(x) není, ale po vynásobení nějakou kladnou konstantou ( asi < 1 _) (hodnota konstanty také není nijak předepsána) je už vždy menší než funkce f(x). Takže: pokud najdeme nějaké x0 a c>0 takové, že c∙g(x) < f(x) všude napravo od x0, (někdy stačí c=1) je jisto, že g(x) Є O(f(x)).
situace vypadá následovně…vlevo definice a vpravo příklad Θ(f(x)) –Theta notace V množině Θ(f(x)) se octne každá funkce g(x), která spadá jak do Ω(f(x)) tak do O(f(x)). Pokud f(x) Є Θ(g(x)), pak g(x) Є Θ(f(x)). situace vypadá následovně…vlevo definice a vpravo příklad Řád růstu funkce Řád růstu funkce f je taková “co nejjednodušší” funkce g, pro kterou platí g(x) Є Θf(x). Například pro ff(x) = 4 × 2n + 3 × 2n‐1 + 5 × 2n/2 je její řád růstu 2n. Asymptotická složitost Asymptotická složitost algoritmu A je řád růstu funkce f(n), která charakterizuje počet elementárních operací algoritmu A při zpracování dat o rozsahu n. Je jedno jestli počítáme asymptotickou složitost všech operací nebo jen operací nad daty nebo porovnání. Asymptotická složitost vychází ve všech případech táž. Typickým příkladem algoritmu se složitostí, která závisí na vstupních datech, je algoritmus řazení QuickSort, jehož asymptotická složitost je O(n²), což je šílené, ale taktéž Ω(log(n)), což je moc hezké, ale platí i Θ(n*log(n)). Materiály •
•
•
X36DSA, přednáška 1 Algoritmy ‐ složitost Wikipedia ‐ Asymptotická složitost Třídy složitosti P a NP, NP‐úplnost. Pojmy Polynomiální složitost – lze vyjádřit jako nk, n leží na horizontální ose (takže je to vlastně x), k je nějaké celé číslo. Polynomiálně složitý algoritmus má složitost například n5+n4+n2. Exponenciální složitost – lze vyjádřit jako en, kde e je eulerovo číslo a n je číslo na horizontální ose grafu Exponenciální složitost je „lepší“ pro n<9500. Například… Třída složitosti P (polynomial) Obsahuje problémy, pro které existuje řešení v polynomiálně omezeném čase – algoritmus by měl řád růstu O(nk). V informatice je P označení polynomiální třídy složitosti (polynomiální = mnohočlenný, polynom = mnohočlen). Třída složitosti NP (non‐deterministic polynomial) NP úlohy umíme prozatím řešit jen tak že řešení „uhádneme“ a ověříme. Není však znám žádnný efektivní algoritmus řešení (avšak není vyloučeno, že existuje). Pro ověření „uhádnutého“ výsledku ovšem existuje algoritmus polynomiálně omezený. To znamená, že pro získání jednoho výsledku potřebujeme v podstatě polynomiální čas. Pro získání všech řešení potřebujeme tedy součet těchto časů. Nedeterministický algoritmus pro rozhodovací úlohy má obvykle dvě fáze: •
•
nedeterministická fáze ‐ do paměti se zapíše nějaký řetěz znaků (uhádnuté řešení) deterministická fáze ‐ použije se deterministický algoritmus pro určení, zda řetěz představuje opravdu řešení zadané úlohy Lépe vysvětlím, co to znamená NP na příkladě. Máme množinu čísel jako např. {‐7,‐3,‐2,5,8} a chceme vědět jestli součet nějakých čísel z této množiny je nula. V tomto případě je odpovědí podmnožina {‐3,‐2,5}. Vypadá to jednoduše, ovšem pokud zadáme velkou množinu čísel, náročnost problému rapidně vzroste. Žádný rozumný algoritmus zatím pro tento případ nebyl nalezen. Na druhé straně, pokud z množiny vyjmeme zmíněnou podmnožinu, je snadné ověřit, jestli je její součet nula nebo ne. NP problémy mají společné to, že pro všechny existuje nějaký ověřovací algoritmus, který je časově polynomiálně složitý. Existuje spousta zajímavých NP úkolů, které neumíme polynomiálně řešit. Víme že P patří do NP, ale to, zda P je podmnožina NP, nebo P = NP (tedy jestli pro řešení NP existuje nějaký efektivní polynomiálně složitý algoritmus), to je problém století. Příklady NP úloh: •
•
•
•
•
plnění krabic ‐ Máme krabice s jednotkovým objemem a n předmětů s objemem s1, s2, s3, ..., sn. Pro dané k určit, zda lze těchto n předmětů uložit do k krabic. součet podmnožiny ‐ Máme n předmětů s objemem s1, s2, s3, ..., sn (kladná celá čísla). Pro dané k máme určit, zda existuje podmnožina předmětů s objemem přesně k. problém batohu ‐ Máme batoh s kapacitou K a n předmětů o velikosti s1, s2, s3, ..., sn a ceně c1, c2, c3, ..., cn (vše kladná celá čísla). Pro dané (kladné celé) k máme určit, zda lze do batohu uložit nějakou podmnožinou předmětů v ceně přesně k. rozhodovací úloha o obarvení grafu ‐ Pro daný (obyčejný) graf G = 〈H,U〉 a kladné celé číslo k určit, zda existuje obarvení grafu G pomocí k barev. rozhodovací úloha o Hamiltonovské kružnici v grafu ‐ Pro daný (obyčejný) graf G = 〈H,U〉 určit, zda v něm existuje Hamiltonovská kružnice (ta prochází všemi uzly).(podobně pro Hamiltonovskou cestu) NP‐úplné problémy Jsou takové NP problémy, na které jsou polynomiálně redukovatelné všechny ostatní problémy z NP. Redukovatelné znamená toto: pokud máme problémy A a B a pokud A je redukovatelné na B, tak potom řešení problému B je i řešením A. To znamená, že třídu NP‐
úplných úloh tvoří v jistém smyslu ty nejtěžší úlohy z NP. •
•
problém splnitelnost logických formulí problém obchodního cestujícího Materiály •
•
X36TIN, přednáška 13 NP‐úplnost Turingovy stroje, jejich zobecnění, nerozhodnutelné problémy. – předělat podle výpisků nebo skript!! – slidy z TIN jsou na hovno… Turingovým cílem bylo vytvořit model vypočitatelnosti /vyčíslitelnosti tak, aby byl •
•
co nejjednodušší pro popis a studium současně dostatečně obecný Turingovy stroje Turingovy stroje jsou stroje, které dokáží modelovat činnost počítače. Všeobecně se má za to, že cokoliv, co dokáže spočítat počítač, dokáže spočítat i Turingův stroj. Toto se označuje jako tzv. Churchova teze. Není ji možné dokázat, ale s její platností se počítá v mnoha důkazech. Základními částmi TS jsou řídící jednotka (s konečným počtem vnitřních stavů) a páska (směrem doprava nekonečná). Páska je vybavena čtecí/zapisovací hlavou, jejímž prostřednictvím řídící jednotka zjišťuje obsah právě čteného políčka pásky a tento obsah může rovněž měnit. Řídící jednotka pracuje v diskrétních krocích ‐ v závislosti na svém vnitřním stavu a na symbolu čteném z pásky provede v každém kroku dvě operace: •
•
přejde do dalšího stavu přepíše čtený symbol, nebo posune hlavu o jedno místo vpravo/vlevo. TS je abstraktní zařízení (matematické modely), které musí mít následující vlastnosti: •
•
•
musí mít charakter automatu musí být co nejjednodušší musí být dostatečně obecné s ohledem na výpočty, které jsou schopny provádět Turingův stroj je uspořádaná pětice M = (Q, A, δ, s, F), kde •
•
•
•
•
Q je konečná množina stavů A je abeceda obsahující mimo jiné prázdný symbol (mezeru) a symbol konce pásky, ale neobsahuje symboly ← a → s Q je počáteční stav F Q je množina koncových stavů δ je přechodové zobrazení ‐ pro všechny stavy platí, že pokud narazí na symbol > , pak se čtecí hlava posune o místo doprava. Mimochodem, tento symbol nejde přepsat. Přechodové zobrazení říká, co má automat udělat, pokud čte takový a takový symbol a je v takovém a takovém stavu, takže např. δ(q,a)= (p,b) znamená, že pokud je TS ve stavu q a čte symbol „a“, pak má přepsat „a“ na „b“ a přesunout se do stavu p. Přechodové zobrazení může být dáno např. tabulkou… Konfigurace Turingova stroje •
je uspořádaná trojice (q, α, β) kde q je stav, α je obsah pásky zleva k hlavě, β obsah pásky od hlavy napravo Je to tedy vlastně popis, v jaké situaci se TS zrovna nachází, například… (myslím si, že druhý řadek uprostřed je špatně a nemají tam být ty dvě mřížky na konci) Přechod mezi konfiguracemi ukážeme na příkladech… výchozí konfigurace (q, wau) • přepis symbolu na pásce pro δ(q,a) = (p,b), b∈A (q, wau) (p, wbu) • posun vlevo pro δ(q,a) = (p,«), w = w'a' – je‐li a ≠ # nebo u ≠ ε (q, wau) = (q, w'a'au) (p, w'a'au) – je‐li a = # a současně u = ε (q, w#) = (q, w'a'#) (p, w'a') • posun vpravo pro δ(q,a) = (p,»), w = w'a' – je‐li u = a'u', a'∈A (q, wau) = (q, waa'u') (p, waa'u') – je‐li u = ε (q,wa) (p, wa#) •
•
mějme 2 koncové stavy Y/N, libovolná koncová konfigurace, jejíž stav je roven Y se nazývá přijímací konfigurace, konfigurace jejíž stav je roven N se nazývá odmítající konfigurace TS přijímá daný vstup, pokud se po konečném počtu kroků nachází ve stavu Y •
•
•
•
•
TS odmítá daný vstup, pokud se po konečném počtu kroků nachází ve stavu N TS rozhoduje daný jazyk L, pokud přijímá každý řetěz tohoto jazyka a odmítá každý řetěz, který nepatří do daného jazyka jazyk L je rekurzivní, pokud existuje TS, který jej rozhoduje TS polorozhoduje daný jazyk L, pokud se zastaví pro libovolný řetěz jazyka L jazyk L se nazývá rekruzivně vyčíslitelný, pokud existuje TS, který jej polorozhoduje Zobecnění Turingových strojů •
•
•
•
•
•
•
Vícepáskové Turingovy stroje – stroj obsahuje více pásek, kdy každá páska má svoji čtecí/zapisovací hlavu Stroj s více hlavami – stroj s jedinou páskou, nad kterou se nezávisle na sobě pohybuje několik čtecích/zapisovacích hlav Stroj s oboustranně nekonečnou páskou – stroj má pásku, která je nekonečná v obou směrech Stroj s dvourozměrnou páskou – stroj pracující s dvourozměrnou mřížkou namísto jednorozměrné pásky Stroj s náhodným přístupem ‐ vlastně model dnešního PC, nemusí sekvenčne procházet všechna políčka pásky aby se dostal na požadované políčko, je určen dvojicí M = <k,P> kde k > 0 je počet registrů a P je program složený z instrukcí Nedeterministický TS ‐ pro některé kombinace stavu a symbolu může existovat více možností, jak se stroj zachová Univerzální TS ‐ je schopen simulovat činnost libovolného jiného TS a má 3 pásky (jedna simuluje pásku stroje M, druhá zakódováva strukturu stroje M a třetí zakódovává aktivní stav stroje M) Nerozhodnutelné problémy Jsou to takové problémy, u kterých nelze rozhodnout o výsledku (nejsou algoritmicky řešitelné). Příkladem může být např. problém zastavení (zda napsaný program uvízne v nekonečném cyklu nebo ne) ‐ takzvaný Halting problem (viz http://www.earchiv.cz/a94/a433c120.php3). Dá se i jednoduše dokázat, že tenhle problém nelze vyřešit: •
http://www.cs.vsb.cz/kot/download/uti‐pr‐07.pdf Materiály •
•
•
•
•
•
X36TIN, přednáška 12 Wikipedia ‐ Turingův stroj Turingovy stroje ‐ toto je GOOD Teorie složitosti Applet simulující Turingův stroj Techniky návrhu algoritmů (X36DSA) Rekurze, převod rekurze na iteraci. Rekurze •
•
•
•
•
•
opakované vnořené volání stejné funkce (podprogramu) ‐ tzv. rekurzivní funkce nedílnou součástí rekurzivní funkce musí být ukončující podmínka určující, kdy se má vnořování zastavit bývá nejčastějším zdrojem chyb => je třeba ji navrhnout dostatečně robustním způsobem a prověřit veškeré možné stavy pro uplatnění rekurzivních algoritmů musí programovací jazyk umožňovat volání podprogramu ještě před ukončením jeho předchozího volání po každém kroku volání sebe sama musí dojít ke zjednodušení problému; pokud nenastane koncová situace, provede se rekurzivní krok každý algoritmus využívající rekurzi lze přepsat do nerekurzivního tvaru při použití zásobníku nebo jiné paměťové struktury speciální typy algoritmů lze přepsat do nerekurzivní podoby přímo. Dělení rekurzí: •
•
přímá ‐ podprogram volá přímo sám sebe nepřímá ‐ podprogram A volá podprogram B, podprogram B volá podprogram C a ten volá podprogram A (dochází k vytvoření kruhového volání) Jiné dělení rekurzí: •
•
lineární ‐ podprogram při vykonávání svého úkolu volá sama sebe pouze jednou (vytváří se lineární struktura postupně volaných podprogramů – prostě strom, který se nevětví) stromová rekurze ‐ funkce nebo procedura se v rámci jednoho vykonání svého úkolu vyvolá vícekrát (vzniklou strukturu je možné znázornit jako strom ‐ pro dvě volání v jednom průchodu vzniká binární strom, pro tři ternární strom, atd.) Rekurze musí obsahovat •
•
•
ukončovací podmínku v každém kroku rekurze musí dojít ke zjednodušení problému V algoritmu se nejprve musí ověřit, zda nenastala koncová situace. Když ne, provede se rekurzivní krok. Převedení rekurze na iteraci Speciální případ V obrou následujících případech lze rekurzivní proceduru přímo převést na iteraci (O(k) je nerekurzivní operace s parametrem k, Φ() je nerekurzivní funkce se dvěma parametry). •
Případ 1 Rekurzivní procedura má tvar: P(k) { O(k) if(k > 0) P(k‐1) } Příslušná nerekurzivní procedura má pak tvar: for (i = k; i >= 0; i‐‐) O(i); •
Případ 2 Rekurzivní procedura má tvar: F(k) { if(k > 0) return Φ(F(k‐1),k) else return F0; } Příslušná nerekurzivní procedura má pak tvar: x = F0; for (i = 1; i < k; i++) x = Φ(x,i); return x; Použití zásobníku Udržujeme si datovou strukturu zásobník, která nahrazuje implicitní hardwarový zásobník použitý při rekurzivním volání. Sami si tedy na tento zásobník odkládáme vhodná data, která v následujících iteracích používáme k výpočtu. Použitím jiných datových struktur Princip práce je podobný, jako při použití zásobníku ‐ ručně si ve vhodné datové struktuře udržujeme data potřebná pro výpočet rekurzivních dat. Často se používá například binární strom. Použití rekurze Rekurze nám dáva možnost definice něčeho nekonečného konečným algoritmem. •
•
•
definice datové struktury Quiksort výpočet faktoriálu ‐ Nejčastějším příkladem rekurzivního postupu je výpočet faktoriálu N!, který lze spočítat pro celá kladná čísla podle vztahu N ! = N ⋅ ( N − 1)! a pro N = 0 je N! = 1 faktoriál(N):
pokud N = 0, potom výsledek = 1,
jinak výsledek = N * faktoriál(N - 1)
Jelikož při každém průchodu funkcí snižujeme hodnotu čísla N a testujeme, zda již N nabylo hodnoty 0, má funkce konec. Poznámka: V uvedeném příkladu je chyba, pokud je uvedená funkce volána pro číslo menší než nula, nebude nikdy splněna ukončující podmínka a dojde k zhroucení programu. Jedním z možných řešení je nahrazení podmínky N = 0 za N <= 0. graficky znázorněno… Materiály •
•
•
•
Wikipedia ‐ Rekurze Wikipedia ‐ Rekurzivní funkce Rekurze (výborná prezentace) Jan Cvejn ‐ Programovací techniky ‐ Převod rekurze na iteraci Algoritmy prohledávání s návratem, dynamické programování. Prohledávání s návratem (Backtracking) •
•
•
•
obecná metoda založená na prohledávání do hloubky stavového prostoru řešené úlohy cílem je nalézt cestu z počátečního stavu do cílového (koncového) stavu z výchozího stavu postupujeme neustále k cílovému dokud to jde jestliže je další postup nemožný, vracíme se o krok (nebo několik kroků) zpět k poslednímu "rozhodovacímu" místu a hledáme další cesty k cílovému řešení (strategie pokusu a omylu) . Dá se to dobře znázornit například stromem…prostě prozkoumáme všechny možné kombinace. •
touto metodou se řeší například úlohy označené jako problém pokrytí, problém vzájemného vyloučení, problém optimálního výběru, problém vzájemného přiřazení, problém obchodního cestujícího, generování permutací, hledání konvexní obálky, ... Problém pokrytí Snažíme se pokrýt šachovnice o velikosti n × n polí tahy koně, tj. hledáme posloupnost tahů, při níž se kůň dostane na každé políčko šachovnice právě jednou. Úloha vzájemného vyloučení zde Snažíme se umísti osm šachových dam na jedné šachovnici 8 × 8 polí tak, aby se vzájemné neohrožovaly. Problém vzájemného přiřazení Chceme nalézt množinu dvojic [a,b], a A, b B tak, že vyhovují určitým kritériům. Dobrým příkladem je například výběr školy pro uchazeče o studium. Problém optimálního výběru Rozšíření předchozích úloh se zaměřením na nalezení optimálního řešení (tedy ne prvního vyhovujícího). Problém obchodního cestujícího zde Máme dáno n měst a vzdálenosti mezi nimi. Úkolem je najít co nejkratší cestu takovou, že každým městem projdeme právě jednou a nakonec skončíme v původním městě (počátečním měste cesty). Generování permutací zde Máme dánu množinu prvků a naším úkolem je vygenerovat všechny možnost, jak jednotlivé prvky poskládat vedle sebe. Základní myšlenkou je, že se vždy jeden prvek zvolí jako pevný a vyrábíme permutace ze zbylých prvků (=> vhodné užití rekurze). Hledání konvexní obálky zde Máme dáno množinu bodů v rovině. Úkolem je nalezení konvexního mnohoúhelníku, který má vrcholy v některých zadaných bodech a všechny ostatní body leží v tomto mnohoúhelníku. některé z těchto problémů jsou popsané zde Dynamické programování •
metoda řešení problémů, které vykazují vlastnosti překrývajících se podproblémů nebo optimální podstruktury problém má překrývající se podproblémy stejné podproblémy jsou použity pro řešení více větších problémů (např. Fibonnaciho čísla) o problém má vlastnosti optimální podstruktura optimální řešení podproblémů vede na optimální řešení celého problému u funkcí, které opakovaně provádějí stejné výpočty, je vhodné hodnoty předpočítat (třeba při výpočtu Fibonacciho čísel) dva možné přístupy: o shora dolů ƒ problém rozložíme na podproblémy a jejich řešení si zapamatujeme (uložíme) pro případ, že by se nám hodila ƒ odpovídá rekurzi, při které si pamatujeme již nalezená řešení o zdola nahoru ƒ všechny podproblémy, které by se nám mohly při řešení problému hodit, jsou vyřešeny předem a následně použity pro vybudování řešení většího problému ƒ nalézt všechny potřebné podproblémy může být těžké využití například k určení nejdelší společné podposloupnosti, nalzení optimálního BVS, spočítání Fibonacciho čísel, průchod ohodnoceným polem, ... o
•
•
•
Určení nejdelší společné podposloupnosti (viz slidy 9c) Jsou dány dvě popsloupnosti čísel a úkolem je nalézt co nejdelší podposloupnost takovou, že ji lze vybrat z obou posloupností. Nalezení optimálního BVS (viz slidy 9c) Je dána množina prvků, které budeme chtít vyhledávat, a společně s ní pro každý prvek pravděpodobnost, že budeme daný prvek vyhledávat. Úkolem je sestavit binární vyhledávací strom takový, že průměrná doba vyhledávání jednoho prvku bude co nejmenší, tj. častěji vyhledávané prvky (s vyšší pravděpodobností) jsou blíže kořenu stromu. Násobení posloupnosti matic Vychází z toho, že při různém pořadí provádění násobení (tzn. při různé asociativitě) se výrazně liší počet operací, které musíme provést. Úkolem je určit pořadí násobení tak, aby se provedlo operací co nejméně. Počítání Fibonacciho čísel Úkolem je vygenerovat Fibonnaciho čísla F0 až Fn pro nějaké dané n, případně pouze nalézt Fibonacciho číslo Fn. Začínáme od nejmenších Fibonnaciho čísel a jejich spočítané hodnoty si ukládáme ‐ při výpočtu vyšších Fibonacciho čísel využíváme spočítaných a uložených menších čísel. Průchod ohodnoceným polem Je dána čtvrcová síť n × n polí a každému políčku je přiřazena hodnota reprezentující náročnost průchodu tímto políčkem. Začínáme v levém dolním rohu a úkolem je najít co nejméně náročnou cestu do pravého horního rohu, přičemž pohybovat se můžeme vždy pouze o jedno políčko vpravo nebo o jedno políčko nahoru. Materiály •
•
•
•
X36DSA, přednáška 9 (http://service.felk.cvut.cz/courses/X36DSA/Lesson09pubC.ppt) Wikipedia ‐ Backtracking (http://en.wikipedia.org/wiki/Backtracking) Backtracking Algorithms (http://www.cse.ohio‐
state.edu/~gurari/course/cis680/cis680Ch19.html#QQ1‐51‐128) Wikipedia ‐ Dynamic programming Zametací technika, metoda "rozděl a panuj". Zametací technika (Sweep Line Algorithm / Plane Sweep Algorithm) •
•
•
•
•
•
používá myšlenou zametací přímku nebo rovinu pro řešení různých problémů v Euklidovském prostoru svislou přímku suneme zleva doprava přes množinu objektů ‐ nikoliv spojitě, ale skáčeme mezi body, kde je nutno zastavit pamatujeme si informace o objektech nalevo od zametací přímky (y‐struktura, T) při průchodu nad objektem aktualizujeme y‐strukturu body jsou v prioritní frontě (x‐struktura, B, postupový plán) ‐ odebíráme je zleva doprava (využití předseřazení množiny bodů podle souřadnice x) tuto metodu používá algoritmus pro hledání minimálních bodů a průsečíků přímek v rovině Jinak řečeno: •
•
•
•
•
•
•
prostorem P proložíme přímku (zametací rovinou) a tuto přímku posouváme mezi dvěmi mezními polohami prostoru P spolu s přímkou udržujeme datovou strukturu S přímka rozděluje prostor na dvě poloviny ‐ levou (zde je úloha již vyřešena) a pravou(zde se bude řešení hledat) struktura S obsahuje informace o stavu řešení úlohy v levé části stav S se mění s polohou přímky v prostoru P při posouvání vpravo se mění stavy řešení přímka se posouvá po jednotlivých bodech Minimální body Úkolem je najít všechny takové body, od nichž nalevo ani dolů není žádný jiný bod. 1.
2.
3.
4.
Seřadíme body podle souřadnice x => x‐struktura (O(n ∙ log n)) Inicializujeme y‐strukturu na ∞ (O(1) na každý bod, dohromady O(n)) Scanline umisťujeme zleva doprava do bodů v x‐struktuře Do y‐struktury ukládám minimální souřadnici y (dohromady s předchozím krokem: O(1) pro každý bod, dohromady O(n)) Celková asymptotická složitost algoritmu tedy je: O(n ∙ log n) + O(n) + O(n) = O(n ∙ log n) Průsečíky úseček Jsou dány úsečky v rovině (koncovými body) a úkolem je najít jejich průsečíky rychleji než metodou každá s každou (O(n²)). Toho se docílí tak, že počítáme průsečíky jenom mezi sousedními úsečkami v T. Do y‐struktury ukládáme úsečky v pořadí, v jakém protínají scanline (od spoda); do x‐struktury ukládáme body, kde se mění pořadí úseček (na začátku jen koncové body úseček a později průběžně průsečíky sousedních úseček v T). 1. Inicializace: koncové body umístíme do B (seřazené podle souřadnice x), T je prázdná 2. Dokud není B prázdná: o vezmi bod z B (smaž ho v B) o dle typu bodu P aktualizuj T strukturu: ƒ P je počátečím bodem úsečky (levým) ƒ najdi v T sousední úsečky s1 a s2 úsečky s, jejímž počátečním bodem je bod P ƒ pokud s1 protíná s2, odstraň průsečík (už nejsou sousedy) ƒ vlož průsečík s1 a s a průsečík s a s2 do B ƒ P je průsečíkem úseček s a s' ƒ najdi v T sousedy s a s' (což jsou úsečky s1 a s2) ƒ prohoď v T pořadí úseček s a s' ƒ pokud s protíná s1, odstraň průsečík z B ƒ pokud s' protíná s2, odstraň průsečík z B ƒ vlož průsečík s a s2 a průsečík s' a s1 do B ƒ P je koncovým bodem úsečky (pravým) ƒ najdi v T sousední úsečky úsečky s1 a s2 úsečky s, jejímž koncovým bodem je bod P ƒ smaž úsečku s z T ƒ pokud s1 protíná s2, vlož průsečík do B Pro umístění scanline máme O(n + k) možných poloh (k je počet průsečíků), v každé poloze se provádí operace se složitostí O(log n). Asymptotická složitost hledání průsečíků úseček tedy je O((n + k) ∙ log n). Metoda "rozděl a panuj" Tato metoda spočívá v rekurzivním rozkládání problému na dva či více podproblémů stejného (nebo podobného) typu, dokud tyto podproblémy nejsou dostatečně jednoduché k vyřešení. Řešení podproblémů se pak zpětně skládají, až dostaneme řešení původního problému. Na principu "rozděl a panuj" pracují například algoritmy Quick‐Sort a MergeSort nebo rychlá Fourierova transformace (FFT). Metoda "rozděl a panuj" uplatňuje princip programování shora dolů. To vede k rekurzivnímu zápisu algoritmu ‐ obecně struktura takového algoritmu vypadá takto: Rekurzivně opakuj { Rozděl prostor P(n) na podprostory P(ni) P(ni) = P, i = 1,2,..k Aplikuj algoritmus A na podprostory P(ni), tím ziskáš řešení V(ni) Sloučením jednotlivých V(ni) vznikne řešení V(n) } Materiály •
•
•
X36DSA, přednáška 12 Wikipedia ‐ Sweep Line Algorithm Wikipedia ‐ Divide & Conquer Algorithm •
Metody řazení (X36DSA) Algoritmy řazení výběrem, vkládáním a zaměňováním. Řazení výběrem – Selection Sort Máme za úkol seřadit prvky od nejmenšího po největší nebo naopak. Princip algoritmu řazení výběrem (maxima nebo minima): •
•
projdeme pole, které máme seřadit a najdeme tam nejnižší (resp. nejvyšší) prvek tento prvek umístíme na začátek pole, tzn. všechny prvky posuneme o 1 za něj •
nyní se zabýváme zbytkem pole, na který aplikujeme stejný algoritmus, tj. najdeme ve zbytku nejmenší prvek a posuneme ho na začátek zbytku •
toto provádíme, dokud nejsou všechny prvky sežazeny, tj. posunujeme dolní hranici zbytkového pole až po předposlední prvek zdrojový kód algoritmu select sort for (i = 0; i < n‐1; i++) //dolni hranice zbytkoveho pole { jmin = i; //vyber minimalni prvek for (j = i+1; j < n; j++) //pro pole od dolni hranice do konce { if (a[j] < a[jmin]) // vyber minimum { jmin = j; } } min = a[jmin]; // postupne prehazej minimum nazacatek for (j = jmin; j > i; j‐‐) { a[j] = a[j‐1]; a[i] = min; } Asymptotická složitost Select Sortu •
výběr minima zabere pro každé zbytkové pole n‐k testů, kde k stoupá od 1 do n‐1 (k je dolní hranice zbytkového pole) •
celkem tedy máme •
1 2
n − n ) = Θ( n 2 )
(
2
počet hýbání s prvky je také Θ(n 2 ) . •
výsledná asymptotická složitost je tedy: (n-1)+(n-2)+...+2+1 =
n −1
1
∑ (n − k ) = 2 ( n
k =1
2
− n ) testů. Θ( n 2 ) Řazení vkládáním –Insertion Sort Jde o řazení vkládáním prvku na adekvátní pozici. Rozebereme opět po krocích… •
•
vezmeme první prvek pole. Necháme jej na začátku nyní vezmeme druhý prvek a ptáme se: je ten druhý menší než první? pokud ano, vložíme druhý prvek na jeho adekvátní pozici (ta je před prvním prvkem) •
podobně postupujeme i se třetím prvkem, vezmeme jej a vložíme jej k předchozím dvěma prvkům tam kam patří…tak samo i se čtvrtým •
takto to děláme se všemi dalšími prvky dokud nedojdeme na konec Kód algoritmu Insert Sort for (i = 1; i < n; i++) // i určuje číslo prvku, pro který řešíme, kam jej umístit { insVal = a[i]; // takže ho nejdříve vyberem z pole j = i‐1; while ((j >= 0) && (a[j] > insVal)) { // a pro každý před nímtestujeme, zda je prvek menší než ten před ním a[j+1] = a[j]; // pokud je, tak ho posunem o 1 dozadu j‐‐; // takto vytvoříme mezeru... } a[j+1] = insVal; // ..do které šoupneme náš prvek } Asymptotická složitost Insertion sortu při každé iteraci cyklu for provádíme urč. počet testů a posunů • testů, zda je prvek menší je pokaždé průměrně (k+1)/2 (1 přinejlepším, k přinejhorším), přičemž k roste od 1 do n. • posunů je pokaždé průměrně (k+3)/2 (přinejlepším 2, přinejhorším k+1 ) celkový počet testů a přesunů je pro všehny iterace… Složitost algoritmu může být tedy n 2 , ale v nejlepším případě může být i n. Výsledná 2
asymptotická složitost je tedy . Ο(n )
Řazení zaměňováním – Bubble Sort U tohoto algoritmu řešíme vždy pouze porovnání dvou sousedních prvků. Princip je takový (dejmetomu, že řadíme vzestupně): •
•
•
máme neseřazené pole prvků postupujeme po dvojicích prvků, pokud je levý větší než pravý, prohodíme je, jinak je nacháme tak. posuneme se na další dvojici, na kterou aplikujeme to samé •
•
•
pokračujeme tak až nakonec pole touto jednou iterací jsme v podstatě přenesli nejvyšší prvek pole na jeho konec. Resp. řekněme, že nám tam „probublal“ Dobře, tak teď máme nejvyšší prvek tam, kde má být, tak ho tam nechme a aplikujme shodý postup pro všechny prvky před ním •
•
druhým průběhem posuneme druhý nejvyšší prvek tam kde má být. Provedeme to samé opět pro prvky před ním opakujeme do té doby, dokud není pole seřazeno. Celkem tedy (n‐1)krát (je jasné, že pokud zbyde na začátku jeden prvek, nebudeme to už pro něj provádět, proto n‐1) Algoritmus Bubble Sort for (lastPos = n‐1; lastPos > 0; lastPos‐‐) // last pos = horní hranice pole které // probubláváme { for (j = 0; j < lastPos‐1; j++) { if (a[j] > a[j+1]) swap(a, j, j+1); } } Asymptotická složitost Bubble Sort •
počet testů je zde pevně daný (není žádný nejlepší ani nejhorší případ) a je to (n-1)+(n-2)+...+2+1 =
1 2
n − n ) = Θ( n 2 ) (
2
•
přesunů je ale v nejlepším případě 0, přinejhorším jich je stejně jako testů, takže 1 2
n − n ) = Θ( n 2 ) (
2
Je však jedno kolik je přesunů, protože v testech tam bude vždycky to n 2 . Proto je 2
výsledná asymptotická složitost rovna Θ(n )
Counting‐sort, Heapsort, Merge‐sort, Shell‐sort, Radix‐sort, Quick‐sort Counting sort Není to na slidech, takže jen krátce… Counting sort je algoritmus, který využívá pomocného pole, ve kterém je uložen počet výskytu jednotlivých prvků. Jeho princip je znázorněn na http://users.cs.cf.ac.uk/C.L.Mumford/tristan/CountingSort.html. Tento algoritmus je velice efektivní, pokud čísla, která chceme řadit mají malý rozsah (dejmetomu 0‐100). Asymptotická složitost algoritmu je, pokud rozsah čísel je větší než jejich počet, Θ(n) Heap sort Co je to halda (Heap)? – Halda je binární strom, kde v každém jeho podstromu platí, že hodnota předchůdce musí být menší než hodnota každého jeho následníka. Lépe to je vidět na obrázku… Jak je halda uložená? Haldu nemusíme ukládat do nějakých speciálních datových struktur, stačí pro to obyčejné pole, kdy používáme toto pravidlo: Pokud předchůdce má index v poli k, pak jeho bezprostřední následníci mají indexy 2k (levý následník) a 2k+1 (pravý následník). Pole ale musí být tím pádem indexované od 1čky. Více na obrázku… Jak je vidět, pole lze jednoduše vytvořit tak, že číslujeme prvky stromu od kořene zleva doprava. Princip Heap Sortu Předpokládejme, že vstupem je pole, které má vlastnosti haldy, pokud tomu tak není, nejprve z něj haldu vytvoříme. Poté postupujeme takto… • Odebereme z haldy její vrchol (jakoby kořen stromu) • Na jeho místo umístíme ten nejposlednější prvek z haldy (tzn. ten, který má nejvyšší index) • Haldu „přeskládáme“ tak, aby bylo zachováno její pravidlo (tzn. že předek má nižsí hodnotu než následníci) •
•
stejný postup aplikujeme do té doby, dokud nejsou z haldy odebrány všechny prvky seřazená posloupnost má tu vlastnost, že i když je halda seřazena v podstatě vzestupně, výsledná posloupnost je seřazena sestupně Popis algoritmu Jak se vytváří halda? V haldě platí rekurzivní pravidlo, že každý její podstrom musí být zase haldou. Proto aplikujeme algoritmus „vytvoř haldu“ pro všechny uzly stromu, které mají nějakého následníka. Pokud je uzel stromu listem, logicky u něj haldu vytvořit nedokážem. Vysvětlení je na obr. Na obrázku je neseřazená posloupnost v poli, kde jsme podle ní vytvořili strom podle pravidle, že kořen s indexem k má následníky 2k a 2k+1. Prvky které mají nějakého následníka jsou tedy umístěny v první polovině pole. Halda se poté z pole vytvoří tak, že postupujeme od poloviny na začtek a na každý prvek aplikujeme rekurzivní algoritmus „vytvořhaldu“. Heap Sort v poli: Vypadá to takto… Zdrojový kód Heap Sort void heapSort(Item a[], int size) { int i, j, // vytvoření haldy for (i = size/2; i > 0; i‐‐) repairTop(array, i, size); // seřazení haldy for (i = size; i > 1; i‐‐) { swap(a, 1, i); repairTop(array, 1, i‐1); } } Asymptotická složitost Heap Sort •
složitost operace RepairTop() – log 2 n (n je velikost haldy) •
vytvoření haldy – je potřeba v podstatě (n/2) RepairTop operací. jakto? protže... •
vytvoření haldy má tedy složitost O(n log(n)) složitost celkového seřazení – (n‐1) operací RapairTop(), tedy •
celková asymptotická složitost Heap Sortu je Θ( n ⋅ log 2
n) Řazení sléváním (Merge Sort) Merge Sort funguje na principu slévání dvou seřazených polí, které sloučí a vytvoří pole nové se seřazenými hodnotami obou původních polí. atd. atd. MergeSort využívá metody Divide and conquer, kdy problém rozloží na podproblém, které jednotlivě vyřeší a poté složí v řešení celého problému. Princip je vlastně takovýto… •
•
•
neseřazené pole rozdělíme na menší pole ty seřadíme postupně je slejeme ve výsledek Vypadá to v podstatě takto… K použití se přímo nabízí nějaká rekurze… Základ algoritmu Merge Sort void mergeSort(int a[], int aux[], int low, int high) { int half = (low + high) / 2; int i; if (low >= high) // Too small return; // Sort mergeSort(a, aux, low, half); // Left half mergeSort(a, aux, half, high); // Right half merge(a, aux, low, high); //Merge halves // Put results back to array a for (i = low; i <= high; i++) a[i] = aux[i]; } Konečné kopírování hodnot z pomocného pole aux zpět do pole a lze zrychlit tím, že místo kopírování jednotlivých hodnot vyměníme reference na pole a a aux. Dobře, to by byla ta rekurze, ještě zbývá popsat, co dělá funkce merge… void merge(int in[], int out[], int low, int high) { int half = (low + high) / 2; int i1 = low; int i2 = half + 1; int j = low; // Compare and merge while ((i1 <= half) && (i2 <= high)) { if (in[i1] <= in[i2]) { out[j] = in[i1]; i1++; } else { out[j] = in[i2]; i2++; } j++; } // Copy the rest (prostě pokud došlo jedno pole, tak tam hoď zbytek toho druhého) while (i1 <= half) { out[j] = in[i1]; i1++; j++; } while (i2 <= high) { out[j] = in[i2]; i2++; j++; } } Asymptotická složitost MergeSort Operace rozdělení řazených dat se vykoná Θ(log n)‐krát a jedna tato operace trvá konstantní dobu. Operace slévání se také vykoná Θ(log n)‐krát, avšak její časová složitost je Θ(n). Asymptotická složitost řazení sléváním je tedy Θ(log n) ∙ Θ(n) = Θ(n ∙ log n). Shell Sort Zase…není to na slidech, takže jen stručně. Metoda je velice podobná, co se její činnosti týče, metodě BubbleSort, ale je podstatně vylepšena, a proto také podstatně rychlejší. Pan Shelltři tvorbě této metody přišel na určité zákonitosti, jako např. na tu, že každý prvek se v posloupnosti přesune ve průměrném případě o jednu třetinu celkové délky posloupnosti. Tohoto poznatku a metodu BubbleSort přepracoval v tom smyslu, že měnil v každém průchodu posloupností vzdálenost dvojic prvků, které se měly uspořádat. Metoda pracuje tak, že neporovnává dva sousední prvky, ale prvky od sebe vzdálené o délku d. Tato délka se po každém průchodu posloupností zmenšuje na polovinu. Vztah pro přesnou časovou složitost nebyl odvozen; časová složitost, odvozená na základě experimentů, je O(N * (log2N)2). Přihrádkové řazení (Radix Sort) Radix sort je číslicové řazení, které používá pro seřazení jednotlivé složky hodnoty ‐ znaky či bity. Postupně od LSB nebo MSB řadí vždy každý řád zvlášť do „přihrádek“. Vypadá to takto (všimněte si, že přihrádky na obrázku mají charakter spojového seznamu)… Jak vypadá implementace a algoritmus? Prvky jsou pospojovány mezi sebou pomocí zřetězeného seznamu, tzn. každá hodnota obsahuje odkaz na následující prvek. V tomto seznamu probíhá tolik řazení, kolik je cifer nejvyššího čísla. Výhoda je ta, že zařazení každého prvku tam kam patří zabere jen 1 operaci – je to vlastně takový Insertion Sort až na to, že ostatní prvky nemusíme posouvat, ale „posunou“ se automaticky. Prostě jen vybereme prvek a umístíme ho tam kam patří. Implementace pomocí jednosměrného spojového seznamu: typedef struct slist_ { long val; struct slist_ *next; } slist; slist *radix_list(slist *l, int t) { int i, j, d, m = 1; slist *temp, *out, *head[10], *tail[10]; out = l; for (j = 1; j <= t; j++) { for (i = 0; i <= 9; i++) head[i] = (tail[i] = NULL); while ( l != NULL ) { d = ((int)(l‐>val/m)) % (int)10; temp = tail[d]; if (head[d] == NULL) head[d] = l; else temp‐>next = l; temp = tail[d] = l; l = l‐>next; temp‐>next = NULL; } for (i = 0; i <= 9; i++) if (head[i] != NULL) break; l = head[i]; temp = tail[i]; for (d = (i + 1); d <= 9; d++) { if (head[d] != NULL) { temp‐>next = head[d]; temp = tail[d]; } } m *= 10; } return (out); } Asymptotická složitost algoritmu Radix Sort provádí celkem d smyček, kde d je počet znaků nebo bitů "nejdelšího" (největšího, ...) prvku mezi daty. V každé smyčce se projdou všechna data, projití jednou smyčkou má tedy asymptotickou složitost Θ(n). Přihrádkové řazení má tedy aymptotickou složitost Θ(d) ∙ Θ(n) = Θ(d ∙ n). Quicksort Princip Quicksortu: 1. Zvolíme tzv. pivot, což je jeden z řazených prvků (podle slidů je to ten první v poli) 2. Přerovnáme prvky tak, že na začátku řazených dat budou všechny prvky, které jsou menší nebo stejné jako pivot, a v pravé části jsou všechny prvky, které jsou větší nebo stejné jako pivot. Prvky mající stejnou velikost jako pivot tedy mohou ležet v levé i v pravé části řazených dat. Po této operaci je již pivot na správném místě a dál se s ním nehýbe. 3. Rekurzivně stejnou technikou seřadíme levou a pravou část řazených dat Princip implementace: •
zvolí se pivot (na obrázku to je písmeno M – protože bylo první v poli) •
•
•
levý index se pohybuje doprava a zastaví se na prvku větším nebo rovném pivotovi pravý index se pohybuje doleva a zastaví se na prvku menším nebo rovném pivotovi pokud je levý index ještě před pravým, příslušné prvky se prohodí a oba indexy se posunou o 1 ve svém směru, jinak pokud se indexy rovnají, jen se oba posunou o 1 ve svém směru •
cyklus se opakuje, dokud se indexy nepřekříží, tj. pravý se dostane před levého (proto se v případě rovnosti posouvaly) •
pak nastává rekurzivní volání na úsek od začátku do pravého (!) indexu včetně a na úsek od levého(!) indexu včetně až do konce, má‐li příslušný úsek délku větší než 1 Implementace algoritmu: void qSort(Item a[], int low, int high) { int iL = low, iR = high; Item pivot = a[low]; do { while (a[iL] < pivot) iL++; while (a[iR] > pivot) iR‐‐; if (iL < iR) { swap(a, iL, iR); iL++; iR‐‐; } else { if (iL == iR) { iL++; iR‐‐; } } } while( iL <= iR); if (low < iR) qSort(a, low, iR); if (iL < high) qSort(a, iL, high); } Asymptotická složitost Operace přeuspořádání řazených dat do dvou částí (měnší než pivot a větší než pivot) trvá řádově Θ(n). V nejlepším případě se operace dělení pole, která je závislá na zvoleném pivotu, zavolá O(log n)‐krát, avšak v nejhorším případě k dělení a rekurzivnímu volání dojde n‐krát. K nejhoršímu přípajdu dojde tehdy, když pokaždé zvolíme pivot jako minimální nebo maximální prvek řazených dat. Potom se nám v každém kroku řazená data rozpadnout na část obsahující jeden prvek (nebo několik stejných) ‐ pivot a část obsahující všechny ostatní prvky. Asymptotická složitost algoritmu Quicksort je tedy O(n²), avšak "průměrná" asymptotická složitost je Θ(n ∙ log n). "Průměrné" asymptotické složitosti lze dosáhnout například vhodnou volbou pivotu. Materiály •
•
•
X36DSA, přednáška 2 X36DSA, přednáška 3 Demo ‐ Algoritmy řazení, vyhledávání a abstraktní datové typy Operační a paměťová složitost algoritmů řazení v průměrném, nejhorším a nejlepším případě Asymptotická operační (časová) složitost
Algoritmus Minimální Střední Maximální "Průměrná"
Paměťová Přístup složitost Stabilní Řazení výběrem Θ(n²) (Select Sort) Θ(n²) Θ(n²) Θ(n²) Θ(1) přímý dle implementace
Řazení vkládáním (Insert Sort) Θ(n) Θ(n²) Θ(n²) O(n²) Θ(1) přímý ano Řazení zaměňováním (Bubble Sort) Θ(n) Θ(n²) Θ(n²) O(n²) Θ(1) přímý ano Řazení haldou (Heap Sort) Θ(n ∙ log n) Θ(n ∙ log n) Θ(n ∙ log n) Θ(n ∙ log n) Θ(1) přímý ne Quicksort Θ(n ∙ log n) Θ(n ∙ log n) Θ(n²) Θ(n ∙ log n) Θ(log n) přímý ne Řazení sléváním Θ(n ∙ log (Merge Sort) n) Θ(n ∙ log n) Θ(n ∙ log n) Θ(n ∙ log n) Θ(n) sekvenční ano Přihrádkové řazení (Radix Sort) Θ(n ∙ d) Θ(n ∙ d) Θ(n ∙ d) přímý •
•
•
•
•
Θ(n ∙ d) O(n) ano n je rozsah vstupních dat d je počet cifer nebo znaků v "největším" prvku mezi čazenými daty veškeré logaritmy mají základ 2 vysvětlení proč jsou jednotlivé složitosti takové, jaké jsou, je u otázek Algoritmy řazení výběrem, vkládáním a zaměňováním a Heapsort, Merge‐sort, Radix‐sort, Quick‐sort paměťová složitost udává rozsah paměťového prostoru potřebného k provedení algoritmu. •
•
•
"průměrná" asymptotická složitost je taková složitost, která se ve spojitosti s algoritmem obvykle uvádí. Například u Quicksortu, který má asymptotickou složitost O(n²) se uvádí Θ(n ∙ log n), protože se dá vhodnou volbu pivotu vyhnout nepříznivému stavu s kvadratickou asymptotickou složitostí paměťová složitost log n u quicksortu je způsobena rekruzí (parametry se musí uložit na zásobník) paměťová složitost n u mergesortu je způsobena pomocným polem Metody vyhledávání (X36DSA) Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce). Adresní vyhledávání ‐ dělení •
•
•
indexování klíčem (přímý přístup) o klíč je přímo indexem (adresou) – např. pole[“Jan Novak”]=svobodny o rozsah klíčů odpovídá rozahu indexů (prostě kolik hodnot, tolik klíčů) o asymptotická složitost Θ(1) rozptylováním o výpočtem adresy z hodnoty klíče o kompromis mezi rychlostí a spotřebou paměti o složitost průměrně Θ(1) porovnáváním klíčů (nepatří mezi adresní vyhledávání, ale mezi asociativní vyhledávání; uvedeno jen pro porovnání) o nalezeno, když klíč_prvku = hledaný klíč o asymptotická složitost Ω(log n) o např. sekvenční vyhledávání, BVS,... Pokud máme k dispozici neomezené množství času, použijeme sekvenční vyhledávání (porovnávání klíčů). Pokud máme k dispozici neomezené množství paměti, použijeme přímý přístup (indexování klíčem). Pokud máme málo času i málo paměti, použijeme rozptylování, přičemž velikost tabulky reguluje čas vyhledávání. Rozptylování (Hashing) •
•
•
•
•
•
konstantní očekávaný čas pro vyhledávání a vkládání není vhodné pro operace výběru a řazení čas provádění je úměrný délce klíče univerzum klíčů = všechny možné klíče (prostě všechny hodnoty co chceme nahashovat) rozptylování se hodí, pokud použijeme pouze zanedbatelné množství klíčů vzhledem k počtu klíčů v univerzu dvě fáze: o výpočet rozptylovací funkce h(k) ƒ zobrazuje množinu klíčů K Є U do intervalu adres A=<amin, amax>, obvykle <0,M‐1> ƒ je silně závislá na vlastnostech klíčů a jejich reprezentaci v paměti ƒ ideálně je výpočetně co nejjednodušší (rychlá) ƒ aproximuje náhodnou funkci ƒ využívá rovnoměrně adresní prostor a generuje minimum kolizí => využívá všechny složky klíče ƒ
ƒ
kolize = funkce vrací stejnou hodnotu pro dva různé klíče (těm se pak říká synonyma) ‐ buď dochází k chybě v konverzi typů, nebo funkce funguje správně, avšak vrací blízké hodnoty v důsledku kolizí je aplikace extrémně pomalá •
o
příklad rozptylovací funkce: pro celá čísla např. h(k)=k mod M, kde M je velikost tabulky (viz obr.) vyřešení kolizí – kolize nastává na obrázku při pokusu umístit číslo 31 – index je obsazen, definice kolize je takováto: k1nerovná se k2, ale h(k1)=h(k2) ƒ zřetězené rozptylování ƒ otevřené rozptylování Zřetězené rozptylování (Separate Chaining) Příklad: mějme h(k) = k mod 3 (3 je také rozsah adres k umístění prvků), posloupnost klíčů je 1,5,21,10,7. Řešení pomocí zřetězeného rozptylování je na obr. Jsou to tzv. seznamy synonym, synonyma jsou ta čísla, pro která h(k) vrátí stejnou hodnotu. Takže zřetězené rozptylování ve zkratce… •
•
•
•
•
•
•
•
udržujeme zřetězené seznamy synonym na každý seznam ukazuje hlavička s příslušnou hodnotou přidělenou všem synonymům řetěz synonym má ideálně délku α = n / m, kde α > 1, n = počet prvků, m = velikost tabulky, m < n vkládání I(n) = thash + tlink = O(1) vyhledávání Q(n) = thash + tsearch = O(n) (extrém) nebo O(1 + α) (průměrně) mazání D(n) = thash + tsearch + tlink = O(n) (extrém) nebo O(1 + α) (průměrně) pro malá α (velká m) se hodně blíží O(1) poskytuje m‐násobné zrychlení oproti sekvenčnímu vyhledávání •
•
•
v praxi se volí m = n / 5 až m = n / 10 => α = 10 prvků na řetěz => vyplatí se hledání sekvenčně a neplýtvá se použitými ukazateli výhoda: nemusíme znát n předem nevýhody: potřebujeme dynamické přidělování paměti a potřebujeme paměť na ukazatele a na tabulku o velikosti m Otevřené rozptylování (Open‐Address Hashing) •
•
•
je znám předem počet prvků (alespoň odhadem) nechceme používat ukazatele (ani v prvcích, ani v tabulce) => posloupnost se ukládá do pole . Jeho délka je stejná nebo spíše o něco vyšší jako předpokládaný počet prvků. podle tvaru rozptylovací funkce řeší kolize: o lineární prohledávání (Linear Probing) ƒ při kolizi se pokoušíme prvek vložit stále o jednu pozici, dokud nenajdeme volné místo ƒ vytváří dlouhé shluky ƒ př.: hashovací funkce h(k)=(k+i) mod 5, kde i nastavíme např. na 1 o
dvojí rozptylování (Double Hashing) ƒ máme dvě hashovací funkce ‐ jednu hlavní a druhou kolizní, kterou (opakovaně) použijeme v případě kolize hlavní rozptylovací funkce ƒ vytváří vnořené sekvence ƒ příklad… •
α = n / m = zaplnění tabulky, α <0; 1>, n = počet prvků, m = velikost tabulky, volíme vždy větší tabulku, než je předpokládaný počet prvků. Otázka je o kolik větší by měla být – tak aby nedocházelo moc ke kolizím. Na to odpoví tabulka s výsledky výpočtů (sloupce určují zaplněnost tabulky)… •
•
zjištění ‐ tabulka může být více zaplněná, než začne klesat výkonnost => operace trvají úměrně zaplnění tabulky k dosažení stejného výkonu stačí menší tabulka Materiály •
•
X36DSA, přednáška 10 Vyhledávání Asociativní vyhledávání (sekvenční, půlením, binární vyhledávací stromy). Asociativní vyhledávání 1. implementované v poli o sekvenční vyhledávání o vyhledávání půlením 2. binární vyhledávací stromy Použitá označení: •
•
•
•
P(n) = paměťová složitost Q(n) = časová složitost vyhledávání I(n) = časová složitost vkládání D(n) = časová složitost mazání Sekvenční vyhledávání Sekvenční vyhledávání spočívá v postupném procházení prvků pole od jeho začátku. Složitost takového vyhledávání tedy velmi závisí na uspořádání dat v poli. Sekvenční vyhledávání v neseřazeném poli V každém kroku testujeme, zda jsme nenašli požadovaný prvek a zda už nejsme na konci pole => 2 testy na každý krok. •
•
•
•
•
P(n) = O(n) Q(n) = O(n) I(n) = O(1) D(n) = O(n) určení minima, maxima = O(n) Sekvenční vyhledávání v neseřazeném poli se zarážkou Od předchozího se liší tím, že před zahájením vyhledávání vložíme na konec pole hledaný prvek. Tím zajistíme, že nedojde k překročení konce pole a že hledaný prvek vždy najdeme. Ušetříme tak v každém kroku prohledávání jeden test (ten, který testoval dosažení konce pole). Ke změně asymptotické složitosti však nedochází. •
•
•
•
•
P(n) = O(n) Q(n) = O(n) I(n) = O(1) D(n) = O(n) určení minima, maxima = O(n) Vyhledávání půlením (binární) Binární vyhledávání využívá metodu půlení intervalů (typicky používanou při vyhledávání v telefonním seznamu). K jeho použití je nutné, aby prvky v poli byly seřazené. Vyhledávání zahájíme v polovině pole ‐ prvek, který tam najdeme, porovnáme s vyhledávaným prvkem. Pokud detekujeme shodu, končíme a oznámíme úspěch. Pokud ne, aplikujeme stejnou metodu pouze na část od začátku pole do středu pole (pokud prvek uprostřed pole je větší, než hledaný prvek) nebo na část od středu pole k jeho konci (v opačném případě). •
•
•
•
•
P(n) = O(n) Q(n) = O(log n) I(n) = O(n) D(n) = O(n) určení minima, maxima = O(1) //Recursive version int bs( key k, nodeT a[], int first, int last ) { if( first > last ) return –(first + 1); // not found int mid = ( first + last ) / 2; if( k < a[mid].key ) return bs( k, a, first, mid – 1); if( k > a[mid].key ) return bs( k, a, mid + 1, last ); return mid; // found! Binární vyhledávací stromy (BVS) •
•
•
uspořádaný (záleží na pořadí potomků) kořenový (jeden uzel je označen jako kořen) binární (uzel má 0, (1), 2 následníky) strom pro všechny uzly levého podstromu uzlu u platí, že jejich hodnota je menší, než hodnota uzlu u pro všechny uzly pravého podstromu uzlu u platí, že jejich hodnota je větší, než hodnota uzlu u … vypadá to například takto… •
následník uzlu u BVS – pokud shrnu obě možnosti, je to nejnižší pvek s vyšší hodnotou, než má u. o pokud existuje pravý syn, pak je minimální prvek pravého podstromu u o
pokud neexistuje pravý syn, pak je to minimální rodič, od kterého je uzel u vlevo •
•
•
•
•
•
•
•
•
•
předchůdce uzlu u BVS – prostě uzel s nejvyšší hodnotou z těch, které mají hodnotu nižší než u o pokud existuje levý syn, pak je to maximální prvek levého podstromu u o pokud neexistuje levý syn, pak je to minimální rodič, od kterého je uzel u vpravo vkládání ‐ najdu vhodný list a na správnou stranu nový prvek připojím mazání o list nemá potomky => je rovnou smazán o uzel má jednoho potomka => provede se přemostění (zapojíme potomka místo smazaného uzlu) o uzel má dva potomky => nahradíme ho předchůdcem (nebo následníkem), který má maximálně jednoho potomka h = výška BVS = O(log n) (vyvážený strom), ale také O(n) ("nudle") P(n) = O(n) Q(n) = O(h) I(n) = O(h) Q(n) = O(h) určení minima, maxima = O(h) určení předchůdce, následníka = O(h) Vyvažování stromů Jak lze vidět výše, složitost všech operací , které s BVS provádíme se rovná výšce stromu. Vyvažování stromů provádíme, abychom minimalizovali výšku stromu a mohli tak vykonávat operace na BVS s časovou složitostí O(h) = O(log n).viz. obr… V ideálním případě požadujeme, aby počet uzlů v levém podstromu každého uzlu byl shodný s počtem uzlů v pravém podstromu tohoto uzlu (silná podmínka). To však často není splnitelné a používají se slabší podmínky vyvážení. Tedy vyvažuje se dle: •
•
•
výška podstromů ‐ tzv. AVL stromy výška a počet potomků ‐ tzv. 1‐2 stromy váha podstromů ‐ tzv. váhově vyvážené stromy Rotace Pro vyvažování stromů se s výhodou používají rotace. Rozeznáváme 4 druhy rotací: •
levá rotace •
pravá rotace •
levo‐pravá rotace •
pravo‐levá rotace AVL stromy AVL stromy jsou výškově vyvážené stromy. Prázdný strom má výšku ‐1, neprázdný strom má výšku 1 + výška delšího potomka. Každý uzel má pak rozdíl výšek potomků (počítá se to: výška levého – výška pravého) ‐1, 0 nebo 1. Pokud by se náhodou přidáním prvku strom rozvážil (výška některého uzlu by se dostala mimo množinu {‐10,1}), je nutno toto korigovat rotací. Příklad AVL stromu… Váhově vyvážené stromy Někdy jsou označovány také jako stromy s ohraničeným vyvážením. Váha uzlu u je ½, pokud je u listem, jinak je váha uzlu u dána vzorcem v(u) = (|UL| + 1) / (|U| + 1), kde |UL| je počet uzlů v levém podstromu a |U| je počet uzlů obou podstromů uzlu u. Příklad váhově vyváženého stromu… Aby byl strom vyvážený, musíme dát nějakou hranici, kterou nesmí hodnota všech uzlů stromu překročit. Takové stromy se nazývají stromy s ohraničeným vyvažováním. Strom S má ohraničené vyvažování α, 0 ≤ α ≤ 0.5 , pokud pro všechny uzly u stromu S platí: α ≤ v(u ) ≤ 1 − α Červeno‐černé stromy Jedná se o speciální BVS, které splňují následující podmínky: 1. Každý uzel je červený nebo černý (to je v programu určeno bitovou hodnotou 1 nebo 0 ) 2. Každý list (nil) je černý 3. Pokud je uzel červený, pak oba jeho potomci jsou černí 4. Každá jednoduchá cesta z uzlu do některého z listů (cestujeme pouze "dolů") obsahuje stejný počet černých uzlů 5. Kořen je černý Příklad takového stromu… Nový pojem: černá výška uzlu x = počet černých uzlů na cestě z uzlu x do listu (x se do této cesty nepočítá) Materiály •
•
•
X36DSA, přednáška 7 X36DSA, přednáška 8 Vyhledávání 2 Operační a paměťová složitost algoritmů vyhledávání v průměrném, nejhorším a nejlepším případě Paměťová Vyhledávání Vládání Mazání Vyhledávání Typ složitost Q(n) I(n) D(n) P(n) Sekvenční Asoc. O(n) O(n) O(1) O(n) Nalezení Nalezení Nalezení minima, předchůdce následníka
maxima O(n) N/A N/A Půlením (binární) Asoc. O(n) O(log n) O(n) O(n) O(1) N/A N/A Binární vyhledávací Asoc. stromy O(n) O(h) O(h) O(h) O(h) O(h) O(h) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) N/A N/A Extrém Extrém O(n) O(n) O(1) Průměrně Průměrně O(1 + α) O(1 + α) N/A N/A úměrné úměrné α úměrné α
α N/A N/A Přímý přístup Adr. Extrém O(n)
Zřetězené Adr. O(m + n) Průměrně rozptylování O(1 + α) Otevřené Adr. rozptylování •
•
•
•
•
O(n) úměrné α n = velikost dat (počet prvků) h = hloubka binárního vyhledávacího stromu m = velikost tabulky α = n / m = zaplnění tabulky typ o asoc. = asociativní vyhledávání o adr. = adresní vyhledávání Podrobnosti jsou popsány u otázek Adresní vyhledávání (přímý přístup, zřetězení a otevřené rozptylování, rozptylovací funkce) a Asociativní vyhledávání (sekvenční, pulením, binární vyhledávací stromy).
Materiály •
•
•
X36DSA, přednáška 8 X36DSA, přednáška 9 X36DSA, přednáška 11 Vícerozměrné vyhledávání, geometrické vyhledávání a geometrické algoritmy. Věeobecným principem, který platí pro tyto algoritmy je předzpracovat si nějak data, abychom pak s nimi mohli lépe manipulovat. Například můžeme seředit body podle jejich x‐
složky, nebo podle úhlu, který svírají s určitým bodem… Hledání konvexní obálky Máme za úkol nalézt nejmenší konvexní mnohoúhelník obsahující všechny zadané body. Grahamův algoritmus Kontrola úhlu : vektorovým součinem… Složitost algoritmu: 1. Seřazení bodů dle osy x : O(n log n) 2. Nalezení horního a dolního řetězu: O (n) 3. celkem ‐> O(n log n) Jarvisův algoritmus ("balení dárku") 1. Vezmeme bod s minimalní hodnotou y a vodorovnou přímku, která jím povede. 2. Otačíme přímkou kolem bodu až narazíme na nový bod. 3. V něm uděláme to samé až projdeme všechny body. Jarvisův algoritmus je vhodný pro malý počet bodů na konvexním obalu. Nalezení bodu s minimální souřadnicí y má asymptotickou složitost O(n), nalezení konvexní obálky má pak složitost O(n) ∙ k, kde k je počet bodů tvořících konvexní obálku. Asymptotická složitost Jarvisova algoritmu je tedy O(n) + O(n) ∙ k = O(k ∙ n). Konvexní obálka metodou rozděl a panuj Seřadíme body podle souřadnice x a rekurzivně je dělíme na skupiny. U každé skupiny se vytvoří konvexní obálka vzniklé konvexní obálky se spojí (horní most, dolní most). Vypadá to asi takto (oranžově konvexní obálky skupin, žlutě zvýrazněny mosty). Nalezení horního mostu funguje takto: 1. Zvolíme na obou částech body, které jsou si nejblíže 2. Testujeme, zda netvoří horní most konvexní obálky 3. Zvolíme nový bod z levé části takový, který leží na konvexní obálce levé části a je neblíže k předchozímu bodu směrem nahoru 4. Testujeme, zda netvoří horní most konvexní obálky 5. Zvolíme nový bod z pravé části takový, který leží na konvexní obálce pravé části a je neblíže k předchozímu bodu směrem nahoru 6. Opakujeme od bodu 2, dokud nenajdeme horní most Hledání dolního mostu funguje obdobně. Seřazení bodů má asymptotickou složitost O(n ∙ log n), rozdělení na části také O(n ∙ log n) a nalezení mostů O(n). Asymptotická složitost hledání konvexní obálky metodou rozděl a panuj je tedy O(n ∙ log n) + O(n ∙ log n) + O(n) = O(n ∙ log n). Zametací technika Nad rovinou obsahující body suneme přímku zleva doprava a pomocí datové struktury, ve které jsou uloženy již vyřešené nebo řešené body, zpracovávame úlohu. Zametací techniku využívají například úlohy pro hledání minimálních bodů nebo hledání průsečíků úseček. Asymptotická složitost algoritmů využívajících zametací techniky je obvykle O(n ∙ log n). Více informací lze nalézt u otázky Zametací technika, metoda "rozděl a panuj". Voroného diagram •
je to struktura umožňující nalézt nejbližšího souseda daného bodu a vypadá takto •
•
•
•
•
•
•
planární graf (tzn. žádné dvě jeho hrany se nekříží) obsahuje tolik oblastí, kolik máme bodů (pro každý bod jedna oblast) hrana mezi dvěmi body je osou spojnice těchto bodů uzel diagramu je střed kružnice opsané alespoň třem bodům uzly mají stupeň alespoň 3 počet uzlů je 2n‐4, počet hran je n‐6 body v otevřených oblastech tvoří vrcholy konvexní obálky •
asymptotická složitost konstrukce Voroného diagramu je O(n ∙ log n), případně O((k + n) ∙ log n) Rozděl a panuj Ve výpočetní geometrii se používá například ke konstrukci Voroného diagramu. Více informací lze nalézt u otázky Zametací technika, metoda "rozděl a panuj". Materiály •
•
•
•
•
•
•
•
•
•
X36DSA, přednáška 11 ‐ Výpočetní geometrie algoritmy na konvexni obalku Graham, Jarvis, D&C Wikipedia ‐ Graham Scan Algorithm Wikipedia ‐ Jarvis Algorithm Wikipedia ‐ Sweep Line Algorithm Voronoi Diagram ‐ Applet Wikipedia ‐ Voronoi Diagram Voronoi Diagram using Divide‐and‐Conquer Paradigm Wikipedia ‐ Divide and Conquare Algorithm Datové struktury (X36DSA) Pole, tabulka, seznam, množina, strom, fronta, zásobník, halda. Základní vlastnosti, operace a jejich složitosti. Základní pojmy •
•
•
•
•
abstraktní datové typy (ADT) abstrahují od jak (jak jsou data zobrazena v paměti, jak jsou prováděny operace, ...) a zdůrazňují co (co si nimi operace s daty provádějí nezávisle na konkrétní implementaci) je to množina druhů dat a příslušných operací, které jsou přesně specifikovány je nezávislý na implementaci ADT je tvořen dvěmi částmi: o syntaxe (signatura) ‐ lze ji zapsat nebo zakreslit pomocí diagramu ("chobotnice") ƒ deklarace druhů (např. jména oborů hodnot) ƒ deklarace operací (např. jména operací, druhy a pořadí jejich argumentů, druh výsledku) o sémantika (axiomy) = popis vlastností operací datová struktura = realizace ADT (jedná se o jednu konkrétní implementaci) 1. zvol datový typ B, který bude implementovat A (např. pro implementaci intervalu čísel <1; 12> použijeme datový typ integer) 2. zvol reprezentaci objektů typu A pomocí ojbjektů typu B (např. jednička bude znamenat leden, dvojka únor, ...) 3. zapíšeme (zakódujeme) operace na objektu A pomocí operací objektu B Vlastnosti ADT •
•
•
počet a vzájemné uspořádání složek o statická = nemění se o dynamická = mění se typ komponent o homogenní = všechny stejného druhu o heterogenní = různého typu existence bezprostředního následníka o lineární = bezprostřední následník existuje (např. pole, seznam, ...) o nelineární = bezprostřední následní neexistuje (např. strom, tabulka, ...) Rozdělení ADT: •
•
Sekvenční o Zásobník (Stack) o Fronta (Queue) o Pole (Array) o Seznam (List) Asociativní o Tabulka (Table, Map) o Množina (Set) Pole Snad je jasné jak funguje pole. Pole je posloupnost prvků, každému prvku je přiřazen index. Atd. atd. Vlastnosti pole • všechny prvky stejného typu (homogenní) • všechny prvky současně v paměti • rychlý náhodný přístup • známý počet prvků ‐> statické pole • nenámý počet prvků ‐> dynamické pole • je dán počet dimenzí (n) a meze indexů • přístup k prvkům je řešen pomocí mapovací funkce Operace s polem • init(_, _): Index, Index → Array
•
•
vrací jednorozměrné pole se zadaným rozsahem indexů
O(n)
• upper(_): Array → Idx
•
•
vrací horní (vyšší) krajní index pole
O(1)
• lower(_): Array → Idx
•
•
vrací dolní (nižší) krajní index pole
O(1)
• set(_, _, _): Array, Idx, Elem → Array
•
uloží prvek do příslušného místa daného pole
•
O(1)
• get(_, _): Array, Idx → Elem
•
•
vrací prvek ležící na příslušném místě v daném poli
O(1)
Mapovací funkce • říká, jak bude pole umístěno do paměti • může se počítat buď po řádcích nebo po sloupcích •
•
•
•
po řádcích 2D: map(i,j) = a(imin, jmin) + (i‐imin) nj + (j‐jmin), kde a(imin, jmin) je base address, (i‐imin) je row offset, nj je počet sloupců, (j‐jmin) je column offset po slupcích 2D: map(i,j) = a(imin, jmin) + (i‐imin) + (j‐jmin) ni, položky znamenají to samé, akorát ni je počet řádků pole. Mapovací funkce vyžadují násobení, pro jejich urychlení můžeme využít tzv. Iliffovy vektory, díky nimž změníme násobení na sčítání. Příklad: máme pole A[3..4, 1..3, 0..2]. Pro nalezení prvku A[3,2,1] pomocí mapovací funkce bychom musel spočítat: adresa = (3 ‐ 3) ∙ (3 ‐ 1 + 1) ∙ (2 ‐ 0 + 1) + (2‐1) ∙ (2 ‐ 0 + 1) + (1 ‐ 0) = 4. Při použití Iliffových vektorů je postup následující: v poli první úrovně pod indexem 3 nalezneme ukazatel na začátek pole druhé úrovně. Tam pod indexem 2 nejdeme ukazatel na začátek pole třetí úrovně, v němž pod indexem 1 nalezneme hledaný prvek. Tabulka použití: Kartotéka, asociativní paměť, převod mezi kódy, četnost slov,... vlastnosti • homogenní, dynamická (nejen) a nelineární •Obsahuje položky jednoznačně identifikované klíčem (podle klíče se položky vyhledávají) • klíč jen 1x (je jedinečný) • Př.: seznam hospod, klíčem je jejich jméno. Operace ‐ vytvoření tabulky init: ‐> Table insert(_,_,_): Key, Elem, Table‐> Table ‐vložení prvku do tabulky read(_,_): Key, Table ‐> Elem ‐přečtení prvku delete(_,_): Key, Table ‐> Table ‐smazání prvku search(_,_): Key, Table ‐> Bool ‐vyhledání prvku Implementace tabulky Implementujeme ji v obyčejném polu • pro malé rozsahy klíčů • sekvenční hledání … O(n) • přímý přístup(key = index) … O(1), např. convertToLatin2( char_kamenický) LUT[char_kamenický] •Pro velké množství klíčů • Hash tables … average O(1) to O(n) Seznam •
•
•
Posloupnost údajů Ukazovátko Pouze v místě ukazovátka lze přidat /zrušit / aktualizovat prvek.Vkládáme před ukazovátko(obr. vlevo), pokud mažeme, vkládáme ukazovátko na další prvek(obr. vpravo) • Homogenní, lineární, dynamický Operace • init: → List (vytvoří nový seznam) • insert(_, _): Elem, List → List (vloží prvek do seznamu) • read(_): List → Elem (vrátí prvek, na který ukazuje ukazovátko) • delete(_): List → List (smaže prvek, na který ukazuje ukazovátko) • first(_): List → List (nastaví ukazovátko na začátek seznamu) • last(_): List → List (nastaví ukazovátko na konec seznamu) • next(_): List → List (nastaví ukazovátko na následující prvek) • prev(_): List → List (nastaví ukazovátko na předchozí prvek) • length(_): List → Number (vrátí počet prvků v seznamu) • empty(_): List → Bool (zjistí, zda je seznam prázdný) • full(_): List → Bool (zjistí, zda je seznam plný) • atbeg(_): List → Bool (zjistí, zda je ukazovátko na začátku seznamu) • atend(_): List → Bool (zjistí, zda je ukazovátko na konci seznamu) • new: → Seq (vrací prázdnou posloupnost) • cons(_, _): Elem, Seq → Seq (vlož prvek do čela posloupnosti) • cons2(_, _): Elem, List → List (vlož do čela) • mark(_): Seq → List (vlož ukazovátko do čela posloupnosti) Implementace • V poli •
• Složitost O(n) pro operace insert, delete • Složitost O(1) pro operace first, prev, last, next Zásobníky v poli •
• Složitost O(1) pro operace insert, delete, next, prev • Složitost O(1) pro operace first, last V dynamické paměti o
o
Spojový seznam – jednoduchý, dvojitě linkovaný a dvojitě linkovaný cirkulární Složitosti jsou O(1) pro všechny operace kromě delete, to má O(n) Množina Může být bez i s opakováním prvků. Prvky množiny mohou být různé: celá čísla, logické hodnoty… operace: []: Set (prázdná množina) ins(_,_): Elem,Set ‐>Set (vložení prvku) del(_,_): Elem,Set ‐>Set (zrušení prvku) in(_,_) : Elem,Set ‐>Bool(test přísluš.) card(_) : Set‐>Nat (počet prvků) Strom Použijeme jej při řazení, vyhledávání, vyhodnocování výrazů, ... Vlastnosti •
je to acyklický souvislý graf •
kořenový strom –
orientovaný strom, zvláštní uzel ‐ kořen –
kořen spojen se všemi uzly orient. cestou –
binární strom ‐ má 0, (1), 2 následníky –
uspořádaný binární strom ‐ dvojice <u, u1> –
a <u, u2> jsou uspořádány • uzel má více následníků • binární strom ‐ 2 následníci • následník ‐ opět strom • homogenní, nelineární (následníků může být více), dynamická Operace: • empty: → Tree (vytvoří prázdný strom) • leaf(_): Elem → Tree (udělá z prvku strom s jedním uzlem) • cons(_, _, _): Elem, Tree, Tree → Tree (z prvku udělá kořen stromu s danými podstromy) • left(_): Tree → Tree (vrátí levý podstrom) • right(_): Tree → Tree (vrátí pravý podstrom) • null(_): Tree → Bool (zjistí, zda je strom prázdný) • setLeft(_, _): Tree, Tree → Tree (změní levý podstrom) • setRight(_, _): Tree, Tree → Tree (změní pravý podstrom) • setInfo(_, _): Tree, Elem → Tree (nastaví prvek v kořenu stromu) • info(_): Tree → Elem (vrátí prvek, který je kořenem stromu) Fronta úlohy hromadné obsluhy • FIFO = First‐in, First‐out ‐ kdo dřív přijde, ten dřív mele • přístup pouze k prvnímu prvku (front) • vkládání pouze na konec (back) • homogenní, lineární, dynamická Operace •
•
•
•
•
init: → Queue o vytvoří novou prázdnou frontu o O(1) front(_): Queue → Elem o vrací prvek, který je v čele fronty (ale nechává ho ve frontě) o O(1) delFront(_): Queue → Queue o odebírá prvek z čela fronty Q o O(1) insLast(_, _): Elem, Queue → Queue o vloží prvek na konec fronty o O(1) empty(_): Queue → Bool o říká, jesli je fronta prázdná O(1) ‐ máme dva ukazatele, jeden na začátek a druhý na konec fronty, porovnáním testujeme prázdnost fronty length(_): Queue → Number o vrací počet prvků ve frontě o O(1) ‐ máme dva ukazatele, jeden na začátek a druhý na konec fronty, odečtením zjistíme počet prvků ve frontě
o
•
Implementace •
v poli o lineární o cirkulární •
v dynamické paměti Zásobník Použití: odložení informace, výběr v opačném pořadí (návrat z procedury, uzlové body cesty, náboje v pistoli,...) Vlastnosti • LIFO = Last‐in, First‐out ‐ „poslední tam, první ven“ • přístup pouze k prvku na vrcholu (top) • vkládání pouze na vrchol (top) • homogenní, lineární, dynamický operace •
•
•
•
•
•
•
•
init: → Stack o vytvoří nový prázdný zásobník o O(1) empty(_): Stack → Bool o říká, jestli je zásobník prázdný o O(1) ‐ testujeme jestli je top nulový push(_, _): Elem, Stack → Stack o přidá prvek na vrchol zásobníku o O(1) top(_): Stack → Elem o vrací prvek na vrcholu zásobníku (ze zásobníku tento prvek neodebírá) o O(1) pop(_): Stack → Stack o odebere prvek z vrcholu zásobníku o O(1) length(_): Stack → Number o vrátí počet prvků na zásobníku o O(1) max: Number o vrací maximální možný počet prvků v zásobníku o O(1) full(_): Stack → Bool o pokud chceme zásobník kapacitně omezit o vrací, zda je zásobník plný o O(1) Implementace •
v poli •
v dynamické paměti Halda Haldu jsme popisovali u řazení Heap Sort – haldu můžeme mimo jiné realizovat polem. Materiály •
•
•
•
•
•
•
•
•
•
•
•
X36DSA, přednáška 4 X36DSA, přednáška 5 Miroslav Beneš ‐ Abstraktní datové typy Wikipedia ‐ Fronta Zásobník Pole Lineární spojový seznam Miroslav Beneš ‐ Strom Miroslav Beneš ‐ Množina Wikipedia ‐ Halda Halda Grafové algoritmy a jejich složitost (X36TIN) Prohledávání grafu do hloubky a do šířky. Prohledávání grafu do šírky (Breadth‐First Search) Je zadán graf G = 〈H,U,σ〉 (není podstatné, zda NG nebo OG) a jeho uzel s ∈ U. Výsledkem algoritmu je BF strom, což je strom nejkratších cest z uzlu s do všech dosažitelných uzlů. Při prohledávání se ze startovacího uzlu prohledávaným grafem šíří "vlna", která v každém kroku nalezne všechny uzly, které mají od startovacího uzlu stejnou vzdálenost. Popis algoritmu BFS: Stavy uzlu… •
•
•
FRESH –uzel, ke kterému ještě vlna nedospěla OPEN – uzel na hraně vlny CLOSED – uzly, přes které vlna již proběhla Jak to celé funguje? U každého uzlu si budeme pamatovat, na kolik kroků jsme se tam dostali (datová struktura d[u]). Postupujeme takto… 1) všechny uzly dáme na začátek FRESH, pak dáme OPEN uzel u (to je ten uzel, z něhož hledáme nejkratší cesty) 2) u každého uzlu, který je OPEN zjistíme, jaké má sousedy ve stavu FRESH 3) u každého uzlu si budeme pamatovat i jeho předchůdce (datová struktura p[u]). Do fronty si ukládáme uzly, které jsou FRESH a ty poté z fronty vybíráme a dáváme je do stavu OPEN. Vypadá to asi takto… FRESH ‐> |Fronta|‐>OPEN. 4) Pokud vyčerpáme všechny sousedy uzlu (všichni budou již OPEN), pak můžeme tento uzel uzavřít (dáme CLOSED) Pěkně je to ukázané na slidu 20 – přednáška 4 z TIN. Výsledek projití algorimu vypadá takto: Každý uzel má určeného svého předchůdce a má určenou vzdálenost od uzlu u. Nyní budeme dejmetomu chtív znát nejkratší cestu z uzlu u do uzlu v. Postupujeme tak, že vezmem hranu z uzlu v k jeho předchůdci. To je poslední hrana cesty. Dále postupujeme opět po šípkách, které nás dovedou až k uzlu u. Proto jsme si pamatovali u každého uzlu jeho předchůdce. Použité datové struktury: •
•
•
•
stav[u] Fresh / Open / Closed d[u] ‐ zjištěná vzdálenost s‐>u p[u] ‐ předchůdce uzlu u fronta ‐ obsahuje OPEN uzly Pseudokód: void BFS (Graph G, Node s) { for (Node u in U(G)‐s) { // Úvodní nastavení všech uzlů kromě startovního uzlu stav[u] = FRESH; // Všechny jsou Fresh d[u] = ∞; // Zatím není známa cesta z uzlu s do žádného jiného uzlu p[u] = null; // Zatím není známa žádná cesta => neznáme ani předchůdce uzlů } stav[s] = OPEN; // Hledání zahájíme uzlem s d[s] = 0; // s je startovní uzel p[s] = null; // s je první uzel na cestě, nemá předchůdce Queue.Init(); Queue.Push(s); // Do fronty vložíme počáteční uzel while (!Queue.Empty()) { // Opakujeme, dokud není fronta prádná u = Queue.Pop(); // Vezmeme první uzel, který je na řadě for (v in Adj[u]) { // Nalezneme všechny jeho sousedy if (stav[v] == FRESH) { // Pro každého Fresh souseda uzlu u: stav[v] = OPEN; // Soused je dosažitelný z uzlu s (už byl nalezen) d[v] = d[u]+1; // Vzdálenost souseda od uzlu s je o 1 větší, něž vzdálenost uzlu u p[v] = u; // Předchůdcem je uzel u Queue.Push(v); // Uložíme souseda do fronty } } stav[u]=CLOSED; // Zpracovali jsme všechny sousedy uzlu u, postupujeme dál a uzel u již nepoužijeme } } Asymptotická složitost algoritmu: •
•
•
•
úvodní cyklus nastavení všech uzlů (na hodnotu FRESH) má složitost O(|U|) operace s frontou má složitost O(1) na uzel, uzlů je v grafu celkem O(|U|), asymptotická složitost všech operací s frontou je tedy O(|U|) operace v cyklu for přes sousedy jednotlivých uzlů se provede jednou pro každého souseda => má tedy asymptotickou složitost O(|H|) celková asymptotická složitost BFS je tedy O(|U|) + O(|H|) = O(|U| + |H|) Prohledávání grafu do hloubky (Depth‐First Search) Základní myšlenkou DFS je snaha postupovat stále dál od počátečního uzlu dosud neprozkoumaným směrem. Když už to dál nejde, vrátíme se a postupujeme jinou cestou zase co nejdál. Jinými slovy postup spočívá v postupování stromem stále dál, dokud existuje FRESH následník. Pokud už uzel nemá FRESH následníka, uzavřeme ho a vrátíme se k předcházejícímu uzlu. Výsledkem prohledávání do hloubky bude DF strom (nebo les) a používá se například k topologickému uspořádání uzlů nebo k hledání silných komponent (viz následující kapitola). Topologické uspořádání uzlů (obyčejného) orientovaného grafu je posloupnost u1, u2, ..., un taková, že každá hrana (ui, uj) má i<j. Použité datové struktury Při prohledávání do hloubky si již nepotřebujeme pamatovat délku cesty d[u], protože tato cesta prostě nejkratší nebude, ostatně my nejkratší cestu již nehledáme. Místo toho bude užitečné si pamatovat dvojici časových značek: čas otevření (d[u])) a čas uzavření uzlu (f[u]). Tyto časy si budeme pamatovat ke každému uzlu. Objevení nového uzlu časové počítadlo zvýší o 1. Dále si pamatujeme to samé, co u prohledávání do šířky, tzn. stav uzlu (FRESH,OPEN,CLOSED) a jeho předchůdce. Tedy shrnutí… Uzly jsou opět FRESH, OPEN nebo CLOSED, ale mají časové značky s hodnotami 1 až 2 ∙ |U|. •
•
časová značka d[u] se uzlu u přidělí při jeho otevření časová značka f[u] se uzlu u přidělí při jeho uzavření (tzn. d[u] < f[u]) Algoritmus Průběh algoritmu je dobře zobrazen na slidu 24 – prednaska 4 TIN. Výsledek je takovýto Pokud můžeme napsat pro všechny určité uzly mezi u a v, že u těchto uzlů u+1 až v jsou jejich otevírací/uzavírací doby podintervalem otevírací / uzavírací doby uzlu u, pak tyto uzly jsou vlastně cestou z u do v. Prohledávání do hloubky nám rozdělí hrany grafu do 4 skupin: •
•
•
•
Stromové hrany – hrany, přes které jsem vlastně strom cest objevil Zpětné hrany – hrana, která v průběhu hledání směřuje do již otevřeného uzlu Dopředné hrany – jsou to hrany, které značí jakousi „zkratku“ – prostě například hrana z uzlu 1 do uzlu 5 na obrázku – pokud pujdeme po ní a ne po stromových hranách, zkrátíme si podstatně cestu Příčné hrany – Směřují v průběhu algoritmu do již uzavřených uzlu. Pseudokód algoritmu: void DFS (Graph G) { for (Node u in U(G)) { // Počáteční nastavení všech uzlů grafu stav[u] = FRESH; // Každý uzel je zatím Fresh p[u] = null; // Žádný uzel zatím nemá předchůdce } i = 0; // "Počítadlo času" for (Node u in U(G)) // Pro každý uzel u if (stav[u] == FRESH) // Pokud je stav uzlu u Fresh DFS‐Projdi(u); // Prohledej do hloubky strom s kořenem u } void DFS‐Projdi(Node u) { stav[u] = OPEN; // Zpracováváme strom s kořenem u d[u] = ++i; // Čas jeho otevření je o 1 více, než poslední přidělená časová značka for (Node v in Adj[u]) // Najdi všechny sousedy uzlu u if (stav[v] == FRESH) { // Pokud je soused v uzlu z Fresh... p[v] = u; // ...pak je jeho předchůdcem uzel u DFS‐Projdi(v); // Prohledáme do hloubky strom s kořenem v } stav[u] = CLOSED; // Zpracovali jsme celý strom s kořenem u => uzel u již můžeme uzavřít f[u] = ++i; // Nastavíme časovou značku uzavření } Asymptotická složitost algoritmu: •
•
•
počáteční nastavení uzlů má asymptotickou složitost O(|U|) DFS‐Projdi se volá jednou pro každého souseda, tedy celkem O(|H|)‐krát celková asymptotická složitost DFS je tedy O(|U|) + O(|H|) = O(|U| + |H|) Materiály •
•
•
•
•
X36TIN, přednáška 4 Prohledávání do šířky a do hloubky Demo ‐ Prohledávání do šířky Demo ‐ Prohledávání do hloubky Demo ‐ DFS Animation Orientované grafy, topologické uspořádání, silná souvislost. Orientovaný graf Je zadán jako uspořádaná trojice G = <H, U, σ> … prvky množiny H jsou orientovanými hranami grafu G, prvky množiny U jsou uzly grafu G a zobrazení σ incidencí grafu G. H, U jsou libovolné disjunktní množiny. Nyní co je to incidence… •
•
•
σ:H ‐> U×U je zobrazení (U×U je množina všech uspořádaných dvojic) σ(h) = (u, v) ... počáteční / koncový uzel hrany h u je následník uzlu v, v je předchůdce uzlu u pokud jsou si v grafu nějaké incidence rovny, tedy σ(h1) = σ(h2) ...pak graf obsahuje rovnoběžné hrany a nazývá se multigraf Prostý graf je takový orientovaný graf, který neobsahuje rovnoněžné hrany. Obyčejný graf je prostý OG bez smyček. Symetrizace grafu je taková operace, při níž se odstraní orientace hran (převod orientované grafu na neorientovaný). Opačná operace se nazývá zavedení orientace. Cyklus je uzavřená orientovaná cesta, acyklický graf neobsahuje cykly. Při zjišťování acykličnost grafu postupně odebíráme všechny kořeny a listy. Pokud je výsledný graf neprázdný, tak obsahuje cyklus. Úplný symetrický orientovaný graf je prostý orientovaný graf (tzn. bez rovnoběžných hran), v němž je každá uspořádaná dvojice uzlů spojena orientovanou hranou. Vstupní stupeň uzlu δ‐(u) je počet hran, které do uzlu vstupují (končí v něm). Výstupní stupeň uzlu δ+(u) je počet hran, které z uzlu vystupují (začínají v něm). Platí Σδ‐ (všech uzlů) = Σδ+ (všech uzlů) = |H|. Topologické uspořádání …orientovaného grafu je posloupnost u1, u2, ..., un taková, že každá hrana (ui, uj) má i<j. Jinými slovy je to takové uspořádání uzlů, kde je pro každou hranu (u,v) uzel u před uzlem v. Toto uspořádání lze zavést pouze pro acyklický graf. Topologické uspořádání lze vyjádřit tak, že uzly seřadíme do jedné horizontální úrovně a orientace všech hran pak musí směřovat jedním směrem – např. zleva doprava. Pokud z grafu na obrázku odstraníme hranu z e do c, která tvoří cyklus pak bude mít graf topologické uspořádání. Jak graf topologicky uspořádat? Naivní algoritmus budeme postupně odebírat kořeny grafu, tj. uzly se vstupním stupněm δ‐(u)= 0. Takto se také hledá cyklus v grafu (schválně zkus na obrázku výše). Opakuji však, že topologicky uspořádat lze jen graf acyklický, takže předpokládáme, že vstupem bude takovýto graf. Jak tedy efektivně graf topologicky uspořádat? •
•
•
•
nejdříve pro každý uzel grafu spočítáme jeho δ‐(u) a množinu jeho následníků Γ(u). Následníci jsou ty uzly, do kterých vstupuje hrana z uzlu u. při každém vypuštění kořene upravíme δ‐(u) pro jeho následníky, při poklesu δ‐(u) na nulu zařadíme uzel u mezi kořeny odebíráme kořeny, dokud nějaké máme výsledné pořadí odebírání uzlů je jejich topologickým uspořádáním Algoritmus hledání topologického uspořádání na základě DFS: •
•
•
•
na začátku máme prázdný seznam S provádíme DFS(G) a v okamžiku f[u], tj. v okamžiku uzavírání uzlu, přidáme tento uzel na začátek seznamu S (tedy podle obrázku bude seznam S obsahovat uzly (5), dále (6,5), dále (3,6,5)...nakonec(1,4,7,8,9,2,3,6,5)) pořadí uzlů v seznamu S je jejich topologickým uspořádáním (podle příkladu to skutečně funguje) asymptotická složitost je stejná jako u DFS: O(|U|+|H|) Silná souvislost Souvislý graf je takový (neorientovaný) graf, v němž platí, že pro každé dva vrcholy x, y existuje alespoň jedna cesta z x do y. Nutná podmínka pro tento fakt je, že každý vrchol má stupeň alespoň 1. Silně souvislý graf V silně souvislém orientovaném grafu G platí pro každou dvojici uzlů u, v , že existují spojení jak z uzlu u do uzlu v, tak i z uzlu v do uzlu u (spojení je cesta, která bere v potaz šipky). Základem silné souvislosti je existence cyklů v grafu. Pro orientované grafy se zavádí dva "druhy" souvislosti: •
•
slabá souvislost ‐ graf je slabě souvislý, pokud jeho symetrizace (odstranění orientace) je souvislý graf silná souvislost ‐ graf je silně souvislý, pokud pro každé dva vrcholy x, y existuje cesta z x do y i z y do x. Silná komponenta grafu Je to maximální podgraf grafu, o kterém se dá říct, že je silně souvislý.Např. graf na obrázku je silně souvislý a je tvořen jedinou silnou komponentou. Kondenzace silně souvislého grafu G je proces, kdy každou silnou komponentu grafu G nahradíme jedním uzlem. Hrany k tomuto uzlu a z tohoto uzlu vedeme tak, jak to předtím bylo u té silné komponenty. Algoritmus určení silných komponent pomocí DFS: •
pomocí DFS(G) se určí f[u] pro všechny u z U (výsledek na obrázku) •
•
vytvoří se G‐ (opačně orientovaný graf) provede se DFS(G‐) s tím, že uzly v hlavním cyklu se berou v klesajícím pořadí f[u]. •
•
stromy DF‐lesa určují silné komponenty asymptotická složitost je stejná, jako při spuštění dvou DFS: O(|U|+|H|) Zdroj •
•
•
X36TIN, přednáška 3 (http://service.felk.cvut.cz/courses/36TI/XTI‐Prednaska‐03.ppt) X36TIN, přednáška 4 (http://service.felk.cvut.cz/courses/36TI/XTI‐Prednaska‐04.ppt) Wikipedia ‐ Souvislý graf Minimální kostra grafu, nejkratší cesty Minimální kostra grafu Faktor grafu G je podgraf grafu G, který má stejnou množinu vrcholů jako graf G. Kostra grafu G je faktor grafu G, který obsahuje minimální počet hran, je to tedy takový faktor, který je zároveň stromem. Počet hran kostry je |H| = |U| ‐ p, kde p je počet komponent (komponenta grafu je jeho maximální souvislý podgraf). Pro souvislý graf má tedy kostra |H| = |U| ‐ 1 hran. Počet hran kostry udává hodnost grafu h(G). Minimální kostra grafu má smysl pouze pro ohodnocené grafy (pro neohodnocené grafy jsou si zřejmě všechny kostry rovnocenné s délkou |U|‐1). Minimální kostra je taková kostra grafu, která má při nezáporném ohodnocení stran grafu nejmenší součet délek svých hran. Například tato… Algoritmy pro minimální kostry Algoritmy pro hledání minimálních koster se opírají o tento generický algoritmus (algoritmus se nazývá Generic MST (Minimum Spanning Tree)): T := 0; // T je množina hran tvořících kostru dokud T není kostra { vyber vhodnou hranu (u,v); T = T (u,v); } Používáme dva algoritmy pro hledání minimálních koster: Borůvkův‐Kruskalův a Jarníkův‐
Primův. Borůvkův‐Kruskalův algoritmus Princip: Na začátku každý uzel tvoří osamocenou množinu. My si seřadíme hrany do neklesající posloupnosti podle jejich váhy a těmto množinám postupně přidáváme další uzly a hrany mezi nimi. Přidáváme ty hrany, které mají co nejnižší ohodnocení, tedy vybíráme hrany ze seřazené posloupnosti. Algoritmus se opírá o 3 množinové operace: •
•
•
MAKE_SET(u) ‐ vytvoření množiny o jednom prvku s reprezentantem u UNION(u, v) ‐ sjednocení dvou množin, přičemž reprezentantem může být kterýkoliv prvek (obvykle však jeden ze dvou reprezentantů sjednocovaných množin) FIND_SET(u) ‐ vrací reprezentanta množiny Pseudokód: A := 0; for (každý uzel u) MAKE_SET(u); uspořádej H do neklesající posloupnosti podle ohodnocení; for (každá hrana (u,v) dle neklesajícího pořadí) { if(FIND_SET(u) != FIND_SET(v)) { A:=A (u, v); přidej hranu do kostry UNION(u, v); spoj množiny uzlů } } Asymptotická složitost: Řazení hran má asymptotickou složitost O(|H| ∙ log |H|), množinový rozklad pak O(|H| ∙ log* |U|), kde log* je velmi pomalu rostoucí inverzní Ackermannova funkce s jedním parametrem. Celková asymptotická složitost Borůvkova‐Kruskalova algoritmu je tedy O(|H| ∙ log |H|). Jarníkův‐Primův algoritmus Seřadíme si hrany opět podle váhy, ale dílčí kostra se nechává růst pouze z jednoho zdroje, přidání hran není libovolné, ale protáhne kostru k dalšímu uzlu. •
•
•
nejdříve se uzly nahází do prioritní fronty a sice podle hodnoty d[u], což je vzdálenost uzlů od dosud vytvořené kostry. Na začátku je vzdálenost každého uzlu nekonečno, protože fronta ještě žádná není. vybereme si první startovní uzel a dáme mu vzdálenost 0, jeho předchůdce bude NULL. Pak vyberem z fronty uzel, jehož připojením bychom přidali hranu s nejnižším ohodnocením Pseudokód: for (všechny uzly u) ENQUEUE(u); for (všechny uzly ve frontě) d[u] = ∞; d[start] = 0; p[start] = NULL; while (QUEUE_NOT_EMPTY) { u := QUEUE_GET_FIRST; for (každý následník v uzlu u) { if(IN_QUEUE(v) && w(u,v) < d[v]) { p[v] = u; d[v] = w(u, v); } } } Asymptotická složitost: Počáteční nastavení má asymptotickou složitost O(|U|), získání minimálního prvku z fronty zabere čas O(|U| ∙ log |U|). For cyklus přes všechny sousedy uzlu se provede O(|H|)‐krát a zjištění, zda je prvek ve frontě (ke kterému dochází uvnitř tohoto cyklu) trvá O(log |U|). Celková asymptotická složitost Jasníkova‐Primova algoritmu je tedy O(|U|) + O(|U| ∙ log |U|) + O(|H| ∙ log |U|) = O(|H| ∙ log |U|). Nejkratší cesty z jednoho uzlu Základní úlohou je nalezení nejkratší cesty z jednoho zadaného uzlu s U do všech ostatních uzlů v U grafu G. Toto lze řešit pomocí algoritmu prohledávání do šířky. Co když má ale graf ohodnocené hrany? Anebo co když chceme vyhledat nejkratší cesty mezi všemi uzly a ne jen z jednoho uzlu. Algoritmy pro řešení této úlohy jsou podobné k prohledávání do šířky. Musíme zjistit strukturu stromu nejkratších cest. Vzdálenost 2 uzlů – neboli délka nejkratší cesty mezi nimi (součet ohodnocení hran). Pokud mezi dvěma uzly bude hrana se záporným ohodnocením, bude to problém, protože se délka cesty se tímto zkracuje. Budeme se snažit před tímto problémem utéci. Pokud z uzlu u do uzlu v nevede cesta žádná, je jejich vzdálenost rovna +∞ , pokud se některá cesta z u do v dotýká nějakého cyklu se záporně ohodnocenou hranou, bude vzdálenost u a v rovna −∞ . Další varianty hledání nejkratších cest: •
•
•
problém nejkratších cest do jednoho cílového uzlu – nalezení nejkratších cest ze všech uzlů u U do pevně zadaného cílového uzlu. Pro vyřešení stačí řešit úlohu v opačně orientovaném grafu a hledat nejkratší cestu z cílového uzlu do všech ostatních (=> převod na základní úlohu) problém jediné nejkratší cesty – nalezení nejkratší cesty pro jedinou zadanou dvojici uzlů u, v U. Stačí řešit základní úlohu problém všech nejkratších cest – nalezení nejkratší cesty pro všechny dvojice uzlů u, v U. Lze ho řešit opakovaným použitím základního algoritmu na všechny uzly, ale jde to i lépe. Důležité zjištění…Pro libovolnou hranu (u,v)∈H a uzel s∈U platí dw(s,v) ≤ dw(s,u) + w(u,v) viz obrázek…(dw (s,v) je nejkratší cesta mezi s a v) K řešení roblému nejkratších cest se používají Dijkstrův algoritmus, Bellman‐Fordův algoritmus, Floyd‐Warshallův algoritmus a další. Datové struktury využívané algoritmy pro hledání nejkratších cest d[u] ... délka (dosud nalezené) minimální cesty p[u] ... předchůdce na (dosud nalezené) minimální cestě Q ... (prioritní) fronta otevřených uzlů (halda?) Společné operace pro základní varianty algoritmů •
Inicializace – všem uzlům dáme vzdálenost na +∞ a jako jejich předchůdce dáme nil. Uzlu s ( to je ten ve kterém bude hledání začínat ) dáme vzdálenost 0 a předchůdce bude pořád nil. void InitPaths(Graph G, Node s) { // inicializace for (Node u in U(G)) { d[u] = +∞; p[u] = null; } d[s] = 0; } •
Relaxace ‐ máme dány dva uzly u a v a délku nějaké cesty z u do v, která je nejkratší doposud nalezená. Relaxace zjišťuje, zda neexistuje uzel z takový, že cesta u → z → v je kratší, než nejkratší doposud nalezená cesta u → v. void Relax (Node u, Node v, Weights w) { if (d[v] > d[u] + w(u, v)) { // příp.úprava délky cesty d[v] = d[u] + w(u, v); p[v] = u; } } Předpoklad Předpokládejme, že pro nějaký graf provedeme operaci InitPaths a pak libovolný počet operací Relax. Potom platí d[u] ≥ dw(s,u) .Jakmile d[u] dosáhne hodnoty dw(s,u), už se nemění. Jakmile se žádné d[u] nemění, máme strom nejkratších cest do všech dosažitelných uzlů z uzlu s. Dijkstrův algoritmus Základním předpokladem Dijkstrova algoritmu je, že nemáme ve vstupním grafu záporné délky hran. Pokud tomu tak není, dijkstra nebude fungovat. Princip: (dobře viditelný na slidu 7/přednáška 7 z TIN) otevřené uzly se řadí do prioritní fronty (a vybírají) podle hodnoty d[u] (což je aktuální nejmenší vzdálenost uzlu u od uzlu s). Takto se postupně aproximuje dw(s,u) (což je ta úplně nejmenší vzdálenost). 1. začne se z výchozího uzlu a relaxuje se do možných následníků (tzn. u následníků změním hodnotu vzdálenosti z nekonečna na ohodnocení té hrany, po které jsem se tam dostal a pamatuji si předchůdce) 2. pokračuji v relaxaci pro další následníky a pokud najdu nižší vzdálednost, pak toto číslo přepíšu. Časová složitost algoritmu záleží na implementaci, při implementaci binární haldou je O(|H| ∙ log |U|). Pseudokód: void Dijkstra(Graph G, Node s, Weights w) { InitPaths(G, s); S = ø Queue.Init(); for (Node u in U(G)) Queue.Push(u); while (!Queue.Empty()) { u = Queue.ExtMin(); S = S {u}; for (Node v in Adj[u]) { Relax(u, v, w); } } } Bellman‐Fordův algoritmus Bellman‐Fordův algoritmus řeší problém záporně ohodnocených hran systematickým relaxováním hran (??). Časová složitost Bellman‐Fordova algoritmu je O(|U| ∙ |H|). Pseudokód: boolean Bellman‐Ford (Graph G, Node s, Weights w) { InitPaths(G, s); for (int i = 1; i < |U|; i++) for (Edge (u,v) in H) Relax(u, v, w); for (Edge (u, v) in H) { if (d[v] > d[u] + w(u, v)) return false; } return true; } DAG‐Paths Je to algoritmus pro zjištění nejkratších cest pro acyklické grafy 1.
2.
3.
Topologicky uspořádáme uzly grafu G InitPaths(G,s) for každý uzel u v pořadí podle topologického uspořádání { for každé v∈Adj[u] {Relax(u,v,w) } } Nejkratší cesty mezi všemi uzly První Idea První idea je aplikovat výše zmíněné algoritmy na každý uzel v grafu. Jaká by pak byla složitost? •
pro nezáporné ohodnocení hran… •
pro záporné ohodnocení hran… Otázka je, zda to jde i lépe. Předem prozradím že jde:‐) Důležité pojmy Matice sousednosti v – je to matice UxU (řádky i sloupci jsou názvy uzlů). Na souřadnici vi,j je počet hran, které vedou mezi uzly u a j. Vypadá to třeba takto… Matice w‐délek – Ta je již používaná pro algoritmy nejkratších cest mezi všemi uzly. Matici sousednosti jsem zmínil, protože matice w‐ délek z ní vychází. Matice w‐délek však zahrnuje délky hran (předpokládejme, že v grafu nemáme rovnoběžné hrany). Výsledky algoritmů pak získáme ve formě matice w‐vzdáleností: D = [ dij ] : dij = dw(ui,uj), tzn. souřadnice dij označuje nejkratší vzdálenost mezi uzly i a j. Oproti matici délek nemusí uzly i a j náležet stejné hraně. Doplňující informace o samotných cestách ukládáme do matice předchůdců P = [ pij ] Floyd‐Warshallův algoritmus Počítá jakousi posloupnost matic. Počáteční maticí je matice w‐délek a v každém kroku se zjistí, jaké jsou nejkratší cesty mezi všemi dvojicemi uzlů s tou podmínkou, že nejkratší cesty mohou procházet pouze přes množinu k uzlů. To k se postupně zvyšuje. Například v kroku 1 nemůže cesta obsahovat ani 1 vnitřní uzel, v kroku 2 jeden atd. Zabýváme se tím, jaký vztah bude mezi maticí n‐tého kroku a maticí n+1. kroku. Podle tohoto vztahu vždy vypočteme z předešlé matice matici následujícího kroku. Jak lze vidět z obr. ten vztah bude pro každý prvek matice: dij(k) = min (dij(k‐1) , dik(k‐1) + dkj(k‐1)), tedy řešíme, zda jestli povedeme cestu přes uzel k, zda ta cesta nebude kratší. Pseudokód: D(0) = W; for (k = 1; k <= |U|; k++) { for (i = 1; i <= |U|; i++) { for (j = 1; j <= |U|; j++) { dij(k) = min (dij(k‐1) , dik(k‐1) + dkj(k‐1)); } } } return D(|U|); Časová složitost algoritmu Floyd Warshall bude O(n3). Pro, to lze dobře vidět z kódu. Johnsonův algoritmus Základní ideou Johnsonova algorimu je otázka: Jaká bude složitost Dijkstry pro hledání nejmenších cest mezi všemy uzly u řídkých grafů (grafy s málo hranami)? Odpověď: Pro řídké grafy (|H|<<O(n2)) je O(|H|.n) lepší než O(n3) takže O(n.(|H| + n.lg n)) je lepší než O(n3). Takže prostě pro řídké grafy se nám vyplatí použít Dijkstru pro každý uzel zvlášť. Nojo, ale dijkstra nefunguje pro záporné hrany. Jak to udělat? Musí dojít k… Přehodnocení w → w' takové, že musí platit: •
•
pro každé u,v je cesta u → v minimální podle w' minimální také podle w w'(u,v) ≥ 0 Jak to přehodnotit, aby se zachovala minimálnost cest? Dáme každému uzlu nějaké hodnocení h(u). Přehodnocení hrany mezi uzly u a v pak bude rovno… Tak, a teď ještě nalézt vhodné hodnocení uzlů h(u)…uděláme to takto: Nejdříve upravíme graf G na graf GI tak, že do grafu G přidáme uzel s. Z toho pak vedeme hranu do všech uzlů grafu G. Výsledek je na obrázku… •
Nyní položíme hodnocení h(u)=d(s,u). Bude platit h(v) ≤ h(u) + w(u,v), tedy w'(u,v) = w(u,v) + h(u) ‐ h(v) ≥ 0 . Super. To jsme celou dobu chtěli. Teď už stačí jen aplikovat Dijkstru na každý uzel grafu Pseudokód: nejdříve G doplníme přidáním uzlu s na G' if (Bellman‐Ford(G', w, s)) return false; for (Node u in U(G)) h(u) = d(s, u); for (Edge (u, v) in H(G)) w'(u, v) = w(u, v) + h(u) ‐ h(v); for (Node u in U(G)) { Dijkstra(G, w', u); for (Node v in U(G)) d(u, v) = d'(u, v) ‐ h(u) + h(v); } Paměťová složitost Johnsonova algoritmu je O(|U|²), časová složitost je: •
•
pro Fibonacciho haldu O(|U|² ∙ log |U| + |U| ∙ |H|) pro binární haldu O(|U| ∙ |H| ∙ log |U|) Materiály •
•
•
•
•
X36TIN, přednáška 6 (http://service.felk.cvut.cz/courses/36TI/XTI‐Prednaska‐06.ppt) X36TIN, přednáška 7 (http://service.felk.cvut.cz/courses/36TI/XTI‐Prednaska‐07.ppt) X36TIN, přednáška 8 (http://service.felk.cvut.cz/courses/36TI/XTI‐Prednaska‐08.ppt) Demo ‐ Dijkstrův algoritmus (http://www.cs.sunysb.edu/~skiena/combinatorica/animations/dijkstra.ht
ml) Wikipedia ‐ Problém nejkratších cest Toky v sítích. Základní pojmy Síť je čtveřice S = <G, q, s, t>, kde: •
•
•
•
G = <H, U> je orientovaný graf q: H → R+ je kapacita hran, q(u, v) se značí quv s je zdroj sítě t je spotřebič sítě Hranový řez S – minimální podmnožina hran, které je nutné odebrat, aby se graf rozpadl na více komponent. Artikulace grafu je takový jeho uzel, jehož odebrání znamená zvýšení počtu komponent grafu. Komponenta grafu je jeho maximální souvislý podgraf. Na obrázku bych jako artikulaci chápal ten oranžový uzel. Řezy jsou pak označeny písmenem S. Množina hran incidující s uzlem u souvislého grafu je jeho hranovým řezem artikulací grafu G. u není Řez sítě je hranový řez, který oddělí zdroj a spotřebič. Tok v síti S je ohodnocení hran f: H → R+ splňující: •
•
•
•
•
•
tok žádnou hranou nesmí překročit její kapacitu tok se v žádeném uzlu nehromadí velikost toku = (to co vyteče ze zdroje ‐ to co do něj přiteče) = (to co přiteče do spotebiče ‐ to co z něj odteče) kapacita sítě = součet kapacity všech hran kapacita řezu ‐ jen to co teče vybraným směrem velikost maximálního toku sítě je rovna kapacitě jejího minimálního řezu Tok je maximální, pokud neexistuje cesta, kde by šel tok zvýšit (zlepšující cesta). Maximální tok lze zjistit pomocí Ford‐Fulkersonova algoritmu. Typy sítí ‐ všechny tyto sítě lze upravit a převést tak problém na základní úlohu: •
•
•
•
Sítě s více zdroji a spotřebiči Sítě s omezenou kapacitou uzlů Sítě s omezeným minimálním tokem Sítě s oceněným token Ford‐Fulkersonův algoritmus Vypočítá maximální tok sítě. Idea je jednoduchá: Nejdříve nastavíme tok na 0. Pak jdeme od zdroje do cíle, kdy vždy vybíráme nějakou cestu od zdroje do cíle, která by tento tok mohla ještě zvýšit a počítáme tok touto cestou. Číslo, které nám vyjde odečteme od kapacity všech hran na této cestě. Toto opakujeme, dokud už nezbyde žádná cesta, kterou bychom mohli ze zdroje do cíle jít. Dobře je to ukázané na http://www‐b2.is.tokushima‐
u.ac.jp/~ikeda/suuri/maxflow/MaxflowApp.shtml?demo5. (levé číslo je tok, který je u hrany vyčerpán, pravé její celková kapacita) Pseudokód 1 for každou hranu (u,v)∈H { f(u,v) ← 0 } 2 while NajdiCestu(S) { ZvyšTok(S) } 3 return f NajdiCestu hledá zlepšující cestu prohledáváním sítě s asymptotickou složitostí O(|U| + |H|). ZvysTok má asymptotickou složitost O(|U|), Ford‐Fulkersonův algoritmus má tedy složitost O(|U|² ∙ |H|). Někdy se uvádějí také složitosti (závisí na podobě sítě): O(|U| ∙ |H|²), O(|U|³). Dalším zrychlováním pro speciální případy lze docílit ještě lepší asymptotické složitosti ‐ například O(|U| ∙ log |U|) pro planární sítě. Materiály •
•
•
•
•
X36TIN, přednáška 9 Wikipedia ‐ Tok sítí Wikipedia ‐ Tok sítí (CZ) Tok sítí, problém maximálního toku Tok sítí ‐ příklady Charakter hladových algoritmů a dynamického programování. Hladové algoritmy Hladové algoritmy hledají optimální řešení postupným řešením dílčích podproblémů tak, že pro každý dílčí podproblém, který se objeví, hledají lokálně optimální řešení. Při výpočtu se tedy postupuje "shora dolů", nikdy se nevracíme a každém kroku původní problém alespoň trochu zjednodušíme. Hladové algoritmy lze použít pouze pro řešení problémů, které mají vlastnost hladového výběru a vlastnost optimální podstruktury. Vlastnost hladového výběru Ke globálně optimálnímu řešení lze dospět pomocí lokálně optimálních řešení. Určení optimálního lokálního řešení se může opírat o optimální řešení, která jsme až do této doby provedli, avšak nikdy se nesmí opírat o jakýkoliv odhad řešení budoucích problémů nebo o výběr optimálního řešení ze všech možných řešení podproblému. Vlastnost optimální podstruktury Optimální řešení problému v sobě obsahuje optimální řešení podproblémů. Tato myšlenka platí i pro dynamické programování. Příklady •
•
Borůvkův ‐ Kruskalův Jarníkův ‐ Primův algoritmus hledání minimální kostry grafu – z toho je dobře vidět, jak rěšíme problém pro podproblémy (podmnožiny uzlů) o
o
o
•
•
výběr "nejlepšího" z n uzlů mimo dílčí podstrom pro přidání úprava kritéria pro jeho sousedy pak totéž pro (n‐1) uzlů, atd. Dijktrův algoritmus hledání nejkratší cesty ze zadaného uzlu grafu algoritmus hledání optimálního Huffmanova stromu Dynamické programování Myšlenka dynamického programování je podobná jako u metody "rozděl a panuj" – tedy rozložit problém na podproblémy, ty vyřešit rekurzivně a dílčí řešení kombinovat do výsledku. To je vhodné tam, kde vznikají navzájem nezávislé podproblémy. Opakují‐li se však stejné podúlohy vícekrát (například při výpočtu více Fibonacciho čísel), vede tato metoda na neefektivní algoritmy. V algoritmech dynamického programování se každý podproblém vyřeší pouze jednou, dílčí výsledky nižších úrovní rozkladu problému se uloží a tak mohou být později opakovaně použity pro určení řešení a vyšší úrovni rozkladu. Při výpočtu se tedy postupuje "zdola nahoru", což je rozdíl oproti hladovým algoritmům. Návrh algortimů založených na dynamickém programování je obecně možné rozdělit do následujících kroků: •
•
•
•
určení struktury optimálního řešení vyjádření hodnoty optimálního řešení rekurzivní formou určení jednotlivých kroků a jejich pořadí při výpočtu tabelovaných hodnot postupem zdola nahoru sestrojení optimálního řešení z vypočtených hodnot Příklady •
•
•
•
výpočet Fibonacciho čísel hledání cesty polem Floyd‐Warshallův algoritmus hledání nejkratších cest mezi všemi páry uzlů grafu problém obchodního cestujícího Další příklady lze nalézt u otázky Algoritmy prohledávání s návratem, dynamické programování. Materiály •
•
•
•
Wikipedia ‐ Greedy Algorithm Wikipedia ‐ Hladový algoritmus Wikipedia ‐ Dynamic Programming skripta Teoretická informatika, kapitoly 5.5 a 7.5 Řešení úloh prohledáváním stavového prostoru, metody heuristického hledání. Při řešení úloh z reálného světa se pracuje jenom s těmi objekty, které jsou pro danou úlohu relevantní – prostřednictvím abstrakce se musí vytvořit vhodný model. Model může být konceptuální, reprezentační, implementační. Dále musíme stanovit reprezentaci znalostí (procedurální, deklarativní). Máme‐li toto stanoveno, řešenou úlohu pak představuje zadaný počáteční stav, požadovaný cílový stav a množina akcí pro změnu stavu systému. Řešení pak spočívá v tom nalézt posloupnost akcí, pomocí nichž se dostaneme z počátečního stavu do koncového. Stavový prostor: Stavovy prostor je množina všech stavů systemu společně s operatory nebo akcemi, ktere způsobuji přechody mezi těmito stavy. Stavovy prostor je tedy možne chapat jako orientovany graf, v němž uzly představuji stavy systemu a hrany vyjadřuji přechody. Cilovych stavů může byt vice, kromě explicitniho popisu mohou byt zadany take podminkou, kterou musi splňovat. Planu řešeni pak v teto interpretaci odpovídá orientovana cesta z počatečniho stavu (uzlu) do nějakeho koncoveho stavu (uzlu). Je nutne objasnit, v čem je specifičnost problematiky hledani řešeni ve stavovem prostoru. Prvni rozdilspočiva v obrovskem (někdy i nekonečnem) rozsahu stavoveho prostoru, ktery u praktickych uloh vylučuje explicitni zobrazeni odpovidajiciho grafu. Prohledavany graf je pak zadan implicitně, zprav. nějakou proceduralni reprezentaci jeho relace nasledovani. K nalezeni cesty je pak třeba použit takovych postupů, ktere při rozumnych narocich na vypočetni prostředky (čas a paměť) projdou a explicitně vyjadři jen velmi omezenou čast grafu. Druhym rozdilem je, že při prohledavani může byt k dispozici nějaka doplňujici specificka informace, jejimž využitim lze postup směrovat, a vyhnout se tak prohledavani neperspektivnich časti grafu. Třeti odlišnosti je skutečnost, že nalezenim cesty (planu řešeni) nemusi uloha skončit, neboť na ně může navazovat jednorazovy nebo opakovany průchod cestou (provedeni planu). S ohledem na povahu teto faze je pak např. možne preferovat rychle nalezeni jakekoliv cesty před zdlouhavym hledanim cesty nejkratši. Prohledávání stavového prostoru lze rozdělit na neinformované (slepé) hledání a informované (heuristické) hledání. Přiklad: (Hra „8_) Jedna se o znamou hru, při ktere je na desce rozdělene na 3×3 poli umístěno 8 kostek očislovanych od 1 do 8. Jedno pole zůstava volne a smyslem hry je prostřednictvim posunů kostek docilit toho, aby se od nahodneho počatečniho uspořadani kostky seřadily do ciloveho pořadi (viz obr. 10.1). Každy stav řešeni ulohy je zde určen polohou kostek, stavovy prostor obsahuje celkem 9! = 362880 možnych stavů ulohy. V každem stavu jsou možne minimalně dva a maximalně čtyři různe posuny, změny stavů jsou reverzibilni (tzn. můžeme se kdykoli vrátit zpět). Vlastnosti prohledávání ve stavovém prostoru •
•
•
•
úplnost ‐ zaručuje nalezení řešení (pokud existuje) výpočetní (časová) složitost paměťová složitost optimálnost ‐ nalezne se nejlepší řešení? Neinformované (slepé) prohledávání stavového prostoru Běžné strategie neinformovaného hledání: •
•
•
•
•
prohledávání do šířky prohledávání uspořádaným výběrem (Uniform Cost) o předpokládá ocenění cest k uzlům f(n) (tzv. hodnotící funkce) o nalezne optimální řešení, pokud hodnoty f(n) neklesají podél cesty k řešení. To je splněno automaticky: ƒ když se cena uzlu počítá jako součet cen jednotlivých hran (akcí) podél odpovídající cesty ƒ když jsou hodnoty (ceny) vracené funkcí f(n) nezáporné prohledávání do hloubky o stavový prostor může být nekonečný ‐ 2 přístupy, jak ho prohledávat do hloubky: ƒ omezení hloubky hledání (problém úplnosti takového vyhledávání) ƒ iterativní prohlubování IDFS (nejprve zkoušíme nalézt řešení ve stavovém prostoru nějaké konečné houbky k prohledáváním do houbky ‐ pokud řešení nenajdeme, zvětšíme k a postup opakujeme) obousměrné prohledávání do šířky ‐ lze použít pouze pokud je explicitně zadaný cílový stav srovnání neinformovaných metod hledání •
•
•
•
b = maximální počet stavů, do kterých se lze dostat z nějakého stavu u přímo (tzv. Branching Factor) d = délka cesty řešení m = hloubka hledání k = omezení hloubky Informované (heuristické) prohledávání stavového prostoru Důsledkem nedeterminismu v řešení úloh je, že nalezení správného řešení úlohy může trvat velmi dlouho nebo proces hledání řešení dokonce neskončí vůbec. Proto se obvykle snažíme získat nějakou další doplňující informaci o úloze, na jejímž základě bychom mohli zformulovat kritérium umožňující vybírat jen takové hypotézy, které mají největší naději vyhovět daným množinám stavů, a ty potom deduktivně prověřovat. Této doplňující informaci říkáme heuristika, protože pomáhá nalézt řešení (heuréka = už jsem na to přišel!). Na rozdíl od exaktních poznatků u heuristik přesně nevíme, za jakých předpokladů jsou pravdivé. Víme jen, že jsou pravdivé v běžných, typických situacích. U heuristického prohledávání předpokládáme, že jsme schopni odhadnou délku (zbývající) cesty k cíli pomocí tzv. heuristické funkce h(u). Algoritmus hledání s heuristickou funkcí h je: •
•
•
přípustný, pokud najde optimální řešení (jestliže existuje) konzistentní, pokud platí: h'(u) ‐ h'(v) <= d (u,v) pro všechny stavy u, v lépe informovaný algoritmus než algoritmus s heuristikou h1: h'(u) >= h1'(u) pro každý stav u Význam jednotlivých označených funkcí: •
•
•
•
g(u) = délka cesty od počátku do u = d(s, u) h(u) = délka cesty od u do cíle = d(u, t) f(u) = hodnotící funkce uzlu (kombinuje g a h) g'(u), h'(u), f'(u) ‐ aproximace g, h, f Druhy heuristického prohledávání: •
•
•
•
•
gradientní algoritmus algoritmus paprskového prohledávání algoritmus uspořádaného prohledávání algoritmus A* o (f'(u) = g'(u) + h'(u)) o paměťová složitost roste s bd obousměrné heuristické hledání – viz obrázek – barevné plochy znázorňují stavový prostor. Materiály •
•
•
•
X36TIN, přednáška 10 http://www.kiv.zcu.cz/studies/predmety/uir/skripta/reseni.html http://drogo.fme.vutbr.cz/opory/pdf/uai/brezina_alg_umele_int/alg_umele_int.pdf Operační systémy (X36OSY) Struktura jednouživatelského a víceuživatelského operačního systému (OS) Jednouživatelský systém nemusí být real‐time (může být dávkový). Pro práci se systémem není potřeba žádné "přihlášení", nerozlišují se jednotliví uživatelé. Typickým příkladem jednouživatelského OS je MS‐DOS. Oproti tomu víceuživatelský systém (Time Sharing ‐ systém umožnující současně práci více uživatelů) musí podporovat multitasking nebo multiprogramming nebo oboje. Musí zabezpečit dostatečně krátkou dobu odezvy. Definice OS OS je základní software, který funguje jako prostředník mezi HW a aplikacemi/uživateli Úkoly •
•
•
Správa výpočetních prostředků o fyzických (procesor, paměť, disky, …) o logických (uživatelská konta, procesy, soubory, přístup. práva,…) Abstrakce složitosti HW Poskytuje rozhraní o aplikacím (Win32 API, Win64 API, systémová volání Unixu,…) o uživatelům (CLI (command line interface) a GUI(Graphical User Interface)) Požadavky na HW •
podpora OS při správě HW o CPU má dva módy ƒ kernel mód: CPU může provádět všechny instrukce ze své instrukční množiny (program běžící v tomto módu má přístup k celému hardwaru) ƒ user mód: pouze podmnožina instrukcí je povolena (např. všechny instrukce V/V a ochrany paměti jsou zakázány) •
podpora OS při správě paměti o ochrana paměti o podpora virtuální paměti (fyzický x logický prostor) o překlad LA (logická adresa) na FA (fyzická adresa) •
•
podpora přepínání kontextu o mechanismus přerušení (reakce na asynchronní události) o programovatelný interní časovač (generuje přerušení po uplynutí čas. kvanta) podpora efektivních operací V/V o přerušení, DMA, … Klasifikace OS Víceúlohový (multitasking, multiprogramming, timesharing) •
•
•
OS umožňuje správu více procesů na jednorpocesorovém systému běh více úloh (procesů) ve sdílení času ochrana paměti, plánování procesů Vícevláknový (multihreading) •
•
proces se může skládat z několika současně běžících úloh (vláken) přechod od plánování procesů na plánování vláken (thread) Víceprocesorový (multiprocessing) •
OS podporuje práci s více procesory na víceprocesorovém systému Víceuživatelský (multi‐user) •
•
•
možnost současné práce více uživatelů identifikace a vzájemná ochrana uživatelů OS uživateli vytváří virtuální prostředí tvářící se, jako by měl počítač sám pro sebe: nikdo nebude bez jeho povolení číst jeho soubory, nikdo nebude zasahovat do běhu jeho programů, bude moci používat periferní jednotky počítače (tiskárny, vstupní jednotky,..) atd. Struktura OS •
•
Monolitický systém o implementován jako jeden proces o program je rozdělen pouze na funkce/procedury o všechno běží obvykle v kernel módu Vrstevný (layered) systém o je rozdělen do hierarchických vrstev o každá vrstva řeší specifický úkol o přesně definované rozhraní mezi vrstvami o vnitřní vrstvy mohou být privilegovanější Virtuální stroj •
emuluje HW (přesná SW kopie HW) – viz obrázek Mikrokernel •
•
•
v jádru je implementováno minimum služeb, stará se o přepínání kontextu, zasílání zpráv .. technologie klient/server, tzn. na OS jsou spuštěny různé servery, jeden pro práci s pamětí, jeden pro práci se soubory… klienti se na tyto servery připojují pomocí funkcí mikrokernelu problém se systémovými servery používajícími privilegované instrukce Základní komponenty OS Materiály •
X36OSY, přednáška 1 Jádro OS. Popis jádra OS Jádro OS je základní součástí většiny OS. Jeho hlavní odpovědností je správa zdrojů OS (komunikace mezi HW a SW). Jádro OS poskytuje abstrakční vrstvu pro zdroje na nejnižším možném stupni (obzvlášť pro paměť, procesory a V/V zařízení), kterou musí aplikace ovládat, aby mohly vykonávat svou funkci. Aplikacím tyto služby poskytuje typicky pomocí mechanismů komunikace mezi procesy a systémových volání. Jádro OS vzniklo v důsledeku návrhu počítačových systémů jako série abstraktních vrstev (hardware firmware assembler jádro OS OS a aplikace), kde každá vrstva spoléhá na funkce posyktované vrstvami pod ní. Ve většině případů zavaděč (Boot Loader) začne vykonávat jádro OS v tzv. kernel režimu (režim s nejvyššími možnými právy). Jádro se tak inicializuje a spustí první proces. Pak už se jádro OS typicky nespouští přímo, ale pouze v reakci na vnější události (např. systémová volání používaná aplikacemi, když vyžadují služby jádra OS, nebo přerušení, která používá HW aby jádro OS uvědomil o určitých událostech). Navíc jádro obvykle poskytuje smyčku, která se vykonává vždy, když nejsou k dispozici žádné procesy, které by se měly vykonávat (tzv. Idle Process). Jádro OS obvykle poskytuje prostředky pro nízkoúrovňové plánování procesů (Process Dispatching), komunikaci mezi procesy, synchronizaci procesů, přepínání kontextu, manipulaci s řídicími bloky procesu, obsluhu přerušní, vytváření a ukončování procesů, pozastavení a obnovení činnosti procesů. Základní služby jádra OS Primárním účelem jádra OS je spravovat zdroje počítače a umožnit ostatním programům bezproblémový běh a použití zdrojů. Zdroje typicky zahrnují: •
•
•
Procesor ‐ centrální část počítačového systému odpovědná za spouštění a vykonávání programů. Jádro OS rozhoduje, kterému z mnoha procesů bude přidělen procesor (nebo procesory).ne program at a time) Paměť počítače používaná pro uložení instrukcí i dat. Aby mohl program běžet, musí být typicky v paměti jeho instrukce i data. Několik programů chce často přistupovat do paměti naráz a dohromady vyžadují více paměti, než má počítač k dispozici. Jádro zodpovídá za přidělování paměti jednotlivým procesům a za rozhodování co dělat v situaci, kdy volná paměť dochází. V/V zařízení, o jejichž použití aplikace žádají. Jádro OS předává žádosti aplikací o provedení V/V operace příslušným zařízením (nebo částem těchto zařízení) a poskytuje pohodlný způsob, jak V/V zařízení používat (obvykle díky abstrakci do té míry, že aplikace neví nic o implementaci V/V zařízení). Správa procesů •
jádra s podporou zpracování více úloh najednou (Multitasking) ‐ zdá se, že najednou běží více procesů, než je procesor schopen fyzicky zvládnout pre‐emptivní multitasking ‐ každému procesu je přidělen procesor na krátké, pevně stanovené kvantum času o kooperativní multitasking ‐ proces běží až do chvíle, kdy dojde k předem definované událost (např. žádost o V/V operaci) ‐ pak je procesor přidělen dalšímu procesu multiprocessing (SMP; Non‐Uniform Memory Access) ‐ různé program a vlákna běží na různých procesorech; jádro OS musí umožňovat, aby bylo naráz prováděno více jeho částí o
•
Správa paměti Jádro OS má úplný přístup k systémové paměti a musí umožnit procesům bezpečně přistupovat k této paměti, pokud to tyto procesy vyžadují. Obvykle se používá virtuální adresování realizované stránkováním, segmentací nebo kombinací obou dvou. Díky virtuálnímu adresování máme zaručenu ochranu paměťového prostoru každého procesu a navíc získáme možnost adresovat více paměti, než má systém fyzicky k dispozici. Správa V/V zařízení Jádro OS musí udržovat seznam dostupných V/V zařízení. Tento seznam může být znám dopředu (např. u embedded systémů, kde je kompletní HW znám předem), určený uživatelem (typické pro starší PC, která nebyla určena pro osobní použití) nebo jsou jednotlivá zařízení detekována a přidána do seznamu operačním systémem za běhu (tzv. Plug And Play). Systémová volání Aby mohl proces efektivně vykonávat svou činnost, musí být schopen přitupovat ke službám, které jádro OS poskytuje. Metoda zpřístupnění služeb jádra je specifická pro každé jádro, ale obvykle se nejčastěji používají knihovny jazyka C nebo API funkce. Návrh jádra OS Co je třeba vzít v úvahu: •
•
•
podpora ochrany o tolerance chyb ‐ je třeba zajistit, aby chyba v jednom procesu neovlivnila činnost ostatních procesů o bezpečnost ‐ zamezení záměrnému nevhodnému chování procesů (např. šifrováním) o ochrana na úrovni HW nebo jazyka spolupráce procesů ‐ jaké prostředky budou k dispozici pro synchronizaci a spolupráci procesů správa V/V zařízení Přístupy k návrhu jádra OS •
monolitická jádra o jádro a všechny služby OS běží v jediném vláknu a jsou umístěny na společném místě v paměti nevýhoda závislosti systémových komponent (chyba v ovladači může způsobit pád celého systému) mikrokernely o definuje se pouze jednoduchá abstrakce nad HW a množina primitiv nebo systémových volání implementující nejnutnější služby OS (správa paměti, multitasking, komunikace mezi procesy) o ostatní služby (i ty které obvykle poskytuje jádro OS, jako například síťové služby) jsou implementovány v uživatelské oblasti (často se jim říká "servery" a procesům využívajícím tyto služby se říká "klienti" => klient‐server architektura) o zbytek OS je implementován jako kterýkoliv jiný program ve vyšším programovacím jazyku hybridní jádra ‐ kompromis mezi monolitickými jádry a mikrokernely (některé služby ‐ například systém souborů ‐ běží v jádru OS, některé ‐ například ovladače periferních zařízení ‐ v uživatelském prostoru) nanokernely ‐ další "stupeň" mikrokernelů (z jádra OS jsou vyčleněny další služby do uživatelské oblasti ‐ například služby spojené s přerušením a časovači) exokernely ‐ typ jádra, které v teoretických modelech neposkytuje abstrakci HW, ale místo toho přiděluje fyzické hardwarové zdroje (procesorový čas, stránky paměti, bloky disku) různým programům o
•
•
•
•
Materiály •
•
Wikipedia ‐ Jádro OS (http://cs.wikipedia.org/wiki/Kernel) Wikipedia ‐ Kernel Procesy, vlákna, jejich plánování a přidělování procesoru. Modely Procesový model •
•
Každý proces alokuje příslušné prostředky (adresový prostor obsahující kód a data, otevřené soubory, reakce na signály, ...), má identitu (PID, PPID, vlastníka, seznam potomku,…)… Implicitně obsahuje jedno vlákno výpočtu Vláknový model •
•
•
•
•
•
•
Oddělení alokace prostředků a samotný výpočet Proces slouží k alokaci společných prostředků Vlákna jsou jednotky plánované pro spuštění na CPU Vlákno má svůj vlastní program counter (pro uchování informace o výpočtu), registry (pro uchování aktuálních hodnot), zásobník (který obsahuje historii výpočtu), lokální proměnné, ale ostatní prostředky a identita jsou sdílené Jednotlivá vlákna v daném procesu nejsou nezávislá tak jako jednotlivé procesy Všechny vlákna v procesu sdílí stejný adresový prostor, stejné otevřené soubory, potomky, reakce na signály, … Multithreading o procesy se spouští s jedním vláknem o toto vlákno může vytvářet další vlákna (pomocí knihovní funkce) o když chce vlákno skončit, může se opět ukončit pomocí knihovní funkce Přepínání kontextu •
V/V paralelismus ‐ zatímco jeden proces čeká na dokončení V/V operace, jiný proces může používat CPU •
Pseudoparalelismus ‐ vlákna běží (pseudo) paralelně na jednoprocesorovém systému díky přepínání kontextu, procesor střídavě provádí kód jednotlivých vláken •
•
•
Skutečný hardwarový paralelismus ‐ každé vlákno běží na svém procesoru (multiprocesorový systém) Hodnota časového kvanta je kompromisem mezi potřebami uživatele (malý čas odezvy) a potřebami systému (efektivní přepínání kontextu), přepínání kontextu trvá zhruba 2‐5 ms) Časové kvantum v OS je zhruba 10‐100 ms (např. parametr jádra Time Slice) Procesy •
•
Všechen běžící software v systému je organizován jako množina běžících procesů (Sekvenční) proces Abstrakce běžícího programu Sekvence výpočetních kroků závisí pouze na výsledcích předchozích kroků a na vstupních datech Paralelní sekvenční procesy (paralelní program) o Množina sekvenčních procesů běžících „současně“ o Procesy mohou běžet na jednoprocesorovém systému (Pseudo Parallelism) nebo na multiprocesorovém systému (Real Parallelism) Výsledek paralelního deterministického programu by neměl záviset na rychlosti provádění jednotlivých procesů o
o
•
•
Stav procesu Každý proces má tři základní stavy: •
•
•
Running ‐ v tomto okamžiku právě používá CPU Ready ‐ připraven použít CPU, avšak je dočasně zastaven a čeká, až mu bude přiřazeno CPU Blocked ‐ neschopný použít CPU, protože čeká na nějakou externí událost (např. načtení dat z disku) Události: •
•
•
•
1 = proces se zablokuje, čeká na vstup (externí událost) 2 = plánovač vybere ke zpracování jiný proces 3 = plánovač vybere tento proces ke zpracování 4 = vstup je k dispozici (nastala externí událost) Nově vytvořené procesy jsou ve stavu Ready, zanikající procesy mohou být v libovolném stavu. Implementace procesu •
OS spravuje tabulku procesů, kde má každý proces jeden záznam (PCB, Process Control Block) •
•
PCB obsahuje informace o procesu, které musí být uloženy když se proces přesouvá ze stavu Running do stavu Ready nebo Blocked (aby mohl být později tento proces restartován) PCB obsahuje: o informace pro identifikaci procesu (jméno procesu, číslo procesu, ...) o stavové informace procesu (ukazatele na zásobníky, hodnoty registrů, ...) o informace pro správu procesu (stav, priorita, ...) Typy procesů •
•
procesy orientované na CPU = CPU je používáno po dlouhou dobu, málo časté čekání na V/V procesy orientované na V/V = CPU využito po krátkou dobu, velmi časté čekání na V/V Způsoby implementace vláken Implementace vláken v uživatelském prostoru •
•
Run‐time system: množina funkcí, která spravuje vlákna. Jádro nemá o vláknech žádné informace Výhody: •
•
•
vlákna mohou být implementována v OS, které nepodporuje vlákna rychlé plánování vláken každý proces může mít svůj vlastní plánovací algoritmus Nevýhody: •
•
•
pro implementaci blokujících systémových volání je třeba buď volat systémovou funkci select, nebo se tato volání musí změnit na neblokující problémy s výpadkem stránky žádný Clock Interrupt uvnitř procesu (jedno vlákno může okupovat CPU během celého časového kvanta procesu) Implementace vláken v prostoru jádra •
jádro má tabulku vláken, která obsahuje informace o všech vláknech v systému Výhody: •
žádný problém s blokujícími systémovými voláními Nevýhody: •
vytváření, ukončování a plánování vláken je pomalejší Hybridní implementace vláken •
•
•
•
•
jádro se stará pouze o kernel‐level threads a plánuje je některé kernel‐level threads mohou mít user‐level threads user‐level threads jsou vytvářena, ukončovana a plánovana uvnitř procesu např. Solaris, Linux, MS Windows kombinuje výhody uživatelských vláken (dobrá výkonnost) s výhodami kernel vláken (jednoduchá implementace) Plánování procesů a vláken Typy plánování •
•
•
•
dlouhodobé (Long‐Term Scheduling) ‐ určuje, které programy budou zpracovány systémem střednědobé (Medium‐Term Scheduling) ‐ součást odkládací funkce krátkodobé (Short‐Term Scheduling) ‐ při přerušení od časovače nebo V/V zařízení, systémové volání, signály,... V/V (I/O Scheduling) ‐ určuje, který V/V požadavek bude obsloužen volným V/V zařízením Kriteria krátkodobého plánování: •
•
uživatelské hledisko o doba zpracování = doba, která uplyne od spuštění do uplynutí procesu o doba odpovědi = doba, která uplyne od okamžiku zadání požadavku do doby první reakce o dosažení meze = zaručení ukončení procesu do dané meze o předvídatelnost = proces by měl pokaždé běžet "stejně" dlouho bez ohledu na zatížení systému systémové hledisko o propustnost = počet procesů dokončených za jednotku času o využití procesoru o spravedlivost = zamezení vyhladovění (Starvation) o porsazení priorit = možnost uplatnit zvolenou plánovací strategii o vyvážení V/V = snaha udržet V/V prostředky maximálně vytížené Strategie plánování •
•
plánování s předbíháním (Preemptive Scheduling) o běžící proces je zablokován automaticky po uplynutí časového kvanta o jediná možná strategie v RT‐systémech a víceuživatelských systémech plánování bez předbíhání (Non‐Preemptive Scheduling) o proces běží, dokud nepožádá o nějakou službu jádro nebo neskončí o proces může blokovat systém a musí „spolupracovat“ pouze když žádá službu jádra o používalo se v dávkových systémech o používá se v některých systémech pro speciální třídy procesů / vláken Plánování v dávkových systémech First Come First Served (FCFS) •
•
•
•
•
jednoduché plánování bez předbíhání pomocí jedné FIFO fronty procesů když je běžící proces zablokován, první proces ve frontě bude pokračovat když se zablokovaný proces stane opět "Ready", je zařazen na konec fronty výhody: jednoduché nevýhody: může zpomalit procesy orientované na I/O Shortest Job First (SJF) •
•
•
plánování bez předbíhání, které předpokládá, že doba výpočtu je známa předem plánovač spouští nejdříve procesy s nejmenší dobou výpočtu minimalizuje průměrnou dobu zpracování (viz obrázek) Shortest Remaining Time First (SRTF) •
•
•
•
SJF s předbíháním plánovač přidělí CPU procesu s nejmenším časem výpočtu když přijde požadavek na spuštění nového procesu, plánovač porovná časy výpočtu nového procesu a aktuálního procesu ‐ proces s menším časem výpočtu získá CPU nevýhoda: riziko hladovění procesů s velkým časem výpočtu Plánování v interaktivních (real‐time) systémech Round Robin (RR) •
•
•
•
•
jednoduché plánování s předbíháním Ready procesy čekají ve frontě FIFO každý proces dostane přidělené časové kvantum po uplynutí tohoto kvanta (pokud ještě proces neskončil) je zařazen na konec FIFO délka časového kvanta je důležitý parametr Priority Sheduling (PS) •
•
•
•
každý proces má přidělenu prioritu Ready procesy se stejnou prioritou jsou seskupeny do prioritních třid CPU je přidělována procesům z nejvyššní přioritní třídy procesy z nejvyšší prioritní třídy se střídají metoudou Round Robin •
nevýhody: hladovění procesů s nízkou prioritou (řešení: procesu, který čeká déle než je stanovený limit, je dočasně zvýšena priorita) Varianty prioritního plánování: •
•
bez předbíhání s předbíháním o statická priorita o dynamická priorita o fixní časové kvantum pro všechny prioritní třídy o různě velká časová kvanta pro různé prioritní třídy Shortest Process Next (SPN) •
•
•
•
•
modifikace SJF pro interaktivní systémy čas výpočtu procesu odhadujeme na základě minulého chování procesu proces s nejmenším odhadem dostane CPU využívá se techniky stárnutí (Aging) například Tn+1 = k ∙ Tn + (1 ‐ k) ∙ Todhad Fair‐Share Sheduling (FSS) •
•
•
•
•
vyšší numerická hodnota priority znamená nižší prioritu v systému exisutje n skupin každá skupina k, 1 <= k <= n: o má přiřazenu váhu Wk, W1 + W2+ ... + Wk = 1 o v časovém intervalu i používá CPU po dobu GCPUk(i) každý proces j o patří právě do jedné skupiny k o má nastavenu pevnou základní prioritu Bj o v časovém intervalu j používal CPU po dobu CPUj(i) o během časového intervalu i má prioritu Pj(i) na začátku každého časového intervalu se přepočtou hodnoty a naplánuje se další proces podle ptiotity Pj(i): o CPUj(i)= ½CPUj(i‐1) o GCPUk(i)= ½GCPUk(i‐1) o Pj(i) = Bj + ½CPUj(i) + GCPUk(i) /(4 ∙ Wk) Plánování na různých OS Unix: •
•
•
•
•
prioritní plánování s prioritními třídami vyšší numerická hodnota priority zmanemá nižší prioritu procesy dostávají přidělena "různě" velká časová kvanta priorita každého procesu se přepočítává každou sekundu CPUj(i) = ½CPUj(i ‐ 1) a Pj(i) = Bj + ½ CPUj(i) + nicej, kde nicej je uživatelem modifikovatelná část priority a Bj umožňuje definovat prioritní úrovně Windows XP: •
•
•
•
prioritní plánování s předbíháním různě velká časová kvanta (normálně 2x Clock Interval) úrovně priorit: o kernel (0 = System Level; 1‐15 = Dynamic Levels; 16‐31 = Real‐Time Levels) o API ƒ Process Base Priority Class (Idle, Below Normal, Normal, Above Normal, High, Real‐Time) ƒ Relative Thread Priority (Time‐Critical, Highest, Above‐Normal, Below‐Normal, Lowest, Idle) proces je bežně spouštěn s Base Priority 24, 13, 10, 8, 6 nebo 4 Materiály •
•
X36OSY, přednáška 2 X36OSY, přednáška 3 Přidělování sdílených prostředků procesům, problém uváznutí ‐podmínky vzniku a řešení. Výpočetní prostředky Výpočetní prostředek: •
•
hardwarové zařízení (např. pásková mechanika, tiskárna, CD vypalovačka,…) informace (např. položka v databázi, řádek v systémové interní tabulce, soubor,…) Výlučný přístup k prostředkům: •
•
většina výpočetních prostředků může být v jednom okamžiku používána pouze jedním procesem (např. tiskárna, páska,…) většina procesů potřebuje výlučný přístup k více prostředkům Dva typy výpočetních prostředků: •
•
odnímatelné (Preemptable): mohou být odebrány procesu bez rizika dalších problémů (např.odložení procesu z fyzické paměti na disk) neodnímatelné (Nonpreemptable): nemohou být odebrány bez rizika (např. CD‐ROM vypalovačka) Sekvence kroků při použití prostředku: 1. žádost o prostředek. 2. použití prostředku. 3. uvolnění prostředku. Pokud žádný prostředek není dostupný: •
•
žádající proces bude automaticky zablokován prostřednictvím OS a probuzen až daný prostředek bude k dispozici žádost skončí s chybou a o žádající proces se ukončí ihned nebo po několika neúspěšných pokusech o žádající proces se bude čekat na prostředek (aktivně/pasivně) Uváznutí (deadlock) Množina procesů uvázne pokud každý proces v množině čeká na nějakou událost, kterou může vyvolat pouze některý proces z množiny. Uváznutí můžeme modelovat pomocí alokačního grafu. Alokační graf: •
•
•
•
•
kolečka představují jednotlivé procesy čtverečky představují jednotlivé prostředky šipka od procesu (kolečka) k prostředku (čtverečku) znamená, že proces potřebuje ke svému pokračování daný prostředek šipka od prostředku (čtverečku) k procesu (kolečku) znamená, že proces právě daný prostředek používá každá smyčka v grafu představuje uváznutí (procesy ve smyčce čekají a nemohou pokračovat) Coffmanovy podmínky (nutné podmínky pro uváznutí) K uváznutí dojde pouze pokud jsou všechny podmínky splněny. 1. vzájemné vyloučení ‐každý prostředek je buď přidělen právě jednomu procesu a nebo je volný (prostředek nemůže být sdílen více procesy) 2. podmínka "drž a čekej" ‐ proces, který má již přiděleny nějaké prostředky, může žádat o další prostředky (proces může žádat o prostředky postupně) 3. podmínka neodnímatelnosti ‐ prostředek, který byl již přidělen nějakému procesu, nemůže mu být násilím odebrán (musí být dobrovolně uvolněn daným procesem) 4. podmínka cyklického čekání ‐ musí existovat smyčka dvou nebo více procesů, ve které každý proces čeká na prostředek přidělený následujícímu procesu ve smyčce Strategie řešení uváznutí 1. pštrosí algoritmus o úplné ignorování celého problému (vychází se z toho, že uváznutí se vyskytuje relativně zřídka, například jednou za rok) o proces se pokusí alokovat prostředek ‐ pokud není k dispozici, proces skončí s chybou o administrátor zjistí uvázlé procesy a ukončí je o toto řešení není přijatelné ve "Fault Tolerant" systémech o dnes velmi používané (Unix, MS Windows) 2. detekce a zotavení o k uváznutí může dojít, ale pak je detekováno a odstraněno o spočívá v evidenci existujících, alokovaných, požadovaných a volných prostředků o algoritmus pro detekci uváznutí: ƒ každý proces je na začátku neoznačen ƒ
ƒ
ƒ
ƒ
ƒ
předpokládáme více prostředků od každého typu Ci,j je matice již alokovaných prostředků, C[i][j] udává, kolik prostředků typu j má alokován proces i Ri,j je matice ještě požadovaných prostředků, R[i][j] udává, kolik prostředků typu j ještě proces i potřebuje E je vektor existujících prostředků A je vektor volných prostředků ¾ najdi neoznačený proces Pi, jehož i‐tý řádek v R má menší nebo stejné hodnoty jako A ¾ pokud takový proces existuje, přičti hodnoty i‐tého řádku z C k hodnotám v A, označ tento proces a opakuj předchozí krok ¾ pokud žádný takový proces neexistuje, algoritmus končí a všechny neoznačené procesy jsou uvázlé 3. dynamické zamezení vzniku uváznutí pomocí pečlivé alokace prostředků o většinou procesy alokují prostředky postupně jeden po druhém ‐ v okamžiku žádosti o další prostředek systém musí rozhodnout, zda přidělení prostředku je bezpečné (tzn. že nedojde k uváznutí) či nebezpečné o prostředek bude přidělen pouze pokud to bude bezpečné o systém se snaží předejít uváznutí opatrnou alokací prostředků o postupový prostor (postupová cesta) lze použít pro modelování vzniku uváznutí (viz obrázek) o bankéřův algoritmus ƒ
předchází vzniku uváznutí ƒ
ƒ
ƒ
bezpečný stav = pokud nedošlo k uváznutí a existuje alokační pořadí zaručující, že každý proces bude postupně uspokojen a skončí pokud by alokace prostředků vedla na nebezpečný stav, je žádost o prostředek odmítnuta nevýhoda: je nutné dopředu znát jaké prostředky bude proces v čase vyžadovat 4. prevence pomocí nesplnění aspoň jedné z Coffmanových podmínek o porušení výlučného přístupu ƒ sdílení prostředku s výlučným přístupem pomocí virtualizace ƒ příkladem je sdílení tiskárny (každý proces pošle svůj požadavek do tiskové fronty, tiskový démon posílá požadavky z tiskové fronty postupně na fyzickou tiskárnu ‐ tedy pouze tiskový démon fyzicky přistupuje k tiskárně) ƒ nelze použít vždy (například sdílení pásky) o porušení podmínky "drž a čekej" ƒ každý proces musí alokovat všechny požadované prostředky v okamžiku spuštěním ƒ prostředky nejsou využívány optimálně ƒ pokud budeme znát požadavky na prostředky v okamžiku spuštění procesu, můžeme použít bankéřův algoritmus o porušení podmínky neodnímatelnosti – v praxi těžko realizovatelné o porušení podmínky kruhového čekání ƒ
ƒ
proces může mít přidělen v daném okamžiku pouze jeden prostředek proces může alokovat více prostředků, ale pouze v přesně definovaném pořadí ƒ
ƒ
ƒ
prostředky mají přiřazena čísla (např. ptiskárna 1, ploter 2, páska 3) proces může požádat pouze o prostředek s vyšším číslem než je maximum z již alokovaných prostředků problém: pro daný počet procesů a prostředků nemusí existovat vhodné očíslování prostředků Materiály •
•
•
X36OSY, přednáška 6 Časově závislé chyby, kritické sekce, metody vzájemného vyloučení procesů a vláken Synchronizace paralelních procesů a vláken (X36OSY) Časově závislé chyby, kritické sekce, metody vzájemné vyloučení procesů a vláken. Časové závislé chyby •
•
•
Dva nebo několik procesů používá (čte/zapisuje) společné sdílené prostředky (např. sdílená paměť, sdílení proměnné, sdílené soubory,…). Výsledek výpočtu je závislý na přepínání kontextu jednotlivých procesů, které používají sdílené prostředky. Velmi špatně se detekují (náhodný výskyt) •
Dle Bernsteinových podmínek by pro vyřešení tohoto problmému musely být sdílené proměnné jen čteny (příliš přísné‐>pouze teoretický význam) Kritická sekce •
•
•
Část programu, kde procesy používají sdílené prostředky (např. sdílená paměť, sdílená proměnná, sdílený soubor, …). Sdružené kritické sekce o Kritické sekce dvou (nebo více) procesů, které se týkají stejného sdíleného prostředku. Vzájemné vyloučení o Procesům není dovoleno sdílet stejný prostředek ve stejném čase. o Procesy se nesmí nacházet ve sdružených sekcích současně. Korektní paralelní program Nutné podmínky: 1.
2.
3.
4.
Dva procesy se nesmí nacházet současně ve stejné sdružené sekci. Žádné předpoklady nesmí být kladeny na rychlost a počet procesorů. Pokud proces běží mimo kritickou sekci nesmí být blokován ostatními procesy. Žádný proces nesmí do nekonečna čekat na vstup do kritické sekce. Metody vzájemné vyloučení procesů a vláken Zákaz přerušení (DI – Deny Interrupt) •
•
•
•
CPU je přidělováno postupně jednotlivým procesům za pomoci přerušení od časovače (nebo jiného přerušení) proces zakáže všechna přerušení před vstupem do kritické sekce a opět je povolí až po opuštění kritické sekce užitečná technika uvnitř jádra OS (ale pouze na krátký čas) nevýhody: o nevhodné pro běžné uživatelské procesy o DI od jednoho uživatele blokuje i ostatní uživatele o ve víceprocesorovém systému má DI efekt pouze na aktuálním CPU o zpomalení reakcí na přerušení o problém se špatně napsanými programy (zablokují CPU) Aktivní čekání •
•
•
•
sdílená proměnná indikuje obsazenost kritické sekce proces ve smyčce testuje aktuální hodnotu proměnné do okamžiku než se sekce uvolní plýtvání časem procesoru pokud OS používá prioritní plánování, může vzniknout inverzní prioritní problém: o proces A má nižší prioritu a nachází se v kritické sekci o proces B má vyšší prioritu a čeká pomocí aktivního čekání na vstup do kritické sekce o pokud je přiřazená priorita fixní, dojde k uváznutí Metody aktivního čekání Lock proměnná •
vzájemné vyloučení pomocí sdílené lock proměnné, kterou proces nastaví při vstupu do kritické sekce •
•
•
naivní řešení pokud dojde k přepnutí kontextu mezi koncem čekání a nastavením sdílené proměnné, může vstoupit do kritické sekce další proces => úplně špatně testování a nastavování proměnné není atomické (neděje se v jednom kroku) Striktní střídání •
•
jeden proces může zpomalit ostatní procesy proces nemůže vstoupit do kritické sekce opakovaně (je porušen 3.bod z nutných podmínek ... ) Petersonův algoritmus •
korektní SW řešení Zdrojový kód pro 2 procesy: #define TRUE 1 #define FALSE 0 #define N 2 int turn; int interested[N]; void enter_section(process) { int other; other = 1 ‐ process; // Počet procesů // Kdo je na řadě? // Na začátku FALSE // Proces je 0 nebo 1 // Číslo druhého procesu // Získání čísla druhého procesu interested[process] = TRUE; // Označíme, že máme zájem o vstup do kritické sekce turn = process; // Nastavíme příznak while(turn == process && interested[other]); // Aktivní čekání } void leave_section(process) { // Proces je číslo procesu, který opouští kritickou sekci interested[N]=false; // Oznámíme opuštění kritické sekce } Instrukce TSL •
•
•
•
instrukce Test and Set Lock načte obsah slova z dané adresy v paměti do registru a nastaví obsah slova na nenulovou hodnotu CPU provádějící TSL instrukci zamkne paměťovou sběrnici, aby znemožnil ostatním CPU přístup do paměti, dokud se instrukce TSL nedokončí TSL je atomická instrukce => korektní HW řešení výhoda: TSL může být použita při synchronizaci v multiprocesorových systémech se sdílenou pamětí Vzájemné vyloučení pomocí blokování •
•
•
lepší způsob než zákaz přerušení nebo aktivní čekání procesy, které nemohou vstoupit do kritické sekce, jsou zablokovány (jejich stav se změnil na "blocked" a jsou umístěny do čekací fronty) blokující a deblokující operace jsou obvykle implementovány jako služby jádra OS Systémová volání Sleep a Wakeup Sleep(): •
•
systémové volání, které zablokuje proces, který ho zavolal zakáže alokování CPU pro tento proces a přesune ho do čekací fronty Wakeup(process): •
•
opačná operace: proces je uvolněn z fornty čekajících procesů a bude mu opět přidělováno CPU řešení potencionálního problému zavolání operace Wakeup() na proces, který ještě není uspán: o
o
Wakeup Waiting bit ‐ při zavolání Wakeup() na proces, který ještě nespí, je tento bit nastaven při pokusu o uspání procesu, která má nastaven Wakeup Waiting bit, se tento proces neuspí, ale pouze resetuje tento bit Semafory •
•
•
•
•
•
datový typ semafor obsahuje čítač a frontu čekajících procesů nabízí tři základní operace: o Init() ‐ čítač se nastaví na zadané číslo a fronta se vyprázdní o Down() ‐ pokud je čítač větší než 0, sníží se o 1; pokud je 0, volající proces zablokuje a uloží do fronty o Up() ‐ pokud nějaké procesy čekají ve frontě, potom se první z nich probudí; v opačném případě se čítač zvětší o 1 každá z těchto operací je prováděna atomicky (během provádění nemůže být přerušena) počáteční hodnota čítače semaforu určuje počet procesů, které mohou sdílet nějaký prostředek současně z počáteční a aktuální hodnoty čítače lze potom určit počet procesů, které se právě nacházejí v kritické sekci nevýhoda: pokud zapomeneme použít operaci Up() na konci kritické sekce, potom procesy čekající ve frontě budou čekat navždy (uváznutí) Binární semafor •
•
•
často nazýván MutEx (Mutual Exclusion) čítač semaforu je na začátku nastaven na 1, tzn. jen jeden proces může „sdílet prostředek“. V tomto případě je však oním sdíleným prostředkem kritická sekce, takže je vyloučeno, aby v ní bylo více procesů současně Monitory •
•
•
•
•
vyšší úroveň synchronizace – nehrozí u nich uváznutí jako u semaforů při zapomenutí operace up() na konci kritické sekce množina procedur, proměnných a datových struktur, které jsou seskupeny dohromady ve speciálním modulu/objektu je to konstrukce vyšších programovacích jazyků, která nabízí stejné možnosti jako semafor v jednom okamžiku může provádět program uvnitř monitoru pouze jeden proces překladač (nikoliv programátor) se stará o vzájemné vyloučení uvnitř monitoru Podmíněné proměnné •
•
•
předdefinovaný datový typ, který umožňuje pozastavit a opět spustit běžící proces operace Wait(c) ‐ pozastaví volající proces na podmíněné proměnné c operace Signal(c) ‐ spustí některý z pozastavených procesů na podmíněné proměnné c Zasílání zpráv •
•
•
•
•
operace send(destination, &message) operace receive(source, &message) synchronizace: o blokující send() i receive() o blokující send(), neblokující receive() o neblokujícjí send(), neblokující receive() + test příchozích zpráv adresování: o přímé ‐ zpráva je uložena přímo do prostoru daného příjemce o nepřímé ‐ zpráva je uložena dočasně do sdílené datové struktury (mailbox) ‐ to umožňuje lépe implementovat kolektivní komunikační algoritmy (One‐To‐
One, One‐To‐Many, Many‐To‐Many) příkladem je MPI (Message‐Passing Interface) Bariéry •
•
pro bariéru definujeme minimální počet procesů N, které ji mohou prolomit když proces dojde k bariéře, tak je zablokován do té doby, dokud všech N procesů nedojde k bariéře Materiály •
•
X36OSY, přednáška 4 X36OSY, přednáška 5 Klasické úlohy synchronizace paralelních procesů a způsoby jejich řešení. Problém producenta a konzumenta •
•
•
jeden z klasických synchronizačních problémů, který demonstruje problémy paralelního programování producent produkuje nějaká data a vkládá je do sdílené paměti konzument vybírá data ze sdílené paměti Řešení pomocí Sleep() a Wakeup() Řešení pomocí semaforů Řešení pomocí zasílání zpráv Večeřící filosofové •
•
•
•
•
model procesů, které souteží o výlučný přístup k omezenému počtu sdílených prostředků N filosofů sedí kolem kulatého stolu mezi každými dvěmi filosofy je jedna vidlička (celkem N vidliček) každý z filosofů buď přemýšlí, nebo jí k jídlu potřebuje současně pravou i levou vidličku Naivní řešení •
•
•
•
všichni filosofové vezmou levou vidličku současně a potom budou čekat, až se uvolní pravá vidlička snadno vede k uváznutí (budou čekat do nekonečna) vylepšení: pokud není pravá vidlička k dispozici, filosof vrátí již alokovanou levou vidličku zpět na stůl a pokus o jídlo zopakuje později vylepšení řešení může také uváznout: o všichni filosofové vezmou levou vidličku o pak se pokusí vzít pravou vidličku, ale protože není volná, vrátí levou vidličku zpět o toto budou do nekonečna opakovat => stárnutí (sice nečekají, ale donekonečna provádí to samé a nikdy se jim to nepovede dokončit) Řešení pomocí semaforů Čtenáři a písaři •
•
•
model procesů, které přistupují do společné databáze více čtenářů může číst současně data, ale jen tahdy, pokud žádný písař nemodifikuje data v databázi pouze jeden písař může modifikovat data v databázi v jednom okamžiku Řešení pomocí semaforů Spící holiči •
•
•
v holičství je N holičů (barber), N holících křesel (barber chair) a M čekacích křesel (waiting chair) pro zákazníky pokud není žádný zákazník v holičství, holič sedne do holícího křesla a usne pokud přijde zákazník, potom: o pokud nějaký holič spí, tak ho zákazník probudí a nechá se ostříhat o jinak si sedne do křesla a čeká (pokud nějaké je volné) o jinak opustí holičství Řešení pomocí semaforů Materiály •
•
•
X36OSY, přednáška 4 X36OSY, přednáška 5 Správa operační paměti (X36OSY) Správa paměti v jednoúlohových a víceúlohových systémech. Základní pojmy •
•
Memory Management Unit (MMU) = hardware umístěný na CPU, který např. překládá logické adresy na fyzické Memory Manager = software, který je součástí OS, udržuje informaci o volné a přidělené paměti, přiděluje a uvolnuje paměť, zajišťuje swapping procesů Základní techniky správy paměti Jednoúlohový systém: •
•
každý proces musí obsahovat ovladače V/V zařízení v paměti je pouze jeden proces, kus paměti je vyčleněn pro jádro OS a kus pro tento program Víceúlohový systém: •
•
•
•
fixní oblasti dynamické oblasti jednoduché stránkování jednoduchá segmentace •
•
virtuální paměť se stránkováním virtuální paměť se segmentací Popis metod správy paměti ve víceúlohových systémech Fixní oblasti •
•
•
•
•
•
rozdělení paměti (většinou při startu systému) na různě velké, avšak fixní, části program je nahrán do stejně velké nebo větší oblasti velikost paměťových oblastí se během běhu OS nemění výhody: jednoduchá implementace, malé režijní náklady nevýhody: interní fragmentace (místo uvnitř oblasti není využito na 100 %); počet aktivních procesů je fixní implementace pomocí o oddělené vstupní fronty pro každou oblast ‐ nevýhodou je, že dochází k nerovnoměrnému obsazení front o
společné vstupní fronty ƒ
strategie výběru úlohy pro volnou oblast (při společné vstupní frontě): ƒ Best Fit ƒ nalezení největší úlohy, která se vejde do oblasti ƒ znevýhodňuje malé (interaktivní) úlohy ƒ lze zlepšit počítadlem, které počítá, kolikrát byl daný proces předběhnut ‐ žádný proces nesmí být předběhnut více než k‐krát ƒ First Fit ƒ nalezení první úlohy, která se vejde do oblasti ƒ
plýtvá místem větších oblastí Dynamické oblasti •
počet, umístění a velikost oblastí se mění dynamicky (neexistují žádné kolonky, do kterých bychom procesy vkládali ), tak jak jednotlivé procesy vznikají, zanikají a přesouvají se mezi hlavní pamětí a diskem •
•
výhody o "žádná" interní fragmentace o efektivnější využití paměti nevýhody o externí fragmentace (možno setřásání paměti, ale je to časově náročné) Zvětšující se procesy: •
•
datový segment procesu může měnit svojí velikost během výpočtu. proto musíme alokovat více paměti než je na počátku potřeba. Požadavky na správu paměti •
přemístění (Relocation) o při kompilaci není většinou známo umístění procesu ve fyzické paměti o každý odkaz do paměti v programu musí být přepočítán podle aktuálního umístění procesu ve fyzické paměti o v programu se můžeme odkazovat na další programy •
•
o různé přístupy k zavádění a spojování programu (viz. dále) ochrana o každý proces musí být chráněn před nechtěnými přístupy z ostatních procesů o paměť je rozdělena na bloky ‐ každý je svázán s n‐bitovým ochranným klíčem, který určuje, zda úloha smí přistupovat k datům v tomto bloku o každá oblast paměti má dva registry (bázový a limitní), které obsahují nejmenší a největší možnou adresu této oblasti ‐ porovnává se při přístupu do paměti o nevýhodou je potřeba sčítání a porovnávání při každém přístupu do paměti (proto se tento problém řeší pomocí speciálního HW) sdílení umožnění přístupu ke společné paměti (např. několik procesů provádí stejný program) logická organizace (logický adresový prostor) o lineární (jednorozměrný) adresový prostor o SW se obvykle skládá z modulů více lineárních prostorů (např. s různými právy, kompilovány v různém čase, …) fyzická organizace (fyzický adresový prostor) o fyzická paměť se skládá z různých úrovní (hierarchie pamětí) – registry, L1, L2 cache, hlavní paměť o
•
•
Spojování a zavádění programu Situace vypadá takto… Zavádění programu •
•
•
absolutní zavedení o každý odkaz v programu obsahuje absolutní fyzickou adresu o program musí být zaveden od dané fyz. adresy o při sestavování programu musím určit, kam bude program zaveden přemístitelné zavedení o každý odkaz do paměti v programu obsahuje relativní adresu o informace o paměťových odkazech je uložena v "Relocation Dictionary" o přepočítání relativní adresy na fyzickou se provede při zavedení programu Dynamic Run‐time Loading o každý odkaz do paměti v programu obsahuje relativní adresu o
program zaveden do paměti s relativními adresami, která se přepočítává na fyzickou až při provádění instrukce Spojování programu •
•
statické spojování ‐ vytvoří se jeden "load module" s relativními adresami vztaženými k začátku modulu dynamické spojování ‐ "load module" obsahuje odkazy na další programy o load‐time dynamic linking ‐ odkazy na další programy se nahradí při zavedení do paměti o run‐time dynamic linking ‐ odkazy na další programy se nahradí při provádění instrukce Správa použité a volné paměti Správa použité a volné paměti se stará o to jak udržovat informaci o volné a přidělené paměti. Možnosti jsou tyto… •
•
bitové mapy zřetězené seznamy Bitové mapy •
•
paměť je rozdělena na alokační jednotky (AU, veliké několik KB) každá AU má korespondující bit ve speciálním "řetězci" – bitové mapě (0‐volná, 1‐
přidělená) •
•
nalezení volných AU = nalezení souvislého řetězce nulových bitů problémy: o velké AU – máme sice malou bitovou mapu, ale plýtváme hlavní pamětí o malé AU – sice lépe využíváme paměť, ale máme velkou bitovou mapu a hledání v bitové mapě je pomalé! Zřetězené seznamy •
zřetězený seznam volných (H ‐ Hole) a přidělených (P ‐ Process) paměťových segmentů . Jak lze vidět na obrázku, položka seznamu udává, zda jde o proces (P) nebo o díru (H), dále jaká je počáteční adresa díry/procesu a nakonec, jak velké místo ten proces či díra zabírá. •
•
•
díry se mohou spojovat a vytvářet tak větší díry pokud proces končí nebo je odložen na disk, je aktualizace seznamu jednoduchá paměť pro nový nebo odložený proces se může alokovat několika způsoby: o First Fit ƒ nalezení první dostatečné díry od začátku seznamu ƒ stávající díra se rozdělí na proces a díru o Next Fit ƒ jako first fit, ale hledání začíná z místa, kde jsme skončili posledně ƒ díry ze začátku seznamu nejsou preferovány o Best Fit ƒ nalezení nejmenší díry, do které se daný proces vejde ƒ stávající díra se rozdělí na proces a malou díru o Worst Fit ƒ nalezení největší díry ƒ nově vzniklá díra bude dostatečné veliká pro další procesy o Quick Fit ƒ informace o dírách je udržována v několika oddělených seznamech ƒ každý seznam obsahuje informaci o dírách, jejichž velikost je v určitém intervalu ƒ
ƒ
o
výhoda: rychlé nelezení volné díry nevýhoda: nalezení sousedních děr pro sloučení do větší díry je časově náročné Buddy systém ƒ jedná se o metodu Quick Fit s dírami o velikosti 2n bytů, takže díry jsou např. ve velikosti 64, 128, 256, 512 B… ƒ
•
výhody: alokace paměti je stejně rychlá jako u Quick Fit algoritmu, zatímco slučování sousedních děr při uvolnění paměti je rychlejší než u Quick Fit algoritmu (nemusíme procházet všechny seznamy) ƒ použití např. pro alokaci paměti v jádře Linuxu o nejpoužívanější je First Fit (Next Fit vykazuje horší chování; Best Fit je pomalejší a plýtvá více pamětí) možnost použití oddělených seznamů pro procesy a díry: o rychlejší alokace paměti o při uvolnění paměti se sousední díry spojují o je vhodné použit obousměrný zřetězený seznam o nevýhoda: složitější (a tím i pomalejší) operace uvolnění paměti Materiály •
X36OSY, přednáška 7 Odkládání na disk (swapování). Odkládání na disk Jedná se o činnost, ke které dochází, pokud nám dochází fyzická paměť. Nepoužívané procesy (lépe řečeno nepoužívané stránky procesů) jsou odkládány z paměti na disk a v případě potřeby jsou přesouvány zpět. Místu na disku, kam se data odkládají, se říká odkládací prostor (Swap Area). Podrobnosti lze nalézt u otázek Stránkování, segmentace, kombinované techniky správy paměti, Způsoby překladu virtuální adresy na fyzickou adresu, Virtuální paměť a dynamický překlad adres a Algoritmy náhrady stránek. Alokace odkládacího prostoru Static Swap Area (prostě swap file je napevno nastaven na urč. velikost) •
•
•
když je proces spuštěn, je pro něj rezervován odkládací prostor na disku výhoda: procesy jsou odkládány na stejné místo na disku nevýhody: o
o
alokujeme více, než je v daném okamžiku nutné problém se zvětšujícími se procesy Dynamic swap area (swap file dynamicky roste podle potřeby) •
•
pro každou stránku alokujeme místo na disku až při odkládání a dealokujeme ho při zpětném přesunu do paměti nevýhody: o proces může být ukončen při nedostatku odkládacího prostoru o složitější SW pro správu odkládacího prostoru Materiály •
•
•
X36OSY, přednáška 8 X36OSY, přednáška 9 X36SKD, přednáška 13 Stránkování, segmentace, kombinované techniky správy paměti. Jednoduché stránkování •
•
hlavní paměť je rozdělena na malé úseky stejné velikosti (např. 4kB) nazývané rámce (frames) • program rozdělen na malé úseky stejné velikosti nazývané stránky (pages) • velikost rámce a stránky je stejná • celý program je nahrán do volných rámců hlavní paměti • OS si musí pamatovat rámce přidělené jednotlivým procesům (např. pomocí tabulky stránek, ...) • OS si musí pamatovat volné rámce v hlavní paměti tzn. rozdíl oproti virtuální paměti je ten, že proces je buď na disku nebo v HP, nic mezi tím. Díky tomu neexistují ani zádné virtuální adresy. •
Na obrázku je dobře zřetelná jedna skutečnost: každý proces má svou tabulku stránek.Toto platí nejen pro jednoduché stránkování, ale také pro virtuální paměť. Je to užitečné z toho důvodu, že procesy si nemohou navzájem přepisovat data. Virtuální paměť •
•
•
•
proces je automaticky (pomocí OS) rozdělen na menší kousky (zase ty stránky) ve fyzické paměti jsou pouze kousky (zase rámce) aktuálně používané, zbytek procesu je na disku většinou je virtuální paměť kombinována se stránkováním princip: o proces používá adresy, kterým se říká virtuální adresy a které tvoří jeho virtuální adresový prostor o virtuální adresový prostor je rozdělen na stejně velké souvislé úseky nazývané virtuální stránky (virtual pages) (typická velikost virtuální stránky je 4KB) o korespondující úseky ve fyzické paměti jsou nazývány rámce stránek (page frames) o v hlavní paměti jsou pouze stránky aktuálně používané, zbytek je odložen na disku •
proces adresuje paměť pomocí virtuálních adres, MMU (Memory Management Unit) překládá virtuální adresu na fyzickou •
•
výpadek stránky (Page Fault) – to je to samé jako Cache Miss, ale pro hlavní paměť o pokud není virtuální stránka ve fyzické paměti, MMU způsobí, aby CPU požádalo OS o nahrání příslušné stránky do fyzické paměti o OS nejdříve definuje, který rámec fyzické paměti je třeba uvolnit, a pak do něj nahraje obsah požadované virtuální stránky z disku MMU tedy definuje zobrazení f přidělující virtuálním stránkám fyzické rámce: číslo_fyzického_rámce = f (číslo_virtuální_stránky) – viz obrázek… •
zobrazení f() může být implementováno pomocí tabulky stránek (tabulka obsahující odpovídající dvojíce <stránka, rámec>) o nevýhody: tabulka stránek může být extémně velká => použití víceúrovňové tabulky stránek Víceúrovňová tabulka stránek •
•
•
•
proces obvykle používá pouze podmnožinu adres svého virtuálního prostoru stačilo by mít v paměti pouze ty položky z tabulky stránek, které bude OS potřebovat při překladu Present/Absent bity položek v top‐level page table jsou na začátku nastaveny na 0, protože virtuální stránky s nimi spojeny nebyly zatím používány při pokusu přístupu k těmto stránkám dojde k výpadku stránky a potřebné informace budou nahrány do paměti •
•
•
•
obecně lze tabulku stránek rozdělit do libovolného počtu úrovní, v praxi se z důvodu rychlosti překladu adres používají pouze dvou a tříúrovňové tabulky většina OS používá tzv. Demand Paging: o když je proces spuštěn, nahrají se do RAM pouze první stránky kódu a první stránky dat o ostatní stránky budou nahrány do RAM až v okamžiku, kdy budou potřeba výhody: malá velikost tabulek v paměti nevýhody: pomalejší překlad Položka v tabulce stránek •
její struktura je závislá na architektuře CPU, ale obvykle obsahuje: o
o
o
o
o
o
Page Frame Number = číslo rámce, do kterého je stránka namapována Present/Absent bit ƒ 1 – stránka je v RAM, ƒ 0 – stránka není v RAM, přístup na stránku způsobí výpadek stránky (Page Fault) Protection bits ƒ 3 bity ‐ Reading, Writing, Executing Modified bit ƒ když je obsah stránky modifikován, HW automaticky nastaví bit na 1 ƒ když OS uvolňuje rámec stránky: ƒ musí obsah stránky uložit na disk pokud je „Modified bit“ roven 1 ƒ jinak může nahrát do rámce rovnou novou stránku Referenced bit ƒ kdykoliv je ke stránce přistupováno (pro čtení nebo zápis), je tento bit nastaven na 1 ƒ hodnota tohoto bitu je používána algoritmy pro náhradu stránek Caching Disabled bit ƒ je důležitý pro stránky, které jsou mapovány na registry periferních zařízení ƒ pokud čekáme na V/V (např. v cyklu), musíme použít hodnoty z fyzických HW registrů, nikoliv (starý) obsah v paměti Translation Lookaside Buffer (TLB) •
•
většina programů provádí velký počet přístupů k malému počtu stránek (tzn. stále se přistupuje k více či méně stejné množině stránek) TLB je vlastně taková Cache tabulky stránek, tzn. obsahuje její nejčastěji používané položky, přístup k položce v TLB je samozřejmě mnohem rychlejší než přístup k položce tabulky stránek. •
•
TLB je organizovaný jako asociativní paměť TLB je obvykle uvnitř MMU a obsahuje desítky položek (položky mají samozřejmě úplně stejnou formu jako ty v tabulce stránek – viz. obr.) •
•
•
•
při překladu virtuální adresy VA MMU nejdříve hledá informaci o VA v TLB hledávání v TLB probíhá paralelně pokud informace o VA existuje v TLB, MMU použije tuto informaci pro překlad VA a nemusí hledat v tabulce stránek pokud informace v TLB není, MMU vyvolá TLB Fault → OS pak musí načíst informaci z tabulky stránek Invertovaná tabulka stránek •
•
•
•
•
•
•
•
v klasické tabulce stránek číslo virtuální stránky slouží jako index do tabulky v 32 bitových počítačích má každý proces 32 bitovou virtuální adresu. Při velikosti stránky 4kB má tabulka stránek každého procesu 1M položek. Se 4B na každou položku zabírá tabulka stránek 4MB v 64 bitových počítačích se 64 bitovou virtuální adresou je situace ještě zřejmější. Při 4kB stránkách, tabulka stránek má 252 položek ačkoliv virtuální adresový prostor je obrovský, fyzický prostor RAM je stále malý tabulka stránek muže být organizována kolem fyzické paměti v invertované tabulce stránek, i‐tá položka obsahuje informaci o virtuální stránce (proto se nazývá invertovaná – všimni si, že v normální tabulce stránek obsahovala virtuální stránka informace o fyzické stránce), která je nahrána v rámci i invertovaná tabulka stránek s obvykle používá společně s TLB o při nalezení v TLB se invertovaná tabulka nepoužije o jinak musíme hledat v invertované tabulce stránek sekvenční hledání v tabulce může být urychleno pomocí rozptylovací (hashovací) funkce Virtuální paměť vs. segmentace Virtuální paměť: •
•
proces má jednorozměrný virtuální adresový prostor pro některé problémy, dva nebo více oddělených adresových prostorů (segmentů) je vhodnější Segmentace: •
virtuální adresový prostor procesu je rozdělen na několik segmentů •
•
•
•
segment je lineární posloupnost adres, od 0 do nějaké maximální adresy různé segmenty mohou mít různé délky, délka segmentu se může měnit během výpočtu různé segmenty mohou mít rozdílnou ochranu a mohou být sdílené logická adresa se skládá ze dvou částí: čísla segmentu a offsetu (pro jednoduchou segmentaci) Jednoduchá segmentace •
•
logická adresa se skládá ze dvou částí: číslo segmentu a offset segmentace je takto viditelná pro programátora Segmentace se stránkováním •
•
•
•
•
virtuální adresový prostor je rozdělen na několik segmentů každý segment se skládá z stejně velkých stránek, které jsou stejně velké jak rámce v hlavní paměti z hlediska programátora se virtuální adresa skládá z čísla segmentu a offsetu uvnitř segmentu z hlediska systému se offset segmentu skládá z čísla stránky a offsetu uvnitř stránky segmentace se stránkováním se může používat společně s TLB Postup při překladu virtuální adresy u segmentace se stránkováním •
•
•
MMU se nejdříve podívá zda není informace v TLB pokud ano, použije pro překlad číslo rámce z TLB jinak MMU hledá v tabulce segmentů a následně v příslušné v tabulce stránek Materiály •
X36OSY, přednáška 8 Způsoby překladu virtuální adresy na fyzickou adresu. Překlad virtuální adresy na fyzickou adresu Překlad zajišťuje speciální HW, tzv. MMU (Memory Management Unit). V závislosti na použité realizaci virtuální paměti (stránkování, segmentace, kombinace segmentace se stránkováním) tento obvod zprostředkovává převod VA na FA za pomoci pomocných struktur (tabulka stránek, Translation Lookaside Buffer, ...). Více informací lze nalézt především u otázky Stránkování, segmentace, kombinované techniky správy paměti a dále u otázky Virtuální paměť a dynamický překlad adres. Materiály •
•
X36OSY, přednáška 8 X36SKD, přednáška 13 Algoritmy náhrady stránek. Strategie nahrání (Fetch Policy) •
•
•
určuje, kdy má být virtuální stránka nahrána do hlavní paměti stránkování na žádost (demand paging) ‐ virtuální stránky jsou nahrávány do hlavní paměti až v okamžiku, když se na ně proces pokusí přistoupit předstránkování (prepaging) ‐ virtuální stránky se nahrají do hlavní paměti ještě dříve než se na ně přistupuje Strategie umístění (Placement Policy) •
•
•
určuje, kam do hlavní paměti bude stránka nahrána v systémech s čistou segmentací hraje důležitou roli (např. best‐fit, first‐fit,...) v systémech se stránkováním je bezpředmětná Strategie nahrazování (Replacement Policy) •
•
•
•
určuje, které stránky v hlavní paměti budou nahrazeny rezidentní velikost (Resident Set Size) ‐ kolik rámců stránek v hlavní paměti bude alokováno pro každý proces rezidentní rozsah (Resident Scope) ‐ určuje zda kandidáti pro náhradu stránky budou pouzestránky patřící procesu, který způsobil výpadek stránky, a nebo všechny stránky (i stránky patřící ostatním procesům) v hlavní paměti nahrazovací algoritmy ‐ z množiny kandidátů vybere stránku, která se nahradí (např. Aging alg., WSclock alg.,...) •
Rezidentní velikost ‐ možnosti: o fixed‐allocation policy ‐ proces dostane fixní počet rámců v paměti o variable‐allocation policy ‐ počet rámců se mění dynamicky podle potřeby •
Rezidentní rozsah ‐ možnosti: o A local replacement policy ‐ mezi kandidáty pro náhradu stránek patří pouze stránky patřící procesu, který způsobil výpadek stránky o A global replacement policy ‐ mezi kandidáty patří všechny stránky v hlavní paměti Pro nahrazování stránek existují tyto možnosti: o Fixed‐allocation, local scope o Variable‐allocation, global scope o Variable‐allocation, local scope •
Strategie ukládání (Cleaning Policy) •
•
•
•
určuje, kdy se modifikované stránky budou zapisovat na disk ukládání na žádost (Demand cleaning) ‐ stránka je uložena na disk až v okamžiku nahrazování průběžné ukládání (Precleaning policy) ‐ modifikované stránky jsou průběžně ukládány na disk (ukládání je efektivnější protože probíhá ve větších objemech) Page Buffering o ukládáme pouze stránky, které by mohly být nahrazeny (spojení ukládání a nahrazování do jednoho kroku) o stránky vhodné pro náhradu jsou umístěny do dvou seznamů: „modifikované“ a „nemodifikované“ o stránky ze seznamu „modifikované“ jsou periodicky v dávce zapisovány na disk a přesunuty do seznamu „nemodifikované“ o stránky ze seznamu „nemodifikované“ jsou buď ze seznamu vyloučeny, pokud se k nim bude ještě přistupovat, a nebo přepsány pokud jsou nahrazeny Řízení zatížení (Load Control) •
•
•
•
pokud proces způsobuje časté výpadky stránek, je označen jako „přetížený“ (thrashing) pokud pracovní množiny (working sets) všech procesů překročí kapacitu hlavní paměti, dojde k přetížení celého systému způsob jak snížit přetížení hlavní paměti je odložení (swap) některých procesů na disk a uvolněné rámce přidělit ostatním procesům periodicky, některé procesy přesunuty z paměti na disk a jiné z disku zpět do paměti Alokace odkládacího prostoru (Swap Area) •
•
Static Swap Area o když je proces spuštěn, je pro něj rezervován alokační prostor o výhoda: procesy jsou odkládány na stejné místo na disku o nevýhoda: ƒ alokujeme více než je v daném okamžiku nutné ƒ problém se zvětšujícími se procesy Dynamic Swap Area o alokujeme místo na disku pro každou stránku až při odkládání a uvolníme ho pří zpětném přesunu do paměti o Nevýhoda: ƒ proces muže být ukončen při nedostatku odkládacího prostoru ƒ složitější SW pro správu odkládacího prostoru Algoritmy pro náhradu stránek •
•
•
•
všechny rámce stránek v hlavní paměti jsou obsazené potřebujeme nahrát další virtuální stránku do hlavní paměti algoritmus pro náhradu stránek musí určit stránku, která bude nahrazena většina algoritmů je založena na principu lokality (stránky, ke kterým se přistupovalo v nedávné minulosti, se bude přistupovat s velkou pravděpodobností v blízké budoucnosti) Optimální algoritmus Princip: •
•
nahradí se stránka, která již nebude používána (pokud taková existuje) jinak nahradíme stránku, která bude používána za nejdelší dobu od tohoto okamžiku Realizace: •
•
•
•
každé stránce přiřadíme číslo, které říká, kolik instrukcí se musí provést před tím, než se k této stránce bude zase přistupovat optimální algoritmus nahradí stránku s nejvyšším číslem (tzn. tu, která se bude používat nejpozději) Výhoda: dosahuje nejlepších výsledků Nevýhody: o musíme znát budoucnost :‐) o v praxi nelze použít – nikdo totiž ještě nevynalezl stroj času… o slouží pro porovnávání ostatních algoritmů Not Recently Used Algorithm (NRU) – v překladu „ne nedávno použitá“ •
•
•
•
•
•
•
•
každé stránce jsou přiřazeny dva bity R (read) a M (modify): R bit je nastaven když ke stránce přistupujeme (čtení/zápis), M bit je nastaven, když stránku modifikujeme (zápis) tyto bity jsou uloženy např. v tabulce stránek jsou aktualizovány hardwarem při každém přístupu na stránku při spuštění procesu jsou oba bity vynulovány periodicky (např. při přerušení od časovače) je bit R nulován tak, abychom rozlišili, které stránky byly používány nedávno při výpadku stránky lze stránky rozdělit do 4 kategorií: o kategorie 0: R=0 M=0 – stránka nebyla dlouho čtena a nikdy modifikována o kategorie 1: R=0 M=1 – stránka nebyla dlouho čtena, ale bylo na ni zapsáno o kategorie 2: R=1 M=0 – stránka byla přednedávnem čtena, zapsáno nebylo o kategorie 3: R=1 M=1 ‐ stránka byla přednedávnem čtena i modifikována algoritmus NRU náhodně nahradí stránku z nejnižší kategorie, která není prázdná NRU je jednoduchý na pochopení a implementaci (a poskytuje odpovídající výsledky) First‐In, First‐Out Algorithm (FIFO) •
•
•
OS si udržuje seznam všech stránek, které jsou právě v hlavní paměti: o nejstarší stránky jsou na začátku seznamu o posledně nahrané stránky jsou na konci seznamu při výpadku stránky je nejstarší stránka ze začátku seznamu vyhozena z hlavní paměti a nová stránka je přidána na konec seznamu nevýhoda: FIFO bere v úvahu pouze kdy se stránka načetla do hlavní paměti, ale nikoliv jak často se ke stránce přistupuje Second Chance Algorithm •
•
•
•
jednoduchá modifikace FIFO pomocí bitu R, který se nastavuje při přístupu ke stránce a periodicky se nuluje při výpadku stránky procházíme seznam od začátku pokud R bit je 0, je stránka stará a nepoužívaná, proto ji nahradíme pokud R bit je 1, potom tento bit vynulujeme, stránku přesuneme na konec seznamu a pokračujeme v hledání ... viz obrázek – stránky jsou seřazeny od těch dávno nahraných po ty nedávno nahané, fronta se prochází od začátku. The Clock Algorithm •
•
•
modifikace algoritmu „Second Chance“ informace o virtuálních stránkách je udržována v cyklické frontě orientované ve směru hodinových ručiček při výpadku stránky, začneme hledat od stránky, na kterou ukazuje ručička: o pokud R = 0, potom stránku nahradíme o pokud R = 1, potom vynulujeme bit R, posuneme ručičku a hledáme dál Least Recently Used Algorithm (LRU) – v překladu „nejméně nedávno použitá“ •
•
•
•
dobrá aproximace optimálního algoritmu základní myšlenka: stránky hodně používané během několika posledních instrukcí budou s velkou pravděpodobností ještě používány během několika následujících instrukcí při výpadku stránky nahradíme stránku, která nebyla používána po nejdelší dobu teoreticky realizovatelné, ale drahé •
•
úplná implementace LRU: seznam stránek setříděný podle doby přístupu, který je aktualizován při každém přístupu do paměti implementace v praxi: o HW čítač o HW udržuje matici N*N – pokud přistoupí ke stránce i pak sloupec i matice nastaví na nuly a potom řádek i nastaví na jedničky. V jakémkoli okamžiku řádek s nejnižší bitovou hodnotou reprezentuje nejmén používanou stránku. příklad: ke stránkám bylo přistupováno: 0 1 2 3 2 1 0 3 2 3. o
lze použít řešení se softwarovým čítačem nazývané NFU (Not Frequently Used) ƒ S každou stránkou je spojen SW čítač a bit R, na počátku ƒ nastavené na 0. ƒ Při přístupu na stránku je nastaven bit R na 1. ƒ Při přerušení od časovače– R bit je přičten k čítači u každé stránky a vynulován. ƒ Při výpadku stránky, stránka s nejnižším čítačem je nahrazena. Aging Algorithm •
•
problém: Algoritmus NFU nic nezapomíná (nerozlišuje kdy se ke stránce přistupovalo) řešení: princip stárnutí ‐ při přerušení od časovače: o obsah čítače je posunut doprava o jeden bit před přičtením bitu R o bit R je přičten do nejlevějšího bitu čítače o bit R je vynulován o při výpadku stránky nahradíme stránku s nejmenší hodnotou čítače příklad Aging Algoritmu: Working Set Algorithm •
•
•
•
•
•
•
pro každý proces definujeme: o aktuální virtuální čas (CVT) = množství času CPU, které proces skutečně využil o pracovní množina (WS) = množina stránek, ke kterým proces přistupoval během poledních τ jednotek svého CVT každá položka v tabulce stránek obsahuje: o TLU – čas “posledního použití” o R – Referenced bit o M – Modified bit při přístupu (čtení/zápis) ke stránce nastavíme bit R na 1 při modifikaci stránky nastavíme ještě bit M na 1 periodicky při přerušení od časovače vynulujeme bit R při výpadku stránky: o nechť Age = CVT ‐ TLU o procházíme tabulku stránek a testujeme R bit: ƒ pokud (R=1), potom TLU=CVT and R=0 ƒ pokud (R=0 && Age > τ), potom nahradíme tuto stránku (nepatří do WS) ƒ pokud (R=0 && Age ≤ τ), potom si zapamatujeme stránku s největším Age (tato stránka patří do WS) o pokud všechny stránky patří do WS, nahradíme stránku s největším Age (pokud jich bude více, vybereme náhodně jednu) nevýhoda: musíme procházet celou tabulku stránek WS‐Clock Algorithm •
•
•
lepší implementace Working Set algoritmu informace o rámcích stránek jsou uloženy v kruhové frontě orientované ve směru hodinových ručiček každá položka fronty obsahuje: o TLU – čas “posledního použití” o R – Referenced bit •
•
o M – Modified bit při výpadku stránky je stránka, na kterou ukazuje ručička, testována jako první: o pokud (R=1),potom TLU=CVT , R=0 a posuneme ručičku o pokud (R=0 && Age > τ && M=0), potom do tohoto rámce nahrajeme novou stránku o pokud (R=0 && Age > τ && M=1) naplánujeme zápis obsahu rámce na disk a posuneme ručičku pokud jsme otestovali celou frontu: o pokud byl naplánován aspoň jeden zápis, potom novou stránku nahrajeme do prvního uloženého rámce o pokud nebyl naplánován žádný zápis, potom všechny stránky patří do WS: ƒ pokusíme se použít první čistý rámec (M=0) ƒ pokud neexistuje žádný čistý rámec, uložíme obsah aktuálního rámce a nahrajeme do něj novou stránku Shrnutí algoritmů pro náhradu stránky Materiály •
•
X36OSY, přednáška 9 Systémy souborů (X36OSY) Atributy souborů, typy souborů, operace se soubory Atributy souborů •
•
•
soubor = jméno + atributy + data jméno souboru o délka (8+3 znaků nebo 255,... záleží jak kde), kódování (ASCII, UNICODE,…) atributy souboru o typ souboru (adresář, obyčejný soubor, link, ...) o vlastníci souboru (uživatel, skupina, ostatní, ...) o přístupová práva (čtení, zápis, spuštění, setuid, ACL, ...) o
•
•
čas (vytvoření, modifikace, přístupu, ...) data o obsah souboru, který je uložen v datových blocích na disku přístup k souboru o pomocí systémových volání: open(), close(), seek(), read(), write(), stat(), ... o příkazy OS, aplikace Sdílené soubory •
•
•
sdílené soubory mohou být viděny současně z různých adresářů pod různými jmény změny obsahu souboru v jednom adresáři by měli být viděny ve všech adresářích link = spojení mezi sdíleným souborem a adresáři •
•
•
problém: o nechť v adresářích (na obrázku označené písmenem ve čtverečku) jsou uloženy i adresy datových bloků souboru o pokud jeden uživatel zvětší sdílený soubor o jeden datový blok, pak ostatní uživatelé tuto změnu neuvidí řešení 1 (Hard Link) o každému souboru přiřadíme strukturu, která bude obsahovat adresy datových bloků daného souboru (např. i‐node) o v adresáři bude ukazatel na tuto strukturu řešení 2 (Soft Link) o adresáře ukazují na systémový soubor typu "LINK", který obsahuje cestu ke sdílenému souboru Typy souborů V UNIXu tři typy: •
•
•
obyčejný soubor o textové soubory o binární soubory adresář zvláštní soubor o není to soubor soubor v pravém smyslu ‐ například "soubory" v adresáři /dev o například symbolické jméno periferie o
o
o
symbolické linky u sdílených souborů (link) pojmenované roury (pipe) socket Operace se soubory •
•
•
•
•
open() – otevření souboru close() – zavření souboru seek() – nalezení souboru read() – čtení ze souboru write() – zápis do souboru Materiály •
X36OSY, přednáška 11 Implementace souborů‐datové bloky, způsoby uložení atributů, správa volných bloků. Rozvržení disku •
•
•
Master Boot Record (MBR) ‐ obsahuje program pro zavedení jádra OS z disku do paměti tabulka oblastí (Partition Table, PT) o disk může být rozdělen na několik diskových oblastí o každá oblast může obsahovat svůj systém souborů jednotlivé oblasti Rozvržení systému souborů (File System ‐ FS) •
•
•
•
•
Boot Block Super Block obsahuje klíčové informace o FS: o magické číslo (pro identifikaci typu FS) o velikost datových bloků a jejich počet v daném FS o velikost “File Headers” oblasti o umístění kořenového adresáře, ... Free Space Management ‐ informace o volných datových blocích a "File Headers" File Headers ‐ pole struktur (jedna na soubor) obsahujících např. atributy souborů a adresy datových bloků datové bloky ‐ je v nich uložen obsah adresářů a souborů Sector vs. datový blok •
•
•
•
•
Sector (fyzická jednotka) = minimální adresovatelná jednotka na disku (typicky 512B) datový blok (logická jednotka) = minimální adresovatelná jednotka ve FS (souvislá posloupnost sektorů) ‐ pozor – nemusí mít rozhodně stejnou velikost jako sektor Příklad: MS Windows FAT 32 má 4kB,...,32kB datové bloky, NTFS má 512B...64 kB, UNIX ufs má 4kB až 64 kB velké datové bloky velké datové bloky jsou vhodné pro FS s velkými soubory a soubory s sekvenčním přístupem malé datové bloky jsou vhodné pro FS s malými soubory a soubory s náhodným přístupem Správa volného prostoru •
zřetězený seznam o je uložen ve volných datových blocích o v hlavní paměti je pouze část tohoto seznamu •
bitová mapa o většinou zabírá méně místa než zřetězený seznam o pouze v případě téměř zaplněného FS je zřetězený seznam výhodnější Souvislá alokace datových bloků •
•
•
•
obsah souboru je uložen na disku v souvislé posloupnosti datových bloků používá se např. v UNIX Veritas File System (vxfs) výhody: o jednodušší implementace o pro přístup k obsahu souboru musíme znát pouze diskovou adresu prvního datového bloku a počet datových bloků alokovaných pro soubor o výborný výkon čtení/zápisu nevýhody: o složitější alokace datových bloků (obvykle naznáme maximální velikost souboru při jeho vytváření) o fragmentace disku Alokace datových bloků pomocí zřetězeného seznamu •
•
•
každý datový blok obsahuje data a ukazatel na následující datový blok výhody: o pro přístup k obsahu souboru musíme znát pouze diskovou adresu prvního datového bloku o žádná fragmentace nevýhody: o pomalý náhodný přístup o množství dat v datovém bloku není přesně mocninou dvou Alokace datových bloků pomocí tabulky •
alokace datových bloků je založená na zřetězeném seznamu, ale ukazatelé na následující datový blok jsou uloženy v tabulce FAT (číslo diskového bloku je přímo indexem řádku tabulky) – např. si vem soubor A – ten začíná na datovém bloku 4, tak •
•
•
se do tabulky podívej na řádek 4, tam je číslo datového bloku, jímž soubor pokračuje atd. atd. při přístupu k FS je FAT nebo její část nahrána do hlavní paměti výhody: o celý datový blok je využit pro uložení dat o náhodný přístup je rychlý (pokud je FAT v hlavní paměti) o pro přístup k souboru stačí znát adresu prvního datového bloku o informace o volných datových blocích je obsažená ve FAT nevýhody: o velikost FAT (např. pro 20GB FS s velikostí datového bloku 1KB, má FAT 20 milionů položek) o celá nebo část FAT musí být v hlavní paměti během používání FS Index Nodes (i‐nodes) Na obrázku je struktura I‐nodu jednoho souboru… •
•
•
•
•
i‐node je struktura, která obsahuje jak atributy souboru, tak adresy datových bloků, ve kterých je uložen obsah souboru jsou tam přímé adresy a nepřímé adresy (první, druhé a třetí úrovně) speciální datové bloky jsou určeny pro uložení adres datových bloků při nepřímé adresaci výhoda: v hlavní paměti jsou pouze i‐nodes otevřených souborů nevýhody: o přístup k velkým souborům je pomalejší než k malým souborům o přibližně 10% datových bloků ve FS je použito na uložení adres datových bloků (speciální datové bloky) MFT (Master File Table) •
•
obdoba FAT použito u file systému NTFS ‐ více o MFT u kapitoly Systémy souborů Materiály •
•
X36OSY, přednáška 11 http://smartrady.com/fel.php Implementace adresářů Adresáře / Složky •
umožňují hierarchické uložení informací ve stromě adresářů •
•
cesta k souboru nebo adresáři může být: o absolutní ƒ začíná vždy v kořenovém adresáři ‐ root ƒ obsahuje posloupnost podadresářů mezi root a cílovým souborem (např. /home/rocnik2/skupina12/Novak) o relativní ƒ začíná vždy v aktuálním adresáři ‐ current ƒ obsahuje posloupnost podadresářů mezi current a cílovým souborem ƒ příklad: ƒ current=/home/rocnik2/skupina15 ƒ ../skupina12/Novak (.. je nadřazený adresář, kdyby to někdo nevěděl – viz speciální „soubory“ dále) přístup k adresáři o pomocí systémových volání: opendir(), creat(), getfirst(), getnext(), link(), ... o příkazy OS, aplikace. Struktura položky adresáře 1. jméno souboru, atributy souboru a adresy datových bloků souboru (FAT12, FAT16, FAT32) 2. jméno souboru a ukazatel na speciální strukturu, která obsahuje atributy souboru a adresy datových bloků souboru (např. UNIX a jeho i‐nody) Speciální "soubory" Jedná se o speciální soubory v adresáři umožňující získat přístup k hierarchicky nadřazenému a aktuálnímu adresáři. •
•
. ‐ link na aktuální adresář .. ‐ link na rodičovský adresář (hierarchicky nadrřazený adresář) Materiály •
X36OSY, přednáška 11 Disková vyrovnávací paměť. Systémy souborů(FAT, UFS, NTFS). Disková vyrovnávací paměť Čtení dat. blok z disku je výrazně pomalejší než čtení slova z hlavní paměti. Vyrovnávací paměť (block cache) •
•
•
•
•
Obsahuje některé informace načtené z FS na disku. Část RAM. Statická cache (fixní velikost, např. 10% RAM). Dynamická cache (proměnná velikost, např. od 5 do50 % RAM). Přiznejme si, že to co je na slidech je 100 let za opicema. Dnes disky samozřejmě disponují vlastní vyrovnávací pamětí. Její běžná velikost je tak 8 – 16 MB, ale četl jsem i o disku, který má 1GB vyrovnávací paměti. Pokud není místo ve vyrovnávací paměti, některé dat. bloky musí být odsunuty zpět na disk. Pro výběr dat. bloků, které odsuneme, používáme modifikované algoritmy pro náhradu stránek (FIFO, LRU, second chance – jejich popis je v kapitole Algoritmy pro náhradu stránek). Strategie zápisu modifikovaných dat. bloků: Write through cache (MS‐DOS) Všechny změny ve FS se zapisují okamžitě jak do vyrovnávací paměti tak do FS na disku (bezpečné, ale málo efektivní). Nonwrite through cache (UNIX) Čtení z vyrovnávací paměti je synchronní (data jsou současně načtena z FS na disku do vyrovnávací paměti i do procesu). Zápis obsahu vyrovnávací paměti do FS na disku je asynchronní – prováděný periodicky pomocí systém. démona (např. syncer v UNIXu každých 30 sekund). Systémy souborů FAT (File Allocation Table) •
jména souborů: o 8+3 velkých znaků: jméno+přípona (FAT‐12, FAT‐16) o 256 znaků (FAT‐32). Rozložení FS: Položka adresáře ve FAT‐12 a FAT‐16 (32 bajtů): Položka adresáře ve FAT‐32 (32 bajtů): •
•
každý soubor může mít dvě jména (jméno 8+3 a dlouhé jméno) dlouhé jméno je uloženo ve více položkách adresáře Přístup k souboru: ‐ Jak je vidět, tak tabulka sama o sobě neobsahuje bližší informace o svých položkách. Tyto jsou obsaženy až v datových blocích daných položek. Kořenový adresář má však indformace ve svojí tabulce. Vyhledávání probíhá takto: prostě v tabulce kořenového adresáře najdeme index do FAT k podadresáři Directory_A . V tabulce FAT bude pouze napsané číslo datového bloku, který obsahuje informace o adresáři. Tak se podíváme do toho bloku a najdeme tam informace o souborech adresáře, resp. jejich indexy do tabulky FAT. Atd.atd. UFS (Unix File System) Rozložení FS: Přístup k souboru: Každý i‐node obsahuje ukazatele na datové bloky souborů, takže si nejprve v tabulce i‐nodů u adresáře Root najdeme číslo datového bloku, který obsahuje informace o podadresářích, podíváme se do toho bloku a tam je u hledaného podadresáře index do tabulky i‐nodů, tedy číslo i‐nodu, který obsahuje bližší info o tomto adresáři. Pokračujeme analogicky, než najdeme i‐node hledaného souboru a ten obsahuje čísla jeho datových bloků. NTFS (New Technology File System) •
•
•
•
•
•
jméno souboru: ƒ cesta (32767 znaků) + jméno (255 znaků) v UNICODE 64 bitové diskové adresy datový blok (Cluster): 512B, ..., 64KB podpora hard linků i symbolických linků umožňuje kompresi a kryptování Tabulka souborů se jmenuje Master File Table (MFT) – je to obdoba FAT (file alocation table) Rozložení FS: Příklad Master File Table (MFT): Položka MFT: •
•
•
•
popisuje jeden soubor / adresář skládá se z posloupnosti dvojic (attribute header a hodnota) rezidentní atribut = attribute header i hodnota jsou v položce MFT nerezidentní atributy = attribute header je v položce MFT, ale hodnota je uložena v datových blocích Přístup k souboru: Je to podobné jako u předešlých filesystémů… Materiály •
•
•
X36OSY, přednáška 11 Wikipedia ‐ Unix File System http://www.programujte.com/view.php?cisloclanku=2005083102 RAID. Něco na úvod o Redundant Array of Independent Disks (RAID) •
•
•
•
1988, University of California at Berkeley SLED = Single Large Expensive Disk RAID = Redundant Array of Independent (Inexpensive) Disks obecná charakteristika: o RAID je množina fyzických disků, které OS vidí jako jeden logický disk o data jsou distribuována mezi jednotlivé fyzické disky část (redundantní) diskové kapacity slouží pro uložení pomocných informací (např. parita, ...) nutných pro obnovu v případě poškození některých disků o Mean Time To Failure (MTTF) – očekávaný čas poškození disku o MTTF jednoho disku je 50 000 hodin (= tak 5.5 roku) o MTTF pole o pěti discích je 10 000 hodin (= asi 1 rok – tak to je COOL) výhody: o vysoká spolehlivost o velká šířka pásma (počet přenesených bytů/doba od zadaní do ukončení požadavku) o
•
Realizace RAID •
•
hardwarový RAID o RAID SCSI řadič + pole SCSI disků o RAID se jeví pro OS jako jeden velký disk softwarový RAID o RAID software + pole SCSI disků o RAID software může být součástí OS o RAID se jeví pro OS jako jeden velký disk Typy RAID RAID 0 ‐ Chaining (zřetězení) •
•
•
data jsou postupně zapisována na jednotlivé disky (po naplnění prvního disku, pokračujeme na druhém,...) operace čtení/zápis stejně rychlé jako u jednoho disku v SW RAIDu slouží jako přípravný krok pro zrcadlení (např. již existujícího systémového FS) RAID 0 ‐ Striping •
•
•
•
•
data jsou postupně zapisována po na jednotlivé disky (po zaplnění prvního disku pokračujeme plynule na druhém) logický disk se skládá ze stripů (strip = množina K po sobě následujících sektorů) operace čtení a zápis jsou stejně rychlé, jako u jednoho disku výhody: (platí to samé i u zřetězení) o lze využít celou diskovou kapacitu o zvýšení propustnosti vyvážením zátěže malými přístupy o paralelizace velkých přístupů s cílem zkrácení doby odpovědi nevýhoda (platí to samé i u zřetězení): o poškození jednoho disku způsobí ztrátu všech dat RAID 1 ‐ Mirroring Prostě zrcadlíme jeden disk na druhý. •
•
výhody: o při ztátě disku lze data okamžitě získat z kopie o zápis může být stejně rychlý jako u jednoho disku (podle strategie zápisu: paralelní / sériová) – máme totiž více hlav žejo. o čtení dat může být rychlejší než u jednoho disku (podle strategie čtení: Round Robin / Geometric / First) nevýhoda: využijeme pouze polovinu diskové kapacity RAID 0+1 stripování (nejdříve stripping (0), pak mirroring (1)) •
•
výhody o data jsou distribuována mezi disky o čtení a zápis mohou být rychlejší než u jednoho disku o redundance nevýhody: o lze využít pouze polovinu diskové kapacity o výpadek jednoho disku způsobí ztrátu redundance RAID 1+0 stripování (nejdřív mirroring (1), pak stripping (0)) •
•
výhody: o jako u RAID 0+1 o toleruje větší počet poškozených disků o rychlejší obnova dat nevýhody: o lze využít pouze polovinu diskové kapacity RAID 2 •
•
•
•
•
•
všechny disky jsou synchronizovány data jsou stripována po bytech mezi jednotlivé disky zabezpečení dat pomocí Hammingova kódu (oprava jednobitových chyb a detekce dvoubitových chyb) počet redundantních disků je úměrný počtu datových disků výhoda: o paralelizace přístupů s cílem zkrácení doby odpovědi nevýhody: o lze využít pouze jen o něco více než polovinu diskové kapacity o malá propustnost RAID 3 •
•
•
•
zjednodušená verze RAID 2 pro zabezpečení se používá parita uložená na paritním disku: P(b) = b0 XOR b1 XOR b2 XOR b3 výhody: o pouze jeden disk obsahuje paritní informace, ostatní lze využít pro data o paralelizace velkých přístupů s cílem zkrácení doby odpovědi nevýhoda: malá propustnost RAID 4 •
•
•
•
•
disky jsou synchronizovány jako u RAID 2 a RAID 3 používá se stripování po blocích (stripech) pro zabezpečení se používá parita po stripech. která je uložená na paritním disku výhody: o pouze jeden disk obsahuje paritní informace, ostatní lze využít pro data o paralelizace čtení velkých přístupů s cílem zkrácení doby odpovědi nevýhody: o zápis velkých přístupů o přetížení paritního disku RAID 5 •
organizován podobně jako RAID 4, ale parita je distribuována mezi všemi disky •
•
•
vhodný pokud počet operací zápisu nepřekročí 15% až 20% všech operací výhody: o parita je distribuovana mezi vsemi disky o paralelizace čtení velkých přístupů s cílem zkrácení doby odpovědi nevýhoda: zápis velkých přístupů RAID 6 •
•
podobný jako RAID 5, ale parita je N+2 může tedy dojít k selhání dvou disků a stále máte data Materiály •
•
•
X36OSY, přednáška 10 http://www.vahal.cz/html/raid.html RAID Vyšší programovací jazyky (X36PJP) Datové objekty a jejich typy, vnitřní reprezentace Datový objekt Datový objekt je z hlediska vyšších programovacích jazyků hodnota nebo soubor hodnot vyjádřitelný nad tělesem Z(2). S datovým objektem úzce souvisí jeho datový typ. Datové objekty se během zpracování programu vytvářejí a zase zanikají. Umístění se během jejich života (obvykle) nemění. Datové objekty se v programu označují pomocí jmen. Jména proměnných jsou tvořena identifikátory proměnných, analogicky jména konstat identifikátory konstant. •
•
•
Wikipedia ‐ Objekt Wikipedia ‐ Proměnná Wikipedia ‐ datový typ Rozdělení datových objektů •
•
elementární (mají jedinou atomickou hodnotu, která je dále nedělitelná, např. proměnná typu int) strukturované (skládají se z tzv. složek , např. pole) •
•
konstanty ‐ hodnota se během výpočtu nemůže měnit (například v C++ všechny proměnné typu const) proměnné ‐ hodnota se během výpočtu může měnit Proměnné Mohou být typované (mají určen datový typ) a netypované (nemají určen datový typ). Typované proměnné jsou ale zpravidla výhodnější, protože… •
•
•
Umožňují vytvořit efektivnější cílový program Zvyšují bezpečnost Zvyšují přehlednost kódu Deklarací proměnné se specifikuje (příklad deklarace : const int promenna = 25) •
•
•
•
•
druh objektu (proměnná nabo konstanta) typ jméno hodnota způsob přidělení paměti Datové objekty lze v některých PJ vytvářet dynamicky. K tatko vytovřeným objektům se nepřistupuje pomocí jejich jmen, ale pomocí ukazatelů. •
•
Wikipedia ‐ Ukazatel (http://cs.wikipedia.org/wiki/Ukazatel) Wikipedia ‐ Reference (http://cs.wikipedia.org/wiki/Reference) Datové typy – vlastnosti Specifikací DT je dána: •
•
množina hodnot, kterých může nabývat množina operací, které lze s daným DT provádět Implementací DT je dána: •
•
vnitřní reprezentace realizace operací instrukcemi cílového jazyka DT lze rozdělit do tří základních skupin: •
•
•
jednoduché strukturované ukazatelové DT mohou dále být: •
standardni(např. int, char, ...) •
uživatelské (ve většině jazyků je třeba tyto proměnné deklarovat). Uživatelské DT mohou být: •
•
•
•
dynamické ‐ jejich deklarace obsahují proměnné, nelze vytvořit při překladu – příkladem budiž třeba to, kdy chceme vytvořit pole, ale nevíme dopředu, jaká bude jeho délka , zjistíme ji až v průběhu provádění programu statické ‐ deklarace mohou obsahovat pouze konstanty, lze je vytvořit při překladu (C, C++) anonymní DT (například při deklaraci proměnných) pojmenované DT Typová kontrola: •
•
dynamická ‐ při běhu programu (je především tam, kde se používají netypované proměnné, např. smalltalk) statická ‐ (při překladu) Ekvivalence typů Jestliže je T1 ekvivalentní s T2, tak pro každou operaci definovanou pro T2 musí být možné použít jako operand T1 a naopak. •
•
ekvivalence podle jména (např. int x, int y) ekvivalence podle struktury Silná typová kontola: 1. příslušnými operandy každé operace jsou pouze datové objekty, jejihž typy jsou ekvivalentní typům daným specifikací operace 2. typ výrazu na pravé straně přiřazení musí být ekvivalentní typu proměnné na levé straně. •
Typovou kontrolu zeslabují například implicitní (tzn. vyvolané programem, ne uživatelem) typové konverze. Struktura paměti cílového počítače: •
•
•
•
•
Ve statické oblasti jsou umístěny konstanty a proměnné, jejichž velikost a umístění je známo při překladu. Statická deklarace nestačí pro: o rekurzivní volání podprogramů (DT se umísťují na zásobník) o dynamické typy (DT se umísťují na haldu) o dynamické vytváření typů (DT se umísťují na haldu) Polymorfismus operace ‐ operace je definovýna různě pro různé typy operandů Deskriptor ‐ popisuje strukturu dynamického typu někdy se pro datové typy požaduje aby byly zarovnány na určitou adresu Jednoduché datové typy •
•
ordinální ‐ uspořadatelné množiny, jde pro ně definovat předchůdce a následníka. reálné Číselné (int, double, float...) •
•
Celočíselné Reálné o V pohyblivé ř.č. o V pevné ř.č. Výčtové Specifikují malé množiny hodnot označených symbolickými jmény, které lze jednoduše zadat jejich výčtem. Mají ordinální čísta ‐ pořadí ve výčtu. (například typedef enum {po, ut, st, ct, pa, so, ne} dnyTydnu) Logické (boolean) True nebo False. Hodnota je ale obvykle reprezentována celým paměťovým místem (kvůli minimální adresovatelné jednotce a kvůli zarovnání) Znakové (char) •
•
8b na znak obvykle ASCII 16b na znak obvykle UNICODE(UTF‐16 vs. UTF‐8) Strukturované datové typy (neboli datové struktury) Jsou charakterizovány: •
•
počtem složek o pevný ‐> statické DS (pole, záznam..) …jinak DS = dat. struktura o proměnný ‐> dynamické DS (fronta, zásobník ..) podle typu složek o homogení – všechny složky stejného typu o heterogení – složky mohou být různého typu Operace s datovými strukturami •
•
•
•
selektory (např. a[i]) operace s celou DS vložení nebo odebrání složky vytvoření nebo zrušení DS Reprezentace •
•
sekvenční – prvky mají přesně dané pořadí spojová – např. spojový seznam Podle způsobu definice •
•
•
standartní DS (pole ..) uživatelské DS (záznam ..) ‐ definován typovým výrazem abstraktní DS (fronta, zásobník ..) ‐ zcela definován programátorem Pole Vnitřní reprezentece je vždy sekvenční. Dynamické pole vyžaduje deskriptor Dělení: •
•
statické a dynamické jednorozměrné a vícerozměrné Znakové řetězce •
•
•
řetezce pevné délky řetezce proměnné délky shora omezené neomezené řetezce Záznamy Heterogenní DS se specifickým počtem složek. Přístup obvykle pomocí tečkové notace. Variantní záznamy Vnitřní reprezetace má obvykle pevnou délku. Vysvětluje se to na Zaměstnanci, ktery muze byt delnik (hodinova sazba a pocet hodin) a urednik (mesicni plat) viz. skripta Množiny Základní operace: •
•
•
Test přítomnosit prvku Vložení a odstranění prvku Sjednocení, průnik a rozdíl množin Ukazatelové datové typy – viz dále Definice •
•
Syntaxe o souhrn pravidel udávajících přípustné tvary dílčích konstrukcí a celého programu Sémantika o udává význam jednotlivých konstrukcí Tabulka symbolů Uchovává informace o jednotlivých symbolech (identifikátorech), které se objevily v průběhu analýzy. Jak název napovídá, tabulka symbolů je organizována jako tabulka, kde klíčem je jméno identifikátoru a hodnotou jsou informace o daném identifikátoru. Protože se v tabulce nachází více duhů (kategorií) identifikátorů, a informace uchovávané pro jednotlivé kategorie jsou různé, je obsah datové části tabulky značně heterogenní. Materiály •
Slajdy z PJ Ukazatele a dynamické proměnné, správa volné paměti Ukazatele •
•
•
Ukazatel ukazatel je datový objekt, jehož hodnota identifikuje jiný datový objekt Základní operace nad ukazateli o vytvoření ukazatele spojené s vytvořením dynamického objektu (int * pole = new int[5]) o dereference ukazatele (např. *p ) – prostě přístup přímo na tu adresu o přiřazení mezi ukazateli o rovnost a nerovnost ukazatelů o nulární operace (NULL, NIL) o zrušení dynamického datového objektu o
aritmetické operace s ukazateli Správa volné paměti Dynamické datové objekty (DDO) se umísťují na haldu (heap). Volná pamět se obvykle uchovává pomocí spojového seznamu a ukazatele na oblast souvislého bloku volné paměti. Explicitní rušení datových objektů Postupným vytvářením a rušením DDO vznikají v haldě díry. Je rozdělena na dvě části. První část obsahuje množinu vytvořených i zrušených DDO. Zrušené DDO vytvářejí volné místo, o kterém je informace udržována pomocí spojového seznamu (přímo v těch místech). Druhá část obsahuje souvislý blok volné paměti. Pokud je vytvořen nový objekt, tak se nejprve projde spojový seznam volných míst (což má lineární složitost). Objekt se da zpravidla do prvního volného místa (first fit). Až v případě, že se objekt nikam nevejde, tak se dá do souvislého bloku volné paměti. Tímto po čase vznikne fragmentace, která se ale obykle neřeší, protože by to bylo velmi náročné (museli by se přepočítat adresy). Automatické rušení DDO Někdy se tomu také říká sbírání smetí (garbage colection). Existují tři základní způsoby: Počítání referencí Tato metoda se často používá jako nadstavba pro C nebo C++ (například v implementaci třídy String. U každého DDO je položka, která označuje, kolik ukazatelů na něj ukazuje (viz obrázek – čislo vlevo u dat. objektu), pokud se číslo zmenší na 0, objekt se zruší. Počítání referencí neřeší problém cyklické reference a takové objekty neuvolní. Značkování a zametání V určitém okamžiku (obvykle, pokud je paměť natolik fragmentovaná, že nejde přidělit požadované místo novému objektu) se spustí dvoufázový mechanismus, který rekurzivně označí všechny používané objekty (projde všechny spojové struktury ...). Neoznačené objekty se potom označí jako volné místo a označené se odznačí pro další volání tohoto algoritmu. Algoritmus si udržuje strom dostupných objektů (viz. obr). Nedostupné objekty jsou odstraněny. Kořeny stromů tvoři všechny objekty, které jsou označeny jako GC Root ‐ například singletony, objekty na zasobníku atd... Kopírování V tomto případě je volná pamět rozdělana na dvě stejě velké části a halda se střídavě vytváří mezi nimi. Zabere‐li halda celou část, ve které se vytváří, dojde k překopírování objektů do druhé části. To ovšem vyžaduje přepočítání referencí. Každý DDO v tomto případě obsahuje obsahuje položku obsahující jeho novou adresu nebo nil. Když se objekty přesunou do druhé poloviny, tak mají přepočítány adresy a nejsou mezi nimi mezery. Materiály •
Slajdy z PJ číslo 1 Jednoduché a strukturované příkazy Notace ve výrazech •
•
•
prefixová postfixová infixová •
•
řídící struktura Strukturované programování Dělení příkazů Jednoduché příkazy a řídící struktury Jednoduchý u příkazu znamená, že neobsahuje vnořené příkazy.Tzn. například jednoduchý příkaz v Cčku neobsahuje složené závorky {}. •
Příkazy pro manipulaci a datovými objekty (přiřazovací příkaz, např. i=5 ) •
Příkazy pro řízení výpočtu (goto, BNZ, BZ ... proste podminene a nepodminene skoky) Strukturované příkazy Kritika používání příkazů skoku (Dijkstra :) ) vyústila v metodiku strukturovaného programování. Strukturované programování klade důraz na hierarchický návrh struktry programu složené z řídících struktur tří typů: •
•
•
kompozice, coz je struktura příkazů, které se provedou v daném pořadí, alternace, což je struktura obsahující několik příkazů (posloupností příkazů), z nichž se provede nanejvýš 1, iterace, což je struktura obsahující příkaz (strukturu příkazů), který se provede opakovaně. Pro vyjádření struktur těchto příkazů slouží strukturované příkazy. Složený příkaz Je posloupnost příkazů uzavřená do "příkazových závorek", což je obvykle begin a end nebo { a }. Jednotlivé příkazy se obvykle oddělují středníkem, který může, ale nemusí být součástí příkazu. Podmíněný příkaz Je jedním z příkazů vyjadřujících alternaci. (například příkaz if ‐ else) Přepínač Je vhodný pro alternaci, kdy jsou jednotlivé alternativy vázány na hodnoty nějaké proměnné. Oproti strukturované podmínce umožňuje efektivnější implementaci (skoková tabulka) a přehledňejší kód. Příkladem je příkaz Case: •
V C like programovacích jazycích nesmíme zapomenout na break; (jednotlivé varianty nejsou zakončeny instrukcí skoku na konec). Příkaz cyklu Cyklus s explicitním počtem opakování Ve vetšine PJ chybí, ale dá se nahradit. Cyklus řízený podmínkou před tělem cyklu obvykle: while (podminka) příkaz •
To, že se podmínka vyhodnocuje na začátku cyklu znamená, že nemusí být proveden ani jednou. Cyklus řízený podmínkou za tělem cyklu Podmínka dvojí, různá sémantika ‐ buďto splnení podmínky ukončuje cyklus, nebo způsobí jeho opakování. Těla techto cyklů se prvedou alespoň jednou. Cyklus s řídící proměnou Obvykle začíná klíčovým slovem for a obsahuje proměnnou, pro kterou specifikuje posloupnost hodnot, kterých má postupne nabývat. To že je cyklus bezpěčný znamená, že v jeho těle nemůže být změnená řídící proměnná (např to tak funguje v Pascalu). Z toho vyplývá, že u takovýchto cyklů nemůže dojít k zacyklení. Ukončení cyklu řídícím příkazem Občas je potřeba ukončit cyklus někde uprostřed, k tomu se hodí tento příkaz. Obvykle se nazývá break. K přeskočení jednoho / části kroku v cyklu slouží continue (C‐like PJ). Procedury a funkce, bloková struktura, aktivační záznamy. Procedury a funkce (= Podprogramy) •
•
•
Podprogram může mít formu procedury nebo funkce Procedura realizuje abstraktní příkaz a její vyvolání má charakter příkazu. Rozdíl mezi procedurou a funkcí je ten, že procedura nevrací žádnou hodnotu. Funkce realizuje abstraktní operaci, jejíž provedení vede na hodnotu určitého typu. Volání funkce má tedy charakter výrazu V některých programovacích jazycích (např. C) se rozlišuje mezi definicí a deklarací podprogramu. Deklarace je tvořena pouze hlavičkou. Výhoda je v tom, že deklaraci umožnuje použít podprogram v místě, kde ještě není známo jeho tělo. •
•
Lokální referenční prostředí podprogramu ‐ Jména lokálních datových objektů spolu s parametry Nelokální referenční prostředí podprogramu ‐ Množina nelokálních jmen použitelných v těle podprogramu (deklarovány vně podprogramu) Podprogramy mohou být: •
•
jednoduché (při provádění podprogramu nemůže dojít k jeho opětovnému volání) rekurzivní (přímé( A volá A) na nepřímé (A volá B a to volá A)) Podprogramy mohou být: •
•
uzavřené (mají vlastí kódový segment) otevřené (jejich kód se zkopíruje do místa volání, třeba inline metody v C++) Referenční prostředí podprogramů Tvoří ho množina jmen, které lze v podprogramu použít pro označení datových objektů a jiných prvků. Může být: •
•
•
•
lokální nelokální statické (definované při překladu). Je založeno na blokové struktuře. Je bezpečnější a efektivnější. dynamické ‐ za běhu programu (v některých PJ s dynamickou typovou kontrolou, nenajde‐li se jméno v lokálním prostředí podprogramu, pokračuje se výše do podprogramu, ze kterého byl volán) Bloková struktura programu Blok je řídící struktura, které kromě příkazů obsahuje též deklarace. Deklarací se najčastěji zavádí lokální datové objekty. Blok může být tvořen: •
•
•
Příkazem Tělem podprogramu Tělem hlavního programu Obvykle se dělí na dvě části: •
•
deklarační část příkazovou část Bloky mohou být do sebe vnořovány, buďto jako příkazy nebo jako podprogramy. Tím vzniká hierarchická bloková struktura, s čímž souvisí pravidla vymezující platnost deklarací: •
•
•
lokální referenční prostředí je dáno lokálními deklaracemi nelokální referenční prostředí bloku X je odvozeno z referenčního prostředí bloku, do něhož je blok X vnořen Lokální deklarace jména N zastíní případnou nelokální deklaraci téhož jména Pro vymezení platnosti v blokové struktuře se používají tyto pojmy: •
•
•
deklarační oblast ‐ blok v němž je deklarace lokální rozsah platnosti ‐ úsek zdrojového programu, ve kterém deklarace platí a deklarovaný prvek lze použít rozsah přímé viditelnosti ‐ úsek zdrojového programu, ve krerém lze deklarovaný prvek označit jeho jménem Rozsahem platnosti může být: •
Celá deklarační oblast (Algol, CHILL) •
Jen část deklarační oblasti začínající místem deklarace (daného jména) Průnik deklarace do vnořeného bloku může být: •
•
•
automatický explicitně vyžádaný explicitně vynucený V některých jazycích (C, Turbo Pacsal) platí , že nelokální jméno můžeme v podprogramu použít před jeho lokální redefinicí. Některé jazyky (C, C++) umožnuji překrývání lokálních a nelokálních referenčních prostředí. Lokální jména mají přímou viditelnost. Nelokální jte třeba označnit pomocí jména jeho deklarační oblasti (že by Namespace?) spolu s jeho jménem. V některých jazycích je možno vnořovat bloky podprogramů do sebe (Pascal). V jiných je možná jen jedna úroveň (C, C++) (tím se asi myslí, že nemůžeme napsat funkci ve funkci??) Parametry podprogramů •
•
•
Vstupní parametry Výstupní parametry Vstupně‐výstupní parametry Mechanismy předání parametrů •
•
•
Parametry předávané hodnotou ‐ kopírováním (vhodné pro jednoduché DT) o Vstupní (paramety nahrazované hodnotou) o Výstupní (parametry nahrazované výsledkem) o Vstupně‐výstupní (parametry nahrazované hodnotou‐výsledkem) Parametry předávané odkazem (je založené na skrytém /nebo taky ne/ použití ukazatelů) Parametry předávané jménem (už se nepoužívá...) Přetěžování Přetěžování podprogramů Jsou rozlišeny počtem a typem parametrů popřípadě výsledku. Příklad přetěžování v C++… Přetěžování operátorů Jsou rozlišeny typem parametrů. Například násobení matic je definováno jinak než násobení celých čísel. Generické podprogramy Umožňují použít stejný kód pro předem neurčený datový typ. Je to dobré pro úsporu kódu a také pro některé standardní struktury (spojový seznam, vektor apod, např z knihovny stl v C++). Příkladem jsou šablony (Templaty) v C++ Implementace podprogramů Překladem definice podprogramu vznikne kódový segment podprogramu. Návratová adresa se obvykle ukládá do systémového zásobníku. Na obrázku je ukázkaInstrukce volání podprogramu s uložením návratové adresy (call) a instrukce návratu z podprogramu (return) Mechanismus přidělování paměti parametrům a lokálním proměnným podprogramu: •
•
•
statické přidělování paměti (při překladu, je vhodné pro jednoduché programy, které nelze volat rekurzivně) lokální datové objetky jsou alokovány staticky a při každé aktivaci podprogramu se do dynamické oblasti ukládají jejich kopie (není zcela obecné) lokální datové objetky jsou alokovány dynamicky (spočívá ve vytváření aktivačních záznamů) Aktivační záznamy Každý aktivační záznam odpovídá jedné aktivaci podprogramu. Je to úsek, který pro aktivaci podprogramu obsahuje: •
•
•
•
skutečné parametry návratovou adresu lokální proměnné, příp. konstanty případně další systémové informace Aktivační záznam se vytvoří na vrcholu zásobníku na začátku aktivace podprogramu, po jeho dokončení se ze zásobníku odstraní. Zásobník obsahuje aktivační záznamy všech rozpracovaných podprogramů, ale přímo přístupný je jen ten na vrcholu. Typy zásobníků Jednoduchý zásobník Je vhodný pro jazyky, které neumožňují vnořování podprogramů, ani dynamické typy. Aktivační záznam: •
•
s pevným počtem parametů, s proměnným počtem parametrů (o zrušení sekce parametrů se musí postarat volající sekvence instrukcí). Zásobník s dynamickým spojem Je zde zaveden další ukazatel (BP). To umožnuje především jednoduššní adresaci proměnných a lokálních parametrů. Aktivační záznam zpravidla obsahuje odkaz na BP volajícího podprogramu. Tento zásobník je nezbytný, pokud jazyk podporuje dynamické typy, protože jejich velikost není známa pri překladu. Dynamický link ukládá obvykle volaný. Zásobík se statickým spojem Dynamický spoj nestačí, jestliže jazyk dovoluje vnořování definic podprogramů. Statický spoj je potřeba pro přístup k proměnným, které jsou umístněny v aktivačních záznamech staticky nadřazených programů. Statický spoj je realizován pomocí spojového seznamu. Určit statický spoj volaného podprogramu musí jeho volající sekvence. Modulární struktura programu. Modul je programová jednotka, která umožňuje, aby v ní deklarované identifikátory a programové entity byly použity v jiných programových jednotkách. Modul tyto identifikátory a jimi označené entity deklaruje veřejně. Veřejné deklarace by měly entitu pouze specifikovat, implementační detaily by měly zůstat skryty (zapouzdření). Moduly se obvykle skládají ze 2 částí: 1. specifikační ‐ obsahuje hlavičky procedur, funkcí 2. implementační ‐ definice veřejně deklarovaných procedur a funkcí a deklarace a definice dalších programových entit, které jsou lokální v modulu a z vnějšku nejsou přístupné Výjimky. Ošetření chyb při výpočtu 1. Oznámením chyby a ukončením výpočtu. 2. Předáním indikace chyby do místa volání a ukončení aktivace podprogramu. 3. Ukončením aktivace podprogramu a skokem na určité místo v programu. 4. Vyvoláním výjimky. Výjimky •
•
•
•
•
Výjimka je programová entita označující chybu při výpočtu. Různé chyby se označují různými výjimkami. Výskyt chyby se signalizuje vyvoláním výjimky. Může jí vyvolat jak interpretace programu tak program pomocí speciálního příkazu. Jsou zavedeny strukturované příkazy, které předepisují provední dílčích příkazů a dále obsluhu výjjmek, které mohou být vyvolány při provádění dílčích příkazů. Každá obsluha je označena identifikací výjimky a tvoří ji příkazy, které se mají provést jako reakce na danou chybu. Obsluhy výjimek tvoří dynamický řetězec. Při vstupu do příkazu s obsluhou výjimek se tento řetězec rozšíří o nový záznam obsluhy, po řádném ukončení se záznam zruší. Při vyvolání výjimky se v řetězci obsluh výjimek hledá nejbližší záznam obsahující obsluhu dané výjimky. Přitom se zruší aktivační záznamy podprogramů, které obsluhu vyjímky neobsahují. Výjimky v C++ V C++ se výjimky rozlišují pomocí datových typů. Vyjímku tedy může reprezentovat jak číslo, znak nebo řetězec, tak instance tříd (objekty). Pro vyvolání vyjímky slouží příkaz throw, jehož argumentem je výraz určující typ a hodnotu dané výjimky. Řídící strukturou je příkaz try. Vyjímka se zachytává v části catch(...){...}. void* AlokujPamet(int size){ void* ptr; ptr = malloc((size_t) size; if (ptr==0) throw("nepodarilo se alokovat pamet"); return ptr; } int main(){ try{ AlokujPamet(100); } catch(char* v){ printf("%s\n", v); } } Materiály http://progres.eternal.cz/article.php?nID=43 http://www.builder.cz/art/cpp/cpp_vyjimky.html jakpak to ten kompiler asi dela s tem vyjimkama Objektově orientované prostředky. Třídy a objekty Třídy umožňují realizovat: •
•
•
zapouzření polymorfismus dědičnost Zapouzdření •
Třída je datový typ, který zapouzdřuje datové položky svých instancí (objektů ) a pro ně definované operace. Zapouzdření zaručuje, že objekt nemůže přímo přistupovat k „vnitřnostem“ jiných objektů, což by mohlo vést k nekonzistenci. Každý objekt navenek zpřístupňuje rozhraní, pomocí kterého (a nijak jinak) se s objektem pracuje. To znamená, že pokud máme například třídu Citac, která obsahuje proměnnou int cislo, tak pokud chceme cislo zvýšit a neporušit zapouzdření, nemůžeme napsat cislo++ , ale musíme pro to udělat metodu ZvysCitac(). Generické třídy Třídy použitelné pro různé datové typy pomocí parametrizované definice (Templaty) Dědičnost Pro třídu X, která je potomkem třídy Y obecně platí: •
•
•
instance třídy X obsahují všechny položky definované třídou Y a dále položkdy definované třídou X na objekty třídy X lze volat stejné instanční metody, jako na objekty třídy Y, a dále medody definované třídou X instanční metody třídy Y lze ve třídě X předefinovat, zděděné položky předefinovat nelze. Pro třídy ve vztahu rodič‐potomek je v C++ dovoleno přiřazení, ale pouze ve směru od potomka k rodiči. Jesliže je X rodič a Y potomek, a x, a y instance těchto tříd, tak lze udělat operaci x=y, ale ne y=x. Polymorfismus Polymorfní datová struktura se skládá z prvků různých typů, pro které jsou definovány operace, jejichž definice jsou závislé na typu prvků. Například si vemte abstraktní třídu Savci, ve které máme nadefinovánu hlavičku metody mluv(). Od této třídy třeba budou dědit třídy Clovek a Opice. Každá z nich bude mít metodu mluv() přepsanou jinak a tedy objekt Clovek a Opice budou po zavolání metody mluv() každý provádět něco jiného. Jsou to však oba potomci třídy Savci, ale každý na funkci mluv() reaguje jinak. Tomu se říká polymorfismus. To bylo jen tak z mojí hlavy, teď co říká wiki… Polymorfismus označuje vlastnost přiřadit instanci typu předek referenci instance potomka, dovoluje, ze potomek muze zastoupit/prekryt implementaci predka. Pouziva se tak, ze se vytvori potomek pres svou abstraktni tridu/rozhrani (rozdil viz. napr. Herout). Interface instance = new Successor(); Ukazkovy priklad na polymorfizmus se vzdy uvadi tento. Jak psal puvodni autor, pouziva se nejen pro polymorfni datove struktury, ale hlavne vsude tam, kde chceme aby prvky z objektove hierarchie konaly nejakou stejnou definovanou cinnost. Plati to ovsem jen na metody, polymorfizmem nemuzeme (ani bychom nechteli) prekryt promenne! abstract class Obrazec { abstract public void show(); } class Trojuhelnik extends Obrazec { public void show() { System.out.println("3uhelnik");} } class Ctverec extends Obrazec { public void show() { System.out.println("ctverec");} } abstract class Obrazec2 { public void show() { System.out.println("default behaviour");} } class Trojuhelnik2 extends Obrazec2 { public void show() { System.out.println("3uhelnik");} } class Ctverec2 extends Obrazec2 { } List<Obrazec> list = new ArrayList<Obrazec>(); //this is also polymorphism list.add(new Trojuhelnik()); list.add(new Ctverec()); for (Obrazec o : list) o.show(); //polymorphism //vypise //3uhelnik //ctverec List<Obrazec2> list2 = new ArrayList<Obrazec2>(); list.add(new Trojuhelnik2()); list.add(new Ctverec2()); for (Obrazec2 o : list) o.show(); //vypise //3uhelnik //default behaviour Staticky a dynamicky vázané metody C++ jsou implicitně metody tříd vázány pomocí statické vazby. To znamená, že adresa volané metody musí být známa již při překladu. Tato vlastnost ale není dostatešně obecná, proto byly zavedeny dynamicky vázané metody. Implemetnují se obvykle pomocí tabulky viruálních metod (ukazatel na tuto tabulku je součástí každého objektu s virtuálními metodami). Příkad použití virtuálních metod v C++: #include <iostream> using namespace std; class A{ protected: static const int a=1; public: A(){} int getVal() {return a;} virtual int getValue() {return a;} }; class B : public A{ static const int b=2; public: B():A(){ } int getVal() {return b;} virtual int getValue() {return b;} }; int main(){ A* pole[10]; pole[0]=new A(); pole[1]=new B(); cout << pole[0]‐>getVal() << endl; //vrati 1 cout << pole[0]‐>getValue() << endl; //vrati 1 cout << pole[1]‐>getVal() << endl; //vrati 1 cout << pole[1]‐>getValue() << endl; //vrati 2 return 0; } No, co tím chtěl autor říct...Pokud je metoda virtuální, můzeme ji ve třídě potomka nějak přepsat. Abstraktní třídy V jazycích se statickou typovou kontrolou slouží abstraktní třídy k umožnění specifikace polymorfní operace aniž by byla definována její specifikace. Potřebujeme je, když je polymorfní struktra tvořena prvky různých typů a polymorfní operace je pro každý typ implementována jiným způsobem. Ukažeme si to na následujícím příkladu (a si lze představit třeba jako číslo, B jako přirozené říslo a C jako komplexní číslo). #include <iostream> using namespace std; class A{ public: A(){} virtual int pis() = 0; }; class B:public A{ int prom1; public: B(int val){prom1=val;} int pis() {cout << prom1 << endl;} }; class C:public A{ int prom2, prom3; public: C(int val1,int val2){prom2=val1;prom3=val2;} int pis() {cout << "(" << prom2 << "," << prom3 << ")" << endl;} }; int main(){ A* pole[2]; pole[0]=new B (1); pole[1]=new C (2,3); for (int i = 0; i<2;pole[i]‐>pis(),i++); //vypise 1 \n (2,3) return 0; } Generické funkce a třídy To jsou prostě ty templaty. To už jsme řešili… Přetěžování funkcí a operátorů Funkce s různým počtem nebo typem parametrů se mohou jmenovat stejně ‐ např. součet(int a) a součet(int a,int b). Zpracování výjimek Catch bloky pro konkrétní druhy výjimek Materiály •
•
Doc. Ing. Karel Müller, CSc. ‐ Programovací jazyky http://cs.wikipedia.org/wiki/Objektov%C4%9B_orientovan%C3%A9_programov%C3
%A1n%C3%AD •
Lexikální a syntaktická analýza (X36PJP) Lexikální analyzátor, prostředky pro jeho specifikaci ‐regulární gramatiky, konečné automaty, vztah mezi nimi. Základní pojmy Abecedy a jazyky •
•
•
•
•
abeceda = konečná množina symbolů řetězec (řetěz, slovo) nad abecedou T: o konečná posloupnost symbolů z T o ε je prázdný řetězec o T* je množina všech řetězců nad T (včetně prázdného řetězce) operace zřetězení o xy je řetězec, který vznikne připojením řetězce y za řetězec x o je asociativní (tzn. x(yz)=(xy)z), není komutativní o ε je jednotkový prvek o |x| je délka řetězce x (počet symbolů) formální jazyk L je libovolná podmnožina množiny všech řetězců nad abecedou T: L T* operace nad formálními jazyky: o obvyklé množinové operace o součin (zřetězení) jazyků L1 ∙ L2 = {xy: x L1, y L2} o n‐tá mocnina Ln = L ∙ Ln‐1, L0 = {ε}, L1 = L o iterace L* = Ln pro n = 0 .. ∞ o pozitivní iterace L+ = Ln pro n = 1 .. ∞ Gramatiky •
bezkontextová gramatika G: o G = (N, T, P, S) ƒ N je konečná množina neterminálních symbolů ƒ T je konečná množina terminálních symbolů (N ∩ T = ø) ƒ P je konečná množina pravidel zapisovaných ve tvaru A → α, kde A N, α (N T)* ƒ S je počáteční (startovací) symbol gramatiky o levou stranou pravidla A → α rozumíme neterminál A, pravou stranou řetězec α o několik pravidel se stejnou levou stranou zapisujeme též zkráceně ve tvaru A → α1 | α2 | ... | αn o Z wikipedie: V komunikaci a lingvistice je kontextem význam sdělení (např. věty) a jeho vztah k ostatním částem sdělení (např. knihy, sociálního a kulturního prostředí, v němž se sdělení odehrává apod.). Kontext je zde tedy rámcem, v němž je na sdělení pohlíženo. o bezkontextová gramatika není například ta generující následující jazyk: L={anbncn: n>=0} . Takže požadujeme, aby generovala řetězce, které mají stejný počet áček, béček i céček. Tento stejný počet je kontext‐řetězce spolu nějakým způsobem souvisí. Programovací jazyky nejsou bezkontextové, analyzujeme je však bezkontextovou gramatikou a ty kontextové operace obstarají atributy symbolů a nějaká sémantická pravidla. přímá derivace o x y (x přímo derivuje y), jestliže x = αAβ, y = αχβ, A N, α, β, χ (N T)* a v P existuje pravidlo A → χ o k‐tá mocnina relace se označuje k o tranzitivní uzávěr relace se označuje + o reflexivně tranzitivní uzávěr relace se označuje * derivací řetězce β z řetězce α délky k v gramatice G = (N, T, P, S) se nazývá posloupnost řetězců α1, α2, ..., αk takových, že α = α0, αi‐1 αi pro 1 ≤ i ≤ k a αk = β větnou formou v gramatice G = (N, T, P, S) se nazývá řetězec α, pro který platí S * α, α (N T)* větná forma neobsahující neterminální symboly se nazývá věta generovaná gramatikou G jazyk generovaný gramatikou G je množina všech vět generovaných gramatikou G a označuje se L(G) gramatiky G1 a G2 jsou ekvivalentní, když generují stejný jazyk: L(G1) = L(G2) o
•
•
•
•
•
•
Derivační stromy •
•
•
•
derivační strom v gramatice G = (N, T, P, S) má tyto vlastnosti: o uzly derivačního stromu jsou ohodnoceny terminálními a neterminálními symboly o kořen stromu je ohodnocem počátečním symbolem gramatiky o jestliže má uzel alespoň jednoho následníka, pak je ohodnocen neterminálním symbolem o jestliže n1, n2, ..., nk jsou bezprostřední následnovníci uzlu n, který je ohodnocen symbolem A, a tyto uzly jsou ohodnoceny symboly A1, A2, ..., Ak, pak A → A1A2...Ak je pravidlo v P o listy derivačního stromu tvoří zleva doprava větnou formu nebo větu v gramatice G gramatika G je jednoznačná, pokud pro každou větu existuje právě jeden derivační strom věta w se nazývá víceznačná, jestliže pro ni existují alespoň dva různé derivační stromy gramatika G je víceznačná, když generuje alespoň jednu víceznačnou větu Příklad derivačního stromu: derivační stromy pro větu a+a+a. Pro tuto větu existuje v gramatice z příkladu více derivačních stromů, proto je tato gramatika víceznačná. Kompilátor Překladač se skládá obecně z přední a zadní části. Zatímco přední část kompilátoru má na starost analýzu zdrojového programu, zadní část již pracuje s vnitřní formou, optimalizuje a generuje cílový program. Obě části kompilátoru využívají tabulku symbolů. Vnitřní forma je generována přední částí kompilátoru atributovou překladovou gramatikou. Jedna se o datové struktury popisující strukturu programu. Přední část kompilátoru zajišťuje lexikální, syntaktickou a sémantickou analýzu. Lexikální analyzátor je součástí přední části kompilátoru. Lexikální analyzátor •
rozpoznává lexikální elementy: o identifikátory o klíčová slova o literály (čísla, řetězce) •
•
•
•
o jedno a víceznakové speciální symboly vynechává oddělovače lexikálních elementů ‐ mezery, oddělovače řádků ‐ komentáře rozpoznává a reaguje na direktivy překladače (#include, #if, ...) jeho formálním modelem je konečný automat činnost lexikálního analyzátoru je dobře znázorněna na následujícím obrázku – vstupem lexikálního analyzátoru je zdrojový text programu. Lex. an. projede tento text a pro každou posloupnost znaků řekne, co je to za lexikální element. Takže ze vlastně zdroják transformuje na posloupnost lexikálních elementů Regulární gramatika •
•
je bezkontextová gramatika, ve které každé pravidlo má tvar A → aB nebo A → a, kde A, B N, a T výjimkou je pravidlo S → ε v případě, že S se neobjeví na pravé straně žádného pravidla Konečný automat (deterministický) Konečný automat (DKA, DFA) je pětice A = (Q, T, δ, q0, F), kde •
•
•
•
•
•
•
Q je konečná neprázdná množina stavů, T je vstupní abeceda, δ je přechodová funkce, která pro každou dvojici (stav, vstupní symbol) určuje následující stav, q0 z Q je počátečním stavem, F , což je část Q, je množinou koncových stavů. konečný automat může být určen tabulkou nebo přechodovým diagramem přechodový diagram konečného automatu: o orientovaný graf, ve které jsou uzly ohodnoceny stavy a hrany vstupními symboly o z uzlu q vede hrana ohodnocená symbolem a do uzlu p, jestliže ƒ p = δ(q, a) pro deterministický automat ƒ p δ(q, a) pro nedeterministický automat (nedeterministický automat má na výběr mezi více možnostmi přechodů, i když je vstup i stav stejný) o počáteční stav označíme šipkou START o
uzly ohodnocené koncovými stavy označíme dvojitým kroužkem Na následujícím obrázku je příklad přechodového diagramu, který přijímá (to znamená po jejím přečtení skončí v koncovém stavu) pouze posloupnost se sudým počtem jedniček a nul. Ještě příklad nedeterministického konečného automatu. Všimněte si – například je ve stavu q, na vstupu je nula a on má více možností, do kterého stavu přejít. Vztah mezi nimi Regulární gramatika generuje věty regulárního jazyka, konečný automat tyto věty přijímá (rozpoznává) ‐ je formálním modelem procedury, jejímž vstupem je posloupnost symbolů a výstupem je odpověď, zda je vstup větou daného jazyka. •
•
k regulární gramatice lze vytvořit (nedeterministický) konečný automat nedeterministický automat lze převést na deterministický Pozn: Jazyk přijímaný DFA je množina všech slov, která po přečtení uvedou DFA z počátečního do nějakého koncového stavu. POZOR: Konečný automat skončí činnost po přečtení posledního vstupního symbolu a přijme tehdy, pokud se v tomto okamžiku nachází v koncovém stavu. Představa, že DFA skončí čtení po dosažení koncového stavu je NESPRÁVNÁ. Konečné automaty jsou schopné rozpoznat regulární jazyky. Vytvoření konečného automatu z regulární gramatiky •
•
vstup = pravá regulární gramatika G = (N, T, P, S) výstup = nedeterministický konečný automat M = (Q, T, δ, q0, F), pro který platí L(M) = L(G) 1. množina stavů Q = N {K}, K N 2. vstupní abeceda automatu M je rovna množině terminálních symbolů T gramatiky G 3. zobrazení δ sestrojíme takto: 1. je‐li v P pravidlo A → aB, pak δ(A, a) obsahuje B (nějaký stav, nazvěme ho třeba B) 2. je‐li v P pravidlo A → a, pak δ(A, a) obsahuje K (koncový stav) 4. q0 = S 5. jestliže je v P pravidlo S → ε, pak F = {S, K}, jinak F = {K} Převod nedeterministického konečného automatu na deterministický •
•
vstup = nedeterministický konečný automat M = (Q, T, δ, q0, F) výstup = ekvivalentní deterministický konečný automat M' = (Q', T, δ', q0', F') 1. definujeme Q' = {{q0}}, stav {q0} považujeme za neoznačený 2. jestliže v Q' jsou již všechny stavy označeny, pokračujeme krokem 4 3. vybereme z Q' neoznačený stav q' a provedeme tyto operace: 1. definujeme přechodovou funkci δ'(q', a) pro všechna a T takto: δ'(q', a) = δ(p, a) pro každý stav p q' 2. přidáme do Q' každý stav δ'(q', a), který v ní ještě není, a stav q' označíme 3. pokračujeme krokem 2 4. počáteční stav q0' je {q0} 5. množina koncových stavů F' je tvořena všemi stavy q', které obsahují alespoň jeden koncový stav q F Na obrázku je tabulka nedeterministického a z něj vytvořeného deterministického automatu. Snad to z ní bude jasnější… To, co je označeno složenými závorkami {} je množina stavů, to co je v hranatých závorkách [] je jeden stav. Materiály •
•
•
X36PJP, přednášky 1‐3 Učebnice z VUT Brno http://moon.felk.cvut.cz/~xvagner/x36pjp/index.php Programová realizace.(Lexikálního analyzátoru) Lexikální analyzátor je část kompilátoru, která čte po znacích vstupní data a rozpoznává lexikální elementy. Přitom vynechává oddělovače lexikálních elementů a současně rozpoznává a reaguje na direktivy překladače (#include, #if, ...) Postup při návrhu lexikálního analyzátoru Návrh a konstrukce lexikálního analyzátoru se typicky dělí do těchto kroků: 1. syntaxe lexikálních elementů ‐ podle zadaných vlastností jazyka je třeba popsat jeho lexikální elementy (např. syntaktickými diagramy nebo rožšířenou Backus‐Naurovou formou 2. lexikální elementy a jejich reprezentace ‐ pro každý lexikální element určíme, jak ho bude lexikální analyzátor reprezentovat, případně jaké bude mít parametry (např. kwIF pro klíčové slovo if) 3. vstupní symboly a jejich reprezentace ‐ určíme množiny vstupních znaků a přidělíme jim vstupní symboly (např. znaky '0'..'9' budou reprezentovány symbolem 'c') 4. návrh konečného automatu – ten může vypadat například takto… 5. zavedení nového koncového stavu o rozdíl mezi rozpoznávací procedurou a lexikálním analyzátorem: ƒ rozpoznávací procedura čte vstupní posloupnost znaků až do konce ƒ lexikální analyzátor se čtením vstupu končí, dostane‐li vstupní symbol, který již do rozpoznávaného lexikálního elementu nepatří ƒ lexikální analyzátor při dosažení konce vstupní posloupnosti znaků vrátí speciální lexikální symbol eof úprava přechodového diagramu ƒ doplníme nový koncový stav reprezentující akci "návrat z lexikálního analyzátoru" ƒ z každého původního koncového stavu vedeme hranu do nového koncového stavu ohodnocenou vstupními symboly, které se nevyskytují v ohodnocení jiných hran vedoucích z daného koncového stavu ƒ z počátečního stavu vedeme hranu do nového koncového stavu ohodnocenou vstupním symbolem označujícím konec souboru o s přechody (hranami) lze spojit nějaké sémantické akce 6. programová realizace o přechodový diagram přepíšeme do některé řídicí struktury o typicky obsahuje proměnná Vstup dopředu načtený vstupní symbol o
Programová realizace Existují 2 základní přístupy k realizaci lexikálního analyzátoru (a konečného automatu obecně): •
•
tabulkou přechodů o stav automatu je uložen v proměnné (např. celé číslo) o touto proměnnou je indexovaná tabulka přechodů (např. 2D pole) o následující stav je určen indexováním z tohoto pole o na konci analýzy je po přečtení celého řetězce zkontrolováno, zda obsah této proměnné odpovídá koncovému stavu, či ne o popis a zdrojáky jsou u Vagnera: http://moon.felk.cvut.cz/~xvagner/x36pjp/cv/cv02.php řídící strukturou o stav automatu je určen tím, která část programu se provádí (u Vagnera je uložen v proměnné a podle toho se skáče po casech) o přechod (změna stavu) znamená, že se má provádět jiná část programu, typicky tedy vede ke skoku (goto) o výborně je to popsané i se zdrojáky na Vagnerových stránkách: http://moon.felk.cvut.cz/~xvagner/x36pjp/cv/cv03.php Materiály •
•
X36PJP, přednášky 1‐3 http://moon.felk.cvut.cz/~xvagner/x36pjp/cv/cv02.php Syntaktický analyzátor shora dolů, prostředky pro jeho specifikaci ‐bezkontextové gramatiky, zásobníkové automaty, vztah mezi nimi . Syntaktický analyzátor shora dolů (LL analyzátor) Syntaktický analyzátor shora dolů vytváří derivační strom věty bezkontextového jazyka od počátečního symbolu (kořene stromu) a postupně doplňuje hrany a uzly směrem dolů a zleva doprava. Prostě, SA dostane na vstup spousty lexikálních elementů, které vytváří dohromady určitou konstrukci. Syntaktický analyzátor zkoumá, zda z jeho gramatiky lze takováto konstrukce vytvořit. Pokud ano, program je syntakticky správný. Například konstrukci else (1) if{} by rozumný syntaktický analyzátor určitě nepřijal. Bezkontextová gramatika Je taková gramatika G = (N, T, P, S), kde: •
•
•
•
N je konečná množina neterminálních symbolů T je konečná množina terminálních symbolů (N ∩ T = ø) P je konečná množina pravidel zapisovaných ve tvaru A ‐> α, kde A N, α (N T)* S je počáteční (startovací) symbol gramatiky Levou stranou pravidla A → α rozumíme neterminál A, pravou stranou řetězec α. Několik pravidel se stejnou levou stranou zapisujeme též zkráceně ve tvaru A → α1 | α2 | ... | αk. Zásobníkový automat •
•
•
•
•
•
•
je sedmice A = (Q, T, G, δ, q0, Z0, F), kde: o Q je konečná neprázdná množina stavů o T je vstupní abeceda o G je zásobníková abeceda o δ je přechodová funkce, která pro každou trojici (stav, vstupní symbol, zásobníkový symbol) určuje následující stav a řetěz uložený na zásobník o q0 Q je počátečním stavem o Z0 G je počátečním symbolem umístěným v zásobníku o F Q je množinou koncových stavů konfigurace zásobníkového automatu R je trojice (q, w, α) Q × T* × G*, kde: o q je okamžitý vnitřní stav o w je dosud nezpracovaná část vstupního řetězu o α je obsah zásobníku počáteční konfigurace zásobníkového automatu je trojice (q0, w, Z0) zápis δ(q, a, α) = {(p1, γ1), (p2, γ2), ..., (pn, γn)} interpretujeme tak, že zásobníkový automat ve stavu q přečte vstupní symbol a, přejde do některého stavu pi (i = 1 .. n) a řetězec α na vrcholu zásobníku nahradí řetězcem γi pokud δ(q, ε, α) = {(p1, γ1), (p2, γ2), ..., (pn, γn)}, automat přejde do dalšího stavu bez čtení vstupního symbolu přechod zásobníkového automatu je relace na množině konfigurací: (q, xw, αβ) [přechod] (p, w, γβ) (p, γ) δ(q, x, α), x T {ε}, α, β, γ G* jazyk přijímaný zásobníkovm automatem R lze definovat dvěmi způsoby: o přechodem do koncového stavu: L(R) = {w: (q0, w, Z0) [přechod]* (q, ε, γ), γ G*, q F, w T*} o přechodem do konfigurace s prázdným zásobníkem: L(R) = {w: (q0, w, Z0) [přechod]* (q, ε, ε), q Q, w T*} Situace vypadá zhruba takto: Tento automat je obecný model pro rozpoznávání a syntaktickou analýzu vět bezkontextového jazyka. Zásobníkovými symboly jsou symboly N T, zásobníkový automat je obecně nedeterministický. Vztah mezi nimi Syntaktický analyzátor lze modelovat jako zásobníkový automat, který je vybaven: •
•
•
•
vstupní páskou, která na počátku výpočtu obsahuje analyzovanou vstupní větu (tato páska je typu ReadOnly) zásobníkem, který na počátku obsahuje počáteční symbol gramatiky výstupní páskou, která je na počátku prázdná a bude obsahovat vygenerovaný levý rozklad (tato páska je typu WriteOnly) řídící jednotkou, která provádí vlastní operace. Řídící jednotka nemá k dispozici žádnou paměť (resp. obecně má k dispozici paměť konečné velikosti). Ke každé bezkontextové gramatice lze sestrojit zásobníkový automat, který nedeterministickým způsobem rozpoznává věty jazyka generovaného gramatikou metodou shora dolů. Syntaktický analyzátor provádí tyto 4 operace: •
•
•
•
expanze o neterminál X na vrcholu zásobníku je nahražen pravou stranou α nějakého pravidla tvaru X → α z gramatiky G o identifikace tohoto pravidla (např. číslo pravidla) je zapsáno na výstupní pásku srovnání o pokud je na vrcholu zásobníku terminál a a na vstupu je ten samý terminál a, pak je jeden symbol vstupu přečten (hlava se posune o 1 pozici vpravo) a terminál a je odstraněn ze zásobníku (přijetí) (chyba) Příklad na výše zmíněné operace: Nedeterministický způsob výběru pravidla, podle kterého expandujeme, je třeba nahradit deterministickým. K tomu potřebujeme nějakou nápovědu, kterou nám například poskytují LL gramatiky. Více informací u otázky LL(1) gramatiky, transformace gramatik. Vytvoření zásobníkového automatu z bezkontextové gramatiky •
•
vstup: bezkontextová gramatika BG = (N, T, P, S) výstup: nedeterministický zásobníkový automat R = (Q, T, G, δ, q0, Z0, F), pro který platí L(R) = L(BG) přechodem do konfigurace s prázdným zásobníkem a který modeluje (nedeterministickou) syntaktickou analýzu shora dolů 1. množina stavů obsahuje jediný stav, tj. Q = {q} 2. vstupní abeceda automatu je rovna množině terminálních symbolů T gramatiky BG 3. zásobníkovými symboly jsou neterminální a terminální symboly gramatiky, tj. G = N T 4. zobrazení δ sestrojíme takto: o δ(q, ε, A) = {(q, α): A → α P} pro všechna A N (expanze) o δ(q, a, a) = {(q, ε)} pro všechna a T (srovnání) 5. počáteční stav je q 6. počáteční symbol zásobníku je S 7. množina koncových stavů je prázdná Materiály •
X36PJP, přednášky 4‐6 LL(1) gramatiky, transformace gramatik. Co je First a Follow Jak jsme již napsali, zásobníkový automat čte nějaký řetězec a podle toho vytváří derivační strom z pravidel své gramatiky. Výsledkem tohoto derivačního stromu by měl být stejný řetězec, jaký je na vstupu (tedy jen tehdy, pokud vstupní řetězec je syntakticky správný). Zásobníkový automat se rozhoduje podle nejlevějšího znaku vstupního řetězce (čte zleva doprava – jako lidi ), zda provést expanzi nebo srovnání. Pokud jsou na vstupu i na vrcholu zásobníku stejné terminály, je to jasné – bude to srovnání. Ale co když je na vstupu terminál (ten je tam ostatně vždy) a na vrcholu zásobníku neterminál. Musíme použít expanzi. Pokud však náš neterminál má více pravidel, jak expandovat, které vybrat? K tomu potřebujeme znát množiny FIST a FOLLOW ke každému pravidlu gramatiky. Množina FIRST určuje znaky (terminály), na které se může náš neterminál přímo expandovat. Dejme tomu, že máme pravidla A ‐>B, B ‐>β. Pak do množiny FIRST pravidla A ‐> B patří terminál β. Množinu FOLLOW počítáme pouze tehdy, kdy náš terminál může expandovat na prázdný znak (tedy např. pravidlo A‐>ε). Vezměme si tento příklad: máme pravidla A ‐> ε, B ‐> Aγ. Pak do množiny FOLLOW(A) patří určitě terminál γ. LL(1) Gramatika Bezkontextová gramatika je LL(1) pokud pro každou dvojici pravidel A → α | β platí: 1. FIRST(α) ∩ FIRST(β) = ø (pokud by toto neplatilo, měli bychom více možností, jak expandovat, a jak bychom si jednu z nich měli vybrat – hodit si korunou?) 2. jestliže ε FIRST(α) a ε FIRST(β), pak FOLLOW(A) ∩ FIRST(β) = ø (to je podobný případ jako předtím – opět máme více možností – vybereme si FIRST nebo FOLLOW?) Je to prostě taková gramatika, která dokáže vytvořit nápovědu Výpočet množiny FIRST(α) •
•
vstup: bezkontextová gramatika G = (N, T, P, S), množiny first(A) pro každé A N, řetězec α (N T)* výstup: množina FIRST(α) 1.
2.
3.
4.
jestliže α = ε, pak FIRST(α) = {ε} jestliže α = aβ, a T, β (N T)*, pak FIRST(α) = {a} jestliže α = Aβ, A N, β (N T)*, ε first(A), pak FIRST(α) = first(A) jestliže α = Aβ, A N, β (N T)*, ε first(A), pak FIRST(α) = (first(A) ‐ {ε}) FIRST(β) Množiny first(A) pro všechny neterminály lze vypočítat takto: •
•
vstup: bezkontextová gramatika G = (N, T, P, S) výstup: množiny first(A) pro každé A N 1. first(A) = ø pro všechna A N 2. pro všechna A N a všechna pravidla A → α upravíme množinu first(A) takto: first(A) = first(A) FIRST(α), kde FIRST(α) vypočteme podle předchozího postupu, přičemž použijeme stávající množiny first 3. opakujeme krok 2, dokud se bude měnit alespoň jedna množina first(A) Výpočet množiny FOLLOW(A) •
•
vstup: bezkontextová gramatika G = (N, T, P, S) výstup: množiny FOLLOW(A) pro každé A N 1. položíme FOLLOW(S) = {ε}, FOLLOW(X) = ø pro všechna X N, X ≠ S 2. pro všechny výskyty neterminálních symbolů na pravých stranách pravidel provedeme: o má‐li pravidlo tvar X → αYβ, pak FOLLOW(Y) = FOLLOW(Y) (FIRST(β) ‐ {ε}) o má‐li pravidlo tvat X → αYβ a platí‐li ε FIRST(β), pak FOLLOW(Y) = FOLLOW(Y) FOLLOW(X) 3. opakujem krok 2, pokud se změnila alespoň jedna množina FOLLOW(X) Transformace na LL(1) Eliminace přímé levé rekurze Přímá levá rekurze je pravidlo A → Aα (vždy porušuje podmínky LL(1) gramatik). Eliminace: •
•
pravidla ve tvaru A → Aα1 | Aα2 | ... | Aαn | β1 | β2| ... |βm (tzv. A‐pravidla; βi nezačíná neterminálem A) nahradíme podle následujících vzorců (zavádíme nový neterminál A'): o A → β1A' | β2A' | ... | βmA' o A' → α1A' | α2A' | ... | αnA' | ε takže v podstatě transformujeme levou rekrzi na pravou Levá faktorizace •
•
•
levá faktorizace odstraňuje kolize FIRST‐FIRST u pravidel s pravými stranami začínajícími týmž řetězcem pravidla typu A → αα1 | αα2 | ... | ααn nahradíme podle vzorců (a zavedeme při tom nový neterminál): o A → αA' o A' → α1 | α2 | ... | αn takže v podstatě zde „vytkneme“ terminál α Rohová substituce •
•
•
řešení pro pravidla s kolizí FIRST‐FIRST, která nelze přímo faktorizovat nechť pravidla typu B → β1 | β2 | ... | βm jsou všechna B‐pravidla gramatiky. Pak pravidlo A → Bα lze nahradit podle vzorce A → β1α | β2α | ... | βmα Příklad na obr.: Zde je kolize FIRST – FIRST u Ačka, protože terminál a můžeme z neterminálu A dostat jak pravidlem A‐>aB tak pravidlem A‐>CB (a potom C‐>aC). Rohová substituce gramatiku trošku předělá (situace za šipkou), takže pak můžeme provést levou faktorizaci. Jak je vidět, substituce je vlastně nahrazení (tedy opak vytknutí) nějakého neterminálu jeho expanzí. V příkladu jsme C na pravé straně pravidla A nahradili expanzí C. Pohlcení terminálu •
používá se na odstranení konfliktu First‐Follow A → Ba B → β se přepíší na A → C C → βa Příklad na pohlcení terminálu: G = ({S, A, B},{a, b, c}, S, P) S → AaB A → ε A → aaB, B → c B → bB FIRST(aaB)∩FOLLOW(A) = {a} a tedy nejde o LL(1) gramatiku.Tuto kolizi můžeme odstranit pomocí pohlcení terminálu a, který kolizi způsobuje jeho pohlcením neterminálem A. G = ({S, A, B, [Aa]},{a, b, c}, S, P) S → [Aa]B A → ε A → aaB, B → c B → bB [Aa] → a [Aa] → aaBa Tím ovšem vznikla FIRST‐FIRST kolize posledních dvou pravidel, kterou musíme dále řešit pomocí faktorizace zavedením X.
Materiály •
•
X36PJP, přednášky 4‐6 http://www1.osu.cz/home/habibal/kurzy/rabj2.pdf Programová realizace syntaktického analyzátoru pro LL(1) gramatiky. Rozkladová tabulka •
•
•
syntaktický analyzátor pro LL(1) gramatiku je upravený zásobníkový automat, který pro výběr pravé strany pravidla při operaci expanze používá tzv. rozkladovou tabulku (označme ji M jako Matice:‐) formálně to je zobrazení definované na kartézském součinu N × T {ε} hodnotou M(A, a)je: o číslo pravidla, která se má použí pro expanzi neterminálu A a dopředu přečteném vstupním symbolu a o značka chyby Vytvoření rozkladové tabulky pro LL(1) gramatiku •
•
vstup: LL(1) gramatika G = (N, T, P, S) výstup: rozkladová tabulka M pro gramatiku G 1. je‐li A → α i‐té pravidlo v P, pak M(A, a) = i pro všechna a FIRST(α) ‐ {ε} 2. je‐li A → α i‐té pravidlo v P a ε FIRST(α), pak M(A, b) = i pro všechny b FOLLOW(A) 3. M(A, a) = chyba ve všech ostatních případech Příklad rozkladové tabulky vytvořené podle gramatiky:(dal jsem tam i „mezistupeň“, tedy výpočet FIRST a FOLLOW) Takže například políčko [0,0] výsledné rozkladové tabulky určuje, že z neterminálu E se na terminál a dostaneme jeho expanzí podle pravidla 1. Syntaktická analýza pro LL(1) gramatiku •
•
•
•
vstup: rozkladová tabulka M pro LL(1) gramatiku G = (N, T, P, S), vstupní řetězec w T* výstup: levý rozklad vstupního řetězce v případě, že w L(G), jinak signalizace chyby algoritmus čte vstupní řetězec, používá zásobník a vytváří výstupní řetězec, jímž je levý rozklad vstupního řetězce konfigurace algoritmu je trojice (x, α, π), kde: o x T* je dosud nepřečtená část vstupního řetězce o α (N T)* je obsah zásobníku o π je posloupnost čísel previdel použitých při dosud provedených expanzích (tj. dosud vytvořená čát levého rozkladu) 1. počáteční konfigurace je (w, S, ε) 2. provádíme přechody mezi konfiguracemi podle následujících kroků, dokud nedojdeme do stavu přijetí nebo chyba: o expanze: (ax, Aα, π) [přechod] (ax, βα, πi) ƒ jestliže A N, M(A, a) = i a i‐té pravidlo z P je A → β ƒ neterminál A na vrcholu zásobníku je nahrazen pravou stranou i‐tého pravidla a číslo i je připojeno k výstupní posloupnosti o srovnání: (ax, aα, π) [přechod] (x, α π) ƒ jestliže a T ƒ terminální symbol na vrcholu zásobníku se stovnává se symbolem na vstupu a v případě rovnosti se vstupní symbol přečte a zásobníkový symbol se ze zásobníku odstraní o přijetí: v konfiguraci (ε ε π) analýza končí a π ke levý rozklad vstupního řetězce o chyba: ve všech ostatních případech analýza končí signalizací chyby Programová realizace ‐ rekurzivní sestup •
•
•
•
•
•
•
vytvoření samostatných procedur pro analýzu každého neterminálního symbolu tělo každé procedury je tvořeno řídicí strukturou, která větví analýzu v duchu syntaktické analýzy pro LL(1) gramatiku (na základě rozkladové tabulky) každá alternativa řídicí struktury je tvořena posloupností příkazů volání procedur, které odpovídají symbolům příslušné pravé strany pravidla pro operaci srovnání existuje zvláštní procedura analýza se spustí voláním procedury odpovídající počátečnímu symbolu gramatiky (již musí být lexikálním analyzátorem přečtem první lexikální element) po skončení procedury odpovídající startovacímu symbolu je třeba otestovat, zda‐li je vstup prázdný (jinak by došlo k přijetí některých řetězců, které začínají větou jazyka, za níž následují ještě další vstupní symboly) pomocná funkce SELECT(A, α) ‐ její hodnotou je pro libovolný neterminál A a libovolnou pravou stranu A‐pravidla α množina terminálních symbolů (případně obsahující i symbol ε), pro které má být neterminál A expandován pravou stranou α o SELECT(A, α) = FIRST(α), pokud ε FIRST(α) o SELECT(A, α) = FOLLOW(A) (FIRST(α) ‐ {ε}), pokud ε FIRST(&alpha) •
•
tělo procedury realizující analýzu neterminálu, pro který jsou dána pravidla A → α1 | α2 | ... |αn (Symb je proměnná obsahující dopředu přečtený vstupní symbol): opět doporučuju se na toto podívat k Vagnerovi, má to tam fakt pěkné : http://moon.felk.cvut.cz/~xvagner/x36pjp/cv/cv05.php Materiály •
•
•
X36PJP, přednášky 4‐6 http://moon.felk.cvut.cz/~xvagner/x36pjp/cv/cv05.php Syntaxí řízený překlad (X36PJP) Prostředky pro specifikaci syntaxí řízeného překladu ‐překladové gramatiky, atributové gramatiky, atributové překladové gramatiky. Syntaxí řízený překladač •
•
syntaktický analyzátor, který v návaznosti na analytické akce provádí též sémantické akce o kontrola kontextových podmínek (statická sémantika) o generování výstupu (napr. vnitřní formy programu) teoretická podpora o formální překlad o překladové gramatiky o překladová schémata o atributovaný překlad o atributové gramatiky o atributové překladové gramatiky Formální překlad •
•
•
formální překlad z jazyka L nad abecedou T do jazyka V nad abecedou D je binární relace Z L × V o L je vstupní vstupní jazyk o T je vstupní abeceda o V je výstupní jazyk o D je výstupní abeceda z dvojice (x, y) Z se: o x nazývá vstupní řetězec o y nazývá výstupní řetězec, který je překladem řetězce x překlad je jednoznačný, jestliže každému řetězci x L odpovídá nanejvýš jeden výstupní řetězec y V Překladové automaty •
•
•
je to rozšíření konečného a zásobníkového automatu, generuje stejný jazyk jako daná PG. osmice (Q, T, G, D, δ, q0, Z0, F) T je vstupní abeceda, G abeceda zásobníku, D výstupní abeceda (to je ten podstatný rozdíl), δ přechodová funkce, q0 počáteční stav, Z0 počáteční symbol zásobníku, F konečná množina koncových stavů •
•
•
konfigurace zásobníkového automatu ‐ čtveřice (q, x, α, y), kde q je stav, x nezpracovaná část vstupního řetězu, α obsah zásobníku, y dosud vytvořená část výstupního řetězu. automat provádí přechody mezi konfiguracemi, a to nedeterministickým způsobem! deterministicky můžeme postupovat, je‐li vstupní gramatika LL(1) gramatikou ‐ pak postupujeme klasicky (rozkladová tabulka a rekurzivní sestup s modifikací (generování výstupu)) Překladová gramatika •
•
PG = (N, T, D, R, S) o N je konečná množina neterminálních symbolů o T je konečná množina vstupních terminálních symbolů o D je konečná množina výstupních terminálních symbolů (to je jediný rozdíl oproti klasické gramatice) o R je konečná množina pravidel ve tvaru A → α, kde A N, α (N T D)* o S je startovací symbol gramatiky množiny N, T a D jsou navzájem disjunktní Vypuštěním symbolů výstupní abecedy z přepisovacích pravidel dostaneme tzv. vstupní gramatiku překladové gramatiky PG. Vypuštěním symbolů vstupní abecedy dostaneme tzv. výstupní gramatiku PG. Gramatika G = (N, T D, R, S) se nazývá charakteristickou gramatikou PG. Pro překladovou gramatiku jsou definovány pojmy překladová derivace (obdoba derivace), překladová forma (obdoba větné formy) a překladový strom (obdoba derivačního stromu). Překladová gramatika PG = (N, T, D, R, S) generuje překlad Z(PG) T* × D* definovaný takto: Z(PG)= {(x, y): S * w, w (T D)*, x = hi(w), y = ho(w)} •
•
•
•
hi(w) je řetězec vstupních symbolů, který vznikne z w vypuštěním výstupích symbolů ho(w) je řetězec výstupních symbolů, který vznikne z w vypuštěním vstupích symbolů zobrazení hi = vstupní homomorfismus zobrazení ho = výstupní homomorfismus Překladová gramatika s LL(1) vstupní gramatikou Pro překladovou gramatiku, jejíž vstupní gramatika je LL(1), lze překlad realizovat jednoduchým rozšírením algoritmu LL(1) syntaktické analýzy • zásobníkové symboly: N U T U D • je‐li na vrcholu zásobníku výstupní symbol, vyjme se ze zásobníku a připojí se k výstupnímu řetezci Jak získáme překladovou gramatiku s LL(1) vstupní gramatikou Tak, že transformacemi pro bezkontextové gramatiky na LL(1) gramatiku budeme transformovat tzv. charakteristickou gramatiku G = (N, T U D, R, S) prekladové gramatiky PG = (N, T, D, R, S), pricemž do výpoctu množin FIRST a FOLLOW zahrneme pouze symboly z T Atributové překlady Atributové překlady sestávají nejen z překlad vstupního řetězce na nějaký výstupní řetězec, ale také z operací s atributy lexikálních elementů. Můžeme si to představit již jako činnost reálného překladače, který nejen zkontroluje, jestli je vstup správný, ale také např. naplní a spočte hodnoty proměnných ze zadaného textu. Také například ukládá jako atributy názvy proměnných (lexikální analyzátor nám pro identifikátory vrátí pouze element IDENT, ale už nijak neříká, jaký je text toho identifikátoru). •
•
•
•
•
•
atribut ‐ veličina, která nabývá nějaké hodnoty z množiny, která se nazývá obor hodnot atributu. Například atributem lex. elementu cislo může být jeho hodnota atributovaný symbol ‐ symbol nějaké abecedy, kterému je přiřazena množina (případně prázdná) atributů (to je právě to cislo z předchozího tvrzení) atributovaný překlad ‐ relace ZA T* × D*, kde T* je množina vstupních atributovaných řetězců a D* je množina výstupních atributovaných řetězců k symbolu x jsou přidruženy atributy a1, a2, ..., an: A(x) ={a1, a2, ..., an} atributovaný symbol x s hodnotamu atributů h1, h2, ..., hn: x[h1, h2, ..., hn] atributová gramatika je definovaná stejně jako atributová překladová gramatika s tím rozdílem, že základní gramatikou je bezkontextová gramatika neobsahující výstupní symboly. (pozor na to!) Atributová překladová gramatika •
APG = (PG, A, V, F), kde: o PG je překladová gramatika PG = (N, T, D, R, S) o A je množina atributů, z nichž některé jsou dedičné a některé syntetizované o V je zobrazením které přiřazuje symbolům X (N T D) množinu jejich atributů A(X) A ƒ množinu dědičných atributů symbolu X značíme I(X) ƒ množinu syntetizovaných atributů symbolu X značíme S(X) ƒ vstupním symbolům jsou přiřazeny pouze syntetizované atributy, výstupním symbolům pouze dědičné atributy o F je množina sémantických pravidel, kterými jsou definovány hodnoty: ƒ každého dědičného atributu neterminálního nebo výstupního symbolu na pravé straně každého pravidla z R na základě hodnot ostatních atributů symbolů téhož pravidla ƒ každého syntetizovaného atributu neterminálního symbolu na levé straně každého pravidla z R na základě hodnot atributů symbolů téhož pravidla ƒ hodnoty dědičných atributů počátečního symbolu a syntetizovaných atributů vstpních symbolů jsou zadány jinak •
Dědičné a syntetizované atributy •
Dědičný atribut – je to atribut, který v derivačním stromě putuje od jeho kořene směrem dolů k jeho potomkům. Dědičné atributy počítáme tehdy, pokud je symbol, jemuž je atribut přiřazen, na pravé straně pravidla. •
Syntetizovaný atribut ‐ je to atribut, který v derivačním stromě putuje odspoda směrem ke kořeni stromu. Syntetizované atributy počítáme tehdy, pokud je symbol, jemuž je atribut přiřazen, na levé straně pravidla. •
Lépe to snad vysvětlí derivační strom z příkladu na Vagnerových stránkách – chceme sestrojit atributový překlad, kterému zadáme součet nebo násobení čísel a on nám vypíše výsledek. Gramatika má tento tvar: (v je jediný výstupní symbol, který bude výsledkem výpočtu, atributy jsou uvedeny v pravém sloupci) 0. S ‐> Ev 1. E ‐> TE' 2. E ‐> ‐TE' 3. E'0 ‐> +TE'1 4. E'0 ‐> ‐T E'1 •
5. E' ‐> ε 6. T ‐> FT' 7. T'0 ‐> *F T'1 8. T'0 ‐> /F T'1 9. T' ‐> ε 10. F ‐> a 11. F ‐> (E) v.hod := E.hod E'.op := T.hod E.hod := E'.hod E'.op := ‐ T.hod E.hod := E'.hod E'1.op := E'0.op + T.hod
E'0.hod := E'1.hod E'1.op := E'0.op ‐ T.hod
E'0.hod := E'1.hod E'.hod := E'.op T'.op := F.hod T.hod := T'.hod T'1.op := T'0.op * F.hod
T'0.hod := T'1.hod T'1.op := T'0.op / F.hod
T'0.hod := T'1.hod T'.hod := T'.op F.hod := a.hod F.hod := E.hod Torzo derivačního stromu pro výraz a*a*a této gramatiky vypadá takto: (dědičné etributy označeny zelenou, syntetizované modrou šipkou) Příklad k pochopení pojmů ‐ překlad (přěvzato z tohoto dokumentu) Překladová gramatika PG = ({E, T}, {a, +, *, (, )}, {a, +, *}, R, S) obsahující pravidla E → E + T + | T T → T * F * | F F → a a | ( E ) generuje formální překlad výrazů z infixové notace do postfixové. Například vstupnímu řetězci a+a*a odpovídá výstupní řetězec aaa*+. Lze se o tom přesvědčit následující překladovou derivací: E ⇒ E + T + ⇒ T + T + ⇒ F + T + ⇒ a a + T + ⇒ a a + T * F * + ⇒ a a + F * F * + ⇒ a a + a a * F * + ⇒ a a + a a * a a * + Vypustíme‐li z výsledného řetězce výstupní symboly, obdržíme vstupní řetěz a+a*a, po vypuštění vstupních symbolů obdržíme odpovídající výstupní řetěz aaa*+. Překladový strom odpovídající této derivaci je na obr. Vstupní gramatika překladové gramatiky obsahuje pravidla: E → E + T | T T → T * F | F F → a | ( E ) Výstupní gramatika obsahuje pravidla: E → E T + | T T → T F * | F F → a Příklad – překlad x atributový překlad Dejme tomu, že pouze upravíme minulý příklad a každému vstupnímu symbolu a a výstupnímu symbolu a přiřadíme atribut, jehož oborem hodnot budou posloupnosti znaků. V tomto atributovém překladu bude atributovanému vstupnímu řetězci a[„a“]+a[„b“]*a[„c“] odpovídat výstupní řetězec a[„a“]a[„b“]a[„c“]*+ Materiály •
•
X36PJP, přednášky 4‐6 dokument s moc hezky popsanym syn.rizenym.prekladacem a dalsima vecma LL‐atributové překladové gramatiky, programová realizace rekurzívním sestupem s parametry. L‐atributové (překladové) gramatiky •
•
libovolný atributovaný derivační (překladový) strom lze vyhodnotit jedním průchodem shora dolů a zleva doprava pro každé syntaktické pravidlo (r) X0 → X1X2...Xn a jemu příslušná sémantická pravidla musí platit: každý dědičný atribut symbolu Xk, 1 ≤ k ≤ n, závisí nejvýš na dědičných atributech symbolu X0 a na atributech symbolů Xi, 1 ≤ i ≤ k o každý syntetizovaný atribut X0.s závisí nejvýš na dědičných atributech symbolu X0 a na atributech symbolů pravé strany jinými slovy: o žádný dědičný atribut symbolu Xk nezávisí na syntetizovaných atributech symbolu X0 ani na atributech symbolů Xi, k < i ≤ n o žádný syntetizovaný atribut symbolu X0 nezávisí na syntetizovaných atributech toho symbolu o
•
LL‐atributová gramatika •
•
LL atributová gramatika = atributová gramatika, jejíž základní bezkontextovou gramatikou je LL(1) gramatika LL‐atributová překladová gramatika o vstupní gramatikou základní překladové gramatiky je LL(1) gramatika o překlad, který generuje, lze snadno realizovat rekurzivním sestupem s parametry Rekurzivní sestup s parametry •
•
•
•
•
•
překlad definovaný LL‐atributovou (překladovou) gramatikou lze realizovat rekurzivním sestupem s parametry pro každý neterminál A napíšeme proceduru, která má tolik parametrů, kolik má neterminál A přidruženo atributů o dědičným atributům odpovídají vstupní parametry procedury o syntetizovaným atributům odpovídají výstupní parametry (dá se to řešit ukazatelem, který předáme jako parametr funkce, ale také jako návratová hodnota funkce) pro každý vstupní terminál, který má přidruženy syntetizované atributy, napíšeme proceduru pro srovnání, která má tolik výstupních parametrů, kolik má symbol přidružených atributů pro každý výstupní terminál, který má přidruženy dědičné atributy, napíšeme proceduru, která má tolik vstupních parametrů, kolik má symbol přidružených atributů dobrý příklad je u Vagnera na http://moon.felk.cvut.cz/~xvagner/x36pjp/cv/cv07.php vyjmutý zápis procedury která obsluhuje pravidla přijímá dědičný atribut op, a vrací hodnoty jako syntetizované atributy. Tento příklad navazuje na ten popsaný u podkapitoly dědičné a syntetizované atributy. static double EC ( double op )
{
switch ( Token )
{
/* HINT: pozor, zde se jiz musi rozlisit + a - */
case LEX_ADD:
/* E' -> +TE' */
Token = NextToken ();
/* Kosaty zapis:
* double x = T ();
* x = EC ( op + x );
* return ( x );
* nebo zkracene:
*/
return ( EC ( op + T ()) );
case LEX_SUB:
/* E' -> -TE' */
Token = NextToken ();
return ( EC ( op - T () ) );
default: /* epsilon pravidlo i pro ostatni dopredu
prohlizene retezce */
return ( op );
}
}
Materiály •
•
X36PJP, přednášky 4‐6 http://moon.felk.cvut.cz/~pjv/Jak/_info/i532/AtributovanyPreklad.html Vnitřní formy programu, jazyk zásobníkového počítače, syntaktický strom, příklady překladu základních konstrukcí. Vnitřní formy programu Jak už název napovídá, je to něco, co použijeme tehdy, když budeme chtít program nějak provádět. Proč vnitřní formu vlastně potřebujeme? Nešlo by každý příkaz provést rovnou řádek po řádku ze zdrojáku? No, to by bylo docela komplikované, protože přeci jen v různých místech programu se odkazujeme na různé funkce, proměnné atd. Proto potřebujeme program nějak strukturovat . Takže vnitřní forma je: •
•
•
datová struktura, která je výstupem přední části kompilátoru (tj. to, co dostaneme po provedení lexikální, syntaktické a sémantické analýzy) . Generuje ji tedy syntaktický analyzátor. lze ji generovat LL‐atributovou (překladovou) gramatikou a realizovat rekurzivním sestupem s parametry nejčastěji používané vnitřní formy: o abstraktní syntaktický strom o jazyk zásobníkového počítače Abstraktní syntaktický strom •
•
•
reprezentuje zdrojový program jako strukturu složenou z operátorů a operandů (operátory jsou vnitřní uzly stromu, operandy listy) takto lze reprezentovat např. aritmetický výraz, ale i výraz for‐cyklu realizujeme pomocí struct a union (C) nebo class (C++) ‐ toto na Müllera umět! Příklad na Abstraktní syntaktický strom Abstraktní syntaktický strom pro výrazy celých čísel a binárních operátorů a jeho programová realizace. Na obrázku je strom pro výraz 5+4*8. Programová realizace pomocí datových struktur vypadá zhruba takto… Pro stromovou realizaci výrazů obsahující pouze binární operátory, celočíselné konstanty a závorky vystačíme se dvěma typy uzlů : uzlem pro celočíselnou konstantu a uzlem pro binární operátor. Uzel konstanty bude obsahovat hodnotu konstanty, uzel binárního operátoru bude obsahovat kód operace a dva ukazetele na stromovou reprezentaci operandů. Takže nejprve popis tříd… class Uzel {
public:
virtual int Hodnota() = 0;
};
class IntKonst : public Uzel {
int hodn;
public:
IntKonst(int c);
virtual int Hodnota();
};
class BinOp
char op;
Uzel *levy,
public:
BinOp(char,
virtual int
};
: public Uzel {
*pravy;
Uzel*, Uzel*);
Hodnota();
Nyní popisy jejich metod… IntKonst::IntKonst(int c) {
hodn = c;
}
int IntKonst::Hodnota() {
return hodn;
}
BinOp::BinOp(char o, Uzel *l, Uzel *p) {
op = o; levy = l; pravy = p;
}
int BinOp::Hodnota() {
int l = levy->Hodnota();
int p = pravy->Hodnota();
switch (op) {
case '+':
return l+p;
case '-':
return l-p;
case '*':
return l*p;
case '/':
return l/p;
}
}
Nyní sestavíme sémantická pravidla pro gramatiku… A teď realizujeme vnitřní formu rekurzivním sestupem… Takto se pak provede volání rekurzivního sestupu… Takže oproti běžnému rekurzivnímu sestupu popsanému dříve, tady metody přebírají jako své parametry ukazatele na uzly a uzly také vrací. Výsledek celé operace bude obsahovat kořenový uzel celého stromu, resp. ho vrátí jeho metoda Hodnota(). Jazyk zásobníkového počítače •
•
•
Vychází z postfixové notace výrazu o Mezivýsledky se ukládají do zásobníku, takže výhoda je, že je nemusíme nijak adresovat, prostě až budou potřeba, tak budou na vrcholu zásobníku Instrukce zásobníkového počítače: o IntKonst(c) do zásobníku vloží císlo c o BinOp(op) ze zásobníku vyjme pravý operand p, levý operand l a pak do nej vloží výsledek operace l op p o Stop ukoncí výpočet a vypíše číslo na vrcholu zásobníku Příklad překladu pro výraz 5 + 4 * 8 : o IntKonst(5) IntKonst(4) IntKonst(8) BinOp('*') BinOp('+') Stop Příklad Předvedeme si to na příkladu u stejné gramatiky jako minule, takže operátory a celá čísla…Po projití výrazu rekurzivním sestupem to vyhodí výsledek v jazyku zásobníkového počítače. Ten se dá pak interpretovat interpretem. Takže, nejdříve si vytvoříme sémantická pravidla pro gramatiku. Syntaktická pravidla gramatiky budou stejná jako minule – akorát doplněné o výstupní symboly, protože chceme, aby výstupem byl opět kód, a ten provedeme až pak. Teď pomocí těchto pravidel provedeme rekurzivní sestup. Výsledkem něho bude to, že přeložíme vstupní kód do jazyka zásobníkového počítače. Tak, to by byl rekurzivní sestup. Dále popíšem, co dělá funkce gener(). No prostě generuje instrukci ve formě jazyka zásobníkového počítače ze zadaných parametrů. Jak generuje? Vemte si, že máme zásobník implementovaný polem. Toto pole je pole struktur, které každá obsahují kód instrukce (tzn. zde například „IntKonst“ nebo „Binop“) a operand instrukce (zde celé číslo v případě kódu IntKonst nebo +,‐,*,/ v případě kódu Binop). Funkce gener() umístí takovouto strukturu reprezentující instrukci na vrchol zásobníku a posune ukazatel na vrchol o 1. Poté co jsme provedli rekurzivní sestup máme vlastně na zásobníku umístěny odshora dolů jednotlivé instrukce. Nyní stačí, když je postupně provedeme. Interpret bude vypadat zhruba takto… Na konci nám na vrcholu zásobníku zůstane výsledná hodnota. Tak a pohádky je konec… Materiály •
X36PJP, přednáška 7 •
•
dokument s texovym popisem Principy databázových systémů (X36DBS) Systém řízení bází dat, databáze, datový slovník, víceuživatelský přístup, kategorie DB uživatelů, transakční zpracování, architektura klient‐server. Systém řízení bází dat •
•
•
•
popis SŘBD na wiki Na úvod příklady SŘBD: MySQL, PostgreSQL, Oracle... jedná se o speciální programové vybavení, které zajišťuje centrální správu databáze. Databáze nemusí být vždy řízena centrálně (např. distribuované databáze). SŘBD může být také pevně spojen s daty (databáze na CD) společně s nějakou databází tvoří databázový systém (DBS = SŘBD + DB) ƒ Autoři aplikací opakovaně řešili problémy, které byly jednotným způsobem vyřešeny nadstavbou ‐ systém řízení báze dat •
•
•
•
systém řízení báze dat (SŘBD) lze chápat jako souhrn procedur a datových struktur, které zajišťují nezávislost databázových aplikací na detailech vytváření, výběru, uchování, modifikaci a zabezpečení ochrany databází na fyzických paměťových strukturách počítače pro práci s daty SŘBD podporují zejména tyto funkce: o vytvoření báze dat (CREATE) o vkládání dat (INSERT) o aktualizace dat (UPDATE) o rušení dat (DELETE) o výběr z báze dat (SELECT) dále je podporována tvorba formulářù (vstupních obrazovek, Forms), výstupních sestav (Reports) a aplikačních programů SŘBD zahrnuje: o modelovací jazyk pro definování schémat databází v SŘBD o datové struktury (pole, záznamy, soubory a objekty) optimalizované pro práci s velkými objemy dat o dotazovací jazyk a systém výpisu sestav ƒ umožňuje uživateli získávat, analyzovat a upravovat data z DB ƒ řídí také bezpečnost (datová bezpečnost zamezuje neoprávněným uživatelům prohlížet nebo upravovat data v DB) o transakční mechanismus ƒ
•
ideálně by měl zaručovat ACID (viz dále) vlastnosti pro zajištění integrity nehledě na současný paralelní přístup více uživatelů a chyby ƒ SŘBD může udržovat integritu tak, že k jedné položce dovolí v jednom okamžiku přistupovat pouze jednomu uživateli je s ním spojena existence dvou typů jazyků: o jazyk pro definici dat (JDD nebo anglicky DDL) ‐ slouží pro vytvoření všech definic uživatelských dat potřebných v aplikaci o jazyk pro manipulaci s daty (JMD nebo anglicky DML) ƒ slouží k aktualiaci dat a k jejich výběru podle daných požadavků ƒ jeho součástí je dotazovací jazyk Databáze •
•
•
•
•
•
•
•
o databázi na wiki strukturovaná kolekce záznamů nebo dat uložená tak, že nějaká aplikace nebo uživatel používající dotazovací jazyk může databázi požádat o odpovědi na dotazy týkající se dat tak jako databázový systém = SŘBD + DB, tak DB = data + metadata (to jsou data popisující data – viz dále) Databáze je soubor informací, jako jsou znaky, čísla, diagramy, jejichž systematická struktura umožňuje, aby tyto informace mohly být vyhledávány pomocí počítače. komplikovanější centrálně zpracovávaná struktura dat zahrnuje tyto komponenty: o datové prvky – slouží k zachycení hodnot o vztahy mezi prvky dat – jsou zachyceny pomocí složitějších datových struktur o metadata ƒ integritní omezení – podmínky, které mají splňovat data v databázi (například určují primární klíč tabulky atd.) ƒ schéma – popis dat srozumitelný uživateli databáze Základní paradigma: existence dat v DB je nezávislá na aplikačních programech Databázový dotaz je výraz v dotazovacím jazyku. Výsledkem dotazu je odpověď v podobě datové struktury Datový slovník •
•
•
•
množina metadat, ve kterých jsou organizovány veškeré definice týkající se logického a fyzického schématu databáze – takže vlastně takový celkový popis databáze. z hlediska SŘBD se jedná o skupinu tabulek (a pohledů), do kterých nelze zapisovat datový slovník mimo jiné obsahuje: o přesnou definici datový prvků o uživatelská jména, role a privilegia o schémata o integritní omezení o Stored Procedury a Triggery o obecnou strukturu databáze o přidělení místa (Space Allocation) datový slovník umožňuje zachovat konzistenci dat v různých tabulkách (datový slovník je i pojem v problematice SIN ‐ viz. 1. přednáška) Víceuživatelský přístup Každý uživatel se musí autentizovat již při vstupu do databáze. Většinou se jedná o jméno a heslo. Dále má každý uživatel speciální uživatelská práva přístupu k datům v databázi. Tato práva mohou být definována na různých úrovních pohledu na databázi. Uživatel může mít přístup k databázi prostřednictvím pohledu, který definuje zákaz přístupu k některým datům a zákaz některých operací. Kategorie DB uživatelů •
•
•
•
správce dat – jedná se většinou o odborný útvar (ne jednotlivec), který zahrnuje osoby odpovědné za autorizovaný přístup do databáze (udílejí práva přístupu pro jednotlivé uživatele) nebo např. vyhodnocuje využívání databáze aplikační programátoři – vytvářejí uživatelské aplikace koncoví uživatelé o příležitostní uživatelé o vyžadují data z databáze v různých souvislostech o obvykle ovládají silnější dotazovací jazyk (např. SQL) a mění své požadavky na základě okamžitých potřeb naivní uživatelé – jsou pro ně k dispozici dotazovací jazyky založené na různých menu Transakční zpracování •
dva základní požadavky na SŘBD: o chránit data organizovaná pod daným SŘBD o poskytnout korektní a rychlý asynchronní přístup většímu množství uživatelů o řešení: ƒ komponenta řízení souběžného (paralelního) zpracování (Concurrency Control) ƒ komponenta zotavení z chyb (Recovery) •
transakce: o posloupnost akcí, které se provedou všechny nebo žádná o s posloupností se zachází jako s jedním celkem (atomicita) o dovoluje provést několik dotazů, které spolu souvisejí, aby nedošlo ke vzniku nekonzistencí v DB o
o
o
o
požadavky na korektnost transakce (ACID): ƒ A(Atomicity) ‐ transakce musí buď proběhnout celá nebo vůbec ne ƒ C(Consitence) ‐ transakce transformuje databázi z konzistentního stavu do jiného konzistentního stavu ƒ I(Independence) ‐ dílčí efekty jedné transakce nejsou viditelné jiným transakcím ƒ D(Durability) ‐ efekty úspěšně ukončené (potvrzené) transakce jsou trvale uloženy na transakčním zpracování je založena většina současných SŘBD začátek transakce ‐ implicitně nebo příkazem SET TRANSACTION příkazy COMMIT a ROLLBACK ƒ potvrzují nebo vrací změny v transakci ƒ mohou se vyvolávat implicitně (samotným systémem) nebo explicitně Obnovení konzistence systému po incidentu •
•
operace použité při obnově: o UNDO ‐ zrušení transakce, která díky chybě proběhla jen částečně o REDO ‐ opakování transakce, která proběhla celá, avšak k jejímu dokončení došlo mezi posledním okamžikem záznamu do žurnálu a okamžikem výskytu chyby využití transakčního žurnálu (žurnál obsahuje posloupnost jednotlivých operací při tranakcí, takže má možnost je vrátit zpět) Stavový diagram transakce Transakce se může dostat do jednoho z pěti stavů: •
•
•
•
•
aktivní (A jako Active) ‐ od počátku provádění transakce částečně potvrzený (PC jako Partially Commited) ‐ po provedení poslední operace transakce chybný (F jako Fail) ‐ v normálním průběhu transakce nelze pokračovat zrušený (AB jako Aborted) ‐ po skončení operace ROLLBACK, tj. uvedení databáze do stavu před transakcí potvrzený (C jako Commited) ‐ úspěšném zakončení, tj. po potvrzení operací COMMIT Paralelní zpracování transakcí Pokud se transakce provádějí paralelně, je zde riziko tzv. ztráty aktualizace, to znamená, že jedna transakce má data, která již nejsou aktuální (byla ihned změněna jinou transakcí) – viz obrázek. Přestože by hodnota X v databázi měla být 79, je to 84. O paralelní zpracování transakcí se v DBS stará tzv. rozvrhovač, jehož úkolem je maximalizace paralelismu a zajištění konzistence. Rozvrhovač sestaví tzv. rozvrh, který může vypadat jako ten na obrázku… Architektura klient‐server Architektura klient‐server představuje rozdělení aplikace do několika částí. Databáze s enginem pro vyhodnocování dotazů běží na serveru, zatímco část aplikace pro komunikaci s uživatelem (přijímání dotazů, zobrazení dat) běží na klientovi. S příchodem internetu se stala populární třívrstevná architektura klient‐server obsahující: prezentační, aplikační a datovou vrstvu. Materiály •
•
•
•
•
•
•
•
Wikipedia ‐ Database Management System Wikipedia ‐ Database Wikipedia ‐ Data Dictionary http://www.smartrady.com/fel.php http://www.fs.vsb.cz/books/dbacc20/dbacc01.htm http://www.student.cvut.cz/cwut/index.php/Principy_datab%C3%A1zov%C3%BDch_
syst%C3%A9m%C5%AF http://cs.wikipedia.org/wiki/3NF Datové modely (X36DBS) Konceptuální datové modely, logické databázové modely, fyzické datové modely a jejich souvislosti. Konceptuální, logická, fyzická uroveň •
•
•
•
Existují různé úrovně pohledu na data. Nejvyšší úroveň je úroveň analytických konceptů, kam patří Konceptuální schéma. Nižší úrovní je úroveň implementačních konceptů, kam patří Databázové schéma. Částečně sem patří Úložiště jako množina souborů. To patří i do Fyzické úrovně, kam se řadí i Úložiště jako množina BOIS bloků Konceptuální – zabývá se modelováním reality, není ovlivněna budoucími prostředky řešení (E‐R model, Class Diagram, ...). Logická – vztahuje se ke konkrétnímu datovému modelu a používá jeho konstrukční dotazovací a manipulační prostředky (relační, objektová, síťová, hierarchická, XML, ...). Fyzická – jde o fyzické uložení dat (sekvenční soubory, indexy, clustery, ...). Programátor je od ní typicky odstíněn vrstvou SŘBD. Konceptuální modelování •
objevily se v 70. letech jako prostředek, který umožňoval společné chápání objektů aplikace uživateli i programátory. Integroval do sebe různé stupně pohledu. Výsledek je vstupem pro návrh implementace. Příkladem konceptuálního modelování je E‐R diagram – jednotlivé jeho části jsou na obrázku barevně odlišeny a popsány. •
•
•
•
•
•
entita = objekt realného světa, který modelujeme entitní typ ‐ popisuje skupinu objektů stejného typu slabý entitní typ ‐ k identifikaci entity slouží parciální klíč a klíč vlastníka ISA hierarchie ‐ hiearchie entitních typů, identifikační klíč vlastní pouze nadtyp, podtyp dědí atributy nadtypu kardinalita ‐ poměr vztahu (1:1, 1:N, M:N) parcialita ‐ povinnost účasti ve vztahu (zda entita musí/může být obsažena ve vztahu) Logické (databázové) modely •
•
•
•
•
•
Síťový model (60. léta 20. století) Hierarchický (konec 60. let lze chápat jako specializaci síťového modelu) Relační model (začátek 70. let) Objektový model (80. léta, lze chápat jako rozšíření síťového modelu) Objektově relační model (90. léta – komerčně úspěšný “kočkopes”) XML model (konec 90. let, mnoho prvků hierarchického modelu) •
Volba databázového modelu typicky určuje také prostředky pro vytváření struktury databáze (DDL), prostředky pro tvorbu aplikací (DML, dotazovací jazyk, TCL, DCL) Příklady: o Relační model – SQL o Objektový model – OQL o XML model – Xpath, XQuery •
Síťový DB model, datové typy •
•
•
Datový typ Record (záznam), který se podobá pascalskému datovému typu File of record, Datový typ Set (C‐množina, dvojice různých datových typů Record), který se podobá datovému typu Seznam Po transformaci E‐R schématu do síťového o Každému entitnímu typu odpovídá jeden typ Record o Každému vztahovému typu 1:N odpovídá jeden typ Set Hierarchický model •
Speciální typ síťového modelu Relační DB model •
•
jediný konstrukt ‐ relace o schéma relace; jméno relace, jména atributů a specifikace domén atributů o prvky domén jsou atomické hodnoty (1. normální forma) o formální zápis: R(A1:D1,...,An:Dn) KINO(NAZEV_K:CHAR(15),ADRESA:CHAR(25) ) Integritní omezení: primární klíč, cizí klíč operace: •
•
•
•
•
•
•
vytvoř novou relaci (tabulku) přidej novou n‐tici (řádek) do dané relace (tabulky) vymaž n‐tice (řádky) zadaných vlastností vytvoř novou relaci (tabulku) ze zadané relace u výběrem n‐tic (řádků) zadaných vlastností ‐ selekce u výběrem zadaných atributů (sloupců) ‐ projekce ve vybraných n‐ticích (řádcích) zadané relace (tabulky) změň hodnoty zadaných prvků (polí) vytvoř novou relaci (tabulku) ze zadaných relací (tabulek) pomocí množinových operací sjednocení, průnik, rozdíl vytvoř novou relaci (tabulku) ze zadaných relací (tabulek) jako podmnožinu jejich kartézského součinu ‐ spojení Integritní omezení (IO): •
•
IO jsou tvrzení vymezující korektnost DB definují se na konceptuální i databázové úrovni Objektový datový model •
•
Objekty = data + metody. Mezi objekty existuje skládání, dědění, závislost, klasifikace podle tříd, ... Strukturované informace není třeba rozdělovat jako v RDM. Protokol objektu je dán množinou přípustných zpráv (ne atributů jako v RDM). •
•
•
Jedna množina může s využitím polymorfismu obsahovat objekty s různou strukturou dat i metod. Je rozdíl mezi množinou objektů a třídou. Identita objektu je dána nejen vnitřnímimi, ale i vnějšími vazbami. Klíče jsou interní záležitostí systému. XML databázový model •
•
•
•
•
Podobá se hierarchickému (XML dokument je chápán jako strom (DOM)) Aplikační doména? (vhodnost použití) Datový model: elementy, atributy, PCDATA, zachování pořadí (document order). Někdy bohatší. Silné a standardizované dotazovací jazyky (XPath, XQuery) Mnoho implementací a mnoho věcí stále ve vývoji (indexování, zamýkání, ...) Fyzické datové modely •
Fyzická ogranizace tabulky: o heap tabulka o heap tabulka s indexy o tabulka s indexovou organizací o tabulka ve shluku (cluster) index může být typu B‐strom a nebo bitmapový •
B‐strom •
bitmapový použití tohoto indexu při vyhodnocení poddotazu… Jak to vidí Michal Valenta Konceptualni datove modely jsou takove, ktere zachycuji pouze vztahy a struktury dat samotnych. Nejsou zavisle ani ovlivnene zpusobem, jakym budou data v databazi ulozena a manipulovana (dotazovacimi jazyky). Napadaji me pouze dva konceptualni modely z praxe ‐ ER model a class diagram (z UML) ‐ ikdyz u toho druheho je to trochu diskutabilni. •
•
Konceptuální model, E‐R model http://owebu.cz/databaze/vypis.php?clanek=298 http://www.cs.cas.cz/~stuller/php/uploaded/ERDDFD%20‐%20Spanek.pdf Logicke datove modely jsou modely se kterymi pracuje databazovy stroj smerem k uzivateli (anebo, kdyz se oprostime od implementace, tak je muzeme definovat napriklad jako modely, nad kterymi jsou definovane databazove dotazovaci a manipulacni jazyky). Sem patri relacni model, objektovy model, ale treba take sitovy, ci hierarchicky, nebo XML model (s jazyky XPath, XQuery). •
•
Relační model http://owebu.cz/databaze/vypis.php?clanek=334 Hiearchické a síťové modely: http://kocour.ms.mff.cuni.cz/~pokorny/dj/prezentace/2_44.ppt Fyzicke datove modely jsou modely, ktere pouzivaji databazove stroje smerem k nizsim vrstvam systemu ‐ tedy operacnimu systemu ‐ v zasade jsou to ruzne zpusoby fyzickeho ulozeni dat (tedy soubory) ‐ sekvencni soubory, ale take B‐stromy, ruzne binarni zpusoby ulozeni dat ‐ dbf soubory atd. Zdroje •
•
http://soubory.gjm.cz/mandik/maturita/Materialy_ke_studiu/databaze/Databaze.pd
f http://home.zcu.cz/~ruz/pred_db1.doc Relační databázový model, relace, funkční závislosti, návrh schématu úložiště v relační databázi, normalizace, integritní omezení. Relační model dat, Relace Jednoduše řečeno: relace = tabulka, schéma relace = záhlaví tabulky •
•
•
•
•
•
jména atributů A1, A2 …, An domény atributů, Di nebo dom(Ai); 1NF n‐tice (a1,…,an) ai є Ai množina n‐tic є D1 x D2 x...x Dn ~ relace schéma relace R(A1:D1,…,An:D2), zkraceně R(A) jméno schématu relace R Příklad relací: chceme sledovat více herců ke každému filmu. jak to pomocí relace udělat? Jaké jsou možnosti? klasické „relační“ řešení je to druhé zvrchu. První nelze použít, protože hodnoty položek nejsou atomické. Vztah tabulky k relaci •
•
•
•
•
Schéma relace = záhlaví tabulky jméno atributu = jméno sloupce atribut = sloupec relace = tabulka n‐tice relace = řádek tabulky Odlišnosti: •
•
V relaci nezáleží na pořadí n‐tic. Relace neobsahují duplicitní n‐tice. Integritní omezení •
•
je nutné zajistit, aby se do relací dostala pouze "správná" data ‐ přípustné n‐tice úplná definice relačního schématu: o (R ,I ) ... schéma relační databáze o R = { R1 ,R2 ,... ,Rk}, o I ... množina IO •
přípustná relační databáze se schématem (R ,I ) je množina relací R1*, R2*, ... , Rk* takových, že jejich n‐tice vyhovují tvrzením v I. Klíč K schématu R(A) je minimální množina atributů z A, která jednoznačně určí n‐tice relace R*. Nechť K je klíč schématu R(A). Pak pro každou přípustnou relaci R* platí: jsou‐li u a v dvě různé n‐tice z R*, pak u[K] ≠ v[K]. •
•
Příklad IO: http://www.manualy.net/article.php?articleID=15 Dotaz •
databázový dotaz nad schématem S je výraz, který vrací odpověď se schématem T o def. oborem jsou všechna úložiště se schématem S o oborem hodnot jsou všechny relace se schématem T data v odpovědi pocházejí z databáze odpověď nezávisí na fyzickém uložení dat dotazovací jazyk je množina všech použitelných výrazů o
o
•
Shrnutí relačního modelu •
•
•
•
•
•
relace (tabulky) jsou v 1NF, tj. komponenty jejich n‐tic (řádků) jsou atomické (dále nedělitelné) – to znamená, že řádky neosahují více hodnot přístup k prvkům relace (řádkům tabulky) dle obsahu jedinečné n‐tice (řádky), jde o zdůraznění množinového myšlení v RMD abstrakce je nezávislá na fyzickém uložení dat existují silné prostředky pro manipulaci s daty existují metody návrhu schématu úložiště v relační databázi, které vedou na schéma “dobrých vlastností” Normalizace (podrobněji viz dále...) •
•
•
postupná transformace tabulky do vhodnějšího tvaru (postupná dekompozice) založena na teorii závislosti. Jsou zavedeny tzv. Normální formy – to jsou předpisy, které by měly tabulky splňovat Žádoucí vlastnosti dekompozice: o bezeztrátovost při zpětném spojení(zpětným spojením získáme stejnou tabulku!) o zachování závislostí o odstranění opakování informace (redundance) Funkční závislosti •
hodnota atributu relace určuje jednoznačně hodnotu jiného atributu téže relace o zapisujeme X → Y o vyplývá z významu atributů, představuje integritní omezení o příkladem může být primární klíč Normalizace, Návrh relačního schématu ve 3. NF dekompozicí z univerzální relace. Normalizace ER modelu Sada pravidel, jak byste měli postupovat při transformaci struktury entit a relací ER modelu na strukturu fyzického uspořádání tabulek a relací v databázi. odstranění redundantních(opakujících) se dat, omezení složitosti (rozloženít složité relace na dvojrozměrné tabulky) a zabránění tzv. aktualizačním anomáliím. vede k tabulkám, které se snadno udržují a efektivně se na ně dotazuje. Normální formy •
•
•
•
1.NF – První normální forma 2.NF – Druhá normální forma 3.NF – Třetí normální forma BCNF – Boyce Coddova normální forma •
•
4.NF – Čtvrtá normální forma 5.NF – Pátá normální forma 1.normální forma •
každý atribut relace obsahuje jen atomické hodnoty (nedělitelné) 2.normální forma •
•
•
relace splňuje 1.NF kazdy neklíčový atribut je zavislý na klíči a to na celém klíči jak jde vidět na příkladu – pokud tabulka není v 2.NF, přináší to značnou redundanci dat. V příkladu špatně je také vidět, proč není tabulka ve 2 NF. Kuchyně není závislá na klíči (id). řešení: dekompozice na 2 tabulky 3.normální forma •
•
•
•
•
splňuje předchozí 2 formy žádný z jejích atributů není tranzitivně závislý na klíči všechny neklíčové atributy jsou navzájem nezávislé Tranzitivní závislost je taková závislost, mezi minimálně dvěma atributy a klíčem, kde jeden atribut je funkčně závislý na klíči a druhý atribut je funkčně závislý na prvním atributu. Jinými slovy všechny neklíčové atributy musí být vzájemně nezávislé Postup: •
•
nalezeni funkcnich zavislosti, ktere jsou tranzitivni rozpad na vice relaci podle nalezenych tranzitivnich zavislosti. Na příkladu špatně je tranzitivní závislost mezi místností a rozlohou místnosti. Navíc tabulka není ani v 2 NF, aby toho nebylo málo. B‐C (Boyce Coddova) normální forma •
•
•
variace třetí normální formy “pro každou netriviální závislost X ‐> Y platí, že X je nadmnožinou nějakého klíče schématu R” (???) Aby byla porusena BCNF, musi byt splneny tyto podminky: ‐ relace má více kandidátních klíčů ‐ min. 2 kand. klíče složené z více atributů ‐ některé kand. klíče mají společný atribut •
mezi kandidátními klíči nesmí být žádná funkční závislost Princip dekompozice: •
•
vyhledání funkčních závislostí mezi kandidatskými klíči řešení: rozpad na více relací 4.normalni forma •
•
je‐li v BCNF a popisuje pouze příčinnou souvislost (jeden fakt) v jedné relaci se nesmí spojovat nezávislé opakované skupiny Typ závislostí, na kterých je 4NF založena není o funkčních závislostech, ale o tzv. multizávislostech. Scháma relace R(A): Jsou‐li dány dvě množiny atributů C, D, které jsou podmnožninou A, pak mulitávislost D na C vychází z intuitivní představy, že jedné C‐hodnotě se přiřadí několik D‐hodnot. (jak říkají skripta Databázové systémy) 5.normalni forma •
•
Relace je v páté normální formě, pokud je ve čtvrté a není možné do ní přidat další atribut (skupinu atributů) tak, aby se vlivem skrytých závislostí rozpadla na několik dílčích relací Dotazovací jazyky (X36DBS) Relační algebra, SQL (DDL, DML, DCL), QBE. Relační algebra •
•
nejzákladnější prostředek pro práci s relacemi Operace: projekce, selekce, spojeni(JOIN), kartézský součin Projekce relace R s atributy A na množinu atributů B: •
•
•
•
česky se tomu říká „výběr sloupců relace“ vytvoření relace schématu B, které vznikly odstraněním hodnot A‐B odstranění eventualních duplicitních záznamů značení : R[B] Selekce relace R s atributy A podle logické podmínky fi: •
•
•
•
česky se tomu říká „výběr řádků relace“ vytvoření relace s týmž schématem a ponechání prvků z původní relace splňující podmínku podmínka = logický výraz ve tvaru t1 (=|>|<|>=|<=) t2, kde t1, t2 jsou atributy, vyrazy, konstanty znaceni: R(fi) Spojení relací R a S se schématy A a B: •
•
•
vytvoří minimální relaci se schématem AČB a s prvky, jejichž projekce na A je z relace R a projekce na B je z relace S. značení: R * S přirozené spojení (spojení přes rovnost – Natural join) ‐ výsledná relace obsahuje ty záznamy, které se shodují v položkách, nad kterými se relace provádí. •
Θ spojení ‐ kde Θ {<, >, =, ≤ , ≥ , ≠ } Mějme relace se schématy R(A) a S(B) R* [t1 Θ t2] S* = { u | u[A] Є R*, u[B] Є S*, u.t1 Θ u.t2} •
•
levé polospojení, pravé polospojení použití polospojení tam, kde není zaručena plná integrita dat Přejmenování atributů •
•
značení: t1‐>alias všímněte si napříkladu, že tabulky relací nesmí obsahovat duplicitní řádky Množinový rozdíl Příklad:(ty D jsou čísla dotazů, toho si nevšímat) Dotazovací jazyk, který umožňuje realizovat všechny operace relační algebry, se nazývá relačně úplný. SQL •
•
standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích Structured Query Language Popis jazyka •
•
•
1. Příkazy pro manipulaci s daty 2. Příkazy pro definici dat 3. Příkazy pro řízení dat Příkazy pro manipulaci s daty (DML) •
•
příkazy pro získání dat z databáze a pro jejich úpravy označují se zkráceně DML •
•
•
•
•
SELECT – vybírá data z databáze, umožňuje výběr podmnožiny a řazení dat. INSERT – vkládá do databáze nová data. UPDATE – mění data v databázi (editace). DELETE – odstraňuje data (záznamy) z databáze. EXPLAIN PLAN FOR – speciální příkaz, který zobrazuje postup zpracování SQL příkazu. Pomáhá uživateli optimalizovat příkazy tak, aby byly rychlejší. SHOW ‐ méně častý příkaz, umožňující zobrazit databáze, tabulky nebo jejich definice •
Příkazy pro definici dat (DDL) Těmito příkazy se vytvářejí struktury databáze – tabulky, (indexy), (pohledy), domény, schémata a další objekty. Vytvořené struktury lze také upravovat, doplňovat a mazat. Tato skupina příkazů se nazývá zkráceně DDL – Data Definition Language („jazyk pro definici dat“). •
•
•
CREATE – vytváření nových objektů. ALTER – změny existujících objektů. DROP – odstraňování objektů. Příkazy pro řízení dat (DCL) Do této skupiny patří příkazy pro nastavování přístupových práv a řízení transakcí. Označují se jako DCL – Data Control Language („jazyk pro ovládání dat“), někdy také TCC – Transaction Control Commands („jazyk pro ovládání transakcí"). Příkazy řídící transakce se často oddělují do samostatné skupiny. •
•
•
•
•
GRANT – příkaz pro přidělení oprávnění uživateli k určitým objektům. REVOKE – příkaz pro odnětí práv uživateli. BEGIN – zahájení transakce. COMMIT – potvrzení transakce. ROLLBACK – zrušení transakce, návrat do původního stavu. Podle přednášek patří řízení transakcí pod TCL QBE (Query‐By‐Example) Elegantní a jednoduchý dotazovací jazyk, který umožňuje eliminovat duplicity v odpovědi. Zachovává referenční integrity. •
•
•
•
Dvourozměrná notace→např nelze provádět složité kvantifikace, zaleží totiž na pořadí kvantifikátorů Nelze vytvářet složitější selekční podmínky http://kocour.ms.mff.cuni.cz/~pokorny/vyuka/pokorny4/ Konceptuální modely používané při analýze (X36DBS, X36SIN) Konceptuální datové modely. Abstraktní datové typy jako definice domén, ER‐model, model tříd. Konceptuální funkční modely. Model jednání, scénáře případů užití, diagramy komunikace, diagramy datových toků, diagram kontextu, diagramy aktivit. Hierarchie funkcí, minispecifikace elementárních funkcí, popisy operací. Zachycení dynamických závislostí pomocí stavových diagramů, scénářů chování a regulárních výrazů, souvislosti. Univerzální modelovací jazyk UML ‐notace a diagramy. Konceptuální modely používané při analýze Analytický (konceptuální) model může být… ƒ
ƒ
ƒ
(konceptuální) datový model (konceptuální) funkční model (konceptuální) dynamický model Konceptuální datové modely (ER‐model, model tříd – Class diagram) Konceptuální či sémantické modely jsou pokusem umožnit vytvoření popisu dat v databázi nezávisle na jejich uložení. Konceptuální model představuje formální popis modelované reality. Hlavními úkoly je nalezení entit, vtahů a atributů. Sémantické modely slouží obvykle k vytvoření schémat s následnou transformací na databázové schéma. Spojíme‐li sémantickou a databázovou úroveň, dostáváme se k tzv. objektově‐orientovaným SŘBD. ƒ
ƒ
ƒ
ƒ
notace konceptuální model tříd nebo ER‐model (diagramy + textový popis) další integritní omezení, která nejsou zachycena v diagramech datový slovník Konceptuální datové modely používají pojmy: •
•
•
entita (objekt) ‐ student,předmět vztah (relationship) – studuje atributy (vlastnost) ‐ věk, rč U každého datového modelu se obvykle řeší 3 komponenty: 1) strukturální ‐ struktura dat 2) manipulace dat ‐ manipulace s daty 3) specifikace integritních omezení Většinou je podrobně vypracována 1. a 3. komponenta. Manipulace dat bývá řešena na nižší úrovni. Abstraktní datové typy jako definice domén •
•
•
•
String – datový typ pro libovolně dlouhý řetězec znaků Integer – datový typ pro celá čísla. Čísla mohou být v rozsahu ±2*109 Float – datový typ pro čísla s pohyblivou řádovou čárkou. Čísla mohou být v rozsahu ±338 Date – datový typ pro datum a čas ER‐model Je to množina pojmů, které pomáhají popsat uživatelskou aplikaci za účelem následné specifikace struktury databáze. Projektant zavádí: •
•
•
•
typy entit – třídy objektů stejného typu typy vztahů – entity do nich mohou vstupovat jednotlivým entitám a vztahům přiřadí atributy, které blíže popisují vlastnosti integritní omezení – pravidla pro správnost ukládaných dat Model tříd Model pojmů, jehož úkolem je formálněji definovat jednotlivé termíny, používané ve studované oblasti. Umožňuje rozpoznávat abstraktní třídy a abstraktní metody. Třída obsahuje atributy a metody. Je možné označovat viditelnost jednotlivých atributů a metod. Součástí jsou i vztahy mezi třídami. Konceptuální funkční modely ƒ
ƒ
ƒ
ƒ
ƒ
notace model jednání (seznam událostí + scénáře) pokud scénář obsahuje složitější aktivity, pak dekompozice těchto aktivit na jednodušší (scénáře, diagramy aktivit, hierarchická sada DFD(Data flow diagrams) ‐ kontextový diagram + diagramy úrovni 0,1,… + popis) minispecifikace elementárních operací datový slovník Model jednání (Use Case) Popisuje možné případy použití systému, události, na které musí systém reagovat. Aktér – uživatelská role nebo spolupracující systém Hranice systému – vymezení hranice systému Případ použití – dokumentace události, na kterou musí systém reagovat Komunikace – vazba mezi aktérem a případem použití Scénáře případů užití (diagram sekvencí) Cílem psaní případů užití (Use Case) je nalezení hranic systému. Jsou psány z pohledu zákazníka a podávají první představu o rozsahu projektu. Nezabýváme se technologickými problémy a snažíme se navrhnout funkční podobu systému co nejsrozumitelnější pro zákazníka. Zjišťujeme, které procesy má systém podporovat a jací uživatelé ho budou používat. Diagramy komunikace, spolupráce •
dokumentují spolupráci objektů •
•
•
Kladou důraz na komunikační aspekt (čas je vyjádřen číslováním) Dokumentují objekty a zprávy, které si posílají při řešení problému Jsou vhodné pro popis spolupráce objektů při návrhu komunikace Diagramy datových toků Používají se pro zachycení vazeb funkcí a toků dat. Komponenty: •
•
•
•
funkce datové toky – orientované hrany vyznačující toky dat datové paměti – místa, kde si potřebujeme něco pamatovat aktéři – uživatelské role nebo spolupracující systémy Diagram kontextu Slouží pro evidenci aktérů a datových toků Diagramy aktivit Popisují průběh činnosti. Slouží jako prostředek pro domluvu mezi zadavatelem a řešitelem. Prvky diagramu aktivit: •
•
•
•
•
Aktivity – činnosti, které modelujeme Přechody – po ukončení činnosti se přejde k činnosti jiné Objekty – s činností může souviset vytváření nebo konzumace objektů Začátek, Konec Synchronizační značky Hierarchie funkcí, minispecifikace elementárních funkcí, popisy operací Hierarchie funkcí Jedna se o klasickou hierarchii jak ji zname. Tedy hierarchicky strom funkci tak jak se funkce volaji. Vyjadruje tak informaci jake jine funkce se v navaznosti na volani nadrazene funkce take volaji. Minispecifikace elementárních funkcí Minispecifikace = popis operace. Slouží pro popis služby evidované v modelu jednání. Priklad podle X36SIN: 1. Zákazník prohlíží katalog a vybere si zboží k nákupu 2. Zákazník zvolí nákup 3. Zákazník vyplní dodací informace (adresa, expresní nebo standardní dodávka) 4. Systém zobrazí plnou cenu včetně ceny dodání 5. Zákazník vyplní platební informace (číslo kreditní karty) 6. Systém autorizuje platbu 7. Systém potvrdí prodej 8. Systém zašle potvrzovací e‐mail zákazníkovi Alternativy: 3a. Uživatel je pravidelným zákazníkem 3a1. Systém zobrazí naposled zapamatované dodací a platební informace Jina podoba minispecifikace: A1: IF odběratel je registrován, THEN, IF objednávka je správně vyplněna AND všechny druhy výrobků v objednávce existují, THEN přidej údaje do tabulky objednávka od odběratele. OTHERWISE, informuj odběratele o chybě v objednávce. OTHERWISE, informuj odběratele o jeho neexistenci v databázi odběratelů. A2: IF všechny výrobky v objednávce jsou rezervovány, THEN pošli objednávku k dalšímu zpracování oddělení prodeje. OTHERWISE, FOR EVERY nezarezervovaný výrobek v objednávce DO: Zkus najít volný výrobek a rezervuj ho. IF výrobek není na skladě, THEN informuj správce. Popisy operací Popis operace obsahuje tyto položky •
•
•
•
•
•
název textový popis jaká data jen čte jaká data mění nebo vytváří jaké reakce vyvolává co předpokládá a co zajišťuje Příklad popisu operací: Operation: Vložení dat zboží do databáze Description: Uživatel systému správně vyplní formulář pro vkládání informací o zboží do databáze Reads: Ověření uživatele a načtení formuláře Changes: Vytvoření nového položky zboží v databázi Sends: Odeslání parametrů položky zboží do databáze Assumes: Kontrola a zobrazení nových dat v databázi Result: Úspěšné vložení zboží do databáze Zachycení dynamických závislostí pomocí stavových diagramů, scénářů chování a regulárních výrazů Stavový diagram •
•
•
Slouží k popisu dynamiky systému Stavový diagram definuje možné stavy, možné přechody mezi stavy, události, které přechody iniciují, podmínky přechodů a akce, které s přechody souvisí Stavový diagram lze použít pro popis dynamiky objektu (pokud má rozpoznatelné stavy), pro popis metody (pokud známe algoritmus), či pro popis protokolu (včetně protokolu o styku uživatele se systémem) Princip stavového automatu: Prostě jako v LOBech Příklady stavových diagramů: Popis řídicích procesů pomocí stavových diagramů •
•
•
Vstupy řídicího procesu lze modelovat pomocí událostí stavového diagramu. Výstupy řídicího procesu lze modelovat pomocí akcí stavového diagramu. Pak lze řídicí procesy modelovat stavovými diagramy. Životní cyklus systému •
•
•
•
Vyjádření souhrné dynamiky systému, která je zachycena ve scénářích Definuje povolené návaznosti akcí a reakcí Představuje hrubou “uživatelskou příručku” pro systém Definice systému jako “konečného automatu” Příklad:Životní cyklus ECO skladu: Životní cyklus jako regulární výraz: Scénáře chování Definují povolené návaznosti akcí a reakcí. Představují hrubou uživatelskou příručku pro systém. Definují systém jako konečný automat. Univerzální modelovací jazyk UML – notace a diagramy je třeba zachytit systém z různých pohledů v různé fázi jejich vývoje. Modelovací jazyk UML proto přináší mnoho prostředků. Je to modelovací jazyk, pro záznam a dokumentaci částí systémů s převážně softwarovou charakteristikou. Diagramy objektů Objekt je pojem, nebo věc s dobře definovanými hranicemi a významem. Každý objekt má tři charakteristiky: •
•
Identita – každý objekt je jedinečný Stav – možná situace, ve které se objekt může nacházet. Stav objektu se může měnit. •
Chování – určuje, jak objekt reaguje na žádosti jiných objektů a určuje vše, co může objekt dělat Diagramy tříd Pro definici atributů se používá notace: Pro definici operací se používá notace: Složky UML •
•
•
•
Elementární prvky (infrastruktura) Diagramy UML (superstruktura) OCL (Object Constraint Language – jazyk pro popis omezení) Výměnný formát (buď jen model – XMI, nebo včetně diagramů konvertovaných do SVG) Tři úrovně využívání UML •
•
•
Jako notaci pro zachycení artefaktů, na kterých se je potřeba domluvit. Lze jej využít přímo (nakreslíme obrázek, abychom si upřesnili imlementaci), ale i zpětně (obrázek nám poslouží k pochopení existujícího kódu). Jako dokumentační prostředek, ve kterém dokumentujeme systém, či jeho části. Jako programovací jazyk, ze kterého se skutečná implementace (přesněji asi jen její kostra) generuje. Základní diagramy UML (1.5) •
•
•
•
•
•
•
•
diagramy tříd diagramy případů užití (model jednání) stavové diagramy scénáře (diagramy sekvencí) diagramy komunikace (spolupráce) diagramy aktivit (činností) diagramy komponent diagramy nasazení Užitečné materiály •
•
http://si.vse.cz/archiv/clanky/2003/08_richta.pdf Logické modely používané při návrhu (X36DBS, X36SIN) Návrh logických datových modelů z modelů konceptuálních. Relační logický model. Objektový logický model. Funkční závislosti. Normální formy. Návrh relačního schématu z konceptuálního datového modelu. Návrh logických funkčních modelů. Návrh dekompozicí, návrh na základě datových struktur, objektový návrh, návrh na základě datových toků. Návrhové vzory. Diagramy komponent, diagramy nasazení. Návrh logických datových modelů z modelů konceptuálních Návrh reprezentace dat Pro každou datovou paměť (úložiště) musíme navrhnout způsob reprezentace ‐ může to být systém ovládání souborů, systém řízení báze dat (relační, objektové, objektově‐relační), speciální datový stroj (SW, SW+HW). •
•
•
Následuje převod konceptuálního modelu do logického. Součástí převodu je i návrh zajištění integrity dat Návrh zajištění konzistence dat, zálohování, archivace apod. Návrh reprezentace dat pomocí relačního databázového systému Vstup: konceptuální datový model (diagram tříd + popis integritních omezení) Výstup: logický relační datový model (SQL‐1999), včetně návrhu realizace integritních omezení Pozn.: Výstupem je obecné SQL, při skutečné implementaci návrhu musí být ještě výstup přizpůsoben konkrétnímu stroji Postup návrhu •
•
•
•
Úprava (normalizace) konceptuálního modelu Návrh reprezentace typů (entit) Návrh reprezentace vztahů Návrh reprezentace integritních omezení Úprava (normalizace) konceptuálního modelu •
•
•
•
Vyloučení multihodnotových a násobných atributů Vyloučení funkčních závislostí (odstranění redundance dat) – převod modelu do 3‐NF (příp. 4‐té, či 5‐té normální formy) Náhrada nebinárních vztah binárními Náhrada vztahů typu M:N přidruženými třídami Návrh reprezentace entit •
•
•
•
Pro každou jednoduchou entitu (typ) navrhneme tabulku, jméno tabulky bude množné číslo jména typu. Návrh jmen sloupce pro reprezentaci atributů a odpovídajících domén. Doplníme informace o volitelnosti formátu sloupců. Z nejčastší používané unikátní identifikace vytvoříme primární klíč, nebo zavedeme nový identifikační sloupec (OID). •
•
•
•
•
•
Pro N‐konce vztahů přidáme k tabulce jednoznačné identifikace z tabulky na 1‐konci (volitelné vztahy indikují nepovinnost. Současně přidáme odpovídající cizí klíče. Pro každý vztah typu nadtyp/podtyp navrhneme reprezentaci (společná tabulka s rozlišovací položkou, samostatné tabulky). Pro každý vztah typu celek/část navrhneme reprezentaci (společná tabulka s rozlišovací položkou, samostatné tabulky). Pro každý exkluzivní vztah (exkluzivní podtypy) rozhodneme, zda se má řešit společnou doménou, nebo explicitními cizími klíči. Doplníme sloupce odpovídající často používaným odvozeným atributům a navrhneme mechanizmus jejich údržby. Navrhneme indexy pro často využívané unikátní kombinace, které nejsou realizovány jako primární klíče. Indexy rovněž vytvoříme pro cizí klíče. Návrh reprezentace integritních omezení •
•
Zkusíme vytvořit deklarativní omezení (constraints). Pokud by nefungovala, musíme navrhnout „triggery“. Relační logický model(relační, síťový) Uspořádá data do řádků a sloupců. Každý řádek představuje záznam, sloupce představují různé datové typy seznamu. Relační datový model •
•
•
popisuje vztahy tabulkami, do kterých se zapisují objekty (jejich klíče)vstupující do vztahů. uspořádá data do řádků a sloupců. Každý řádek představuje záznam, sloupce představují různé datové typy seznamu. Síťový datový model ƒ
znázorňuje vztah pomocí ukazatele na vazební entitu. Ke každé tabulce je připojena systémová část s tolika odkazy, ke kolika jiným typům záznamů je vázán. Objektový logický model Není omezen na uchovávání dat v řádcích a sloupcích. Návrhář vytvoří definici, která popisuje určitou třídu informací. Každý objekt (záznam) je potom instancí této třídy a obsahuje všechny datové položky. Funkční závislosti Jsou to speciální druhy integritních omezení. Jsou definovány mezi dvěma množinami atributů v rámci jednoho schématu relace. Jde tedy o vztahy mezi daty, ne o vztahy mezi entitami a daty nebo mezi entitami navzájem. Funkční závislost je vztažena ke schématu relace a vymezuje nějakou množinu přípustných relací. Schéma relace R(A) s množinou funkčních závislostí F se značí R(A, F). Normální formy •
•
•
•
•
1NF – normální celá tabulka 2NF (druhá normální forma) – tabulka je ve druhé normální formě, jestliže platí, že existuje klíč a všechna neklíčová pole jsou funkcí celého klíče 3NF (třetí normální forma) – tabulka je ve třetí normální formě, jestliže každý neklíčový atribut není tranzitivně závislý na žádném klíči schématu BCNF (Boyce‐Coddova normální forma) – tabulka je v Boyce‐Coddově normální formě, jestliže pro každou netriviální závislost X→Y platí, že X obsahuje klíč schématu R 4NF (čtvrtá normální forma): Tabulka je ve čtvrté normální formě, je‐li ve třetí a popisuje pouze příčinnou souvislost (jeden fakt) Návrh relačního schématu z konceptuálního datového modelu Asi stejný jako u první otazky…??? Návrh logických funkčních modelů????? Princip návrhů ve Fusion: Postup návrhu ve Fusion 1. Pro každou operaci funkčního modelu nakresli diagram komunikace (včetně metod vzniklých při návrhu) 2. Pro každou třídu datového modelu zakresli potřebnou viditelnost podle diagramů komunikace 3. Pro každou třídu datového modelu vytvoř popis třídy 4. Doplň návrh o dědičnost Návrh dekompozicí Pro návrh se používá tvrzení o bezeztrátové dekompozici: Mějme schéma R(A,B,C), kde A,B,C jsou disjunktní množiny atributů a funkční závislost B→C. Rozložíme‐li R na schémata R1(B,C) a R2(A,B), je takto provedená dekompozice bezeztrátová. Naopak, je‐li dekompozice R1(B,C) a R2(A,B) bezeztrátová, musí platit buď A→B nebo B→C Návrhové vzory Co jsou návrhové vzory? •
•
Standardní řešení častých problémů v návrhu softwaru například: Sada vzorů GoF = Gang of Four Co nejsou návrhové vzory? •
•
•
idiomy = ustálené fragmenty kódu – konkrétní prog. jazyk, nejde o návrh konvence kódu – nejde o návrh algoritmy – řeší výpočet, ne návrh Christopher Alexander: ”Každý vzor popisuje často se vyskytující problém a poté popisuje jádro řešení tohoto problému tak, aby bylo možno toto řešení opakovaní využívat, bez toho, že bychom stejnou věc dělali dvakrát"., Obecné části: ƒ
ƒ
ƒ
ƒ
Jméno vzoru Popis problému Popis řešení Důsledky použití Kategorie návrhových vzorů ƒ
ƒ
ƒ
Vzory pro vytváření a manipulaci s reprezentací informace (např. AbstractFactory, Proxy) Vzory strukturální vyjadřující strukturu implementace (např. Adapter, Composite) Vzory pro chování (např. Iterátor) Struktura vzoru Proxy Příklad použití vzoru Proxy Diagramy komponent Popisují rozdělení výsledného systému na funkční celky (komponenty) a definují náplň jednotlivých komponent. Diagramy nasazení Popisují umístění funkčních celků na výpočetních uzlech informačního systému. 

Podobné dokumenty

Data - Základní škola Kovářov

Data - Základní škola Kovářov IS/ICT v běžném životě oba pojmy splývají. IS reprezentuje

Více

1.0 OS Unix Historie. Architektura. Zpracování

1.0 OS Unix Historie. Architektura. Zpracování Interaktivní přístup s možností vytváření dávek příkazů shell jako rozhraní uživatele a interpret řídícího jazyka Přesměrování a řetězení vstupu a výstupu příkazů vše je soubor (i periferie, nyní i...

Více

Programové, informační a výpočetní systémy (14) 1. VÝPOČETNÍ

Programové, informační a výpočetní systémy (14) 1. VÝPOČETNÍ 1) Posloupnost příkazů - všechny příkazy se provedou postupně 2) Větvení - příkaz se provede v závislosti na splnění/nesplnění podmínky 3) Cyklus - v závislosti na splnění podmínky se část programu...

Více

Architektura počítačů a operačních systémů

Architektura počítačů a operačních systémů • Štruktúra počítača sa nemení typom úlohy (tj. počítač je programovaný obsahem paměti). • Program se nejprve zavede do paměti, z ní se postupně popořadě vybírají instrukce (a následující krok závi...

Více

Metodika odboru ochrany vod, která stanovuje postup komplexního

Metodika odboru ochrany vod, která stanovuje postup komplexního ke zvýšení protipovodňové ochrany v povodí a dosažení dobrého stavu vod dle RSV.

Více

1. Charakteristika discipliny SW inženýrství a její vývoj 2

1. Charakteristika discipliny SW inženýrství a její vývoj 2 Diskrétnost – posloupnost nespojitých, oddělených a předem definovaných operací Rezultativnost – po konečném počtu kroků dospěje k výsledku • Determinovanost – vždy je jednoznačně určena operace, k...

Více

Průvodce zabezpečením pro firmy

Průvodce zabezpečením pro firmy k návštěvě infikovaného webu s tvrzením, že se vyskytl problém s vaším účtem nebo že jste se zaregistrovali v nějaké službě. Jakmile takový web navštívíte, můžete být požádáni o zadání osobních úda...

Více