Uˇcebn´ı texty k st´atn´ı bakal´aˇrsk´e zkouˇsce Obecn´a informatika 4. z´aˇr´ı 2011
1
V´ aˇzen´y ˇstudent/ˇcitatel’, toto je zbierka vypracovan´ ych ot´ azok pre bakal´ arske sk´ uˇsky Informatikov. Ot´azky boli vypracovan´e ˇstudentmi MFF poˇcas pr´ıpravy na tieto sk´ uˇsky, a teda zatial’ neboli overen´e kvalifikovan´ ymi osobami (profesormi/dokotorandmi mff atd’.) - preto nie je ˇziadna z´ aruka ich spr´ avnosti alebo u ´plnosti. V¨ aˇcˇsina textov je vypracovan´ a v ˇcestine resp. slovenˇcine, pros´ıme dodrˇzujte t´ uto konvenciu (a obmedzujte teda pouˇz´ıvanie napr. anglick´ ych textov). Ak n´ ajdete nejak´ u chybu, nepresnost’ alebo ne´ upln´ u inform´aciu - nev´ahajte kontaktovat’ administr´ atora alebo niektor´eho z prispievatel’ov, ktor´ y m´ a write-pr´ıstup k svn stromu, s opravou :-) Podobne - ak n´ajdete v texte“ veci ako ” ??? a TODO, znamen´ a to ˇze dan´ u inform´ aciu je potrebn´e skontrolovat’, resp. doplnit’... Texty je moˇzn´e d’alej pouˇz´ıvat’ a ˇs´ırit’ pod licenciou GNU GFDL (ˇco pre vˇsetk´ ych prispievaj´ ucich znamen´a, ˇze musia s´ uhlasit’ so zverejnen´ım svojich u ´prav podl’a tejto licencie). Ver´ıme, ˇze V´ am tieto texty pomˆ oˇzu k u ´speˇsn´emu zloˇzeniu sk´ uˇsok.
Hlavn´ı writeˇ ri :-) : • • • • • • •
ajs andree – http://andree.matfyz.cz/ Hydrant joshis / Petr Dvoˇr´ ak kostej nohis tuetschek – http://tuetschek.wz.cz/
´ Uvodn´ e verzie niektor´ ych textov vznikli prepisom ot´azok vypracovan´ ych p´ısomne na papier“, alebo inak ne-TEX-ovsky. ” Autormi t´ ychto pˆ ovodn´ ych verzi´ı s´ u najm¨ a nasleduj´ uce osoby: gASK, Grafi, Kate (mat-15), Nytram, Oscar, Stando, xStyler. ˇ ’ je prebrat´ Cast a aj z pˆ ovodn´ ych s´ uborkov´ ych textov... Vˇsetk´ ym patr´ı naˇsa/vaˇsa vd’aka. ˇ cil a el enfant. V roce 2011 nˇekter´e ot´ azky updatovali a rozˇs´ıˇrili: Karel B´ılek (http://karelbilek.com), Petr Ceˇ
2
Obsah 1 Logika 1.1 Jazyk, formule, s´emantika, tautologie . . . . . . . . . . . . . . . . . . . . . . . 1.2 Rozhodnutelnost, splnitelnost, pravdivost a dokazatelnost . . . . . . . . . . . 1.3 Vˇety o kompaktnosti a u ´plnosti v´ yrokov´e a predik´atov´e logiky . . . . . . . . . 1.4 Norm´ aln´ı tvary v´ yrokov´ ych formul´ı, prenexn´ı tvary formul´ı predik´atov´e logiky
. . . .
4 4 6 10 12
2 Automaty a jazyky 2.1 Automaty – Chomsk´eho hierarchie, tˇr´ıdy automat˚ u a gramatik, determinismus a nedeterminismus. . . . . . . . . 2.1.1 Uz´ avˇerov´e vlastnosti tˇr´ıd jazyk˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13 13 18
3 Algoritmy a datov´ e struktury ˇ 3.1 Casov´ a sloˇzitost algoritm˚ u, sloˇzitost v nejhorˇs´ım a pr˚ umˇern´em pˇr´ıpadˇe . . . 3.2 Tˇr´ıdy sloˇzitosti P a NP, pˇrevoditelnost, NP-´ uplnost . . . . . . . . . . . . . . 3.3 Metoda rozdˇel a panuj – aplikace a anal´ yza sloˇzitosti . . . . . . . . . . . . . 3.3.1 N´ asoben´ı dlouh´ ych ˇc´ısel v lepˇs´ım neˇz kvadratick´em ˇcase. . . . . . . . 3.3.2 N´ asoben´ı matic n×n a Strassen˚ uv algoritmus . . . . . . . . . . . . . 3.3.3 Hled´ an´ı k-t´eho nejmenˇs´ıho prvku (medi´anu) v lin. ˇcase (Blum et al.) 3.3.4 MergeSort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Bin´ arn´ı vyhled´ avac´ı stromy, vyvaˇzov´ an´ı, haldy . . . . . . . . . . . . . . . . 3.5 Haˇsov´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6 Sekvenˇcn´ı tˇr´ıdˇen´ı, porovn´ avac´ı algoritmy, pˇrihr´adkov´e tˇr´ıdˇen´ı, tˇr´ıd´ıc´ı s´ıtˇe . . 3.7 Grafov´e algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8 Tranzitivn´ı uz´ avˇer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9 Algoritmy vyhled´ av´ an´ı v textu . . . . . . . . . . . . . . . . . . . . . . . . . 3.10 Algebraick´e algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11 Z´ aklady kryptografie, RSA, DES . . . . . . . . . . . . . . . . . . . . . . . . 3.12 Pravdˇepodobostn´ı algoritmy – testov´ an´ı prvoˇc´ıselnosti . . . . . . . . . . . . 3.13 Aproximaˇcn´ı algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Datab´ aze 4.1 Podstata a architektury DB system˚ u . . . . . . . . . . . . . . . . 4.2 Konceptualn´ı, logick´ a a fyzick´ au ´roveˇ n pohledu na data . . . . . 4.3 Relaˇcn´ı datov´ y model, relaˇcn´ı algebra . . . . . . . . . . . . . . . 4.4 Algoritmy n´ avrhu sch´emat relac´ı . . . . . . . . . . . . . . . . . . 4.5 Z´ aklady SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Transakˇcn´ı zpracov´ an´ı, vlastnosti transakc´ı, uzamykac´ı protokoly, 4.7 Technologie XML, XML Schema . . . . . . . . . . . . . . . . . . 4.8 Organizace dat na vnˇejˇs´ı pamˇeti, B-stromy a jejich varianty . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
18 19 20 23 24 24 25 26 27 31 35 39 45 46 48 50 53 55
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . zablokov´an´ı . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
56 56 59 61 64 66 69 72 73
5 Architektury poˇ c´ıtaˇ c˚ u a s´ıt´ı 5.1 Architektury poˇc´ıtaˇce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Procesory, multiprocesory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Vstupn´ı a v´ ystupn´ı zaˇr´ızen´ı, ukl´ ad´ an´ı a pˇrenos dat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Architektury OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5 Procesy, vl´ akna, pl´ anov´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6 Synchronizaˇcn´ı primitiva, vz´ ajemn´e vylouˇcen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.7 Zablokov´ an´ı a zotaven´ı z nˇej . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.8 Organizace pamˇeti, alokaˇcn´ı algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9 Principy virtu´ aln´ı pamˇeti, str´ ankov´ an´ı, algoritmy pro v´ ymˇenu str´anek, v´ ypadek str´anky, str´ankovac´ı tabulky, segmentace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.10 Syst´emy soubor˚ u, adres´ aˇrov´e struktury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.11 Bezpeˇcnost, autentizace, autorizace, pˇr´ıstupov´a pr´ava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.12 Architektury OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.13 Rodina protokol˚ u TCP/IP (ARP, IPv4, IPv6, ICMP, UDP, TCP) – adresace, routing, fragmentace, spolehlivost, flow control, congestion control, NAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.14 Spojovan´e a nespojovan´e sluˇzby, spolehlivost, zabezpeˇcen´ı protokolu . . . . . . . . . . . . . . . . . . . . . . . . .
76 77 82 85 89 90 92 96 97 98 102 106 108 109 115
6 Programovac´ı jazyky 117 6.1 Principy implementace procedur´ aln´ıch a objektov´e orientovan´ ych programovac´ıch jazyk˚ u, oddˇelen´ y pˇreklad, sestaven´ı117 6.2 Objektovˇe orientovan´e programov´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.3 Neprocedur´ aln´ı programov´ an´ı, logick´e programov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6.4 Generick´e programov´ an´ı – ˇsablony a generika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
3
1
Logika
Poˇ zadavky • • • •
1.1
Jazyk, formule, s´emantika, tautologie. Rozhodnutelnost, splnitelnost, pravdivost, dokazatelnost. Vˇety o kompaktnosti a u ´plnosti v´ yrokov´e a predik´atov´e logiky. Norm´ aln´ı tvary v´ yrokov´ ych formul´ı, prenexn´ı tvary formul´ı predik´atov´e logiky.
Jazyk, formule, s´ emantika, tautologie
logika prvn´ıho ˇ r´ adu V logice pracujeme s formulemi a termy, coˇz jsou slova (ˇretˇezce znak˚ u dan´e abecedy) form´aln´ıho jazyka. Jazyk prvn´ıho ˇr´ adu m˚ uˇze zahrnovat: • • • • • •
neomezenˇe mnoho symbol˚ u pro promˇenn´e x1 , x2 , . . . symboly pro logick´e spojky (¬, ∨, &, →, ↔) symboly pro kvantifik´ atory (∀ obecn´ y, ∃ existenˇcn´ı) funkˇcn´ı symboly f1 , f2 . . . s aritou n ≥ 0 (napˇr. +, −, 1, ∗) predik´ atov´e symboly p1 , p2 . . . s aritou n ≥ 1 (napˇr. ≥, =, ≈, ∈, ⊂) m˚ uˇze (ale nemus´ı) obsahovat bin´ arn´ı predik´ at =“, kter´ y pak se pak ale mus´ı chovat jako rovnost, tj. splˇ novat urˇcit´e ” axiomy.
Promˇenn´e, logick´e spojky, kvantifik´ atory a =“ jsou logick´e symboly, ostatn´ı symboly se naz´ yvaj´ı speci´ aln´ı, jelikoˇz urˇcuj´ı ” specifika jazyka a t´ım vymezuj´ı oblast, kterou jazyk popisuje. V´ yrokov´a a predik´atov´a logika se ˇrad´ı mezi logiky prvn´ıho ˇr´ adu. Ty pracuj´ı jen s jazyky prvn´ıho ˇr´ adu, kter´e maj´ı pouze jeden typ promˇenn´ ych (pro prvky zvan´e individua). Jazyky vyˇsˇs´ıch ˇr´ ad˚ u maj´ı kromˇe promˇenn´ ych pro individua tak´e dalˇs´ı typy promˇenn´ ych (pro pˇrirozen´a ˇc´ısla, funkce, relace, mnoˇziny a dalˇs´ı typy objekt˚ u). Kaˇzd´ y form´ aln´ı syst´em logiky prvn´ıho ˇr´ adu obsahuje: • jazyk • axiomy • odvozovac´ı pravidla (pomoc´ı nichˇz tvoˇr´ıme d˚ ukazy a odvozujeme vˇety). Ze symbol˚ u jazyka tvoˇr´ıme dva druhy slov: • termy popisuj´ı individua (objekty) vznikl´e z uveden´ ych operac´ı • formule vyjadˇruj´ı tvrzen´ı o objektech. Definice (jazyk v´yrokov´e logiky) Jazyk LP v´ yrokov´e logiky nad mnoˇzinou P obsahuje prvky mnoˇziny P zvan´e prvotn´ı formule nebo v´yrokov´e promˇenn´e (typicky jde o slova nˇejak´eho form´ aln´ıho jazyka napˇr. x, y, ABC, nula), symboly pro logick´e spojky (¬, ∨, &, →, ↔) a pomocn´e symboly (z´ avorky). Definice (jazyk predik´ atov´e logiky) Jazyk predik´ atov´e logiky obsahuje symboly pro promˇenn´e, predik´ atov´e a funkˇcn´ı symboly, symboly pro logick´e spojky, symboly pro kvantifik´ atory a pomocn´e symboly (z´ avorky). Definice (redukce jazyka) Pro zmenˇsen´ı mnoˇziny axiom˚ u je vhodn´e redukovat poˇcet logick´ ych spojek, se kter´ ymi pracujeme, na nˇekolik z´ akladn´ıch a ostatn´ı vn´ımat jako odvozen´e. Je moˇzno zvolit negaci a implikaci jako spojky z´akladn´ı a v predik´atov´e logice obecn´ y kvantifik´ ator. Zkratky pak vypadaj´ı jako (A&B) za formuli ¬(A → ¬B), (A ∨ B) odpov´ıd´a (¬A → B) a nakonec (A ↔ B) redukujeme na ((A → B)&(B → A)). Definice (formule v´yrokov´e logiky) Pro jazyk v´ yrokov´e logiky jsou n´ asleduj´ıc´ı v´ yrazy formule: 1. kaˇzd´ a v´ yrokov´ a promˇenn´ ap∈P 2. pro formule A, B i v´ yrazy ¬A, (A ∨ B), (A&B), (A → B), A ↔ B 3. kaˇzd´ y v´ yraz vzniknuvˇs´ı koneˇcn´ ym uˇzit´ım pravidel 1. a 2. Tedy vˇsechny formule jsou koneˇcn´ a slova.
4
Definice (term – v predik´ atov´e logice) V predik´ atov´e logice je term: 1. kaˇzd´ a promˇenn´ a 2. v´ yraz f (t1 , . . . , tn ) pro n-´ arn´ı funkˇcn´ı symbol f a termy t1 , . . . , tn 3. kaˇzd´ y v´ yraz vzniknuvˇs´ı koneˇcn´ ym uˇzit´ım pravidel 1. a 2. Podslovo termu, kter´e je samo o sobˇe term, se naz´ yv´a podterm. Definice (formule predik´ atov´e logiky) V predik´ atov´e logice je formule kaˇzd´ y v´ yraz tvaru p(t1 , . . . , tn ) pro p predik´atov´ y symbol a t1 , . . . , tn termy. Stejnˇe jako ve v´ yrokov´e logice je formule i (koneˇcn´e) spojen´ı jednoduˇsˇs´ıch formul´ı log. spojkami. Formule jsou nav´ıc i v´ yrazy (∃x)A a (∀x)A pro formuli A a samozˇrejmˇe cokoliv, co vznikne koneˇcn´ ym uˇzit´ım tˇechto pravidel. Podslovo formule, kter´e je samo o sobˇe formule, se naz´ yv´ a podformule. Definice (voln´e a v´ azan´e promˇenn´e, otevˇren´e, uzavˇren´e formule, sentence) V´ yskyt promˇenn´e x ve formuli je v´ azan´y, je-li tato souˇc´ast´ı nˇejak´e podformule tvaru (∃x)A nebo (∀x)A. V opaˇcn´em pˇr´ıpadˇe je voln´y. Formule je otevˇren´ a, pokud neobsahuje v´ azanou promˇennou, je uzavˇren´ a (nebo tak´e sentence), kdyˇz neobsahuje volnou promˇennou. Promˇenn´ a m˚ uˇze b´ yt v t´eˇze formuli voln´a i v´azan´a (napˇr. (x = z) → (∃x)(x = z)). Definice (pravdivostn´ı ohodnocen´ı – ve v´yrokov´e logice) S´emantika zkoum´ a pravdivost formul´ı. V´ yrokov´e promˇenn´e samotn´e neanalyzujeme – jejich hodnoty m´ame d´any uˇz z vnˇejˇsku, m´ ame pro nˇe mnoˇzinu pravdivostn´ıch hodnot ({0, 1}). Pravdivostn´ı ohodnocen´ı e : P → {0, 1} je zobrazen´ı, kter´e kaˇzd´e v´ yrokov´e promˇenn´e pˇriˇrad´ı pr´avˇe jednu hodnotu z mnoˇziny pravdivostn´ıch hodnot. Je-li zn´ amo ohodnocen´ı promˇenn´ ych, lze urˇcit pravdivostn´ı hodnotu v pro kaˇzdou formuli (pˇri dan´em ohodnocen´ı) – indukc´ı podle jej´ı sloˇzitosti, podle tabulek pro logick´e spojky. Definice (realizace jazyka, term˚ u a ohodnocen´ı promˇenn´ych – v predik´ atov´e logice) Realizace jazyka nebo t´eˇz interpretace jazyka je definov´ana mnoˇzinovou strukturou M, kter´a ke kaˇzd´emu symbolu jazyka a mnoˇzinˇe promˇenn´ ych pˇriˇrad´ı nˇejakou mnoˇzinu individu´ı. Popisuje hodnoty“ vˇsech funkˇcn´ıch a predik´atov´ ych symbol˚ u. M ” obsahuje: • nepr´ azdnou mnoˇzinu individu´ı M . • zobrazen´ı fM : M n → M pro kaˇzd´ y n-´ arn´ı funkˇcn´ı symbol f • relaci pM ⊂ M n pro kaˇzd´ y n-´ arn´ı predik´ at p Realizace term˚ u se uvaˇzuje pro dan´ y jazyk L a jeho realizaci M. Ohodnocen´ı promˇenn´ych je zobrazen´ı e : X → M (kde X je mnoˇzina promˇenn´ ych). Realizace termu t pˇri ohodnocen´ı e (znaˇc´ıme t[e]) se definuje n´asledovnˇe: • t[e] = e(x) je-li t promˇenn´ ax • t[e] = fM (t1 [e], . . . , tn [e]) pro term t tvaru f (t1 , . . . , tn ). Ohodnocen´ı z´ avis´ı na zvolen´em M, realizace term˚ u pˇri dan´em ohodnocen´ı pak jen na koneˇcnˇe mnoha hodnot´ach z nˇej. Pokud jsou x1 , . . . , xn vˇsechny promˇenn´e termu t a e, e0 dvˇe ohodnocen´ı tak, ˇze ∀i ∈ {1, . . . , n} plat´ı e(xi ) = e0 (xi ), pak t[e] = t[e0 ]. Definice (pozmˇenˇen´e ohodnocen´ı – v predik´ atov´e logice) Pozmˇenˇen´e ohodnocen´ı e(x/m) je ohodnocen´ı, ve kter´em jsme zmˇenili hodnotu jedn´e promˇenn´e. Form´alnˇe pro ohodnocen´ı e, promˇennou x a individuum m ∈ M je definov´ ano: ( m (je-li y promˇenn´a x, y ≡ x) e(x/m)(y) = e(y) (jinak, )
Definice (tautologie |= – ve v´yrokov´e logice) Formule je tautologie, jestliˇze je pravdiv´ a pˇri libovoln´em ohodnocen´ı promˇenn´ ych (|= A). Definice (teorie) Mnoˇzinˇe formul´ı ˇr´ık´ ame teorie. Definice (pravdiv´ a formule – ve v´yrokov´e logice) Formule v´ yrokov´e logiky A je pravdiv´ a pˇri ohodnocen´ı e, je-li e¯(A) = 1 (kde e¯ je definov´ano z ohodnocen´ı prvotn´ıch formul´ı e induktivnˇe podle tabulek pro logick´e spojky). V opaˇcn´em pˇr´ıpadˇe je formule nepravdiv´ a. Definice (model, tautologick´y d˚ usledek T |= – ve v´yrokov´e logice) Model nˇejak´e teorie ve v´ yrokov´e logice je takov´e ohodnocen´ı promˇenn´ ych, ˇze kaˇzd´a formule z t´eto teorie je pravdiv´ a. Teorie U je tautologick´y d˚ usledek teorie T , jestliˇze kaˇzd´ y model T je tak´e modelem U (T |= U ).
5
1.2
Rozhodnutelnost, splnitelnost, pravdivost a dokazatelnost
Z tˇechto t´emat se rozhodnutelnosti budeme vˇenovat aˇz jako posledn´ı, protoˇze k vysloven´ı nˇekter´ ych vˇet budeme potˇrebovat pojmy definovan´e v ˇc´ astech o splnitelnosti, pravdivosti a dokazatelnosti. Definice (form´ aln´ı syst´em v´yrokov´e logiky) Pracujeme s redukovan´ ym jazykem (jen s log. spojkami ¬, →). Form´aln´ı syst´em v´ yrokob´e logiky obsahuje: 1. jazyk LP v´ yrokov´e logiky nad mnoˇzinou prvotn´ıch formul´ı P , 2. sch´emata axiom˚ u v´yrokov´e logiky, ze kter´ ych pro libovoln´e formule A, B, C jazyka LP vznikaj´ı axiomy tvaru (a) A → (B → A) (b) (A → (B → C)) → [(A → B) → (A → C)] (c) (¬B → ¬A) → (A → B)
(A1 - implikace sebe sama“), ” (A2 - rozn´ asoben´ı“), ” (A3 - obr´acen´a negace implikace“), ”
3. odvozovac´ı pravidlo (modus ponens) – z formul´ı A a A → B odvod’ formuli B. Definice (substituce, instance, substituovatelnost – v predik´ atov´e logice) Substituce term˚ u za promˇenn´e (tx1 ,...,xn [t1 , . . . , tn ]) je souˇcasn´e nahrazen´ı vˇsech v´ yskyt˚ u promˇenn´ ych xi termy ti (pro x1 , . . . , xn r˚ uzn´e promˇenn´e a t, t1 , . . . , tn termy). Jedn´ a se opˇet o term. Instance formule je souˇcasn´e nahrazen´ı vˇsech voln´ ych v´ yskyt˚ u nˇejak´ ych promˇenn´ ych za termy. Je to taky formule, vyjadˇruje speci´ alnˇejˇs´ı tvrzen´ı – ne vˇzdy ale lze prov´est substituci bez zmˇeny v´ yznamu formule. Term t je substituovateln´y za promˇennou x do formule A, pokud ˇz´ adn´ y voln´ y v´ yskyt promˇenn´e x ve formuli A neleˇz´ı v oboru platnosti nˇekter´eho z kvantifik´ ator˚ u (∀y nebo ∃y), kde y je promˇenn´ a obsaˇzen´ a v termu t. (Neboli pokud pro kaˇzdou promˇennou y obsaˇzenou v t ˇz´adn´ a podformule formule A tvaru (∃y)B ani (∀y)B neobsahuje voln´ y v´ yskyt x.)
Pozn´ amka Promˇenn´e v termu t se substituc´ı nesm´ı st´ at v´ azan´ ymi. Je-li A otevˇren´a formule, pak je kaˇzd´ y term substituovateln´ y za kaˇzdou promˇennou vyskytuj´ıc´ı se v A. Stejnˇe pokud ˇz´adn´a promˇenn´a obsaˇzen´a v termu t nen´ı v A v´azan´a. To jsou ale jen jednoduch´e pˇr´ıklady susbtituovatelnosti (napˇr. pro promˇennou z je term tvaru z substituovateln´ y za promˇennou x do formule x = 0 → ¬ (∃z) (z 6= 0), i kdyˇz pro nˇej ani jedna z tˇechto podm´ınek neplat´ı). Definice (form´ aln´ı syst´em predik´ atov´e logiky) Pracujeme s redukovan´ ym jazykem (jen s log. spojkami ¬, → a jen s kvantifik´atorem ∀). Sch´emata axiom˚ u predik´ atov´e logiky vzniknou z tˇech ve v´ yrokov´e logice prost´ ym dosazen´ım libovoln´ ych formul´ı predik´atov´e logiky za v´ yrokov´e promˇenn´e. Modus ponens plat´ı i v pred. logice. PL obsahuje nav´ıc dalˇs´ı dva axiomy a odvozovac´ı pravidlo: • sch´ema specifikace: (∀x)A → Ax [t] • sch´ema pˇreskoku: (∀x)(A → B) → (A → (∀x)B), pokud promˇenn´a x nem´a voln´ y v´ yskyt v A. A • pravidlo generalizace: (∀x)A Toto je form´ aln´ı syst´em pred. logiky bez rovnosti. S rovnost´ı pˇrib´ yv´a symbol = a dalˇs´ı tˇri axiomy. Vˇ eta (o kvantifik´ atorech) • (pravidlo zaveden´ı ∀) Je-li ` A → B a promˇenn´ a x nem´a v A voln´ y v´ yskyt, pak ` A → (∀x)B. • (pravidlo zaveden´ı ∃) Je-li ` A → B a promˇenn´ a x nem´a v B voln´ y v´ yskyt, pak ` (∃x)A → B. • (distribuce kvantifik´ ator˚ u) Pokud ` A → B, pak ` (QxA) → (QxB) pro Q obecn´ y nebo existenˇcn´ı kvantifik´ ator. Definice (splnitelnost – ve v´yrokov´e logice) Formule A ve v´ yrokov´e logice je splniteln´ a, jestliˇze existuje ohodnocen´ı e takov´e, ˇze A je pravdiv´a pˇri e. Mnoˇzina formul´ı T je splniteln´ a, pokud existuje ohodnocen´ı e takov´e, ˇze kaˇzd´a formule A ∈ T je pravdiv´a pˇri e. Potom e naz´ yv´ame modelem teorie T (znaˇc´ıme e |= T ). Definice (d˚ ukaz ` – ve v´yrokov´e logice) D˚ ukaz A je koneˇcn´ a posloupnost formul´ı A1 , . . . An , jestliˇze An = A a pro kaˇzd´e i = 1, ..n je Ai bud’ axiom, nebo je odvozen´ a z pˇredchoz´ıch pravidlem modus ponens (v predik´ atov´e logice nav´ıc moˇznost pouˇzit´ı pravidla generalizace). Existuje-li d˚ ukaz formule A, pak je tato dokazateln´ a ve v´ yrokov´e logice (je vˇetou v´ yrokov´e logiky, znaˇc´ıme ` A). Definice (d˚ ukaz z pˇredpoklad˚ u T `) D˚ ukaz formule A z pˇredpoklad˚ u je posloupnost formul´ı A1 , . . . An takov´a, ˇze An = A a ∀i ∈ {1, ..n} je Ai axiom, nebo prvek mnoˇziny pˇredpoklad˚ u T , nebo je odvozena z pˇrechoz´ıch pravidlem modus ponens. Existuje-li d˚ ukaz A z T , pak A je dokazateln´ a z T , znaˇc´ıme T ` A.
6
Vˇ eta (o dedukci – ve v´yrokov´e logice) Pro T mnoˇzinu formul´ı a formule A, B plat´ı T ` A → B pr´avˇe kdyˇz T, A ` B. Idea d˚ ukazu → M´ ame d˚ ukaz formule A → B, k nˇemu m˚ uˇzeme z pˇredpokladu pˇripojit A a pomoc´ı MP odvodit B. ← A1 , . . . , An = B je d˚ ukaz formule B z pˇredpoklad˚ u T, A. Indukc´ı dok´aˇzeme, ˇze T ` A → Ai , tedy pro i = n jsme hotovi. Vˇ eta (o dedukci – v predik´ atov´e logice) Necht’ T je mnoˇzina formul´ı pred. logiky, A je uzavˇren´a formule a B lib. formule, potom T ` A → B pr´avˇe kdyˇz T, A ` B. Idea d˚ ukazu Podobnˇe jako ve VL, pouze v indukˇcn´ım kroku mohlo b´ yt pouˇzito pravidlo generalizace, proto poˇzadujeme, aby A byla uzavˇren´ a. D˚ usledek Pro libovolnou mnoˇzinu formul´ı T a formule A, B, C plat´ı: T ` A → (B → C) pr´ avˇe kdyˇz T, A, B ` C pr´avˇe kdyˇz T ` B → (A → C) , T ` (A → (B → C)) → (B → (A → C)) , ` (A → B) → [(B → C) → (A → C)] . Posledn´ımu vztahu ˇr´ık´ ame vˇeta o skl´ ad´ an´ı implikac´ı, v´ yˇse je uk´az´ano, ˇze v implikaci nez´aleˇz´ı na poˇrad´ı pˇredpoklad˚ u. Vˇ eta (o neutr´ aln´ı formuli – ve v´yrokov´e logice) Necht’ T je mnoˇzina v´ yrokov´ ych formul´ı, necht’ A, B jsou formule. Jestliˇze T, A ` B a T, ¬A ` B, pak T ` B. Definice (uz´ avˇer formule – v predik´ atov´e logice) Jsou-li x1 , . . . , xn vˇsechny promˇenn´e s voln´ ym v´ yskytem ve formuli A, potom (∀x1 ) . . . (∀xn )A je uz´ avˇer formule A. Vˇ eta (vˇeta o instanc´ıch – v predik´ atov´e logice) Je-li A0 instance formule A, pak jestliˇze plat´ı ` A, plat´ı i ` A0 . Vˇ eta (vˇeta o uz´ avˇeru – v predik´ atov´e logice) Je-li A0 uz´ avˇer formule A, pak ` A plat´ı pr´ avˇe kdyˇz ` A0 . Definice (Tarsk´eho definice pravdy – v predik´ atov´e logice) Pro dan´ y (redukovan´ y, tj. jen se z´ akladn´ımi“ log. spojkami) jazyk predik´atov´e logiky L, M jeho interpretaci, ohodnocen´ı e a ” formuli A tohoto jazyka plat´ı: 1. A je pravdiv´ a v M pˇri ohodnocen´ı e nebo platn´ a v M pˇri ohodnocen´ı e (znaˇc´ıme M |= A[e]), kdyˇz: • • • • • •
A A A A A A
je je je je je je
atomick´ a tvaru p(t1 , . . . , tn ), kde p nen´ı rovnost a (t1 [e], . . . , tn [e]) ∈ pM . atomick´ a tvaru t1 = t2 a t1 [e] = t2 [e] tvaru ¬B a M 6|= B[e] tvaru B → C a M 6|= B[e] nebo M |= C[e] tvaru (∀x)B a M |= B[e(x/m)] pro kaˇzd´e m ∈ M tvaru (∃x)B a M |= B[e(x/m)] pro nˇejak´e m ∈ M
2. A je pravdiv´ a v interpretaci M nebo platn´ a v interpretaci M (M |= A), jestliˇze je A pravdiv´a v M pˇri kaˇzd´em ohodnocen´ı promˇenn´ ych (pro uzavˇren´e formule staˇc´ı jedno ohodnocen´ı, splnˇen´ı je vˇzdy stejn´e) Definice (logicky pravdiv´ a/platn´ a formule – v predik´ atov´e logice) Formule A je validn´ı (logicky pravdiv´ a/platn´ a) (znaˇc´ıme |= A), kdyˇz je platn´a pˇri kaˇzd´e interpretaci dan´eho jazyka. Definice (spornost, bezespornost) Mnoˇzina formul´ı T je sporn´ a, pokud je z pˇredpoklad˚ u T dokazateln´a libovoln´a formule, jinak je T bezesporn´ a. T je maxim´ aln´ı bezesporn´ a mnoˇzina, pokud je T bezesporn´ a a nav´ıc jedin´a jej´ı bezesporn´a nadmnoˇzina je T samo. Mnoˇzina vˇsech formul´ı dokazateln´ ych z T se znaˇc´ı Con(T ). Vˇ eta (o bezespornosti a splnitelnosti – ve v´yrokov´e logice) Mnoˇzina formul´ı v´ yrokov´e logiky je bezesporn´ a, pr´ avˇe kdyˇz je splniteln´a. Definice (teorie, model – obecnˇe) Pro nˇejak´ y jazyk L prvn´ıho ˇr´ adu je mnoˇzina T formul´ı tohoto jazyka teorie prvn´ıho ˇr´ adu. Formule z T jsou speci´ aln´ı axiomy teorie T . Pro interpretaci M jazyka L je M model teorie T (znaˇc´ıme M |= T ), pokud jsou vˇsechny speci´aln´ı axiomy T pravdiv´e v M. Formule A je s´emantick´ym d˚ usledkem T (znaˇc´ıme T |= A), jestliˇze je pravdiv´a v kaˇzd´em modelu teorie T .
7
Rozhodnutelnost Definice (rekurzivn´ı funkce a mnoˇzina) Rekurzivn´ı funkce jsou vˇsechny funkce popsateln´e jako f : Nk → N, kde k ≥ 1, tedy vˇsechny algoritmicky vyˇc´ısliteln´e“ ” funkce. Mnoˇzina pˇrirozen´ ych ˇc´ısel je rekurzivn´ı mnoˇzina (rozhodnuteln´ a mnoˇzina), pokud je rekurzivn´ı jej´ı charakteristick´ a funkce (funkce urˇcuj´ıc´ı, kter´e prvky do mnoˇziny patˇr´ı). Definice (spoˇcetn´y jazyk, k´ od formule) Spoˇcetn´y jazyk je jazyk, kter´ y m´ a nejv´ yˇs spoˇcetnˇe mnoho speci´aln´ıch symbol˚ u. Pro spoˇcetn´ y jazyk, kde lze efektivnˇe (rekurzivn´ı funkc´ı) oˇc´ıslovat jeho speci´ aln´ı symboly, lze kaˇzd´e jeho formuli A pˇriˇradit jej´ı k´ od formule - pˇrir. ˇc´ıslo #A. Definice (mnoˇzina k´ od˚ u vˇet teorie) Pro T teorii s jazykem aritmetiky definujeme mnoˇzinu k´ od˚ u vˇet teorie T jako T hm(T ) = {#A|A je uzavˇren´a formule a T ` A}. Definice (rozhodnuteln´ a teorie) Teorie T s jazykem aritmetiky je rozhodnuteln´ a, pokud je mnoˇzina T hm(T ) rekurzivn´ı. V opaˇcn´em pˇr´ıpadˇe je T nerozhodnuteln´ a. Vˇ eta (Churchova o nerozhodnutelnosti predik´ atov´e logiky) Pokud spoˇcetn´ y jazyk L prvn´ıho ˇr´ adu obsahuje alespoˇ n jednu konstantu, alespoˇ n jeden funkˇcn´ı symbol arity k > 0 a pro kaˇzd´e pˇrirozen´e ˇc´ıslo spoˇcetnˇe mnoho predik´ atov´ ych symbol˚ u, potom mnoˇzina {#A|A je uzavˇren´a formule a L |= A} nen´ı rozhodnuteln´ a. Vˇ eta (o nerozhodnosti predik´ atov´e logiky) Necht’ L je jazyk prvn´ıho ˇr´ adu bez rovnosti a obsahuje alespoˇ n 2 bin´arn´ı predik´aty. Potom je predik´atov´a logika (jako teorie) s jazykem L nerozhodnuteln´ a. Definice (Tˇri popisy aritmetiky) Je d´ an jazyk L = {0, S, +, · ≤}. • Robinsonova aritmetika - ”Q”s jazykem L m´ a 8 n´asl. axiom˚ u: 1. 2. 3. 4. 5. 6. 7. 8.
S(x) 6= 0 S(x) = S(y) → x = y x 6= 0 → (∃y)(x = S(y)) x+0=x x + S(y) = S(x + y) x·0=0 x · S(y) = (x · y) + x x ≤ y ↔ (∃z)(z + x = y)
Pozn´ amka: Nˇekdy, pokud nen´ı potˇreba definovat uspoˇr´ ad´ an´ı, se posledn´ı axiom spolu se symbolem ≤“ vypouˇst´ı. ” • Peanova aritmetika - ”P ”m´ a vˇsechny axiomy Robinsonovy kromˇe tˇret´ıho, nav´ıc m´a Sch´ema(axiom˚ u) indukce - pro formuli A a promˇennou x plat´ı: Ax [0] → {(∀x)(A → Ax [S(x)]) → (∀x)A}. ´ a aritmetika m´ • Upln´ a za axiomy vˇsechny uzavˇren´e formule pravdiv´e v N, je-li N standardn´ı model aritmetiky - pravdiv´ a ” aritmetika“. Teorie modelu N je mnoˇzina T h(N) = {A|A je uzavˇren´a formule a N |= A}. Plat´ı: Q ⊆ P ⊆ T h(N). Q m´ a koneˇcnˇe mnoho axiom˚ u, je tedy rekurzivnˇe axiomatizovateln´a. P m´a spoˇcetnˇe mnoho axiom˚ u, k´ ody axiom˚ u sch´ematu indukce tvoˇr´ı rekurzivn´ı mnoˇzinu. T h(N) nen´ı rekurzivnˇe axiomatizovateln´a. Vˇ eta (Churchova o nerozhodnutelnosti aritmetiky) Kaˇzd´e bezesporn´e rozˇs´ıˇren´ı Robinsonovy aritmetiky Q je nerozhodnuteln´a teorie. Vˇ eta (G¨ odel-Rosserova o ne´ uplnosti aritmetiky) ˇ adn´e bezesporn´e a rekurzivnˇe axiomatizovateln´e rozˇs´ıˇren´ı Robinsonovy aritmetiky Q nen´ı u Z´ ´pln´a teorie. Report (Neˇcask´y) Predik´ atov´ a logika - popis jazyka, realizace, ohodnocen´ı, splnitelnost, Tarsk´eho definice pravdivosti. Report (Bedn´ arek) Tady se d´ a popsat hooodnˇe pap´ıru definicemi - napˇr´ıklad definice pravdivosti je v PL o nˇeco komplikovanˇejˇs´ı. To jsem taky uˇcinil a po projit´ı 5 list˚ u A4 (p´ıˇsu velk´ ym p´ısmem) mi bylo satisfakci Bedn´arkovo: ”no mysl´ım, ˇze to bylo celkem vyˇcerp´ avaj´ıc´ı”
8
Report (Kofroˇ n) Rozhodnutelnost, splnitelnost, pravdivost, dokazatelnost - to mˇe nepotˇeˇsilo, ale zplodil jsem co je v´ yrokov´a logika, ohodnocen´ı, vysvˇetlil ty pojmy v ot´ azce, uk´ azal CNF, DNF jak na nˇe upravit... zkouˇsej´ıc´ı byl nedoˇckav´ y, tak jsem nakonec nenapsal nic o PL, s t´ım, ˇze to kdyˇztak dop´ıˇsu pak (coˇz nechtˇel). Ptal se docela dost, hlavnˇe ot´azky kter´e jsem neˇcekal, tak pro dalˇs´ı generace tu m´ ame v´ ybˇer: Sloˇzitost zjiˇst’ov´ an´ı splnitelnosti pro CNF (3-SAT je NP, ale chtˇel vˇedˇet co tˇreba 2-SAT - to je polynomi´ aln´ı, chtˇel vˇedˇet jak by se to naprogramovalo), stejnˇe ho zaj´ımala sloˇzitost u zjiˇstˇen´ı tautologie... nakonec z toho byl docela pˇr´ıjemn´ y pokec. Report (Skopal) Pro Skopala na tuhle ot´ azku si pˇripravte nˇejak´ y pˇekn´ y pˇr´ıklad nedokazateln´e formule nebo nerozhodnuteln´eho probl´emu. Definiciu rozhodnutelnosti som vedel, ale nevedel som mu nic blizsie povedat a rekurzivne spocetnych mnozinach, vyzeral byt trosku nahnevany (lebo prave o tom chcel pocut a bol velmi prekvapeny ako je mozne, ze sme to nebrali) ale podarilo sa mi spravne argumentovat a vysvetlit, ze to je az Slozitost I a nie bc predmety, takze nakoniec v poho. (Ale mal som strach ako male decko.)
9
1.3
Vˇ ety o kompaktnosti a u ´ plnosti v´ yrokov´ e a predik´ atov´ e logiky
Definice (´ upln´ a teorie) Teorie T s jazykem L prvn´ıho ˇr´ adu je u ´pln´ a, je-li bezesporn´a a pro libovolnou uzavˇrenou formuli A je jedna z formul´ı A, ¬A dokazateln´ a v T. Vˇ eta (o korektnosti – ve v´yrokov´e logice) Pro teorii T a formuli A plat´ı T ` A ⇒ T |= A. (Kaˇzd´a v T dokazateln´a formule je v T pravdiv´a.) D˚ ukaz Indukc´ı na vˇet´ ach T . Kaˇzd´ y axiom je pravdiv´ y (ovˇeˇr´ıme pˇr´ımo) a pravidlo modus ponens tak´e zachov´av´a pravdivost. Vˇ eta (o bezespornosti a modelech – ve v´yrokov´e logice) M´ a-li teorie model, je bezesporn´ a. D˚ ukaz Formule A a ¬A nemohou b´ yt z´ aroveˇ n platn´e v ˇz´ adn´em modelu. Vˇ eta (o spoustˇe vˇec´ı – ve v´yrokov´e logice) Necht’ A, B jsou formule teorie T . Plat´ı n´ asleduj´ıc´ı tvrzen´ı. 1. (a) Teorie T je sporn´ a, pr´ avˇe kdyˇz je v n´ı dokazateln´ y spor. (b) (D˚ ukaz sporem.) T, ¬A je sporn´ a pr´ avˇe kdyˇz T ` A. 2. Bud’ T maxim´ aln´ı bezesporn´ a teorie. Pak plat´ı: (a) T ` A ⇔ A ∈ T ⇔ T, A je bezesporn´ a (b) A ∈ T ⇔ ¬A ∈ / T a d´ ale (A → B) ∈ T ⇔ (¬A ∈ T nebo B ∈ T ). (c) Ohodnocen´ı e takov´e, ˇze e(p) = 1 ⇔ p ∈ T pro kaˇzdou v´ yrokovou promˇennou p, je jedin´ y model T . 3. 4. 5. 6.
Bezesporn´ a teorie m´ a maxim´ aln´ı bezesporn´e rozˇs´ıˇren´ı (v t´emˇze jazyce). (O existenci modelu.) Teorie m´ a model, pr´ avˇe kdyˇz je bezesporn´a. (O kompaktnosti.) Teorie m´ a model (tedy je splniteln´a), pr´avˇe kdyˇz kaˇzd´a jej´ı koneˇcn´a podteorie m´a model (je splniteln´ a). (O u ´ plnosti.) T ` A ⇔ T |= A plat´ı pro kaˇzdou teorii T a jej´ı formuli A. D˚ usledkem je bezespornost v´ yrokov´e logiky a dokazateln´e v n´ı jsou pr´ avˇe tautologie.
D˚ ukaz 1. (a) Je-li A spor (` ¬A) a pˇritom T ` A, pak d´ıky vˇetˇe ` ¬A → (A → B) plat´ı jak´ ykoliv v´ yrok B. (b) ⇒ Je-li T, ¬A sporn´ a, pak T ` ¬A → A uˇzit´ım vˇety o dedukci. D´ıky vˇetˇe ` (¬A → A) → A pak plat´ı T ` A. ⇐ Opˇet d´ıky vˇet´ am o dedukci a ` ¬A → (A → B) lze dok´azat libovolnou formuli. 2. (a) z definic a maxim´ alnosti (b) ¬A ∈ / T ⇔ T, ¬A je sporn´ a ⇔ T ` A ⇔ A ∈ T dle 2a) a d˚ ukazu sporem. Tvrzen´ı o implikaci: Kdyˇz A → B ∈ T , tak z ¬A ∈ / T plyne A ∈ T . Pak T ` B a d´ıky 2a) je B ∈ T . Kdyˇz ¬A ∈ T , tak T ` A → B d´ıky vˇetˇe ` ¬C → (C → D), tedy A → B ∈ T d´ıky a). Podobnˇe kdyˇz B ∈ T , tak T, A ` B, tud´ıˇz T ` A → B. (c) Plat´ı A ∈ T ⇔ e(A) = 1, coˇz plyne indukc´ı dle sloˇzitosti A ihned uˇzit´ım b). Tedy e |= T . Koneˇcnˇe pro e0 |= T m´ ame e0 (p) = 1 ⇔ p ∈ T pro kaˇzdou v´ yrokovou promˇennou p, tedy e0 = e. 3. Plyne z principu maximality (ekvivalentn´ıho s axiomem v´ ybˇeru), aplikujeme-li jej na mnoˇzinu vˇsech bezesporn´ ych teori´ı S s S ⊇ T ,Sna n´ıˇz uvaˇzujeme uspoˇr´ ad´ an´ı inkluz´ı. Kaˇzd´ y ˇretˇezec R v popsan´em uspoˇr´ad´an´ı m´a majorantu, kterou je jeho sjednocen´ı R, nebot’ to je teorie rozˇsiˇruj´ıc´ı T , kter´a je bezesporn´a, protoˇze spor v n´ı je sporem v nˇejak´e teorii z R. 4. ⇐ M´ a-li T model e a T ` A, tak e(A) = 1, tedy e(¬A) = 0, tedy T 6` ¬A a T je bezesporn´a. ⇒ Necht’ je T bezesporn´ a. Dle 3) existuje maxim´aln´ı bezesporn´a teorie T 0 ⊇ T a dle 2c) existuje model teorie T 0 , coˇz je i model T . 5. Plyne z 4) z toho, ˇze teorie je bezesporn´ a, pr´ avˇe kdyˇz je bezesporn´a kaˇzd´a jej´ı koneˇcn´a podteorie. 6. ⇒ je vˇeta o korektnosti, v opaˇcn´em smˇeru pˇredpokl´ad´ame T |= A. Pak je T, ¬A sporn´a dle tvrzen´ı o existenci modelu 4), tedy T ` A dle d˚ ukazu sporem 1b).
Vˇ eta (o ekvivalenci – ve v´yrokov´e logice) Vznikne-li formule A0 z A nahrazen´ım nˇekter´eho v´ yskytu podformule B formul´ı B 0 , tak plat´ı: 1. ` B ↔ B 0 → A ↔ A0 , 2. T ` B ↔ B 0 ⇒ T ` A ↔ A0 .
10
Vˇ eta (o existenci modelu, u ´plnosti a kompaktnosti – v predik´ atov´e logice) 1. (O existenci modelu.) Kaˇzd´ a bezesporn´ a teorie m´a model kardinality nejv´ yˇse kL(T )k. 2. (O u ´ plnosti.) Formule teorie T je dokazateln´ a, pr´avˇe kdyˇz je pravdiv´a (T ` A ⇔ T |= A). 3. (O kompaktnosti.) Teorie m´ a model (je splniteln´a), pr´avˇe kdyˇz kaˇzd´a jej´ı koneˇcn´a ˇc´ast m´a model. (T |= A pr´ avˇe kdyˇz T 0 |= A pro nˇejakou koneˇcnou podteorii T 0 ⊆ T .) D˚ ukaz 2. Pro formuli A(x) uˇzit´ım pravidla generalizace, d˚ ukazu sporem a vˇety o existenci modelu m´ame: T 6` A ⇔ T 6` (∀x)A ⇔ T, (∃x)¬A je bezesporn´ a ⇔ T, (∃x)¬A m´ a model ⇔ T 6|= A. 3. Plyne z toho, ˇze teorie je sporn´ a, pr´ avˇe kdyˇz je nˇejak´a jej´ı koneˇcn´a ˇc´ast sporn´a.
Report (IOI 21. 6. 2011) Zformulujte vˇetu o existenci modelu a dokaˇzte pomoc´ı n´ı tvrzen´ı: je-li T nˇejak´a L-teorie a φ je L-sentence, tak T |= φ ⇒ T ` φ.
11
1.4
Norm´ aln´ı tvary v´ yrokov´ ych formul´ı, prenexn´ı tvary formul´ı predik´ atov´ e logiky
Pozn´ amka (vlastnosti log. spojek) Plat´ı: 1. 2. 3. 4. 5. 6. 7.
A ∧ B ` A; A, B ` A ∧ B A ↔ B ` A → B; A → B, B → A ` A ↔ B ∧ je idempotentn´ı, komutativn´ı a asociativn´ı. ` (A1 → . . . (An → B) . . . ) ↔ ((A1 ∧ · · · ∧ An ) → B) DeMorganovy z´ akony: ` ¬(A ∧ B) ↔ (¬A ∨ ¬B); ` ¬(A ∨ B) ↔ (¬A ∧ ¬B) ∨ je monotonn´ı (` A → A ∨ B), idempotentn´ı, komutativn´ı a asociativn´ı. ∨ a ∧ jsou navz´ ajem distributivn´ı.
Vˇ eta (o ekvivalenci ve v´yrokov´e logice) Jestliˇze jsou podformule A1 . . . An formule A ekvivalentn´ı s A01 . . . A0n (` A0i ↔ Ai ) a A0 vytvoˇr´ım nahrazen´ım A0i m´ısto Ai , je i A ekvivalentn´ı s A0 . (D˚ ukaz indukc´ı podle sloˇzitosti formule, rozborem pˇr´ıpad˚ u Ai tvaru ¬B, B → C) Lemma (o d˚ ukazu rozborem pˇr´ıpad˚ u) Je-li T mnoˇzina formul´ı a A, B, C formule, pak T, (A ∨ B) ` C plat´ı pr´avˇe kdyˇz T, A ` C a T, B ` C. Definice (norm´ aln´ı tvary DNF, CNF) V´ yrokovou promˇennou nebo jej´ı negaci nazveme liter´ al. Klauzule budiˇz disjunkce nˇekolika liter´al˚ u. Formule v norm´ aln´ım konjunktivn´ım tvaru (CNF) je konjunkce klauzul´ı. Formule v disjunktivn´ım tvaru (DNF) je disjunkce konjunkc´ı liter´ al˚ u. Pozn´ amka (hornovsk´e klauzule) Prolog pracuje s hornovsk´ymi klauzulemi, coˇz jsou klauzule, ve kter´ ych se vyskytuje nejv´ yˇse jeden pozitivn´ı (nenegovan´ y) liter´ al. Vˇ eta (o norm´ aln´ıch tvarech) Pro kaˇzdou formuli A lze sestrojit formule Ak , Ad v konjunktivn´ım, resp. disjunktivn´ım tvaru tak, ˇze ` A ↔ Ad , ` A ↔ Ak . (D˚ ukaz z DeMorganov´ ych formul´ı a distributivity, indukc´ı podle sloˇzitosti formule)
Prenexn´ı tvary formul´ı predik´ atov´ e logiky Vˇ eta (o ekvivalenci v predik´ atov´e logice) Necht’ formule A0 vznikne z A nahrazen´ım nˇekter´ ych v´ yskyt˚ u podformul´ı B1 , . . . , Bn po ˇradˇe formulemi B10 , . . . , Bn0 . Je-li 0 0 0 ` B1 ↔ B1 , . . . , ` Bn ↔ Bn , potom plat´ı i ` A ↔ A . Definice (prenexn´ı tvar) Formule predik´ atov´e logiky A je v prenexn´ım tvaru, je-li A ≡ (Q1 x1 )(Q2 x2 ) . . . (Qn xn )B, kde n ≥ 0 a ∀i ∈ {1, . . . , n} je Qi ≡ ∀ nebo ∃, B je otevˇren´a formule a kvantifikovan´e promˇenn´e jsou navz´ajem r˚ uzn´e. B je otevˇren´e j´ adro A, ˇc´ ast s kvantifik´ atory je prefix A. Definice (varianta formule predik´ atov´e logiky) Formule A0 je varianta A, jestliˇze vznikla z A postupn´ ym nahrazen´ım podformul´ı (Qx)B (kde Q je ∀ nebo ∃) formulemi (Qy)Bx [y] a y nen´ı voln´ a v B. Vˇ eta (vˇeta o variant´ ach – v predik´ atov´e logice) Je-li A0 varianta formule A, pak jestliˇze plat´ı ` A, plat´ı i ` A0 . Lemma (o prenexn´ıch operac´ıch) Pro pˇrevod formul´ı do prenexn´ıho tvaru se pouˇz´ıvaj´ı tyto operace (v´ ysledn´a formule je s p˚ uvodn´ı ekvivalentn´ı). Pro podformule B, C, kvantifik´ ator Q a promˇennou x: 1. 2. 3. 4. 5. 6.
podformuli lze nahradit nˇejakou jej´ı variantou ` ¬(Qx)B ↔ (Qx)¬B ` (B → (Qx)C) ↔ (Qx)(B → C), pokud x nen´ı voln´a ` ((Qx)B → C) ↔ (Qx)(B → C), pokud x nen´ı voln´a ` ((Qx)B ∧ C) ↔ (Qx)(B ∧ C), pokud x nen´ı voln´a v ` ((Qx)B ∨ C) ↔ (Qx)(B ∨ C), pokud x nen´ı voln´a v
vB vC C C
Vˇ eta (o prenexn´ıch tvarech) Ke kaˇzd´e formuli A predik´ atov´e logiky lze sestrojit ekvivalentn´ı formuli A0 , kter´a je v prenexn´ım tvaru. (D˚ ukaz: indukc´ı podle sloˇzitosti formule a z prenexn´ıch operac´ı, nˇekdy je nutn´e pˇrejmenovat voln´e promˇenn´e)
12
2
Automaty a jazyky
Poˇ zadavky • Chomsk´eho hierarchie, tˇr´ıdy automat˚ u a gramatik, determinismus a nedeterminismus. • Uz´ avˇerov´e vlastnosti tˇr´ıd jazyk˚ u.
2.1
Automaty – Chomsk´ eho hierarchie, tˇ r´ıdy automat˚ u a gramatik, determinismus a nedeterminismus.
• Popiˇste jednotliv´e tˇr´ıdy jazyk˚ u a jejich vztahy; definujte tˇr´ıdy pomoc´ı odpov´ıdaj´ıc´ıch gramatik. Napiˇste priklady gramatik pro jednotliv´e tˇr´ıdy. • Popiˇste automaty, ktere tyto tridv jazyku rozpozn´avaj´ı i s ohledem na jejich (ne)deterministicnost. Tˇ r´ıdy automat˚ u a gramatik Definice (Koneˇcn´y automat) Koneˇcn´y automat je pˇetice A = (Q, X, δ, q0 , F ), kde Q je stavov´ y prostor (mnoˇzina vˇsech moˇzn´ ych stav˚ u), X je abeceda (mnoˇzina symbol˚ u), δ je pˇrechodov´ a funkce δ : Q × X → Q, q0 ∈ Q je poˇc. stav a F ⊆ Q mnoˇzina koncov´ ych stav˚ u. Definice Slovo w je posloupnost symbol˚ u v abecedˇe X. Jazyk L je mnoˇzina slov, tedy L ⊆ X ∗ , kde X ∗ je mnoˇzina vˇsech posloupnost´ı symbol˚ u abecedy X. λ je pr´ azdn´ a posloupnost symbol˚ u. Rozˇs´ıˇren´ a pˇrechodov´ a funkce je δ ∗ : Q × X ∗ → Q - tranzitivn´ı uz´ avˇer δ. Jazyk rozpozn´ avan´ y koneˇcn´ ym automatem – regularn´ı jazyk je L(A) = {w|w ∈ X ∗ , δ ∗ (q0 , w) ∈ F }. Prav´ a kongruence je takov´ a relace ekvivalence na X ∗ , ˇze ∀u, v, w ∈ X ∗ : u ∼ v ⇒ uw ∼ vw.1 Je koneˇcn´eho indexu, jestliˇze X ∗ / ∼ (rozklad na tˇr´ıdy ekvivalence) m´ a koneˇcn´ y poˇcet tˇr´ıd. Vˇ eta (Nerodova) Jazyk L nad koneˇcnou abecedou X je rozpoznateln´ y kon. automatem ⇔ existuje prav´a kongruence koneˇcn´eho indexu ∼ na X ∗ tak, ˇze L je sjednocen´ım jist´ ych tˇr´ıd rozkladu X ∗ / ∼.2 Vˇ eta (Pumping (iteraˇcn´ı) lemma) Pro jazyk rozpoznateln´ y kon. automatem (tzn. regul´arn´ı) L existuje n ∈ N tak, ˇze libovoln´e slovo z ∈ L, |z| ≥ n lze ps´ at jako uvw, kde |uv| ≤ n, |v| ≥ 1 a ∀i ≥ 0 : uv i w ∈ L.3 Definice Dva automaty jsou ekvivalentn´ı, jestliˇze pˇrij´ımaj´ı stejn´ y jazyk. Homomorfismus (isomorfismus) automat˚ u je zobrazen´ı, zachov´ avaj´ıc´ı poˇc. stav, pˇrech. funkci i konc. stavy (+ prost´e a na). Pokud existuje homomorfismus automat˚ u A → B, pak jsou tyto dva ekvivalentn´ı (jen 1 implikace!). Dosaˇziteln´y stav q - ∃w ∈ X ∗ : δ ∗ (q0 , w) = q. Relace ekvivalence je automatovou kongruenc´ı, pokud zachov´ av´ a konc. stavy a pˇrech. funkci. Ke kaˇzd´emu automatu existuje redukt - ekvivaletn´ı automat bez nedosaˇziteln´ ych a navz´ ajem ekvivalentn´ıch stav˚ u. Ten je urˇcen jednoznaˇcnˇe pro dan´ y jazyk (aˇz na isomorfismus), proto lze zav´est normovan´ y tvar. Pozn´ amka (Operace s jazyky) S jazyky lze prov´ adˇet mnoˇzinov´e operace (∪, ∩), rozd´ıl ({w|w ∈ L1 &w ∈ / L2 }), doplnˇek ({w|w ∈ / L}), d´ale zˇretˇezen´ı (L1 · L2 = {uv|u ∈ L1 , v ∈ L2 }), mocniny (L0 = λ, Li+1 = Li · L), iterace (L∗ = L0 ∪ L1 ∪ L2 ∪ ...), otoˇcen´ı (LR = {uR |u ∈ L}), lev´ y (L2 \ L1 = {v|uv ∈ L1 , u ∈ L2 }) i prav´ y (L1 /L2 = {u|uv ∈ L1 , v ∈ L2 }) kvocient L1 podle L2 a derivace (kvocienty podle jednoslovn´eho jazyka). Tˇr´ıda jazyk˚ u rozpoznateln´ ych koneˇcn´ ymi automaty je na tyto operace uzavˇren´a. Definice (Regul´ arn´ı jazyky) Tˇr´ıda regul´ an´ıch jazyk˚ u nad abecedou X je nejmenˇs´ı tˇr´ıda, kter´a obsahuje ∅, ∀x ∈ X obsahuje x a je uzavˇren´a na sjednocen´ı, iteraci a zˇretˇezen´ı. Vˇ eta (Kleenova) Jazyk je regul´ arn´ı ⇔ je rozpoznateln´ y koneˇcn´ ym automatem.4 1 Pokud dvˇ e r˚ uzn´ a slova u, v pˇrevedou automat do stejn´ eho stavu (=jsou navz´ ajem ekvivalentn´ı (u ∼ v)), pak mus´ı patˇrit do stejn´ e tˇr´ıdy rozkladu. Pokud k tˇ emto dvˇ ema slov˚ um pˇrid´ ame stejn´ e slovo zprava, pak tato zˇretˇ ezen´ a slova budou opˇ et patˇrit do stejn´ e tˇr´ıdy rozkladu (=mus´ı b´ yt navz´ ajem ekvivalentn´ı (uw ∼ vw)). A toto je pr´ avˇ e ta vlastnost definuj´ıc´ı pravou kongruenci. 2 D˚ uleˇ zit´ e tedy je, ˇ ze pokud je jazyk regul´ arn´ı, pak pro nˇ ej mus´ı existovat prav´ a kongruence, kter´ a (coˇ z je nejd˚ uleˇ zitˇ ejˇs´ı) rozkl´ ad´ a vˇsechna slova jazyka do koneˇ cnˇ e mnoha tˇr´ıd. 3 Plat´ ı i pro koneˇ cn´ e jazyky: kdyˇ z je jazyk koneˇ cn´ y, tak si za n staˇ c´ı vz´ıt d´ elku nejdelˇs´ıho slova a pak to pro vˇsechny slova delˇs´ı neˇ z n (tj. ˇ za ´dn´ a) plat´ı taky. 4 D˚ ukaz se d´ a indukc´ı podle poˇ ctu hran v nedeterministick´ em automatu.
13
Definice (Regul´ arn´ı v´yrazy) Regul´ arn´ı v´yrazy nad abecedou X = x1 , ..., xn jsou nejmenˇs´ı mnoˇzina slov v abecedˇe x1 , ..., xn , ∅, λ,+ , ·,∗ , (, ), kter´ a obsahuje v´ yrazy ∅ a λ a ∀i obsahuje xi a je uzavˇren´ a na sjednocen´ı (+), zˇretˇezen´ı (·) a iterace (∗ ). Hodnota reg. v´yrazu a je reg. jazyk [a], lze takto reprezentovat kaˇzd´ y reg. jazyk. Definice (Dvoucestn´e koneˇcn´e automaty) Dvoucestn´y koneˇcn´y automat je pˇetice (Q, X, δ, q0 , F ), kde oproti kon. automatu je δ : Q × X → Q × {−1, 0, 1} (tj. pohyb ˇctec´ı hlavy). Pˇrij´ım´ a slovo, pokud v´ ypoˇcet zaˇcal vlevo v poˇc. stavu a ˇctec´ı hlava opustila slovo w vpravo v konc. stavu (mimo slovo konˇc´ı v´ ypoˇcet okamˇzitˇe). Pozn´ amka Jazyky pˇrij´ıman´e dvoucestn´ ymi automaty jsou regul´arn´ı - kaˇzd´ y dvoucestn´ y automat lze pˇrev´est na (nedeterministick´ y) koneˇcn´ y automat. Definice (Z´ asobn´ıkov´e automaty) Z´ asobn´ıkov´y automat je sedmice M = (Q, X, Y, δ, q0 , Z0 , F ), kde proti koneˇcn´ ym automat˚ um je Y abeceda pro symboly na z´ asobn´ıku, Z0 poˇc´ ateˇcn´ı symbol na z´ asobn´ıku a funkce instrukc´ı δ : Q × (X ∪ {λ}) × Y → P(Q × Y ∗ ). Je z principu nedeterministick´ y; vˇzdy se nahrazuje vrchol z´ asobn´ıku, neˇcte ale pokaˇzd´e vstupn´ı symboly. Instrukci (p, a, Z) → (q, w) lze vykonat, pokud je automat ve stavu p, na z´ asobn´ıku je Z a na vstupu a. Vykon´an´ı instrukce znamen´a zmˇenu stavu, pokud a 6= λ, tak i posun ˇctec´ı hlavy a odebr´ an´ı Z ze z´ asobn´ıku, kam se vloˇz´ı w (prvn´ım p´ısmenem nahoru). V´ ypoˇcet konˇc´ı bud’ pˇreˇcten´ım slova, nebo v pˇr´ıpadˇe, ˇze pro danou situaci nen´ı definov´ana instrukce (Situace z´as. automatu je trojice (p, u, v), kde p ∈ Q, u je nepˇreˇcten´ y zbytek slova a v cel´ y z´ asobn´ık ). Pˇrij´ımat slovo je moˇzn´e bud’ koncov´ ym stavem (slovo je pˇreˇcteno a automat v konc. stavu), nebo z´asobn´ıkem (slovo je pˇreˇcteno a z´ asobn´ık pr´ azdn´ y – konc. stavy jsou v takov´em pˇr´ıpadˇe nezaj´ımav´e - F = ∅). Pozn´ amka Pro z´ as. automat pˇrij´ımaj´ıc´ı konc. stavem vˇzdy existuje ekvivalentn´ı automat (L(A1 ) = L(A2 )) pˇrij´ımaj´ıc´ı z´ asobn´ıkem a naopak. Definice (Pˇrepisovac´ı syst´em) Pˇrepisovac´ı (produkˇcn´ı) syst´em je dvojice R = (V, P ), kde V je koneˇcn´a abeceda a P mnoˇzina pˇrepisovac´ıch pravidel (uspoˇr´ adan´ ych dvojic prvk˚ u z V ∗ ). Slovo w se pˇr´ımo pˇrep´ıˇse na z (w ⇒ z), pokud ∃u, v, x, y ∈ V ∗ : w = xuy, z = xvy, (u, v) ∈ P . Derivace (odvozen´ı) je zˇretˇezen´ı nˇekolika pˇr´ım´ ych pˇreps´an´ı. Definice (Form´ aln´ı (generativn´ı) gramatika) Form´ aln´ı gramatika je ˇctveˇrice G = (VN , VT , S, P ), kde VN je mnoˇzina netermin´aln´ıch symbol˚ u (ostatn´ı znaky napˇr. S), VT mnoˇzina termin´ aln´ıch symbol˚ u (”znaky z abecedy”), S startovac´ı symbol (S ∈ VN ) a P mnoˇzina pravidel. Jazyk generovan´y gramatikou je L(G) = {w|w ∈ VT∗ , S ⇒∗ w}. Vˇ eta Kaˇzd´ y bezkontextov´ y jazyk je rozpozn´ av´ an z´ asobn´ıkov´ ym automatem, pˇrij´ımaj´ıc´ım pr´azdn´ ym z´asobn´ıkem. Stejnˇe pro kaˇzd´ y z´ asobn´ıkov´ y automat existuje bezkontextov´ a gramatika, kter´a generuje jazyk j´ım pˇrij´ıman´ y. Pozn´ amka (Vlastnosti bezkontextov´ych gramatik) Bezkontextov´ a gramatika je redukovan´ a, pokud ∀X ∈ VN existuje termin´aln´ı slovo w ∈ VT∗ tak, ˇze X ⇒∗ w a nav´ıc ∀X ∈ VN , X 6= S existuj´ı slova u, v tak, ˇze S ⇒∗ uXv. Ke kaˇzd´e bezkontextov´e gramatice lze sestrojit ekvivalentn´ı redukovanou. Pro kaˇzd´e termin´ aln´ı slovo v bezkontextov´e gramatice existuj´ı derivace, kter´e se liˇs´ı jen poˇrad´ım pouˇzit´ı pravidel (a prohozen´ım nˇekter´ ych pravidel dostanu stejn´e termin´aln´ı slovo), proto lze zav´est lev´e (prav´e) derivace - tj. kanonick´e derivace. Pokud X ⇒∗ w, pak existuje i lev´ a (prav´ a) derivace. Zn´azornˇen´ı pr˚ ubˇehu derivac´ı je moˇzn´e urˇcit derivaˇcn´ım stromem – urˇcuje jednoznaˇcnˇe pravou/levou derivaci. Bezkontextov´ a gramatika je v´ıceznaˇcn´ a (nejednoznaˇcn´a), pokud v n´ı existuje slovo, kter´e m´a dvˇe r˚ uzn´e lev´e derivace; jinak je jednoznaˇcn´ a. Jazyk je jednoznaˇcn´ y, pokud k nˇemu existuje generuj´ıc´ı jednoznaˇcn´a gramatika. Pokud je kaˇzd´ a gramatika nˇejak´eho jazyka nejednoznaˇcn´ a, je tento podstatnˇe nejednoznaˇcn´y. Definice (Greibachov´e norm´ aln´ı forma) Gramatika je v Greibachov´e norm´ aln´ı formˇe, jsou-li vˇsechna jej´ı pravidla ve tvaru A → au, kde a ∈ VT a u ∈ VN∗ . Ke kaˇzd´emu bezkontextov´emu jazyku existuje gramatika v G. norm´aln´ı formˇe tak, ˇze L(G) = L \ {λ}. Kaˇzdou bezkontextovou gramatiku lze pˇrev´est do G. norm´ aln´ı formy. ´ Pozn´ amka (Upravy bezkontextov´ych gramatik) Spojen´ım v´ıce pravidel (A → uBv, B → w1 , ...B → wk se pˇrevede na A → uw1 v|...|uwk v) dostanu ekvivalentn´ı gramatiku. Stejnˇe tak odstranˇen´ım lev´e rekurze (pˇrevod pˇres nov´ y netermin´al). Definice (Chomsk´eho norm´ aln´ı forma) Pro gramatiku v Chomsk´eho norm´ aln´ı formˇe jsou vˇsechna pravidla tvaru X → Y Z nebo X → a, kde X, Y, Z ∈ VN , a ∈ VT . Ke kaˇzd´emu bezkontextov´emu jazyku L existuje gramatika G v Chomsk´eho norm´aln´ı formˇe tak, ˇze L(G) = L \ {λ}
14
Pozn´ amka (Vlastnosti tˇr´ıdy bezkontextov´ych jazyk˚ u) Tˇr´ıda bezkontextov´ ych jazyk˚ u je uzavˇren´ a na sjednocen´ı, zrcadlen´ı, ˇretˇezen´ı, iteraci a pozitivn´ı iteraci, substituci a homomorfismus, inverzn´ı homomorfismus a kvocient s regul´ arn´ım jazykem. Nen´ı uzavˇren´a na pr˚ unik a doplnˇek. Definice (Dyck˚ uv jazyk) Dyck˚ uv jazyk je definov´ an nad abecedou a1 , a01 , ...an , a0n gramatikou S → λ|SS|a1 Sa01 |...|an Sa0n Je bezkontextov´ y, popisuje spr´ avn´ a uz´ avorkov´ an´ı a lze j´ım popisovat v´ ypoˇcty z´asobn´ıkov´ ych automat˚ u, tedy i bezkontextov´e jazyky. Definice (Turing˚ uv stroj) Turing˚ uv stroj je pˇetice T = (Q, X, δ, q0 , F ), kde X je abeceda, obsahuj´ıc´ı symbol ε pro pr´azdn´e pol´ıˇcko, pˇrechodov´ a funkce δ : (Q \ F ) × X → Q × X × {−1, 0, 1} popisuje zmˇenu stavu, z´apis na p´asku a posun hlavy. V´ ypoˇcet konˇc´ı, nen´ı-li definov´ ana ˇza´dn´ a instrukce (spec. plat´ı pro q ∈ F ). Konfigurace Turingova stroje jsou u ´daje, popisuj´ıc´ı stav v´ ypoˇctu – nejmenˇs´ı souvisl´ a ˇca´st p´ asky, obsahuj´ıc´ı vˇsechny nepr´ azdn´e buˇ nky a ˇctenou buˇ nku, vnitˇrn´ı stav a poloha hlavy. Krok v´ypoˇctu je uqv ` wpz pro u ˇc´ ast slova vlevo od akt. pozice na p´ asce, v od ˇcten´eho p´ısmena d´al a q stav stroje. V´ypoˇcet je posloupnost krok˚ u, slovo w je pˇrij´ım´ ano, pokud q0 w `∗ upv, p ∈ F . Jazyky (mnoˇziny slov bez ε) pˇrij´ıman´e Turingov´ ymi stroji jsou rekurzivnˇe spoˇcetn´e. Vˇ eta Kaˇzd´ y jazyk typu 0 (s gramatikou s obecn´ ymi pravidly) je rekurzivnˇe spoˇcetn´ y.
Chomsk´ eho hierarchie Definice (Chomsk´eho hierarchie) Chomsk´eho hierarchie je rozdˇelen´ı gramatik do 4 tˇr´ıd podle omezen´ı na pravidla:
15
Pozn´ amka ˇ sen´ım je pˇrevod na S L1 ⊃ L2 nast´ av´ a probl´em, protoˇze bezkontextov´e gramatiky umoˇzn ˇuj´ı pravidla tvaru X → λ. Reˇ nevypouˇstˇej´ıc´ı bezkontextov´e gramatiky - takov´e bezkontextov´e gramatiky, kter´e nemaj´ı pravidla typu X → λ. Vˇ eta (o nevypouˇstˇej´ıc´ıch bezkontextov´ych gramatik´ ach) Ke kaˇzd´e bezkontextov´e G existuje nevypouˇstˇej´ıc´ı bezkontextov´a G0 tak, ˇze L(G0 ) = L(G) \ {λ} Je-li λ ∈ L(G), pak ∃G1 , t.ˇz. L(G1 ) = L(G) a jedin´e pravidlo v G1 s λ na prav´e stranˇe je S → λ a S nen´ı v G1 na prav´e stranˇe ˇz´ adn´eho pravidla. Pozn´ amka (Line´ arn´ı gramatiky) Pro kaˇzdou gramatiku typu G3 lze sestrojit koneˇcn´ y automat, kter´ y pˇrij´ım´a pr´avˇe jazyk j´ı generovan´ y, stejnˇe tak pro kaˇzd´ y koneˇcn´ y automat lze sestrojit gramatiku G3. Lev´e line´arn´ı gramatiky tak´e generuj´ı regul´arn´ı jazyky, d´ıky uzavˇrenosti na reverzi. Line´ arn´ı gramatiky, s pravidly typu X → uY v, X → w, kde X, Y ∈ VN , u, v, w ∈ VT∗ , generuj´ı line´ arn´ı jazyky - silnˇejˇs´ı neˇz regul´ arn´ı jazyky. Definice (Separovan´ a a nevypouˇstˇej´ıc´ı gramatika) Separovan´ a gramatika je gramatika (obecnˇe libovoln´e tˇr´ıdy), obsahuj´ıc´ı pouze pravidla tvaru α → β, kde bud’ α, β ∈ VN+ , nebo α ∈ VN a β ∈ VT ∪ {λ}. Nevypouˇstˇej´ıc´ı (monot´ onn´ı) gramatika (tak´e se neomezuje na konkr´etn´ı tˇr´ıdu) je takov´a, ˇze pro kaˇzd´e pravidlo u → v plat´ı |u| ≤ |v|. Pozn´ amka (Kontextov´e gramatiky) Ke kaˇzd´e kontextov´e gramatice lze sestrojit ekvivalentn´ı separovanou. Ke kaˇzd´e monot´onn´ı gramatice lze nal´ezt ekvivalentn´ı kontextovou.
Determinismus a nedeterminismus Definice (Nedeterministick´y koneˇcn´y automat) Nedeterministick´y koneˇcn´y automat je pˇetice (Q, X, δ, S, F ), kde Q je mn. stav˚ u, X abeceda, F mn. konc. stav˚ u, S mnoˇzina poˇc´ ateˇcn´ıch stav˚ u a δ : Q × X → P(Q) je pˇrechodov´a funkce. Slovo w je takov´ ym automatem pˇrij´ım´ano, pokud existuje posloupnost stav˚ u {qi }ni=1 tak, ˇze q1 ∈ S, qi+1 ∈ δ(qi , xi ), qn+1 ∈ F . Pozn´ amka Pro kaˇzd´ y nedeterministick´ y koneˇcn´ y automat A lze sestrojit deterministick´ y kon. automat B tak, ˇze jimi pˇrij´ıman´e jazyky jsou ekvivalentn´ı (m˚ uˇze to znamenat exponenci´ aln´ı n´ar˚ ust poˇctu stav˚ u). Definice (Deterministick´y z´ asobn´ıkov´y automat) Deterministick´y z´ asobn´ıkov´y automat je M = (Q, X, Y, δ, q0 , Z0 , F ) takov´e, ˇze ∀p ∈ Q, ∀a ∈ (X ∪ {λ}), ∀Z ∈ Y plat´ı |δ(p, a, Z)| ≤ 15 a nav´ıc pokud pro nˇejak´e p, Z je δ(p, λ, Z) 6= ∅, pak ∀a ∈ X je δ(p, a, Z) = ∅6 . Pozn´ amka Deterministick´ y z´ asobn´ıkov´ y automat je slabˇs´ı“ neˇz nedeterministick´ y, rozpozn´av´a deterministick´e bezkontextov´e jazyky kon” cov´ ym stavem a bezprefixov´e bezkontextov´e jazyky pr´azdn´ ym z´asobn´ıkem (takov´e jazyky, kde u ∈ L(M ) ⇒ ∀w ∈ X ∗ : uw ∈ / L(M )) - kdyˇz se poprv´e z´ asobn´ık automatu vypr´ azdn´ı, v´ ypoˇcet urˇcitˇe konˇc´ı. Bezprefixov´e bezkontextov´e jazyky jsou vˇzdy deterministick´e, opaˇcnˇe to neplat´ı. Deterministick´ y bezkontextov´ y jazyk lze na bezprefixov´ y pˇrev´est zˇretˇezen´ım s dalˇs´ım symbolem, kter´ y nen´ı v p˚ uvodn´ı abecedˇe. Regul´ arn´ı jazyky a bezprefixov´e bezkontextov´e jazyky jsou neporovnateln´e mnoˇziny. Definice (Nedeterministick´y Turing˚ uv stroj) Nedet. Turing˚ uv stroj je pˇetice T = (Q, X, δ, q0 , F ), kde oproti deterministick´ ym je δ : (Q \ F ) × X → P(Q × X × {−1, 0, 1}). Pˇrij´ım´ a slovo w, pokud existuje nˇejak´ y v´ ypoˇcet q0 w `∗ upv tak, ˇze p ∈ F . Pozn´ amka Nedeterministick´e Turingovy stroje pˇrij´ımaj´ı pr´ avˇe rekurzivnˇe spoˇcetn´e jazyky, tj. nejsou silnˇejˇs´ı neˇz deterministick´e. V´ ypoˇcty nedet. stroje lze totiˇz d´ıky nekoneˇcnosti p´ asky simulovat deterministick´ ym (napˇr. prohled´av´an´ım do ˇs´ıˇrky). Definice (Line´ arnˇe omezen´y automat) Line´ arnˇe omezen´y automat je nedeterministick´ y Turing˚ uv stroj s omezenou p´askou (napˇr. symboly l a r, kter´e nelze pˇrepsat ani se dostat mimo jejich rozmez´ı). Slovo je pˇrij´ım´ ano, pokud q0 lwr `∗ upv, kde p ∈ F . Prostor v´ ypoˇctu je omezen d´elkou vstupn´ıho slova. Line´ arnˇe omezen´e automaty pˇrij´ımaj´ı pr´avˇe kontextov´e jazyky. 5 definuje 6 definuje
ze v kazdem kroku si nemuzeme vybirat ukonˇ cen´ı vypoctu
16
Pozn´ amka (Rozhodnutelnost) Turing˚ uv stroj m˚ uˇze nepˇrijmout slovo bud’ skonˇcen´ım v´ ypoˇctu v nekoncov´em stavu, nebo pokud v´ ypoˇcet nikdy neskonˇc´ı. Turing˚ uv stroj rozhoduje jazyk L, kdyˇz pˇrij´ım´ a pr´avˇe slova tohoto jazyka a pro libovoln´e slovo je jeho v´ ypoˇcet koneˇcn´ y. Takov´e jazyky se naz´ yvaj´ı rekurzivn´ı. Probl´em zastaven´ı v´ ypoˇctu Turingova stroje je algoritmicky nerozhodnuteln´ y (kv˚ uli moˇznosti jeho simulace jin´ ym Turingov´ ym strojem). Pro bezkontextov´e jazyky je algoritmicky rozhodnuteln´e, zda dan´e slovo patˇr´ı do jazyka. Pro bezkontextovou gramatiku nelze algoritmicky rozhodnout, zda L(G) = X ∗ . Pro dvˇe kontextov´e gramatiky je nerozhodnuteln´e, zda jejich jazyky maj´ı nepr´ azdn´ y pr˚ unik. Report (Hnetynka) napisal som hierachiu, pravidla gramatik, ake automaty rozpoznavaju jednotlive gramatiky, pre reg gram veticky o KA a reg jazykoch. Pytal sa ma ako jednotlive automaty pracuju, zadal par jednoduchych prikladov a chcel zdovodnenie do akych tried patri -nakreslit/opisat slovami KA, gramatiky, ZA + dokaz pomocou pumping lemma. Pytal sa, do akej triedy by som zaradil rozpoznavanie prg jazykov, napr Java. Povedal som kontextove, ale zdovodnit som to velmi nevedel. Potvrdil ze su to kontextove + ze prave kvoli dobrym znalostam sa pouzivaju bezkontextove v kombinacii s analyzou kontextu (kedze na poradi jednotlivych riadkov zalezi) (znamka 1-2, ze zalezi na druhej inf otazke) Report (Bulej) napisal som gramatiky, odpovedajuce automaty, vysvetlil inkluzie a to bohato stacilo Report (Bednarek) Mˇel jsem definice hierarchie a srovn´ an´ı s pˇr´ısluˇsn´ymi automaty, n´ astin (opravdu lehce) inkluz´ı mezi tˇr´ıdami jazyk˚ u, Greibachov´e a Chomsk´eho n.f. plus nˇejak´e pˇr´ıklady jazyk˚ u, kter´e dokazuj´ı ostrou inkluzi, ale bez pˇresnˇejˇs´ıch d˚ ukaz˚ u (kouzeln´ a vˇeta: ”to se uk´ aˇze pˇres pumping lemma”;-) ) Ptal se mˇe na srovn´ an´ı deterministick´ych a nedeterministick´ych verz´ı jednotliv´ych druh˚ u automat˚ u, coˇz jsem vˇedˇel. Informatika za jedna. Report (Kucera) Toto se obeslo bez problemu, stacilo to definovat, a rict ktere automaty prijimaij ktere jazyky, umet je definovat. Vety kolem moc zajem nevzbudily ( Nerudovka, pump. lemma):-) Report (Fiala) Napsal sem tˇr´ıdy automat˚ u, gramatik, determinismus/nedeterminismus a pak jeˇstˇe rozhodnutelnost. Pˇri proch´ azen´ı sem dost´ aval doplˇ nuj´ıc´ı ot´ azky typu : ”Jak nˇejak l´ıp omezit odhad o n´ arustu poˇctu stavu pˇri pˇrevodu NKA do KA”(z´ aleˇz´ı na poˇctu poˇc´ ateˇcn´ıch stav˚ u a na poˇctu ”stejnejch”pˇrechod˚ u z jednotliv´ych stav˚ u.), U rozhodnutelnosti n´ aznak d˚ ukazu halting problem a dalˇs´ı. Report (Bedn´ arek) Tak jsem napsal automat a gramatiku ke kaˇzd´e tˇr´ıdˇe jazyk˚ u, determ./nedeterm. verze a jak je to kde s jejich silou. Drobn´e chyby v definic´ıch nevadily, kdyˇz byly po upozornˇen´ı opraveny. U RJ se zeptal jeˇstˇe na reg. v´yrazy a pak taky proˇc ˇze se rekurzivnˇe spoˇcetn´e jazyky jmenuj´ı jak se jmenuj´ı (kde je ta rekurze), coˇz jsem nevˇedˇel a byl pouˇcen. Report (IOI 10.2.2011) a) Popiˇste jednotliv´e tˇr´ıdy jazyk˚ u a jejich vztahy definujte tˇr´ıdy pomoc´ı odpovidajicich gramatik. Napiˇste pˇriklady gramatik pro jednotliv´e tˇr´ıdy. b) Popiˇste automaty, ktere tyto tˇr´ıdy jazyk˚ u rozpozn´ avaj´ı i s ohledem na jejich (ne)determinstiˇcnost. Report (IOI 21. 6. 2011) 4.1 Popiˇste Chomsk´eho hierarchii tˇr´ıd jazyk˚ u, jak se naz´yvaj´ı jazyky v kaˇzd´e tˇr´ıdˇe, jak´y typ gramatiky je generuje a jak´y typ automatu je pˇrij´ım´ a. 4.2 Uved’te pˇr´ıklad neregul´ arn´ıho jazyka a ukaˇzte, ˇze nen´ı regul´ arn´ı. 4.3 Existuje uz´ avˇ erov´ a vlastnost, na kterou nejsou uzavˇ ren´ e jazyky typu 0? TODO Report (IP 21. 6. 2011) Ukaˇzte, ˇze n´ asleduj´ıc´ı gramatika G je v´ıceznaˇcn´ a S → if then S else S |if then S |λ Vytvoˇrte gramatiku G’, kter´ a nebude v´ıceznaˇcn´ a, a bude platit L(G) = L(G0 ). Existuje obecnˇe k libovoln´e bezkontextov´e gramatice G jednoznaˇcn´ a gramatika G’ takov´ a, ˇze L(G) = L(G0 )?
17
2.1.1
Uz´ avˇ erov´ e vlastnosti tˇ r´ıd jazyk˚ u
(tohle asi nikdy nebude samostatna otazka) TODO: nejaka zduvodneni
Pozn´ amka (DBKJ nejsou uzavˇren´e na homomorfismus (BKJ ano)!) L1 = {ai bj ck |i = j} je DBKJ L2 = {ai bj ck |j = k} je DBKJ 0L1 ∪ 1L2 je DBKJ, 1L1 ∪ 1L2 nen´ı DBKJ poloˇzme h(0) = 1 a h(x) = x pro ostatn´ı symboly h(0L1 ∪ 1L2 ) = 1L1 ∪ 1L2 Pozn´ amka ((D)BKJ nejsou uzavˇren´e na pr˚ unik) • L1 = {ai bi cj |i, j ≥ 0} • L2 = {ai bj cj |i, j ≥ 0} TODO Pozn´ amka (Doplnˇek deterministick´eho BKJ je opˇet deterministick´y BKJ!) prohod´ıme koncov´e a nekoncov´e stavy pot´ıˇze: • nemus´ı pˇreˇc´ıst cel´e vstupn´ı slovo – krok nen´ı definov´ an (napˇr. vypr´ azdnˇen´ı z´ asobn´ıku) snadno oˇsetˇr´ıme podloˇzkou“ na z´ asobn´ıku ” – cyklus (z´ asobn´ık roste, z´ asobn´ık pulsuje) odhal´ıme pomoc´ı ˇc´ıtaˇce • po pˇreˇcten´ı slova proch´ az´ı koncov´e a nekoncov´e stavy staˇc´ı si pamatovat, zda proˇsel koncov´ ym stavem
3
Algoritmy a datov´ e struktury
Poˇ zadavky • • • • • • • • • • • • •
ˇ Casov´ a sloˇzitost algoritm˚ u, sloˇzitost v nejhorˇs´ım a pr˚ umˇern´em pˇr´ıpadˇe. Tˇr´ıdy sloˇzitosti P a NP, pˇrevoditelnost, NP-´ uplnost. Metoda ,,rozdˇel a panuj” - aplikace a anal´ yza sloˇzitosti. Bin´ arn´ı vyhled´ avac´ı stromy, vyvaˇzov´ an´ı, haldy. Haˇsov´ an´ı. Sekvenˇcn´ı tˇr´ıdˇen´ı, porovn´ avac´ı algoritmy, pˇrihr´ adkov´e tˇr´ıdˇen´ı, tˇr´ıd´ıc´ı s´ıtˇe. Grafov´e algoritmy - prohled´ av´ an´ı do hloubky a do ˇs´ıˇrky, souvislost, topologick´e tˇr´ıdˇen´ı, nejkratˇs´ı cesta, kostra grafu, toky v s´ıt´ıch. Tranzitivn´ı uz´ avˇer. Algoritmy vyhled´ av´ an´ı v textu. Algebraick´e algoritmy - DFT, Euklid˚ uv algoritmus. Z´ aklady kryptografie, RSA, DES. Pravdˇepodobnostn´ı algoritmy - testov´ an´ı prvoˇc´ıselnosti. Aproximaˇcn´ı algoritmy.
18
3.1
ˇ Casov´ a sloˇ zitost algoritm˚ u, sloˇ zitost v nejhorˇ s´ım a pr˚ umˇ ern´ em pˇ r´ıpadˇ e
Definice (ˇcasov´ a sloˇzitost) ˇ Casovou sloˇ zitost´ı algoritmu rozum´ıme z´ avislost jeho ˇcasov´ ych n´arok˚ u na velikosti konkr´etn´ıch vstupn´ıch dat. Analogicky se definuje i pamˇ et’ov´ a sloˇ zitost. Dobu zpracov´ an´ı u ´lohy o velikosti n znaˇc´ıme T (n) ˇ Casovou sloˇzitost ˇcasto zkoum´ ame z nˇekolik hledisek: • v nejhorˇ s´ım pˇ r´ıpadˇ e – maxim´ aln´ı poˇcet operac´ı pro nˇejak´a data, • v nejlepˇ s´ım pˇ r´ıpadˇ e – minim´ aln´ı poˇcet operac´ı pro nˇejak´a data, • v pr˚ umˇ ern´ em (oˇ cek´ avan´ em) pˇ r´ıpadˇ e – pr˚ umˇer pro vˇsechna moˇzn´a vstupn´ı data (nˇekdy t´eˇz stˇredn´ı hodnota n´ ahodn´e veliˇciny T (n)). Pozn´ amka Jako jednu operaci“, nebo-li krok algoritmu rozum´ıme jednu element´arn´ı operaci nˇejak´eho abstraktn´ıho stroje (napˇr. Turingova ” stroje), proveditelnou v konstantn´ım ˇcase. Intuitivnˇe je moˇzn´e ch´apat to jako nˇekolik operac´ı poˇc´ıtaˇce, kter´e dohromady netrvaj´ı v´ıce, neˇz nˇejakou pevnˇe danou dobu.
Pozn´ amka ˇ Casov´ a sloˇzitost probl´emu je rovna sloˇzitosti nejlepˇs´ıho algoritmu ˇreˇs´ıc´ıho dan´ y probl´em.
Asymptotick´ a sloˇ zitost Definice ˇ Rekneme, ˇze funkce f (n) je asymptoticky menˇ s´ı nebo rovna neˇz g(n), znaˇc´ıme f (n) je O(g(n)), pr´avˇe tehdy, kdyˇz ∃c > 0 ∃n0 ∀n > n0 : 0 ≤ f (n) ≤ c · g(n) Funkce f (n) je asymptoticky vˇ etˇ s´ı nebo rovna neˇz g(n), znaˇc´ıme f (n) je Ω(g(n)), pr´avˇe tehdy, kdyˇz ∃c > 0 ∃n0 ∀n > n0 : 0 ≤ c · g(n) ≤ f (n) Funkce f (n) je asymptoticky stejn´ a jako g(n), znaˇc´ıme f (n) je Θ(g(n)), pr´avˇe tehdy, kdyˇz ∃c1 , c2 > 0 ∃n0 ∀n > n0 : 0 ≤ c1 · g(n) ≤ f (n) ≤ c2 · g(n) Pozn´ amka Asymptotick´ a sloˇzitost zkoum´ a chov´ an´ı algoritm˚ u na velk´ ych“ datech a dle jejich sloˇzitosti je zaˇrazuje do skupin (polynomi´ aln´ı, ” exponenci´ aln´ı. . . ). Pˇri zkoum´ an´ı se zanedb´ avaj´ı aditivn´ı a multiplikativn´ı konstanty.
Amortizovan´ a sloˇ zitost Definice (Amortizovan´ a sloˇzitost) Amortizovan´ a ˇcasov´ a sloˇzitost poˇc´ıt´ a pr˚ umˇern´ y ˇcas na jednu operaci pˇri proveden´ı posloupnosti operac´ı. Pouˇz´ıv´ a se typicky pro poˇc´ıt´ an´ı ˇcasov´e sloˇzitosti operac´ı nad datov´ ymi strukturami. D´av´a realistiˇctˇejˇs´ı horn´ı odhad sloˇzitosti posloupnosti operac´ı, neˇz poˇc´ıt´ an´ı s nejhorˇs´ım pˇr´ıpadem u kaˇzd´e operace. Agregaˇ cn´ı metoda Spoˇc´ıt´ ame (nejhorˇs´ı moˇzn´ y) ˇcas T (n) pro posloupnost operac´ı. Amortizovan´a cena jedn´e operace je potom
T (n) n .
´ cetn´ı metoda Uˇ Od kaˇzd´e operace vybereme“ urˇcit´ y obnos“, ze kter´eho zaplat´ıme“ za danou operaci a pokud nˇeco zbude, d´ ame to na ” ” ” u ´ˇcet. Pokud je operace draˇzˇs´ı neˇz kolik je jej´ı obnos, tak potˇrebn´ y rozd´ıl vybereme z u ´ˇctu. Z˚ ustatek na u ´ˇctu mus´ı b´ yt st´ ale nez´ aporn´ y. Pokud uspˇejeme, tak obnos“ = amortizovan´a cena jedn´e operace. ” Pozn´ amka Jde o to, ˇze nˇekter´ a operace m˚ uˇze trvat kr´ atce, ale rozh´aˇze“ datovou strukturu, takˇze n´asleduj´ıc´ı operace potˇrebuj´ı v´ıc ˇcasu. ” Nebo naopak trv´ a dlouho a datovou strukturu uspoˇr´ad´a“, takˇze ostatn´ı operace jsou kratˇs´ı. ”
19
3.2
Tˇ r´ıdy sloˇ zitosti P a NP, pˇ revoditelnost, NP-´ uplnost
Pˇ revoditelnost Definice ´ • Uloha – Pro dan´e zad´ an´ı (vstup, instanci u ´lohy) naj´ıt v´ ystup s dan´ ymi vlastnostmi. • Optimalizaˇ cn´ı u ´ loha – Pro dan´e zad´ an´ı naj´ıt optim´aln´ı (vˇetˇsinou nejmenˇs´ı nebo nejvˇetˇs´ı) v´ ystup s dan´ ymi vlastnostmi. • Rozhodovac´ı probl´ em – Pro dan´e zad´ an´ı odpovˇedˇet ANO/NE. Definice (pˇrevody mezi rozhodovac´ımi probl´emy) ˇ ık´ Necht’ A, B jsou dva rozhodovac´ı probl´emy. R´ ame, ˇze A je polynomi´ alnˇ e redukovateln´ y (pˇ revoditeln´ y) na B, pokud existuje zobrazen´ı f z mnoˇziny zad´ an´ı probl´emu A do mnoˇziny zad´an´ı probl´emu B s n´asleduj´ıc´ımi vlastnostmi: • Necht’ X je zad´ an´ı probl´emu A a Y zad´ an´ı probl´emu B, takov´e, ˇze f (X) = Y . Potom je X kladn´e zad´an´ı probl´emu A pr´ avˇe tehdy, kdyˇz Y je kladn´e zad´ an´ı probl´emu B. • Necht’ X je zad´ an´ı probl´emu A. Potom je zad´ an´ı f (X) probl´emu B (deterministicky sekvenˇcnˇe) zkonstruovateln´e v polynomi´ aln´ım ˇcase vzhledem k velikosti X. Jin´ a definice: Mˇejme rozhodovac´ı probl´em A, v´ ysledek probl´em ch´apejme jako funkce A(x) na vstupu x, pak probl´em A je redukovateln´ y na B (A → B) kdyˇz ∀A : B(f (x)) = A(x) pro polynomi´aln´ı f . Obˇe definice ˇr´ıkaj´ı, ˇze B je aspoˇ n tak tˇeˇzk´ y“, ” jako A (m˚ uˇze ale b´ yt tˇeˇzˇs´ı!). N´ azev je trochu zav´ adˇej´ıc´ı – neredukujeme na lehˇc´ı, ale na tˇeˇzˇs´ı probl´em. Plat´ı ale, ˇze pokud B je polynomi´ alnˇe sloˇzit´ y, je i A. Definice (3-SAT) 3-SAT (z anglick´eho satisfiability“) je rozhodovac´ı probl´em, kter´ y jako vstup dostane logickou formuli urˇcit´eho typu a ” rozhodne, zda je, nebo nen´ı splniteln´ a, tj. jestli existuje nˇejak´e jej´ı ohodnocen´ı, kter´e je pravdiv´e. Logick´a formule mus´ı b´ yt typu CNF, tj.: (a1 ∨ b1 ∨ c1 ) ∧ (a2 ∨ b2 ∨ c2 ).... ∧ (an ∨ bn ∨ cn ), kde an , bn , cn jsou bud’ xi nebo ¬xi pro nˇejak´ a i = (1...k). Definice (3-COL) 3-COL, nebo tak´e trojbarevnost grafu, je n´ asleduj´ıc´ı probl´em: dostanu graf a mus´ım urˇcit, jestli jej lze obarvit tˇremi barvami. Definice (Probl´em nez´ avisl´e mnoˇziny v grafu) Probl´em nez´ avisl´e mnoˇziny v grafu: Existuje v dan´em grafu velikosti N nez´avisl´a mnoˇzina velikosti K? Vˇ eta 3-SAT → 3-COL D˚ ukaz Pro 3-SAT si udˇel´ ame graf´ık, kter´ y bude obarviteln´ y ⇔ 3-SAT m´a ˇreˇsen´ı. Pravdu si budu v grafu reprezentovat jako b´ılou, nepravdu jako ˇcernou, tˇret´ı barva je pomocn´a. Nejdˇr´ıve si udˇel´ am konstrukt“, co mi pro kaˇzdou kombinaci tˇr´ı barev vr´at´ı“ logick´ y or. ” ”
Kdyˇz do v´ yˇse uveden´eho konstruktu jakoby vloˇz´ım“ do horn´ı ˇr´adky barvy, odpov´ıdaj´ıc´ı tˇr´ı pravdivostn´ım hodnot´ am, ” nem˚ uˇzu spodn´ı vrchol obarvit jinak, neˇz jako logick´ y or tˇr´ı barev. Tyto konstrukty mi budou slouˇzit pro reprezentaci (a ∨ b ∨ c).
20
Udˇel´ am si ted’ jeden stˇredn´ı bod (C jako centrum – viz obr´azek 1), k nˇemu pˇrid´ am nejdˇr´ıv dva body T a F a potom pro kaˇzdou promˇennou pˇrid´ am dva body, reprezentuj´ıc´ı x a ¬x a spoj´ım je dohromady a s C. Neˇz zaˇcnu pˇrid´ avat konstrukty“ na vyhod” nocov´ an´ı trojic, pod´ıv´ am se na vlastnosti. Mus´ı platit: • C, T a F mus´ı m´ıt kaˇzd´ a jinou barvu • pro vˇsechny body mus´ı x nebo ¬x T barva a ta druh´a F barva ´ BUNO m˚ uˇzu ˇr´ıct, ˇze C je ˇsediv´ a, T b´ıl´ a a F ˇcern´a, ˇcern´a mi vyjadˇruje nepravdu, b´ıl´ a pravdu. Potom za nˇe navˇes´ım“ ty kon” strukty – bud’ na x, nebo na ¬x, podle toho, kter´ a z nich ve trojici zrovna je – a jejich spodn´ı vrchol pˇripoj´ım F vrchol (to vynu” cuje“, aby vrchol byl T ). Na obr´ azku je formule (¬x1 ∨¬x2 ∨¬x3 ). Tento graf je obarviteln´ y pr´ avˇe tehdy, kdyˇz je formule splniteln´a, a je sestaviteln´ y v polynomi´ aln´ım ˇcase.
Obr´azek 1: Cel´ y graf
Vˇ eta 3-COL → existence nez´ avisl´e mnoˇziny v grafu D˚ ukaz Graf zkop´ırujeme tˇrikr´ at pod sebe, kaˇzd´ a kopie bude reprezentovat jednu barvu. Budeme cht´ıt pˇresnˇe stejnˇe velkou mnoˇzinu, jako je bod˚ u v p˚ uvodnˇe obarvovan´em grafu. M´ am-li mnoˇzinu, m´ am pak nutnˇe i obarven´ı. V´ıc to snad ujasn´ı obr´ azek 2.
Obr´azek 2: Redukce Vˇ eta existence nez´ avisl´e mnoˇziny v grafu → 3-SAT D˚ ukaz Udˇel´ am si formuli, kter´ a bude odpov´ıdat grafu, n´asledovnˇe: • kaˇzd´ y vrchol v ⇒ promˇenn´ a xv • kaˇzd´ a hrana v − w ⇒ klauzule (¬xv ∨ ¬xw ) • pˇrid´ am klauzuli takovou, ˇze bude splnˇen´ a pr´ avˇe, kdyˇz K promˇenn´ ych je rovno 1. Budeme Kuˇcerovi vˇeˇrit, ˇze se d´ a vytvoˇrit v polynomi´ aln´ım ˇcase.
Dok´ azali jsme, ˇze 3-SAT, 3-COL a nez´ avisl´ a mnoˇzina jsou ve stejn´e tˇr´ıdˇe ekvivalence, jsou na sebe navz´ajem pˇrevoditeln´e. Pˇreskoˇc´ım dopˇredu a ˇreknu, ˇze jde o tˇr´ıdu NP a ˇze ve stejn´e tˇr´ıdˇe je spousta dalˇs´ıch probl´em˚ u. P, NP, NP-´ uplnost, NP-tˇ eˇ zkost Definice (tˇr´ıda P) Tˇ r´ıdu sloˇ zitosti P (nˇekdy t´eˇz PTIME) tvoˇr´ı probl´emy ˇreˇsiteln´e sekvenˇcn´ımi deterministick´ ymi algoritmy v polynomi´ aln´ım ˇcase, tj. jejich ˇcasov´ a sloˇzitost je O(nk ). O algoritmech ve tˇr´ıdˇe P tak´e ˇr´ık´ame, ˇze jsou efektivnˇ eˇ reˇ siteln´ e. Definice (tˇr´ıda NP) Tˇ r´ıda NP (NPTIME) je tˇr´ıda probl´em˚ u ˇreˇsiteln´ ych v polynomi´aln´ım ˇcase sekvenˇcn´ımi nedeterministick´ ymi algoritmy. (nedeterministick´e algoritmy samozˇrejmˇe na nekvantov´ych poˇc´ıtaˇc´ıch nespust´ıme, a netuˇs´ım, jak je to vlastnˇe s tˇemi kvantov´ymi) Jin´ a, ekvivalentn´ı definice ˇr´ık´ a, ˇze jde o probl´emy, kter´e s polynomi´alnˇe velkou n´apovˇedou ovˇeˇr´ıme v polynomi´ aln´ım ˇcase. Pˇ r´ıklad Jednoduch´ y pˇr´ıklad - SAT je NP probl´em, museli bychom vyzkouˇset vˇsechny moˇznosti, coˇz zvl´adneme v polynomi´ aln´ım ˇcase nedeterministicky (v kaˇzd´em kroku m´ ame vˇsechny moˇznosti pro jednotliv´e promˇenn´e). Pokud uˇz ale m´ame dan´e, co je v jednotliv´ ych promˇenn´ ych, ovˇeˇr´ıme to v polynomi´ aln´ım ˇcase deterministicky. Trochu poetiˇctˇejˇs´ı a naprosto neexaktn´ı a filosofick´ y pˇr´ıklad – nikdo nevid´ıme do budoucnosti vˇsechny moˇznosti, co se n´ am nask´ ytaj´ı, takˇze nem˚ uˇzeme ˇr´ıct, jestli se nˇeco povede, nebo ne, protoˇze moˇznost´ı je pˇr´ıliˇs mnoho. Pokud hled´ıme do minulosti, je moˇzn´e svoje ˇciny zhodnotit v polynomi´ aln´ım ˇcase, ale do budoucnosti ne. Pokud bychom ovˇsem nemˇeli pˇresnou informaci o tom, co se stane; v tom pˇr´ıpadˇe by bylo ovˇeˇren´ı taky polynomi´aln´ı. :-)
21
Pozn´ amka P ⊆ N P – deterministick´ y automat je vlastnˇe taky nedeterministick´ y. Nev´ı se vˇsak, zda P 6= N P . Pˇredpokl´ ad´ a se to, ale jeˇstˇe to nikdo nedok´azal. (Jde o tzv. Millenium Prize Problem) Bylo by ovˇsem velmi podivn´e, kdyby platil opak.
Definice (NP-tˇeˇzk´y probl´em) Probl´em B je NP-tˇ eˇ zk´ y, pokud pro libovoln´ y probl´em A ze tˇr´ıdy NP plat´ı, ˇze A je polynomi´ alnˇe redukovateln´ y na B. Pozn´ amka NP-tˇeˇzk´ y probl´em nem˚ uˇze b´ yt P (resp. pokud by byl, potom by P=NP). M˚ uˇze a nemus´ı b´ yt NP (napˇr. halting problem nen´ı NP, ale kaˇzd´ y NP na nˇej lze redukovat).
Obr´azek 3: Vztah NP mnoˇzin Definice (NP-´ upln´y probl´em) Probl´em je NP-´ upln´ y, pokud patˇr´ı do tˇr´ıdy NP a je NP-tˇeˇzk´ y. Pozn´ amka NP-´ upln´e probl´emy jsou nejtˇeˇzˇs´ı probl´emy v NP.
D˚ usledky • Pokud je A NP-tˇeˇzk´ y a nav´ıc je A polynomi´ alnˇe redukovateln´ y na B, tak je B taky NP-tˇeˇzk´ y. • Pokud existuje polynomi´ aln´ı algoritmus pro nˇejak´ y NP-tˇeˇzk´ y probl´em, pak existuj´ı polynomi´aln´ı algoritmy pro vˇsechny probl´emy ve tˇr´ıdˇe NP. (tedy P=NP) Vˇ eta (Cook-Levin 1971) Existuje NP-´ upln´ y probl´em. (Dok´ az´ ano pro SAT) Pˇ r´ıklady probl´ em˚ u ze tˇ r´ıdy NP • KLIKA(´ upln´ y podgraf) – Je d´ an neorientovan´ y graf G a ˇc´ıslo k. Existuje v G u ´pln´ y podgraf velikosti aspoˇ n k? – je z´ aroveˇ n NP-´ upln´ y • HK(Hamiltonovsk´ a kruˇznice) – Je d´ an neorientovan´ y graf G. Existuje v G Hamiltonovsk´a kruˇznice? (tj. kruˇznice, ve kter´e je kaˇzd´ y bod grafu pr´ avˇe jednou) – je z´ aroveˇ n NP-´ upln´ y • BATOH(Souˇcet podmnoˇziny) – Jsou d´ ana pˇrirozen´a ˇc´ısla a1 , . . . , an , b. Existuje podmnoˇzina ˇc´ısel a1 , . . . , an , jej´ıˇz souˇcet je pˇresnˇe b? – je z´ aroveˇ n NP-´ upln´ y • Obchodn´ı cestuj´ıc´ı (rozhodovac´ı verze) – Existuje v dan´em u ´pln´em ohodnocen´em grafu hamiltonovsk´a kruˇznice kratˇs´ı neˇz x? – NP-´ upln´ y • testov´ an´ı norm´ aln´ıch forem v datab´ azi, obarven´ı grafu, 3-SAT, celoˇc´ıseln´e line´arn´ı programov´an´ı... – NP u ´pln´ y • testov´ an´ı isomorfismu graf˚ u (jsou 2 grafy izomorfn´ı?) – nen´ı NP-´ upln´ y, ale nen´ı P. • testov´ an´ı isomorfismu subgraf˚ u (existuje v grafu B subgraf isomorfn´ı s A?) – uˇz je NP-´ upln´ y Report Bedn´ arek
22
3.3
Metoda rozdˇ el a panuj – aplikace a anal´ yza sloˇ zitosti
Je to cel´e napsan´e dost rozvl´ aˇcnˇe, ale podle mˇe nen´ı nutn´e umˇet cel´e (napˇr´ıklad vzorce ze Strassena m˚ uˇze cht´ıt jenom sadista), ˇ sp´ıˇs tomu vˇsemu nˇejak rozumˇet. Zdroje: Cepkovy a MJovy pˇredn´aˇsky na ADS1. Definice (Metoda rozdˇel a panuj) Rozdˇel a panuj je metoda n´ avrhu algoritm˚ u (ne strukturovan´e programov´an´ı), kter´a m´a 3 kroky: 1. rozdˇel – rozdˇel´ı u ´lohu na nˇekolik pod´ uloh stejn´eho typu, ale menˇs´ı velikosti 2. vyˇreˇs – vyˇreˇs´ı pod´ ulohy bud’ pˇr´ımo pro dostateˇcnˇe mal´e (ˇcasto trivi´aln´ı), nebo rekurzivnˇe dˇel´ıme d´al pokud jsou jeˇstˇe moc velk´e 3. sjednot’ – sjednot´ı ˇreˇsen´ı pod´ uloh do ˇreˇsen´ı p˚ uvodn´ı u ´lohy Pozn´ amka (Vytvoˇren´ı rekurentn´ı rovnice) Pro ˇcasovou sloˇzitost algoritm˚ u typu rozdˇel a panuj zpravidla dost´av´am nˇejakou rekurentn´ı rovnici. • T (n) budiˇz doba zpracov´ an´ı u ´lohy velikosti n, za pˇredpokladu, ˇze T (n) = Θ(1) pro n ≤ n0 . • D(n) budiˇz doba na rozdˇelen´ı u ´lohy velikosti n na a pod´ uloh stejn´e velikosti nc . n ´lohu velikosti n. • S(n) budiˇz doba na sjednocen´ı ˇreˇsen´ı pod´ uloh velikosti c na jednu u Dost´ av´ am rovnici
( T (n) =
D(n) + aT ( nc ) + S(n) Θ(1)
n > n0 n ≤ n0
Metody ˇ reˇ sen´ı rekurentn´ıch rovnic Pozn´ amka (k ˇreˇsen´ı rekurentn´ıch rovnic) • Pˇredpoklad T (n) = Θ(1) pro dostateˇcnˇe mal´ a n nep´ıˇseme explicitnˇe do rovnice • Zanedb´ av´ ame celoˇc´ıselnost (tj. p´ıˇseme n2 m´ısto d n2 e a b n2 c) • Nehled´ıme na konkr´etn´ı hodnoty aditivn´ıch a multiplikativn´ıch konstant, asymptotick´e notace pouˇz´ıv´am i v zad´ an´ı rekurentn´ıch rovnic, i v jejich ˇreˇsen´ı. Vˇ eta (Substituˇcn´ı metoda) 1. Uhodnu asymptoticky spr´ avn´e ˇreˇsen´ı 2. Pˇr´ımo nebo indukc´ı ovˇeˇr´ım spr´ avnost (zvl´ aˇstˇe horn´ı a doln´ı odhad)
Vˇ eta (Metoda kuchaˇrka“ (Master Theorem)) ” Necht’ a ≥ 1, c > 1, d ≥ 0 ∈ R a necht’ T : N → N je neklesaj´ıc´ı funkce takov´a, ˇze ∀n tvaru ck plat´ı n T (n) = aT ( ) + Θ(nd ) c Potom 1. Je-li a 6= cd , pak T (n) je Θ(nmax{logc a,d} ) 2. Je-li a = cd , pak T (n) je Θ(nd logc n) Vˇ eta (Master Theorem, varianta 2) Necht’ 0 < ai < 1, kde i ∈ {1, . . . , k} a d ≥ 0 jsou re´ aln´a ˇc´ısla a necht’ T : N → N splˇ nuje rekurenci T (n) =
k X
T (ai · n) + Θ(nd )
i=1
Pk Necht’ je ˇc´ıslo x ˇreˇsen´ım rovnice i=1 axi = 1. Potom Pk 1. Je-li x 6= d (tedy i=1 adi 6= 1), pak T (n) je Θ(nmax{x,d} ) Pk 2. Je-li x = d (tedy i=1 adi = 1), pak T (n) je Θ(nd log n)
23
3.3.1
N´ asoben´ı dlouh´ ych ˇ c´ısel v lepˇ s´ım neˇ z kvadratick´ em ˇ case.
Klasick´ ym ”ˇskoln´ım”algoritmem pro n´ asoben´ı na pap´ıˇre ⇒ O(n2 ) Libovoln´e 2N-cifern´e ˇc´ıslo muˇzeme zapsat jako 10N A + B, kde A a B jsou N-cifern´a. Souˇcin dvou takov´ ych ˇc´ısel pak bude (10N A + B) ∗ (10N C + D) = (102N AC + 10N (AD + BC) + BD). Sˇc´ıtat dok´aˇzeme v line´arn´ım ˇcase, n´asobit mocninou deseti tak´e (dop´ıˇseme pˇr´ısluˇsn´ y poˇcet nul na konec ˇc´ısla), N-cifern´a ˇc´ısla budeme n´asobit rekurzivn´ım zavol´an´ım t´ehoˇz algoritmu. Pro ˇcasovou sloˇzitost tedy bude platit T (N ) = O(N )+4T (N/2). Nyn´ı tuto rovnici m˚ uˇzeme snadno vyˇreˇsit, ale ani to dˇelat nebudeme, nebot’ n´ am vyjde, ˇze T (N ) ≈ N 2 , ˇcili jsme si oproti p˚ uvodn´ımu algoritmu v˚ ubec nepomohli. Pˇrijde trik. M´ısto ˇctyˇr n´ asoben´ı ˇc´ısel poloviˇcn´ı d´elky n´am budou staˇcit jen tˇri: spoˇcteme AC, BD a (A + B) ∗ (C + D) = AC + AD + BC + BD, pˇriˇcemˇz pokud od posledn´ıho souˇcinu odeˇcteme AC a BD, dostaneme pˇresnˇe AD + BC, kter´e jsme ˇ pˇredt´ım poˇc´ıtali dvˇema n´ asoben´ımi. Casov´ a sloˇzitost nyn´ı bude T (N ) = O(N ) + 3T (N/2). Master theorem: T (n) = 3T (n/2) + O(n) ⇒ a = 3b = 2d = 1; 3 > 21 ⇒ Θ(nlog2 3 ) ≈ Θ(n1,58 ) 3.3.2
N´ asoben´ı matic n×n a Strassen˚ uv algoritmus
Nejdˇr´ıve si pˇripomeneme definici n´ asoben´ı dvou ˇctvercov´ ych matic typu n × n. Plat´ı, ˇze prvek v i-t´em ˇr´adku a j-t´em sloupci v´ ysledn´e matice Z se rovn´ a standardn´ımu skal´ arn´ımu souˇcinu i-t´eho ˇr´adku prvn´ı matice X a j-t´eho sloupce druh´e matice Y . Form´ alnˇe zaps´ ano: Zij =
n X
Xik · Ykj .
k=1
_j _i
(i,j)
=
X
X
Y
Z
Algoritmus, kter´ y by n´ asobil matice podle t´eto definice, by mˇel ˇcasovou sloˇzitost Θ(n3 ), protoˇze poˇcet prvk˚ u ve v´ ysledn´e matici 2 je n a jeden skal´ arn´ı souˇcin vektor˚ u dimenze n vyˇzaduje line´arn´ı poˇcet operac´ı. My se s touto ˇcasovou sloˇzitost´ı ovˇsem nespokoj´ıme a budeme postupovat podobnˇe jako pˇri vylepˇsov´an´ı algoritmu na n´ asoben´ı velk´ ych ˇc´ısel. Bez u ´jmy na obecnosti pˇredpokl´ adejme, ˇze budeme n´asobit dvˇe matice typu n × n, kde n = 2k , k ∈ N. Obˇe tyto matice rozdˇel´ıme na ˇctvrtiny a tyto ˇc´ asti postupnˇe oznaˇc´ıme u matice X p´ısmeny A, B, C a D, u matice Y p´ısmeny P , Q, R a S. Z definice n´ asoben´ı matic zjist´ıme, ˇze ˇctvrtiny v´ ysledn´e matice Z m˚ uˇzeme zapsat pomoc´ı souˇcin˚ u ˇc´ast´ı n´asoben´ ych matic. Lev´ a horn´ı ˇctvrtina bude odpov´ıdat v´ ysledku operac´ı AP + BR, prav´a horn´ı ˇctvrtina bude AQ + BS, lev´a doln´ı CP + DR a zbyl´ a CQ + DS (viz obr´ azek).
A
P
B
Q
X
C
D X
AP+BR
AQ+BS
CP+DR
CQ+DS
=
R
S
Z
Y N´ asoben´ı rozˇctvrcen´ ych matic
Pˇrevedli jsme tedy probl´em n´ asoben´ı ˇctvercov´ ych matic ˇr´adu n na n´asoben´ı ˇctvercov´ ych matic ˇr´adu n/2. T´ımto rozdˇelov´ an´ım bychom mohli pokraˇcovat, dokud bychom se nedostali na matice ˇr´adu 1, jejichˇz vyn´asoben´ı je trivi´aln´ı. Dostali jsme tedy klasick´ y algoritmus typu rozdˇel a panuj. Pomohli jsme si ale nˇejak? V kaˇzd´em kroku prov´ad´ıme 8 n´asoben´ı matic poloviˇcn´ıho ˇr´ adu a nav´ıc konstantn´ı poˇcet operac´ı na n2 prvc´ıch. Dost´ av´ ame tedy rekurentn´ı z´apis ˇcasov´e sloˇzitosti: n T (n) = 8T + Θ(n2 ). 2 Pouˇzit´ım Master Theoremu lehce dojdeme k z´ avˇeru, ˇze sloˇzitost je st´ale Θ(n3 ), tedy stejn´a jako pˇri n´asoben´ı matic z definice. Zd´anlivˇe jsme si tedy nepomohli, ale stejnˇe jako tomu bylo u n´asoben´ı velk´ ych ˇc´ısel, i ted’ m˚ uˇzeme zredukovat poˇcet n´ asoben´ı matic poloviˇcn´ıho ˇr´ adu, kter´e nejv´ıce ovlivˇ nuje ˇcasovou sloˇzitost algoritmu. Nen´ı to bohuˇzel nic trivi´aln´ıho, a proto si radˇeji rovnou ˇrekneme spr´ avn´e ˇreˇsen´ı. Jedn´ a se o Strassen˚ uv algoritmus, kter´ y redukuje potˇrebn´ y poˇcet n´asoben´ı na 7, a jeˇstˇe pˇred t´ım, neˇz si uk´ aˇzeme, jak funguje, dok´ aˇzeme si, jak n´ am to s ˇcasovou sloˇzitost´ı vlastnˇe pom˚ uˇze: n T (n) = 7T + Θ(n2 ) =⇒ Θ(nlog2 7 ) = Θ(n2.808 ). 2
24
V´ ysledn´ a sloˇzitost Strassenova algoritmu je tedy Θ(n2.808 ), coˇz je sice mal´e, ale pro velk´e matice znateln´e zlepˇsen´ı oproti algoritmu vych´ azej´ıc´ımu pˇr´ımo z definice 7 8 . Lemma (vzorce pro n´ asoben´ı blokov´ych matic ve Strassenovˇe algoritmu) A B P Q T1 + T4 − T5 + T7 · = C D R S T2 + T4
T3 + T5 T1 − T2 + T3 + T6
kde: T1 = (A + D) · (P + S)
T5 = (A + B) · S
T2 = (C + D) · P
T6 = (C − A) · (P + Q)
T3 = A · (Q − S)
T7 = (B − D) · (R + S)
T4 = D · (R − P )
3.3.3
Hled´ an´ı k-t´ eho nejmenˇ s´ıho prvku (medi´ anu) v lin. ˇ case (Blum et al.)
Algoritmus (Blum et al.) Select(X,k) 1. 2. 3. 4. 5. 6.
Pokud n ≤ 5 ⇒ vyˇreˇs´ıme pˇr´ımo Vstup rozdˇel´ıme na pˇetice P1 ...Pdn/5e (posledn´ı m˚ uˇze b´ yt ne´ upln´a), to zvl´adneme v O(n) ∀i ∈ {1...dn/5e} : mi := median(P i), to zvl´ adneme v O(n) pivot := Select(m1 , ..., mdn/5e , dn/10e) (medi´ an medi´an˚ u) Rozdˇelime X na L(=menˇs´ı neˇz pivot), S(=stejn´e jako pivot), P(=vˇetˇs´ı neˇz pivot) Rekurzivnˇe se zavol´ ame na jednu z L, S, P (tu, ve ktere se ma vyskytovat hledany prvek – tj. podle jejich velikosti a k9 )
ˇ Casov´ a sloˇ zitost: V kaˇzd´em kroku vypadne alespoˇ n
3n 10
prvk˚ u.
D˚ ukaz. Pˇredstavme si vybran´e pˇetice seˇrazen´e podle velikosti od nejvˇetˇs´ıho prvku a zakresleme je do sloupc˚ u. Jejich medi´ any tedy vyplˇ nuj´ı prostˇredn´ı ˇradu. Tyto pˇetice pak seˇrad’me podle velikosti jejich medi´an˚ u (nejmenˇs´ı vlevo)10 . Hledan´ y pivot se tedy nach´ az´ı (pokud pˇredpokl´ ad´ ame pro jednoduchost lich´ y poˇcet pˇetic) pˇresnˇe uprostˇred. O prvc´ıch nad pivotem a napravo od nˇej m˚ uˇzeme urˇcitˇe ˇr´ıct, ˇze jsou vˇetˇs´ı nebo rovny pivotu, prvky pod n´ım a nalevo od nˇej jsou zase urˇcitˇe menˇs´ı nebo rovny pivotu. Podle algoritmu vˇzdy vypadne jedna nebo druh´ a skupina prvk˚ u o velikosti alespoˇ n 3n u (z obr´azku). 10 prvk˚
V kaˇzd´em kroku funkce vol´ a sama sebe na vstup velikosti nejv´ yˇse n/5 a pak na 7n/10 ostatn´ı operace jsou line´ arn´ı, nejhorˇs´ı pˇr´ıpad: T (n) = O(n) + T ( n5 ) + T ( 7n ), odhadneme ˇ z e odpov´ ıd´ a lin.sloˇ z itosti O(n). 10 D˚ ukaz. Pˇr´ımo ˇze T (n) = Θ(n) ⇔ ∃k > 0 : ∃n0 ∈ N ∀n ≥ n0 : T (n) = kn pro nˇejakou dostateˇcnˇe velkou konstantu k. n 7n 9n T (n) = Θ(n) + T ( n5 ) + T ( 7n 10 ) ⇔ kn = n + k 5 + k 10 = n + k 10 ⇔ 10 = k (dosadili jsme T(n) = kn)
7 Zat´ ım
nejlepˇs´ı dok´ azan´ y algoritmus m´ aˇ casovou sloˇ zitost Θ(n2.376 ), ovˇsem s velkou multiplikativn´ı konstantou. se da pouzit i pro vypocet determinantu. 9 bud’ je k ≤ |L|, nebo |L| < k ≤ |L| + |S|, nebo |L| + |S| < k 10 bacha algoritmus nic takoveho nedˇ el´ a, jen n´ am to pom˚ uˇ ze v u ´vaze o spr´ avnosti 8 Strassen
25
3.3.4
MergeSort
Tento tˇr´ıd´ıc´ı algoritmus pracuje na principu, ˇze vstup rozdˇel´ıme na dvˇe (skoro) stejnˇe velk´e ˇc´asti, kter´e rekurzivn´ım vol´ an´ım setˇr´ıd´ıme, a nakonec v´ ysledn´e dvˇe posloupnosti slijeme do jedn´e. Algoritmus (MergeSort) 1. 2. 3. 4. 5.
Vstup: posloupnost x1 , . . . , xn . Pokud n ≤ 1 ⇒ vr´ at´ıme vstup. y1 , . . . , ybn/2c ← MergeSort (x1 , . . . , xbn/2c ). z1 , . . . , zdn/2e ← MergeSort (xbn/2c+1 , . . . , xn ). Vr´ at´ıme MergeSort (y1 , . . . , ybn/2c ; z1 , . . . , zdn/2e ).
Na slit´ı dvou setˇr´ıdˇen´ ych posloupnost´ı do jedn´e pouˇz´ıv´ame funkci Merge: Merge (y1 , . . . , ya ; z1 , . . . , zb ) 1. i ← 1, j ← 1, k ← 1. 2. Dokud k ≤ a + b: 3. Je-li (j > b) nebo (i ≤ a)&(yi < zj ) ⇒ xk ← yi , k + +, i + +. 4. Jinak ⇒ xk ← zj , k + +, j + +. 5. Vr´ at´ıme x1 , . . . , xn . Pozorov´ an´ı: Merge trv´ a Θ(n), nebot’ kaˇzdou ze sl´evan´ ych posloupnost´ı projdeme pr´avˇe jednou. ˇ Casov´ a sloˇ zitost: Rozdˇelov´ an´ı a sl´ev´ an´ı n´ am trv´ a line´ arnˇe dlouho, takˇze pro ˇcasovou sloˇzitost MergeSortu plat´ı tato rekurentn´ı rovnice, kterou vyresime pomoc´ı MT: T (n) = 2 · T (n/2) + Θ(n) =⇒ Θ(n1 log n) = Θ(n log n). Pamˇ et’ov´ a sloˇ zitost11 : M (n) = d · n + M (n/2) = d · n + d · n/2 + d · n/4 + · · · ≤ 2dn = Θ(n). Tento vztah plat´ı pro nˇejakou vhodnou konstantu d. M˚ uˇzeme ho opˇet nahl´ednout napˇr´ıklad ze stromu rekurzivn´ıch vol´ an´ı. Pod´ıvejme se na libovolnou cestu od koˇrene do listu. V jednotliv´ ych vrcholech potˇrebujeme pamˇeti pˇresnˇe d · n/2k , kde k je ˇc´ıslo hladiny. Kdyˇz tyto hodnoty seˇcteme pˇres vˇsechny vrcholy na t´eto cestˇe, v´ ysledek bude konvergovat k 2dn, coˇz d´ av´ a pamˇet’ovou sloˇzitost Θ(n). Z´ avˇ er: Mergesort bˇeˇz´ı V ˇcase Θ(n log n) a pamˇeti Θ(n). Line´arn´ı pamˇet’ov´a sloˇzitost nen´ı v´ yhodn´a, ale na druhou stranu se tento algoritmus velmi hod´ı napˇr´ıklad na tˇr´ıdˇen´ı line´ arn´ıch spojov´ ych seznam˚ u.
11 pro
zaj´ımavost, neni to asi nutne umet odvodit
26
3.4
Bin´ arn´ı vyhled´ avac´ı stromy, vyvaˇ zov´ an´ı, haldy
pozn. – jako skoro u vˇsech algoritm˚ u, doporuˇcuju si pustit Kuˇcerovo Algovision – http://www.algovision.org/Algovision/ Algovision.html – vysvˇetlivky k nˇemu jsou tady – http://kam.mff.cuni.cz/~ludek/AlgovisionTexts.html. Bin´ arn´ı strom Definice Dynamick´ a mnoˇzina je mnoˇzina prvk˚ u (datov´ a struktura), mˇen´ıc´ı se v ˇcase. Kaˇzd´ y jej´ı prvek je pˇr´ıstupn´ y pˇres ukazatel a obsahuje: • kl´ıˇc (jednu poloˇzku, typicky hodnotu z lin. uspoˇr´adan´e mnoˇziny), • ukazatel(e) na dalˇs´ı prvky, • pˇr´ıpadnˇe dalˇs´ı data. Na takov´e mnoˇzinˇe jsou definov´ any tyto operace: • • • • •
find - nalezen´ı prvku podle kl´ıˇce insert - pˇrid´ an´ı dalˇs´ıho prvku delete - odstranˇen´ı prvku min, max - nalezen´ı nejvˇetˇs´ıho / nejmenˇs´ıho prvku succ, pred - nalezen´ı n´ asleduj´ıc´ıho / pˇredch´ azej´ıc´ıho prvku k nˇejak´emu pˇredem dan´emu
Definice Bin´ arn´ı strom je dynamick´ a mnoˇzina, kde kaˇzd´ y prvek (uzel, node) m´a kromˇe kl´ıˇce a pˇr´ıp. dalˇs´ıch dat (tˇri) ukazatele na lev´eho a prav´eho syna (a rodiˇce). Speci´ aln´ı uzel je koˇren, kter´ y m´a NULLov´ y ukazatel na rodiˇce. Ten je v bin´arn´ım stromˇe jeden. Uzly, kter´e maj´ı NULLov´e ukazatele na prav´eho i lev´eho syna, se naz´ yvaj´ı listy. Podstrom je ˇc´ ast stromu (vybran´e prvky), kter´ a je sama stromem - napˇr. pokud se jako koˇren urˇc´ı jeden z prvk˚ u. Lev´y(prav´y) podstrom nˇejak´eho prvku je strom, ve kter´em je koˇrenem lev´ y(prav´ y) syn tohoto prvku. V´yˇska stromu je d´elka nejdelˇs´ı cesty od koˇrenu k listu. Bin´ arn´ı strom je dokonale vyv´ aˇzen´y, jestliˇze pro kaˇzd´ y jeho vrchol plat´ı, ˇze poˇcet prvk˚ u v jeho lev´em a prav´em podstromu se liˇs´ı nejv´ yˇse o 1. V´ yˇska dokonale vyv´ aˇzen´eho stromu roste logaritmicky vzhledem k poˇctu uzl˚ u. V´ yˇska nevyv´aˇzen´eho stromu m˚ uˇze r˚ ust aˇz line´ arnˇe vzhledem k poˇctu prvk˚ u (i spojov´ y seznam“ je platn´ y bin. strom). ” Bin´ arn´ı vyhled´ avac´ı strom Definice Bin´ arn´ı vyhled´ avac´ı strom je takov´ y bin´ arn´ı strom, ve kter´em je jeho struktura urˇcen´a podle kl´ıˇcu jeho uzl˚ u: pro kaˇzd´ y uzel s kl´ıˇcem hodnoty k plat´ı, ˇze jeho lev´ y podstrom obsahuje jen uzly s menˇs´ı hodnotou kl´ıˇce neˇz k a jeho prav´ y podstrom jen uzly s hodnotou kl´ıˇce vˇetˇs´ı nebo rovnou k. Algoritmus (Vyhled´ av´ an´ı v bin. stromˇe) Find( x - koˇ ren, k - hledan´ a hodnota kl´ ıˇ ce ){ while( x != NULL && k != x->kl´ ıˇ c ){ if ( k < x->kl´ ıˇ c ) x = x->lev´ y_syn; else x = x->prav´ y_syn; } return x; } Sloˇzitost je O(h) v nejhorˇs´ım pˇr´ıpadˇe, kde h je v´ yˇska stromu (tj. pro nevyv´aˇzen´e stromy aˇz O(n) kde n je poˇcet prvk˚ u). Asymptotick´ a ˇcasov´ a sloˇzitost ostatn´ıch operac´ı je stejn´a. Vloˇzen´ı a vymaz´ an´ı prvku se prov´ ad´ı prost´ ym nalezen´ım m´ısta, kam by se prvek mˇel vloˇzit (nebo kde uˇz je), a pˇrepojen´ım pointer˚ u.
Vyvaˇ zovan´ e vyhled´ avac´ı stromy Kv˚ uli zajiˇstˇen´ı vˇetˇs´ı rychlosti (menˇs´ı asymptotick´e ˇcasov´e sloˇzitosti) operac´ı byly vytvoˇreny speci´aln´ı druhy bin´ arn´ıch vyhled´ avac´ıch strom˚ u, kter´e jsou pr˚ ubˇeˇznˇe vyvaˇzov´ any, aby mˇely max. v´ yˇsku menˇs´ı neˇz c · log n, kde n je poˇcet uzl˚ u a c nˇejak´ a konstanta.
27
Definice (Pomocn´e operace na stromech) Pro vyvaˇzov´ an´ı strom˚ u pˇri vkl´ ad´ an´ı a odeb´ır´ an´ı uzl˚ u se definuj´ı pomocn´e operace: prav´ a a lev´ a rotace. Zachov´avaj´ı vlastnosti bin. vyhled´ avac´ıch strom˚ u a jsou provediteln´e v konstatn´ım ˇcase - jde jen o pˇrepojen´ı uzl˚ u n´asl. zp˚ usobem (pro pravou rotaci na uzlu Q a levou na P ):
(Zdroj obr´azku: Wikipedia) ˇ Definice (Cerveno-ˇ cern´e stromy) ˇ Cerveno-ˇ cern´e stromy jsou bin´ arn´ı vyhled´ avac´ı stromy s garantovanou max. v´ yˇskou O(log n), kde n je poˇcet uzl˚ u, tj. operace na nich mohou m´ıt asymptotickou ˇcasovou sloˇzitost O(log n). Pro jejich popis je nutn´e definovat intern´ı uzly - vˇsechny uzly stromu a extern´ı uzly - na (intern´ıch) listech (a uzlech s jedn´ım potomkem) umˇele pˇridan´e NULLov´e ukazatele (de facto listy“ ” ˇcerveno-ˇcern´eho stromu). Extern´ı uzly slouˇz´ı jenom jako abstrakce pro popis strom˚ u, pˇri implementaci se s nimi neoperuje. Pˇri operac´ıch (insert, delete) nedˇel´ ame nikdy v´ıc neˇz 2 rotace, a pouˇz´ıvaj´ı se ˇcasto pˇri implementaci asociativn´ıho pole. ˇ Cerveno-ˇ cern´ y strom m´ a tyto ˇctyˇri povinn´e vlastnosti: 1. 2. 3. 4.
Kaˇzd´ y Kaˇzd´ y Kaˇzd´ y Kaˇzd´ a
uzel (extern´ı i intern´ı) m´ a definovanou barvu, a to ˇcernou nebo ˇcervenou. extern´ı uzel a koˇren je ˇcern´ y. ˇcerven´ y vrchol mus´ı m´ıt oba syny ˇcern´e a otce taky. cesta od libovoln´eho vrcholu k list˚ um v jeho podstromˇe mus´ı obsahovat stejn´ y poˇcet ˇcern´ ych uzl˚ u.
Pro ˇcerveno-ˇcern´e stromy se definuje v´yˇska uzlu x (h(x)) jako poˇcet uzl˚ u na nejdelˇs´ı moˇzn´e cestˇe k listu v jeho podstromˇe. ˇ a v´yˇska uzlu (bh(x)) je poˇcet ˇcern´ Cern´ ych uzl˚ u na takov´e cestˇe. Vˇ eta (Vlastnosti ˇcerveno-ˇcern´ych strom˚ u) Podstrom libovoln´eho uzlu x obsahuje alespoˇ n 2bh(x) − 1 intern´ıch uzl˚ u. D´ıky tomu m´a ˇcerveno-ˇcern´ y strom v´ yˇsku vˇzdy nejv´ yˇse 2 log(n + 1) (kde n je poˇcet uzl˚ u). (D˚ ukaz prvn´ıho tvrzen´ı indukc´ı podle h(x), druh´eho z prvn´ıho a tˇret´ı vlastnosti ˇcerveno-ˇcern´ ych strom˚ u) D˚ usledek Operace hled´ an´ı (minima, maxima, n´ asledn´ıka, . . . ), kter´e jsou stejn´e jako u obecn´ ych bin´arn´ıch vyhled´avac´ıch strom˚ u, maj´ı garantovanou ˇcasovou sloˇzitost O(log n). Algoritmus (Vkl´ ad´ an´ı a odeb´ır´ an´ı uzl˚ u v ˇcerveno ˇcern´ych stromech) Obˇe operace maj´ı podle garantovan´e max. v´ yˇsky garantovanou ˇcas. sloˇzitost O(log n) pro n poˇcet uzl˚ u. Protoˇze bez poruˇsen´ı vlastnost´ı ˇcerveno-ˇcern´ ych strom˚ u lze koˇren vˇzdy pˇrebarvit naˇcerno, m˚ uˇzeme pro nˇe pˇredpokl´adat, ˇze koˇren stromu je vˇzdy ˇcern´y. Vkl´ ad´ an´ı vypad´ a n´ asledovnˇe: • Nalezen´ı m´ısta pro vloˇzen´ı a pˇrid´ an´ı nov´eho prvku jako v obecn´ ych bin. vyhl. stromech, nov´ y prvek se pˇrebarv´ı naˇcerveno. • Pokud je jeho otec ˇcern´ y, m˚ uˇzeme skonˇcit – vlastnosti strom˚ u jsou splnˇen´e. Pokud je ˇcerven´ y, mus´ıme strom upravovat (tady pˇredpokl´ ad´ am, ˇze otec pˇrid´ avan´eho uzlu je lev´ ym synem, opaˇcn´ y pˇripad je symetrick´ y): • Je-li i str´ yc ˇcerven´ y, pˇrebarvit otce a str´ yce naˇcerno a pˇren´est chybu o patro v´ yˇs (je-li dˇed ˇcern´ y, konˇc´ım, jinak m˚ uˇzu pokraˇcovat aˇz do koˇrene, kter´ y uˇz lze pˇrebarvovat beztrestnˇe). • Je-li str´ yc ˇcern´ y a pˇridan´ y uzel je lev´ ym synem, udˇelat pravou rotaci na dˇedovi a pˇrebarvit uzly tak, aby odpov´ıdaly vlastnostem strom˚ u. • Je-li str´ yc ˇcern´ y a pˇridan´ y uzel je prav´ ym synem, udˇelat levou rotaci na otci a pˇrev´est tak na pˇredchoz´ı pˇr´ıpad. Odeb´ır´ an´ı se prov´ ad´ı takto: • Odstran´ım uzel stejnˇe jako v pˇredchoz´ım pˇr´ıpadˇe. Opravdu odstranˇen´ y uzel (z pˇrepojov´an´ı) m´a max. jednoho syna. Pokud odstraˇ novan´ y uzel byl ˇcerven´ y, neporuˇs´ım vlastnosti strom˚ u, stejnˇe tak pokud jeho syn byl ˇcerven´ y – to ˇreˇs´ım jeho pˇrebarven´ım naˇcerno. • V opaˇcn´em pˇr´ıpadˇe (tj. syn odeb´ıran´eho – x – je ˇcern´ y) mus´ım udˇelat n´asl. u ´pravy (pˇrep. ˇze x je lev´ ym synem sv´eho nov´eho otce, v op. pˇr´ıpadˇe postupuji symetricky):
28
• x prohl´ as´ım za dvojitˇe ˇcern´ y“ a t´eto vlastnosti se pokouˇs´ım zbavit. ” • Pokud je bratr x (bud’ w) ˇcerven´ y, pak m´ a 2 ˇcern´e syny – provedu levou rotaci na rodiˇci x, prohod´ım barvy rodiˇce x a uzlu w a pˇrevedu tak situaci na jeden z n´ asl. pˇr´ıpad˚ u: • Je-li w ˇcern´ y a m´ a-li 2 ˇcern´e syny, prohl´ as´ım x za ˇcern´ y a pˇrebarv´ım w naˇcerveno, rodiˇce pˇrebarv´ım bud’ na ˇcerno (a konˇc´ım) nebo na dvojitˇe ˇcernou“ a propaguji chybu (mohu doj´ıt aˇz do koˇrene, kter´ y lze pˇrebarovat beztrestnˇe). ” • Je-li w ˇcern´ y, jeho lev´ y syn ˇcerven´ y a prav´ y ˇcern´ y, vymˇen´ım barvy w s jeho lev´ ym synem a na w pouˇziji pravou rotaci, ˇc´ımˇz dostanu posledn´ı pˇr´ıpad: • Je-li w ˇcern´ y a jeho prav´ y syn ˇcerven´ y, pˇrebarv´ım prav´eho syna naˇcerno, odstran´ım dvojitˇe ˇcernou z x, provedu levou rotaci na w a pokud mˇel p˚ uvodnˇe w (a x) ˇcerven´eho otce, pˇrebarv´ım w naˇcerveno a tohoto (ted’ uˇz lev´eho syna w) pˇrebarv´ım naˇcerno. Definice (AVL stromy (Adelson-Velsky & Landis)) AVL stromy jsou, podobnˇe jako ˇcerveno-ˇcern´e stromy, bin. vyhled´avac´ı stromy, kter´e zaruˇcuj´ı max. logaritmick´ y n´ ar˚ ust v´ yˇsky vzhledem k poˇctu prvk˚ u. Pro kaˇzd´ y uzel x se v AVL stromu definuje faktor vyv´ aˇzen´ı jako rozd´ıl v´ yˇsky jeho lev´eho a prav´eho podstromu: bf (x) = h(x->lev´ y) − h(x->prav´ y). Pro vˇsechny uzly v AVL stromu plat´ı, ˇze |bf (x)| ≤ 1. Vˇ eta (Zaruˇcen´ı v´yˇsky AVL strom˚ u) V´ yˇska AVL stromu s n vrcholy je O(log n). (D˚ ukaz: bud’ Tn AVL strom v´ yˇsky n s minim´aln´ım poˇctem uzl˚ u. Ten√m´ a podstromy ukaz Tn−1 a Tn−2 atd., tj. velikost minim´ aln´ıho AVL stromu roste jako Fibonacciho posloupnost, tedy |Tn | ≥ ( 1+2 5 )n−1 . D˚ tohoto indukc´ı.) Algoritmus (Operace na AVL stromech) Vyhled´ avac´ı operace se prov´ ad´ı stejnˇe jako na obecn´ ych bin. vyhled´avac´ıch stromech, vkl´ad´an´ı a odeb´ır´an´ı prvk˚ u taky, ale pokud tyto operace poruˇs´ı z´ akl. vlastnost AVL strom˚ u (|bf (x) = 2|), je nutn´e prov´est vyvaˇzov´an´ı – pomoc´ı rotac´ı (kter´e mohou b´ yt propagov´ any aˇz ke koˇreni). Pˇri vkl´ ad´ an´ı a odeb´ır´an´ı je nav´ıc nutn´e pr˚ ubˇeˇznˇe (nejh˚ uˇre aˇz ke koˇreni) upravovat indikaci faktoru vyv´ aˇzen´ı jednotliv´ ych uzl˚ u. TODO: Splay stromy + Optim´ alni BVS! Halda Definice Halda(heap) je dynamick´ a mnoˇzina se stromovou strukturou (bin´arn´ı halda je bin´arn´ı strom), pro kterou plat´ı tzv. vlastnost ” haldy“: Je-li x potomek y, pak x->kl´ ıˇ c ≥ y->kl´ ıˇ c Haldy s touto nerovnost´ı jsou tzv. min-heapy, pokud je nerovnost opaˇcn´a, jde o max-heap. (Bin´ arn´ı) haldy Bin´ arn´ı haldy jsou nejˇcastˇejˇs´ım typem haldy. Zajiˇst’uj´ı nalezen´ı minim´aln´ıho prvku v konstantn´ım ˇcase a odebr´ an´ı a pˇrid´ an´ı minima v ˇcase O(log n). V kaˇzd´e hladinˇe od prvn´ı aˇz do pˇredposledn´ı je max. moˇzn´ y poˇcet uzl˚ u, v posledn´ı jsou uzly co nejv´ıce vlevo“ – tedy max. v´ yˇska haldy s n prvky je (log n) + 1. Proto je pro bin´arn´ı haldy jednoduˇse provediteln´a jejich datov´ a ” reprezentace polem (bez pointer˚ u), kde pˇri indexov´ an´ı od 0 m´a uzel na indexu k: • Lev´eho a prav´eho syna na indexu 2k + 1, resp. 2k + 2 (pokud to nen´ı v´ıc neˇz celk. poˇcet prvk˚ u, potom syny nem´ a). k • Rodiˇce na indexu d 2 e − 1. Pˇrid´ an´ı uzlu do haldy znamen´ a pˇrid´ an´ı prvku na konec haldy a dokud m´a jeho rodiˇc vˇetˇs´ı kl´ıˇc, jeho prohazov´ an´ı s rodiˇcem (tedy posouv´ an´ı o vrstvu v´ yˇs). Pˇri odeb´ır´ an´ı uzlu z haldy tento nahrad´ım posledn´ım prvkem v haldˇe a potom dokud neplat´ı vlastnost haldy (nejm´enˇe jeden z potomk˚ u m´ a menˇs´ı kl´ıˇc), prohazuji ho s potomkem s menˇs´ım kl´ıˇcem (a posouv´ am o vrstvu n´ıˇz). Vytvoˇren´ı haldy je moˇzn´e v ˇcase O(n), kde n je poˇcet prvk˚ u v haldˇe – pˇrid´an´ı 1 prvku do haldy trv´a O(h), kde h je n aktu´ aln´ı v´ yˇska (a h roste od 0 aˇz k dlog ne, poˇcet prvk˚ u ve v´ yˇsce k je 2k+1 , bereme-li v´ yˇsku list˚ u rovnou nule) - v souˇctu za Pdlog ne h vˇsechny prvky jde o O(n · h=0 2h ). Bin´ arn´ı halda se pouˇz´ıv´ a napˇr. k tˇr´ıdˇen´ı haldou (heapsortu), kdy se z dat, kter´a je potˇreba utˇr´ıdit, nejdˇr´ıve postav´ı halda, a potom se opakuje operace odebr´ an´ı koˇrene (tj. minim´aln´ıho prvku). TODO: Binomi´ aln´ı haldy! Fibonacciho haldy Fibonacciho haldy maj´ı n´ızkou ˇcasovou sloˇzitost bˇeˇzn´ ych operac´ı – amortizovanˇe O(1) pro vloˇzen´ı, hled´an´ı minima apod.; odebr´ an´ı prvku a odebr´ an´ı minima m´ a sloˇzitost O(log n) pro n prvk˚ u v haldˇe. Tvoˇr´ı ji skupina strom˚ u, vyhovuj´ıc´ıch vlastnosti ” haldy“. Kaˇzd´ y uzel haldy s n prvky m´ a max. log n potomk˚ u a ve sv´em podstromˇe minim´alnˇe Fk+2 uzl˚ u, kde Fk je k-t´e Fibonacciho ˇc´ıslo. To je zajiˇstˇeno pravidlem, ˇze pˇri odeb´ır´an´ı prvk˚ u lze z nekoˇrenov´eho uzlu oddˇelit max. 1 syna, jinak je nutn´e oddˇelit i tento uzel a ten se pak stane koˇrenem dalˇs´ıho stromu. Poˇcet strom˚ u se sniˇzuje pˇri odeb´ır´an´ı minima, kdy jsou spojov´ any dohromady. Fibonacciho haldy se pouˇz´ıvaj´ı pro efektivn´ı implementaci sloˇzitˇejˇs´ıch operac´ı, jako napˇr. Jarn´ıkova nebo Dijkstrova algoritmu.
29
Report Napsal jsem tam toho myslim dost, popis a slozitost operaci, prumerna vyska pr. stromu, u AVL rotace, kolik max rotaci pri jake operaci, max hloubku AVL stromu, i tu haldu, vcetne pekne reprezentace v poli (tam jsem nenapsal, ze syny najdu na pozici a2i a a2i+1, na coz se pak doplnkove ptal). Pro doplneni chtel CC stromy a splay-stromy (tam jsem zvoral, ze se vyhledavany zaznam ”strci”do korene, pote, co zvedl oboci, jsem se rychle opravil ”Ja jsem blbej, zarotuje az do korene”). Halda se mu nezdala, ac jsem tam napsal to vyuziti pri trideni na vnejsi pameti (predtrideni dvojitou haldou) - doufal jsem, ze ho to potesi, kdyz jsme to brali na OZD. ;) ... ”Hmmm, a co jiny haldy?”Tak jsem priznal, ze nevim, ze jsem akorat slysel o Fibonaciho haldach. Chtel neco s vice-arnimi haldami a haldami, jejichz nazev jsem slysel snad poprve v zivote. Report Zemla byl....no, jako na OZD, co k tomu rict;). Otazky vybiral podle xichtu a me osobne moc nerypal (ostatni ze skupiny toto zrejme ale nepotvrdi) - zakladem je ho zahltit papiry a prikyvovat;). Prekladace byly dost zamotane a navic byl dost nespokojen, ze znam jen klasicke haldy a zadne fibbonacciho,leftist,... Na konci me ohromil vetou ”Tak to mate vymalovano”. Report BVS a vyvaˇzov´ an´ı: (AVL + RedBlack). Dotaz na optim´aln´ı vyhled´avac´ı stromy: popsal jsem splay (aniˇz jsem tuˇsil, ˇze se tak jmenuj´ı), ale ˇze na statick´e o.v.s. se hod´ı dynamick´e programov´an´ı, jsem si ”vzpomnil”aˇz po n´apovidi. Report Tohle jsem mel vse, az na malou chybicku u AVL, ze pri pridani staci provest max. jednu rotaci a take jsem nevededel vyhledavaci stromy, kde krom klice je ulozena i potencionalni cetnost hledani. Report B-stromy a analogie s RB stromy - nechtil v´ıc neˇz definici a odhady sloˇzitosti FIND v nejhorˇs´ım a nejlepˇs´ım po´ıpadi Report BVS a vyvazovani - tady chtel Kopecky slyset rozdily mezi AVL a RB, algoritmus pro optimalni binarni vyhledavaci strom, splay stromy Report Tady to bylo celkem v pohode, az na to, ze se jim trochu nelibilo, ze jsem nedal dohromady definici optimalniho BVS, haldy jim stacily pouze binarni, zadne Fibonacciho ani slyset nechteli
30
3.5
Haˇ sov´ an´ı
Definice (slovn´ıkov´y probl´em) D´ ano univerzum U , m´ ame reprezentovat S ⊆ U a navrhnout algoritmy pro operace • MEMBER(x) - zjist´ı zda x ∈ S a pokud ano nalezne kde, • INSERT(x) - pokud x ∈ / S, vloˇz´ı x do struktury reprezentuj´ıc´ı S, • DELETE(x) - kdyˇz x ∈ S, smaˇze x ze struktury reprezentuj´ıc´ı S. Napˇr´ıklad pomoc´ı pole m˚ uˇzeme tyto operace implementovat rychle, ale nev´ yhodou je prostorov´a n´aroˇcnost. Pro velk´e mnoˇziny je to nˇekdy dokonce nemoˇzn´e. Haˇsov´ an´ı se snaˇz´ı zachovat rychlost operac´ı a odstranit prostorovou n´aroˇcnost. Pod´ıvejme se nyn´ı na z´ akladn´ı ideu haˇsov´ an´ı. Mˇejme univerzum U a mnoˇzinu S ⊆ U takovou, ˇze |S| << |U |. D´ ale mˇejme funkci h : U → {0, 1, . . . , m − 1}. Mnoˇzinu S potom reprezentujeme tabulkou (polem) o velikosti m tak, ˇze prvek x ∈ S je uloˇzen na ˇr´ adku h(x). Definice (Haˇsovac´ı funkce, kolize) Funkci h : U → {0, 1, . . . , m − 1} potom naz´ yv´ ame haˇ sovac´ı funkc´ı. Situaci h(s) = h(t), pro s 6= t; s, t ∈ S nazveme kolize. Jelikoˇz mohutnost univerza U je vˇetˇs´ı neˇz velikost haˇsovac´ı tabulky, nelze se koliz´ım u ´plnˇe vyhnout. Existuje spousta r˚ uzn´ ych metod, jak kolize ˇreˇsit. Pod´ıvejme se tedy na nˇekter´e podrobnˇeji. Definice Jeˇstˇe si zavedeme nˇekter´e znaˇcen´ı. Velikost S (haˇsovan´e mnoˇziny) oznaˇcme n, velikost tabulky (pole) oznaˇcme m, a faktor n . naplnˇen´ı α = m
Haˇ sov´ an´ı se separovan´ ymi ˇ retˇ ezci ˇ kaˇzd´ Pouˇzijeme pole velikosti m, jehoˇz i-t´ a poloˇzka bude spojov´ y seznam Si takov´ y, ˇze s ∈ Si ⇔ h(s) = i, pro s ∈ S. Cili y ˇr´ adek pole obsahuje spojov´ y seznam vˇsech (koliduj´ıc´ıch) prvk˚ u, kter´e jsou haˇsov´any na tento ˇr´adek. Seznamy nemus´ı b´ yt uspoˇr´ adan´e, vznikaj´ı tak, jak jsou vkl´ ad´ any jednotliv´e prvky do struktury. Algoritmus (Haˇsov´ an´ı se separovan´ymi ˇretˇezci) • MEMBER – Spoˇcteme hodnotu haˇsovac´ı funkce h(x), prohled´ame ˇretˇezec zaˇc´ınaj´ıc´ı na pozici h(x) a zjist´ıme zda se prvek nach´ az´ı, ˇci nenach´ az´ı ve struktuˇre. Pokud se prvek v datab´azi nach´az´ı, tak mus´ı nutnˇe leˇzet v tomto ˇretˇezci. • INSERT – Zjist´ıme zda x je v ˇretˇezci h(x), pokud ne, pˇrid´ame ho nakonec, v opaˇcn´em pˇr´ıpadˇe nedˇel´ame nic. • DELETE – Vyhled´ a x v ˇretˇezci h(x) a smaˇze ho. Pokud se tam x nenach´az´ı, neudˇel´a nic.
Oˇ cek´ avan´ y poˇ cet test˚ u v ne´ uspˇeˇsn´em pˇr´ıpadˇe je pˇribliˇznˇe e−α + α a pˇri u ´spˇeˇsn´em vyhled´av´an´ı pˇribliˇznˇe 1 + α2 . Haˇ sov´ an´ı s uspoˇ r´ adan´ ymi ˇ retˇ ezci Jak jiˇz je zˇrejm´e z n´ azvu je tato metoda t´emˇeˇr stejn´ a jako pˇredchoz´ı. Jedin´ y rozd´ıl je, ˇze jednotliv´e seznamy jsou uspoˇr´ ad´ any vzestupnˇe dle velikosti prvk˚ u. Algoritmus (Haˇsov´ an´ı s uspoˇr´ adan´ymi ˇretˇezci) Rozd´ıly jsou pouze pro operaci MEMBER, kde skonˇc´ıme prohled´av´an´ı, kdyˇz dojdeme na konec, nebo kdyˇz nalezneme prvek, kter´ y je vˇetˇs´ı neˇz hledan´ y a operaci INSERT, kter´e vkl´ad´a prvek na m´ısto kde jsme ukonˇcili vyhled´av´an´ı (pˇred prvek, kter´ y ho ukonˇcil).
Oˇ cek´ avan´ y poˇ cet test˚ u v ne´ uspˇeˇsn´em pˇr´ıpadˇe je pˇribliˇznˇe roven e−α + 1 + α2 − α1 (1 − e−α ) a v u ´spˇeˇsn´em pˇr´ıpadˇe je pˇribliˇznˇe α 1+ 2. Nev´ yhodou pˇredchoz´ıch dvou metod je nerovnomˇern´e vyuˇzit´ı pamˇeti. Zat´ımco nˇekter´e seznamy mohou b´ yt dlouh´e, v nˇekter´ ych ˇ sen´ım je naj´ıt zp˚ nen´ı prvek ˇz´ adn´ y. Reˇ usob, jak koliduj´ıc´ı prvky ukl´adat na jin´e (pr´azdn´e) ˇr´adky tabulky. Potom je ale nutn´e kaˇzd´ y prvek tabulky rozˇs´ıˇrit a poloˇzky pro pr´ aci s tabulkou. ˇ ım pouˇzijeme sofistikovanˇejˇs´ı metodu ukl´ C´ ad´ an´ı dat do tabulky, t´ım v´ıce budeme potˇrebovat poloˇzek pro pr´aci s tabulkou a tedy vzroste pamˇet’ov´ a n´ aroˇcnost. Naˇs´ım c´ılem je tedy naj´ıt rozumn´ y kompromis mezi sofistikovanost´ı (rychlost´ı) strategie a jej´ı pamˇet’ovou n´ aroˇcnost´ı. Pod´ıvejme se na dalˇs´ı algoritmy, kter´e se o to pokouˇsej´ı. Haˇ sov´ an´ı s pˇ rem´ıst’ov´ an´ım Seznamy jsou tentokr´ at ukl´ ad´ any do tabulky a implementov´any jako dvousmˇern´e. Potˇrebujeme tedy dvˇe poloˇzky pro pr´ aci s tabulkou: next – ˇc´ıslo ˇr´ adku obsahuj´ıc´ı dalˇs´ı prvek seznamu a previous – ˇc´ıslo ˇr´adku obsahuj´ıc´ı pˇredchoz´ı prvek seznamu. Kdyˇz dojde ke kolizi, tj. chceme vloˇzit prvek a jeho m´ısto je obsazen´e prvkem z jin´eho ˇretˇezce, pak tento prvek z jin´eho ˇretˇezce pˇrem´ıst´ıme na jin´ y pr´ azdn´ y ˇr´ adek v tabulce (proto haˇsov´an´ı s pˇrem´ıst’ov´an´ım).
31
Algoritmus (Haˇsov´ an´ı s pˇrem´ıst’ov´ an´ım) Algoritmus MEMBER funguje stejnˇe jako u haˇsov´an´ı se separovan´ ymi ˇretˇezci, jen m´ısto ukazatele na dalˇs´ı prvek pouˇzije hodnotu next z tabulky. Pˇri operaci INSERT vloˇz´ıme prvek kam patˇr´ı pokud je tam m´ısto, pokud jiˇz je m´ısto obsazeno prvkem kter´ y tam patˇr´ı, ˇcili zde zaˇc´ın´ a seznam koliduj´ıc´ıch prvk˚ u (previous = pr´azdn´e), pak postupujeme po poloˇzk´ ach next aˇz na konec seznamu, vloˇz´ıme prvek na nˇekter´ y voln´ y ˇr´adek tabulky a vypln´ıme spr´avnˇe hodnoty next a previous. Pokud je m´ısto obsazeno prvkem z jin´eho seznamu (previous 6= pr´azdn´e), tak tento prvek pˇrem´ıst´ıme na nˇekter´ y voln´ y ˇr´ adek, spr´ avnˇe pˇrep´ıˇseme poloˇzky next a previous v mˇenˇen´em seznamu a vkl´adan´ y prvek uloˇz´ıme na jeho m´ısto. Operace DELETE je vcelku pˇr´ımoˇcar´ a, jenom je tˇreba, pokud maˇzeme prvn´ı prvek seznamu na jeho m´ısto pˇresunout ten druh´ y v poˇrad´ı (pokud existuje).
Oˇ cek´ avan´ y poˇ cet test˚ u je v ne´ uspˇeˇsn´em pˇr´ıpadˇe roven pˇribliˇznˇe (1 − 1 haˇsov´ an´ı se separovan´ ymi ˇretˇezci a tedy n−1 2m + 1 ≈ 1 + α .
1 n m)
+
n m
≈ e−α + α a v u ´spˇeˇsn´em je stejn´ y jako pro
Haˇ sov´ an´ı se dvˇ ema ukazateli Haˇsov´ an´ı s pˇrem´ıst’ov´ an´ım m´ a tu nev´ yhodu, ˇze d´ıky pˇremist’ov´an´ı prvk˚ u jsou operace INSERT a DELETE ˇcasovˇe n´ aroˇcn´e. Tato metoda tedy implementuje ˇretˇezce jako jednosmˇern´e seznamy, ale takov´e kter´e nemusej´ı zaˇc´ınat na sv´em m´ıstˇe, tj. ˇretˇezec Sj obsahuj´ıc´ı prvky s ∈ S takov´e, ˇze h(s) = j, nemus´ı zaˇc´ınat na j-t´em ˇr´adku. M´ısto ukazatele na pˇredchoz´ı prvek tak do poloˇzek pro pr´ aci s tabulkou pˇrid´ ame ukazatel na m´ısto, kde zaˇc´ın´a ˇretˇezec pˇr´ısluˇsn´ y dan´emu ˇr´adku. Poloˇzky pro pr´aci s tabulkou tedy budou: next – ˇc´ıslo ˇr´ adku tabulky kde je dalˇs´ı prvek seznamu, begin – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı prvn´ı prvek seznamu pˇr´ısluˇsn´eho tomuto m´ıstu. Algoritmus (Haˇsov´ an´ı se dvˇema ukazateli) Poloˇzka begin v j-t´em ˇr´ adku je vyplnˇena pr´ avˇe tehdy, kdyˇz reprezentovan´a mnoˇzina S obsahuje prvek s ∈ S takov´ y, ˇze h(s) = j. Algoritmy jsou potom podobn´e tˇem u haˇsov´ an´ı s pˇrem´ıst’ov´an´ım, ale pˇrem´ıst’ov´an´ı prvk˚ u je nahrazeno odpov´ıdaj´ıc´ımi zmˇenami v poloˇzce begin dan´ ych ˇr´ adk˚ u. D´ıky pr´ aci s poloˇzkami jsou operace INSERT a DELETE rychlejˇs´ı neˇz pˇri haˇsov´an´ı s pˇrem´ıst’ov´an´ım, ale zaˇc´ atek ˇretˇezce v jin´em ˇr´ adku tabulky pˇrid´ a nav´ıc jeden test, coˇz zmˇen´ı sloˇzitost operace MEMBER. Oˇ cek´ avan´ y poˇ cet test˚ u v ne´ uspˇeˇsn´em pˇr´ıpadˇe je pˇribliˇznˇe 1 + (n−1)(n−2) n−1 α2 + 2m ≈ 1 + 6 + α2 1+ 6m2
α2 2
+ α + e−α (2 + α) − 2 a pˇri u ´spˇeˇsn´em vyhled´ av´ an´ı je roven
Sr˚ ustaj´ıc´ı haˇ sov´ an´ı Nyn´ı se pod´ıv´ ame na nˇekolik verz´ı metody, kter´ a se naz´ yv´a sr˚ ustaj´ıc´ı haˇsov´an´ı. Budeme potˇrebovat jedinou poloˇzku pro pr´ aci s tabulkou a to ukazatel jednosmˇern´eho spojov´eho seznamu. Na rozd´ıl od pˇredchoz´ıch metod zde nejsou ˇretˇezce separovan´e, v jednom ˇretˇezci mohou b´ yt prvky s r˚ uznou hodnotou haˇsovac´ı funkce. Kdyˇz m´ame pˇridat prvek s, tak ho zaˇrad´ıme do ˇretˇezce, ˇ ezce tedy v t´eto metodˇe sr˚ kter´ y se nach´ az´ı na h(s)-t´em ˇr´ adku tabulky. Retˇ ustaj´ı. R˚ uzn´e verze t´eto metody se liˇs´ı t´ım, kam pˇrid´ av´ ame nov´ y prvek a podle pr´ ace s pamˇet´ı. Dˇel´ı se na standardn´ı sr˚ ustaj´ıc´ı haˇsov´ an´ı bez pomocn´e pamˇeti a na haˇsov´ an´ı pouˇz´ıvaj´ıc´ı pomocnou pamˇet’, kter´emu se ˇr´ık´ a jen sr˚ ustaj´ıc´ı haˇsov´ an´ı. Nejdˇr´ıve se budeme vˇenovat metod´ am standardn´ıho sr˚ ustaj´ıc´ıho haˇsov´an´ı (bez pomocn´e pamˇeti): • LISCH – late-insertion standard coalesced hashing – vkl´ad´a se za posledn´ı prvek ˇretˇezce, • EISCH – early-insertion standard coalesced hashing – vkl´ad´a se za prvn´ı prvek ˇretˇezce. Pˇrirozen´ a efektivn´ı operace DELETE pro standardn´ı sr˚ ustaj´ıc´ı haˇsov´an´ı nen´ı zn´ama. Na druhou stranu i primitivn´ı algoritmy maj´ı rozumnou oˇcek´ avanou ˇcasovou sloˇzitost. Dalˇs´ı ot´ azka zn´ı, proˇc pouˇz´ıvat metodu EISCH, kdyˇz programy pro metodu LISCH jsou jednoduˇsˇs´ı. Odpovˇed’ je na prvn´ı pohled dost pˇrekvapuj´ıc´ı. Pˇri u ´spˇeˇsn´em vyhled´ av´ an´ı je metoda EISCH rychlejˇs´ı neˇz metoda LISCH. Je to proto, ˇze je o nˇeco pravdˇepodobnˇejˇs´ı, ˇze se bude pracovat s nov´ ym prvkem. V ne´ uspˇeˇsn´em pˇr´ıpadˇe jsou samozˇrejmˇe obˇe metody stejn´e, nebot’ ˇretˇezce jsou u obou stejnˇe dlouh´e. Metody sr˚ ustaj´ıc´ıho haˇsov´ an´ı (s pomocnou pamˇet´ı) maj´ı pouˇzitou pamˇet’ rozdˇelenou na dvˇe ˇc´asti. Na tu pˇr´ımo adresovatelnou haˇsovac´ı funkc´ı a na pomocnou ˇc´ ast. Adresovac´ı ˇc´ ast m´a m ˇr´adk˚ u, pokud haˇsovac´ı funkce m´a hodnoty z oboru {0, 1, . . . , m − 1}, v pomocn´e ˇc´ asti jsou ˇr´ adky ke kter´ ym nem´ ame pˇr´ıstup pˇres haˇsovac´ı funkci. Kdyˇz pˇri pˇrid´av´an´ı nov´eho prvku vznikne kolize, tak se nejprve vybere voln´ y ˇr´ adek z pomocn´e ˇc´ asti a teprve kdyˇz je pomocn´e ˇc´ast zaplnˇena pouˇzij´ı se k ukl´ad´an´ı koliduj´ıc´ıch prvk˚ u ˇr´ adky z adresovateln´e ˇc´ asti tabulky. Tato strategie oddaluje sr˚ ust´an´ı ˇretˇezc˚ u. Sr˚ ustaj´ıc´ı haˇsov´an´ı se tedy, aspoˇ n dokud nen´ı zaplnˇena pomocn´ a ˇc´ ast tabulky, podob´ a haˇsov´ an´ı se separovan´ ymi ˇretˇezci. Existuj´ı z´akladn´ı tˇri varianty: • LICH – late-insertion coalesced hashing – vkl´ ad´a prvek na konec ˇretˇezce, • VICH – early-insertion coalesced hashing – vkl´ ad´a prvek na ˇr´adek h(x) pokud je pr´azdn´ y a nebo hned za prvek na ˇr´ adku h(x), • EICH – varied-insertion coalesced hashing – vkl´ad´a se za posledn´ı prvek ˇretˇezce, kter´ y je jeˇstˇe v pomocn´e ˇc´ asti. Pokud v pomocn´e ˇc´ asti ˇz´ adn´ y nen´ı, vkl´ ad´ a se hned za prvek na pozici h(x). Tyto metody nepodporuj´ı pˇrirozen´e efektivn´ı algoritmy pro operaci DELETE.
32
Haˇ sov´ an´ı s line´ arn´ım pˇ rid´ av´ an´ım N´asleduj´ıc´ı metoda nepouˇz´ıv´ a ˇz´ adn´e poloˇzky pro pr´ aci s tabulkou to znamen´a, ˇze zp˚ usob nalezen´ı dalˇs´ıho ˇr´adku ˇretˇezce je zabudov´ an pˇr´ımo do metody. Metoda funguje tak, ˇze pokud chceme vloˇzit prvek do tabulky a nastane kolize, najdeme prvn´ı n´asleduj´ıc´ı voln´ y ˇr´ adek a tam prvek vloˇz´ıme. Pˇredpokl´ad´ame, ˇze ˇr´adky jsou ˇc´ıslov´any modulo m, ˇcili vytv´aˇrej´ı cyklus d´elky m. Tato metoda sice vyuˇz´ıv´ a minim´ aln´ı velikost pamˇeti, ale v tabulce vznikaj´ı shluky obsazen´ ych ˇr´adk˚ u a proto je pˇri velk´em zaplnˇen´ı pomal´ a. Nav´ıc metoda nepodporuje efektivn´ı operaci DELETE. Shrnut´ı Zde uvedeme poˇrad´ı metod haˇsov´ an´ı podle oˇcek´ avan´eho poˇctu test˚ u. Ne´ uspˇ eˇ sn´ e vyhled´ av´ an´ı: 1. 2. 3. 4. 5. 6. 7.
Haˇsov´ an´ı s uspoˇr´ adan´ ymi separovan´ ymi ˇretˇezci, Haˇsov´ an´ı se separovan´ ymi ˇretˇezci = Haˇsov´ an´ı s pˇrem´ıst’ov´an´ım, Haˇsov´ an´ı se dvˇema ukazateli, VICH = LICH EICH, LISCH = EISCH, Haˇsov´ an´ı s line´ arn´ım pˇrid´ av´ an´ım.
´ eˇ Uspˇ sn´ e vyhled´ av´ an´ı 1. 2. 3. 4. 5. 6. 7. 8.
H. s uspoˇr´ adan´ ymi ˇretˇezci = H. se separovan´ ymi ˇretˇezci = H. s pˇrem´ıst’ov´an´ım, Haˇsov´ an´ı se dvˇema ukazateli, VICH, LICH, EICH, EISCH, LISCH, Haˇsov´ an´ı s line´ arn´ım pˇrid´ av´ an´ım.
Pozn´ amka Metody se separovan´ ymi ˇretˇezci a sr˚ ustaj´ıc´ı haˇsov´ an´ı pouˇz´ıvaj´ı v´ıce pamˇeti. Metoda s pˇrem´ıst’ov´an´ım vyˇzaduje v´ıce ˇcasu – na pˇrem´ıstˇen´ı prvku. Ot´ azka kter´ a z metod je nejlepˇs´ı nen´ı proto jednoznaˇcnˇe rozhodnuteln´a a je nutn´e peˇclivˇe zv´ aˇzit vˇsechny okolnosti nasazen´ı metody a vˇsechny naˇse poˇzadavky na n´ı, neˇz se rozhodneme, kterou pouˇzijeme.
Univerz´ aln´ı haˇ sov´ an´ı Pro dobr´e fungov´ an´ı haˇsov´ an´ı potˇrebujeme mimo jin´e, aby vstupn´ı data byla rovnomˇernˇe rozdˇelena a toho nˇekdy nen´ı moˇzn´e dos´ ahnout. Odstranit tento nedostatek se pokouˇs´ı metoda univerz´ aln´ı haˇsov´ an´ı. Z´akladn´ı idea t´eto metody je takov´ a, ˇze m´ ame mnoˇzinu H haˇsovac´ıch funkc´ı z univerza do tabulky velikosti m takov´ ych, ˇze pro S ⊆ U , |S| ≤ m se vˇetˇsina funkc´ı chov´ a dobˇre v tom smyslu, ˇze m´ a mal´ y poˇcet koliz´ı. Haˇsovac´ı funkci potom zvol´ıme z mnoˇziny H (takovou s rovnomˇern´ ym rozdˇelen´ım). Jelikoˇz funkci vol´ıme my, m˚ uˇzeme poˇzadavek rovnomˇern´eho rozdˇelen´ı zajistit. Jeden z takov´ ych syst´em˚ u funkc´ı je napˇr´ıklad ha,b (x) = ((ax + b) mod |U |) mod m, kde a, b jsou n´ahodnˇe voleny. Perfektn´ı haˇ sov´ an´ı Jin´ a moˇznost jak vyˇreˇsit kolize, je naj´ıt takzvanou perfektn´ı haˇsovac´ı funkci, tj. takovou kter´e nepˇripouˇst´ı kolize. Nev´ yhoda t´eto metody je, ˇze nelze dost dobˇre implementovat operaci INSERT, proto se d´a prakticky pouˇz´ıt pouze tam, kde pˇredpokl´ ad´ ame hodnˇe operac´ı MEMBER a jen velmi m´ alo operac´ı INSERT. Kolize se potom daj´ı ˇreˇsit tˇreba malou pomocnou tabulkou, kam se ukl´ adaj´ı koliduj´ıc´ı data. Pro rozumn´e fungov´ an´ı metody je nutn´e, aby haˇsovac´ı funkce byla rychle spoˇcitateln´a a aby jej´ı zad´an´ı nevyˇzadovat mnoho pamˇeti, nejv´ yhodnˇejˇs´ı je analytick´e zad´ an´ı. Naopak jedna z v´ yhod je, ˇze nalezen´ı perfektn´ı haˇsovac´ı funkce, m˚ uˇze trvat dlouho, nebot’ ho prov´ad´ıme pouze jednou na zaˇca´tku algoritmu. Extern´ı haˇ sov´ an´ı Extern´ı haˇsov´ an´ı ˇreˇs´ı trochu jin´ y probl´em, neˇz v´ yˇse popsan´e metody. Chceme uloˇzit data na extern´ı m´edium a protoˇze pˇr´ıstup k extern´ım m´edi´ım je o nˇekolik ˇr´ ad˚ u pomalejˇs´ı, neˇz pr´ace v intern´ı pamˇeti, bude naˇs´ım c´ılem minimalizovat poˇcet pˇr´ıstup˚ u do n´ı. Extern´ı pamˇet’ b´ yv´ a rozdˇelena na str´ anky a ty vˇetˇsinou naˇc´ıt´ame do intern´ı pamˇeti cel´e. Tato operace je vˇsak velice pomal´ a. Probl´emem extern´ıho haˇsov´ an´ı je tedy nal´ezt datovou strukturu pro uloˇzen´ı dat na vnˇejˇs´ı pamˇeti a algoritmy pro operace INSERT, DELETE a MEMBER, tak abychom pouˇzili co nejmenˇs´ı poˇcet komunikac´ı mezi vnˇejˇs´ı a vnitˇrn´ı pamˇet´ı.
33
Metod extern´ıho haˇsov´ an´ı je opˇet mnoho. Nˇekter´e pouˇz´ıvaj´ı pomocnou datovou strukturu v intern´ı pamˇeti, kterou ˇcasto naz´ yv´ ame adres´ aˇr. Pokud metody nemaj´ı ˇz´ adnou takovou pomocnou strukturu neobejdou se obvykle bez oblasti pˇreteˇcen´ı. Nˇekter´e zn´ amˇejˇs´ı metody vnˇejˇs´ıho haˇsov´ an´ı jsou napˇr´ıklad: Litwinovo line´arn´ı haˇsov´an´ı“, Faginovo rozˇsiˇriteln´e haˇsov´ an´ı“, ” ” Cormackovo perfektn´ı haˇsov´ an´ı“ nebo Perfektn´ı haˇsov´an´ı Larsona a Kajli“. ” ”
34
3.6
Sekvenˇ cn´ı tˇ r´ıdˇ en´ı, porovn´ avac´ı algoritmy, pˇ rihr´ adkov´ e tˇ r´ıdˇ en´ı, tˇ r´ıd´ıc´ı s´ıtˇ e
TODO: trochu v´ıc formalismu by tu neˇskodilo, taky je potˇreba sjednotit ´oˇckovou notaci (zˇrejmˇe prost´e nahrazen´ı symbolu O symbolem Θ by staˇcilo, ale chce to ovˇeˇrit). Sekvenˇ cn´ı tˇ r´ıdˇ en´ı a porovn´ avac´ı algoritmy Pojmy sekvenˇcn´ı tˇr´ıdˇen´ı“ a porovn´ avac´ı algoritmy“ mohou znamenat vlastnˇe cokoliv, takˇze uvedu p´ar nejbˇeˇznˇejˇs´ıch tˇr´ıd´ıc´ıch ” ” algoritm˚ u a budu doufat, ˇze to bude ke zkouˇsce staˇcit :-(. Zdrojem mi budiˇz Wikipedie a kniha Algoritmy a programovac´ı techniky Doc. P. T¨ opfera. Algoritmus (Selection sort, tˇr´ıdˇen´ı v´ybˇerem) Selection sort je jeden z nejjednoduˇsˇs´ıch tˇr´ıd´ıch algoritm˚ u. Jde o vnitˇrn´ı tˇr´ıdˇen´ı – tedy cel´a posloupnost prvk˚ u by mˇela b´ yt v pamˇeti. M´ a ˇcasovou sloˇzitost Θ(n2 ) a obecnˇe b´ yv´ a pomalejˇs´ı neˇz insertion sort. Pracuje n´asledovnˇe: Udrˇzuje si mnoˇzinu setˇr´ıdˇen´ ych prvk˚ u na zaˇc´ atku posloupnosti (pole), kter´a je na zaˇc´atku pr´azdn´a a na konci pˇredstavuje cel´e pole. Zbytek pole za setˇr´ıdˇenou mnoˇzinou je neuspoˇr´adan´ y. V jednom kroku vˇzdy vybere jeden prvek a vloˇz´ı ho do utˇr´ıdˇen´e ˇca´sti (kterou t´ım zvˇetˇs´ı o 1 a z´ aroveˇ n zmenˇs´ı nesetˇr´ıdˇenou). Jeden krok algoritmu (kter´ ych je n pro n prvk˚ u v kaˇzd´em pˇr´ıpadˇe) vypad´ a takto: 1. Najdi nejmenˇs´ı prvek z nesetˇr´ıdˇen´eho u ´seku. 2. Vloˇz ho pˇresnˇe za konec setˇr´ıdˇen´eho u ´seku (a prvek co tam byl p˚ uvodnˇe si s n´ım vymˇen´ı m´ısto) Heapsort, kter´ y pop´ıˇsu pozdˇeji, m˚ uˇze b´ yt povaˇzovan´ y za variantu selection sortu, protoˇze tak´e vyb´ır´a minimum a zaˇcleˇ nuje do setˇr´ıdˇen´e ˇc´ asti. Algoritmus (Insertion sort, tˇr´ıdˇen´ı vkl´ ad´ an´ım) Insertion sort je tak´e relativnˇe jednoduch´ y a na velk´e datov´e soubory neefektivn´ı, ale jednoduch´ y na implementaci a rychlejˇs´ı neˇz nejprimitivnˇejˇs´ı algoritmy bubble sort a selection sort. Nav´ıc je efektivn´ı pro data, kter´a jsou uˇz ˇc´asteˇcnˇe pˇredtˇr´ıdˇen´ a – v nejhorˇs´ım pˇr´ıpadˇe sice bˇeˇz´ı v ˇcase O(n2 ), ale v nejlepˇs´ım pˇr´ıpadˇe (´ upln´e setˇr´ıdˇen´ı dat) je line´arn´ı – obecnˇe bˇeˇz´ı v ˇcase O(n + d), kde d je poˇcet inverz´ı ve tˇr´ıdˇen´e posloupnosti. Nav´ıc je stabiln´ı (zachov´av´a poˇrad´ı prvk˚ u se stejn´ ym kl´ıˇcem) a in-place“, tedy nepotˇrebuje ˇz´ adn´e pomocn´e datov´e struktury. Proti selection sortu ale vˇetˇsinou potˇrebuje v´ıce pˇrepisov´ an´ı (a ” to m˚ uˇze u velk´ ych datov´ ych struktur vadit). V jednom kroku vˇzdy vezme nˇejak´ y prvek (berou se po ˇradˇe od zaˇc´atku pole), zapamatuje si jeho hodnotu, a dokud pˇred n´ım jsou prvky s vˇetˇs´ım kl´ıˇcem, posouv´ a je na pozici o 1 vˇetˇs´ı (ˇc´ımˇz vˇzdy pˇrep´ıˇse n´asleduj´ıc´ı, takˇze p˚ uvodn´ı prvek se ztrat´ı) a pokud naraz´ı na prvek s menˇs´ım kl´ıˇcem, do za nˇej nap´ıˇse onen zapamatovan´ y prvek (a m´ısto tam je, protoˇze celou cestu k nˇemu posouval prvky). Algoritmus vypad´ a takto: insert sort( array a ){ for( i = 1; i < a.length - 1; ++i ){ value = a[i]; j = i-1; while( j >= 0 && a[j] > value ){ a[j + 1] = a[j]; j = j-1; } a[j+1] = value; } } Jednou z variant insertion sortu je Shell sort, kter´ y porovn´av´a prvky ne vedle sebe, ale vzd´alen´e o nˇejak´ y poˇcet pol´ı, kter´ y se postupnˇe zmenˇsuje. M˚ uˇze dosahovat sloˇzitost O(n3/2 ) aˇz O(n4/3 ). S jist´ ymi u ´pravami se u nˇej d´a dos´ahnout aˇz O(n log2 n). Jin´e vylepˇsen´ı je library sort, kter´ y si pˇri vkl´ ad´ an´ı nech´av´a mezery pro dalˇs´ı prvky (podobnˇe jako v knihovnˇe nejsou poliˇcky u ´plnˇe pln´e) – ten m˚ uˇze s velkou pravdˇepodobnost´ı bˇeˇzet v ˇcase O(n log n), ale zase potˇrebuje vˇetˇs´ı pamˇet’ov´ y prostor. Algoritmus (Bubble sort, bublinkov´e tˇr´ıdˇen´ı) Bubble sort je velmi jednoduch´ y tˇr´ıd´ıc´ı algoritmus (asi nejjednoduˇsˇs´ı na implementaci), s ˇcasovou sloˇzitost´ı O(n2 ). V nejlepˇs´ım pˇr´ıpadˇe (pro u ´plnˇe setˇr´ıdˇen´ a data) mu ale staˇc´ı jen jeden pr˚ uchod, takˇze O(n). Vˇetˇsinou ale b´ yv´a pomalejˇs´ı i neˇz insertion sort, takˇze se na velk´e mnoˇziny dat nehod´ı. Algoritmus proch´ az´ı v jednom kroku cel´e pole a hled´a pozice, kde se prvek s menˇs´ım kl´ıˇcem nach´az´ı bezprostˇrednˇe za prvkem s vˇetˇs´ım kl´ıˇcem. Takov´eto dva prvky pak vymˇen´ı. Kroky opakuje, dokud neprojde cel´e pole bez jedin´eho prohozen´ı prvk˚ u (nebo v tupˇejˇs´ı“ variantˇe n-kr´ at pro n prvk˚ u, protoˇze pak je zaruˇceno, ˇze posloupnost bude pro libovoln´e poˇrad´ı prvk˚ u ” setˇr´ıdˇen´ a – ta m´ a ale pak sloˇzitost O(n2 ) v kaˇzd´em pˇr´ıpadˇe!). Vylepˇsen´ı algoritmu lze dos´ ahnout jednoduchou u ´vahou: nejvˇetˇs´ı prvek je uˇz pˇri prvn´ım pr˚ uchodu polem odsunut´ y aˇz na konec. To se samozˇrejmˇe opakuje pro kaˇzd´ y pr˚ uchod (ve druh´em je pˇredposledn´ı na druh´em m´ıstˇe od konce atp.), takˇze lze pr˚ uchody postupnˇe zkracovat a konec pole uˇz netestovat – dos´ahneme t´ım v pr˚ umˇeru dvojn´asobn´e rychlosti. Variantou bubble sortu je shake sort neboli cocktail sort, kter´ y stˇr´ıdavˇe proch´az´ı posloupnost prvk˚ u nejdˇr´ıv od zaˇc´ atku a pak od konce (a pˇritom prov´ ad´ı to sam´e jako bubble sort). T´ım m˚ uˇze v nˇekter´ ych pˇr´ıpadech o trochu tˇr´ıdˇen´ı zrychlit –
35
pˇr´ıkladem budiˇz posloupnost prvk˚ u (2, 3, 4, 5, 1), kter´a potˇrebuje jen 1 pr˚ uchod cocktail-sortem tam a jeden zpˇet, ale pro bubble-sort by potˇrebovala 4. Dalˇs´ım vylepˇsen´ım bubble sortu je Comb sort, kter´ y o nˇeco zvyˇsuje rychlost. Je zaloˇzen na stejn´e myˇslence jako shell sort – tedy nejsou porovn´ av´ any prvky bezprostˇrednˇe za sebou, ale prvky posunut´e o nˇejak´ y ofset – ten je na zaˇc´atku roven d´elce posloupnosti, a postupnˇe se dˇel´ı zkracovac´ım faktorem“ (bˇeˇzn´a hodnota 1.3) aˇz dos´ahne jedn´e. Sloˇzitost se pohybuje mezi ” O(n2 ) v nejhorˇs´ım pˇr´ıpadˇe a O(n log n) v nejlepˇs´ım. V pr˚ umˇern´em pˇr´ıpadˇe jde st´ale o O(n2 ), ale s menˇs´ı konstantou neˇz u bubble-sortu (TODO: tohle je potˇreba set-sakra ovˇeˇrit ... opsan´e z nˇemeck´e wiki a talk:Comb sort“ na anglick´e, takˇze fakt ” d˚ uvˇeryhodn´e“). ” Algoritmus (Heap sort, tˇr´ıdˇen´ı haldou) Heapsort je tak´e tˇr´ıd´ıc´ı algoritmus zaloˇzen´ y na porovn´av´an´ı a myˇslenkovˇe vych´az´ı ze selection sortu, ke kter´emu pˇrid´ av´ a pr´ aci s haldou. Vˇetˇsinou b´ yv´ a pro typick´ a vstupn´ı data pomalejˇs´ı neˇz quicksort, ale zaruˇcuje ˇcasovou sloˇzitost O(n log n) i v nejhorˇs´ım pˇr´ıpadˇe. Jde o in-place“ algoritmus (halda se m˚ uˇze nach´azet pˇr´ımo v nesetˇr´ıdˇen´e ˇc´asti pole), ale nen´ı stabiln´ı“. ” ” Algoritmus s´ am, m´ ame-li vyˇreˇsen´e operace na haldˇe, je velice jednoduch´ y – nejdˇr´ıve pro kaˇzd´ y prvek opakuje jeho vloˇzen´ı do haldy (takˇze postupnˇe vytvoˇr´ı n-prvkovou haldu, kter´a se s kaˇzd´ ym krokem zvˇetˇsuje o 1), pro implementaci haldy na zaˇc´ atku pole je vhodn´ y max-heap“, a potom opakuje odebr´an´ı maxima a jeho pˇresun na voln´e m´ısto hned za konci zmenˇsivˇs´ı ” se haldy – takˇze od konce pole postupnˇe roste smˇerem k zaˇc´atku setˇr´ıdˇen´a posloupnost. Upraven´ y heapsort s pouˇzit´ım tern´ arn´ı haldy dosahuje o multiplikativn´ı konstantu lepˇs´ı v´ ysledky, existuje i (pr´ y :-)) sloˇzit´ a varianta smoothsort, kter´ a se bl´ıˇz´ı ˇcasov´e sloˇzitosti O(n), pokud jsou data ˇc´asteˇcnˇe pˇredtˇr´ıdˇen´a – heapsort totiˇz pracuje pro libovolnou posloupnost v ˇcase O(n log n). Algoritmus (Merge sort, tˇr´ıdˇen´ı sl´ev´ an´ım) Dalˇs´ım tˇr´ıd´ıc´ım algoritmem zaloˇzen´ ym na porovn´ av´ an´ı prvk˚ u je mergesort. Je stabiln´ı, takˇze zachov´av´a poˇrad´ı dat se stejn´ ym kl´ıˇcem. Jde o pˇr´ıklad algoritmu typu rozdˇel a panuj“, stejnˇe jako u n´ıˇze popsan´eho quicksortu. Byl vynalezen Johnem Von ” Neumannem. Je zaloˇzen na rozdˇelen´ı posloupnosti na dvˇe zhruba stejn´e poloviny, rekurzivn´ım setˇr´ıdˇen´ı a potom sl´ev´ an´ı“ dvou ” jiˇz setˇr´ıdˇen´ ych posloupnost´ı. Jeho ˇcasov´ a sloˇzitost je O(n log n) i v nejhorˇs´ım pˇr´ıpadˇe, prov´ad´ı vˇetˇsinou m´enˇe porovn´ an´ı neˇz quicksort, m´ a vˇetˇs´ı n´ aroky na pamˇet’ v pˇr´ıpadˇe rekurzivn´ıho vol´an´ı (existuje ale i nerekurzivn´ı verze), ale vˇetˇsinou nepracuje na m´ıstˇe a potˇrebuje alokovat pamˇet’ pro v´ ystup setˇr´ıdˇen´ ych posloupnost´ı (i toto se d´a odstranit, ale je to zbyteˇcnˇe sloˇzit´e a pˇr´ıliˇsn´e zrychlen´ı oproti pouˇzit´ı jin´eho algoritmu nepˇrinese). Jeho pˇr´ıstup ho ale ˇcin´ı ide´aln´ım k pouˇzit´ı na m´edi´ıch se sekvenˇcn´ım pˇr´ıstupem k dat˚ um (napˇr. p´ asky). Jde tedy pouˇz´ıt i ke tˇr´ıdˇen´ı na vnˇejˇs´ı pamˇeti – detaily viz sekce o datab´ az´ıch. Postup pr´ ace je n´ asleduj´ıc´ı: 1. Rozdˇel nesetˇr´ıdˇenou posloupnost na dvˇe (zhruba) poloviˇcn´ı ˇc´asti 2. Pokud maj´ı v´ıce neˇz jeden prvek, setˇrid’ je rekurzivn´ım zavol´an´ım mergesortu (tj. pro kaˇzdou z nich pokraˇcuj od kroku 1 do konce algoritmu), jinak pokraˇcuj n´ asleduj´ıc´ım krokem. 3. Slij dvˇe setˇr´ıdˇen´e posloupnosti do jedn´e – vyber z obou posloupnost´ı prvn´ı prvek, a pak opakovanˇe prvky porovn´ avej, zapisuj do setˇr´ıdˇen´e posloupnosti menˇs´ı z nich a doplˇ nuj dvojici z t´e poloviˇcn´ı posloupnosti, odkud poch´ azel zapsan´ y prvek. Algoritmus (Quicksort) Quicksort je jedn´ım z nejrychlejˇs´ıch algoritm˚ u pro tˇr´ıdˇen´ı na vnitˇrn´ı pamˇeti, pˇrestoˇze v nejhorˇs´ım pˇr´ıpadˇe m˚ uˇze jeho ˇcasov´ a sloˇzitost dos´ ahnout aˇz Θ(n2 ). Pro ide´ aln´ı i pr˚ umˇern´a data dosahuje Θ(n log n). Je tak´e zaloˇzen na principu rozdˇel a panuj“, ” i kdyˇz ponˇekud jin´ ym zp˚ usobem neˇz pˇredchoz´ı zmiˇ novan´ y, od nˇehoˇz se liˇs´ı i t´ım, ˇze nen´ı stabiln´ı. Algoritmus nejdˇr´ıv vybere nˇejak´ y prvek, tzv. pivot, a prvky s kl´ıˇcem vˇetˇs´ı neˇz pivot pˇresune do jin´e ˇc´asti pole neˇz ty s kl´ıˇcem menˇs´ım. Pak rekurzivnˇe tˇr´ıd´ı obˇe ˇc´ asti pole – kdyˇz se dostane k pol´ım d´elky 1, probl´em je vyˇreˇsen. Postup vypad´ a takto: 1. Vyber pivot (jeden prvek ze seznamu). Tady jde o nejvˇetˇs´ı magii, protoˇze k dosaˇzen´ı nejlepˇs´ı rychlosti by se mˇel pokaˇzd´e vyb´ırat medi´ an. Nejjednoduˇsˇs´ı je vybrat prvn´ı, ale tento v´ ybˇer ovlivˇ nuje v´ yslednou rychlost pr´ace, takˇze se vyplat´ı napˇr vz´ıt tˇri prvky, porovnat je a vz´ıt si z nich ten prostˇredn´ı. 2. Postupuj od zaˇc´ atku pole a hledej prvn´ı prvek vˇetˇs´ı nebo rovn´ y neˇz pivot. Aˇz ho najdeˇs, postupuj od konce a najdi prvn´ı prvek menˇs´ı neˇz pivot. 3. Prvky prohod’ a opakuj krok 2 a 3, dokud se hled´an´ı od zaˇc´atku a od konce nepotk´a na nˇejak´e pozici – tu pojmenujeme tˇreba k. 4. Rekurzivn´ım vol´ an´ım setˇrid’ prvky (0, . . . , k) a (k + 1, . . . , n − 1) (m´a-li tˇr´ıdˇen´e pole d´elku n) – to znamen´a pro obˇe ˇc´ asti pole pokraˇcuj od kroku 1. Pokud je k = 0 nebo k = n − 2, nen´ı tˇreba uˇz rekurzivn´ıho vol´an´ı, protoˇze posloupnosti d´elky 1 jsou setˇr´ıdˇen´e. Pro algoritmus existuje i nerekurzivn´ı verze (staˇc´ı rekurzi nahradit z´asobn´ıkem u ´sek˚ u ˇcekaj´ıc´ıch na zpracov´an´ı). Je vidˇet, ˇze na volbˇe pivotu z´ avis´ı vˇsechno – pokud pokaˇzd´e jako pivot vol´ım 1. nebo n − 1. hodnotu v poli v poˇrad´ı podle velikosti, dˇel´ım pak vˇzdy na ˇc´ asti o d´elce 1 a n − 1, takˇze tento rekurzivn´ı krok provedu aˇz n-kr´at a dostanu se k ˇcasu Θ(n2 ). Samozˇrejmˇe, d´ıky existenci algoritmu pro nalezen´ı medi´ anu v ˇcase Θ(n) je moˇzn´e i tady dos´ahnout zaruˇcen´e sloˇzitosti Θ(n log n), ale v praxi je to kv˚ uli vysok´e multiplikativn´ı konstantˇe nepouˇziteln´e – k v´ ybˇeru pivotu se vˇetˇsinou s u ´spˇechem uˇz´ıv´a nˇejak´ a jednoduch´ a heuristika, jak je nast´ınˇeno v popisu algoritmu samotn´eho. Heapsort b´ yv´ a pomalejˇs´ı neˇz quicksort, ale zaruˇcuje n´ızkou ˇcasovou sloˇzitost i pro nejhorˇs´ı pˇr´ıpad a nav´ıc potˇrebuje m´enˇe pamˇeti – n´ aroky quicksortu nav´ıc (kromˇe tˇr´ıdˇen´e posloupnosti) jsou O(log n) minim´alnˇe, kv˚ uli nutnosti pouˇzit´ı rekurzivn´ıho 36
vol´ an´ı nebo z´ asobn´ıku. Oproti mergesortu ho nelze pouˇz´ıt na data se sekvenˇcn´ım pˇr´ıstupem, tyto nev´ yhody ale vyvaˇzuje relativn´ı jednoduchost´ı implementace a rychlost´ı v pr˚ umˇern´em pˇr´ıpadˇe. Variantou quicksortu je introsort, kter´ y ho kombinuje s heapsortem, pokud hloubka rekurze dos´ahne nˇejak´ ych nepˇrijateln´ ych hodnot – tak je zaruˇcena ˇcasov´ a sloˇzitost Θ(n log n) i v nejhorˇs´ım pˇr´ıpadˇe (samozˇrejmˇe je to ale v nejhorˇs´ım pˇr´ıpadˇe poˇr´ ad pomalejˇs´ı neˇz pouˇzit´ı jen heapsortu). Jedna z variant tohoto algoritmu se d´a pouˇz´ıt k hled´an´ı k-t´eho nejmenˇs´ıho prvku (tedy i medi´ anu), kdy dosahuje sloˇzitosti O(n) pr˚ umˇernˇe aˇz O(n2 ) nejh˚ uˇre.
Pˇ rihr´ adkov´ e tˇ r´ıdˇ en´ı Algoritmus (Bucket sort, Radix sort, pˇrihr´ adkov´e tˇr´ıdˇen´ı) Radix sort je zvl´ aˇstn´ı tˇr´ıd´ıc´ı algoritmus – jeho sloˇzitost je totiˇz line´arn´ı. Dosahuje to t´ım, ˇze neporovn´av´a vˇsechny tˇr´ıdˇen´e prvky (sloˇzitost probl´emu tˇr´ıdˇen´ı pomoc´ı porovn´ av´ an´ı je Θ(n log n), takˇze by to jinak nebylo moˇzn´e), je ho ale moˇzn´e pouˇz´ıt jen pro tˇr´ıdˇen´ı dat podle kl´ıˇce z nˇejak´e ne pˇr´ıliˇs velk´e mnoˇziny – max. rozsah tˇr´ıdˇen´ ych hodnot z´avis´ı na tom, jak velk´e pole si m˚ uˇzeme dovolit vymezit v pamˇeti pro tento u ´ˇcel. Nejjednoduˇsˇs´ı varianta (tzv. pigeonhole sort, nebo-li counting sort) opravdu poˇc´ıt´a s kl´ıˇci ze zadan´eho rozmez´ı [l, h]. Pro nˇej si pˇriprav´ı c´ılov´e pole velikosti h − l + 1, tj. pˇrihr´adky“. Do nich pak pˇr´ımo podle kl´ıˇce pˇrehazuje ˇcten´e prvky (jestliˇze ” pˇrihr´ adky realizujeme jako seznamy, bude tˇr´ıdˇen´ı dokonce stabiln´ı). Nakonec projde pˇrihr´adky od zaˇc´atku do konce a co v nich najde, to vyp´ıˇse (a v´ ystup bude setˇr´ıdˇen´ y). Variantou counting sortu je bucket sort, kdy se do jedn´e pˇrihr´ adky ned´ avaj´ı jen prvky se stejn´ ym kl´ıˇcem, ale prvky s kl´ıˇcem v nˇejak´em mal´em rozmez´ı – ty pak lze setˇr´ıdit rychle, protoˇze jich zˇrejmˇe nebude mnoho, a nav´ıc se uˇsetˇr´ı pamˇet’. Protoˇze ale kl´ıˇce velikosti max. tis´ıc˚ u hodnot jsou vˇetˇsinou trochu m´alo, v praxi se bˇeˇznˇe pouˇz´ıvaj´ı sloˇzitˇejˇs´ı varianty – ty zahrnuj´ı nˇekolik pr˚ uchod˚ u nahoˇre popsan´eho algoritmu, pˇri nichˇz se tˇr´ıd´ı jenom podle ˇc´asti kl´ıˇce. Ty se dˇel´ı na ty, kter´e zaˇc´ınaj´ı od nejm´enˇe v´ yznamn´e ˇc´ asti kl´ıˇce (least significant digit radix sort) a ty, kter´e jdou od nejv´ yznamnˇejˇs´ı ˇc´ asti (most significant digit). Prvn´ı z nich maj´ı tu v´ yhodu, ˇze lze zachovat stabilitu tˇr´ıdˇen´ı, druh´a zase m˚ uˇze tˇr´ıdit i podle kl´ıˇc˚ u r˚ uzn´e d´elky a zastavovat se po nalezen´ı unik´ atn´ıch prefix˚ u, takˇze se hod´ı napˇr. pro lexikografick´e tˇr´ıdˇen´ı podle ˇretˇezcov´ ych kl´ıˇc˚ u. Tˇr´ıdˇen´ı typu least significant digit vypad´ a n´ asledovnˇe: 1. Vezmi nejm´enˇe v´ yznamnou ˇc´ ast kl´ıˇce (urˇcit´ y poˇcet bit˚ u). 2. Rozdˇel podle t´eto ˇc´ asti kl´ıˇce data do pˇrihr´ adek, ale v nich zachovej jejich poˇrad´ı (to je nutn´e kv˚ uli n´asledn´emu pr˚ uchodu, z´ aroveˇ n to dˇel´ a z tohoto algoritmu stabiln´ı tˇr´ıdˇen´ı). 3. Opakuj toto pro dalˇs´ı (v´ yznamnˇejˇs´ı) ˇc´ ast kl´ıˇce. Most significant digit varianta (rekurzivn´ı verze, je zaloˇzen´a na bucket sortu) bˇeh´a takto: 1. Vezmi nejv´ yznamnˇejˇs´ı ˇc´ ast kl´ıˇce (prvn´ı p´ısmeno, napˇr´ıklad). 2. Rozdˇel prvky podle t´eto ˇc´ asti do pˇrihr´ adek (takˇze v jedn´e se jich octne docela hodnˇe) 3. Rekurzivnˇe setˇrid’ kaˇzdou z pˇrihr´ adek (zaˇcni podle dalˇs´ı ˇc´asti kl´ıˇce), pokud je v n´ı v´ıce neˇz jeden prvek (tohle zaruˇc´ı zastaven´ı za rozliˇsuj´ıc´ım prefixem). 4. Slep pˇrihr´ adky do jedn´e (setˇr´ıdˇen´e) posloupnosti. Popisovan´e algoritmy vˇetˇsinou potˇrebuj´ı O(n + (h − l)) ˇcasu k tˇr´ıdˇen´ı, je-li h − l (zhruba) poˇcet pˇrihr´adek – to znamen´ a, ˇze sice jde o sloˇzitost line´ arn´ı, ale line´ arn´ı i v poˇctu pˇrihr´adek, coˇz se nemus´ı vˇzdy oproti konvenˇcn´ımu tˇr´ıdˇen´ı vyplatit. Nav´ıc jsou probl´emem vysok´e n´ aroky na pamˇet’ (nelze tˇr´ıdˇen´ı prov´est na m´ıstˇe“ v jedin´em poli). Pro malou mnoˇzinu hodnot kl´ıˇc˚ u ” (nebo u most significant digit varianty kr´ atk´e odliˇsuj´ıc´ı prefixy) jsou ale ˇcasovˇe efektivnˇejˇs´ı.
Tˇ r´ıd´ıc´ı s´ıtˇ e Zdrojem t´eto sekce jsou z´ apisky z pˇredn´ aˇsek Prof. L. Kuˇcery Algoritmy a datov´e struktury II. Definice (Bitonick´ a posloupnost) ˇ Rekneme, ˇze posloupnost prvk˚ u je bitonick´ a, pokud po spojen´ı do cyklu (tedy nult´ y prvek za n-t´ y) obsahuje dva monot´ onn´ı u ´seky. Nebo-li obsahuje aˇz na f´ azov´ y posuv dva monot´onn´ı u ´seky. Definice (Kompar´ ator) Kompar´ ator je speci´ aln´ı typ hradla (pˇredstavme si pod t´ım nedˇelitelnou elektronickou souˇc´astku, pˇr´ıpadnˇe jen virtu´ aln´ı), kter´ a m´ a dva v´ ystupy a dva vstupy. Pokud na vstupy pˇrivedeme dva prvky (kl´ıˇce, ˇc´ısla), z lev´eho v´ ystupu vyd´a menˇs´ı z nich a z prav´eho v´ ystupu vˇetˇs´ı (takˇze vlastnˇe porovn´ a dva prvky a na v´ ystup je vyplivne ve spr´avn´em poˇrad´ı). Pracuje v konstantn´ım ˇcase. Definice (Tˇr´ıd´ıc´ı s´ıt’) Tˇr´ıd´ıc´ı s´ıt’ je spr´ avnˇe sestaven´ a mnoˇzina kompar´ ator˚ u dohromady spojen´a vstupy a v´ ystupy tak, ˇze pˇri pˇriveden´ı posloupnosti d´elky n na vstup ji vyd´ a setˇr´ıdˇenou na v´ ystupu. Kompar´atory v n´ı jsou rozˇclenˇen´e do hladin, jejichˇz poˇcet pak ud´ av´ a celkovou dobu v´ ypoˇctu – pˇredpokl´ ad´ a se tam, ˇze kompar´ atory v jednotliv´ ych vrstv´ach pracuj´ı paralelnˇe, takˇze tˇr´ıd´ıc´ı s´ıtˇe mohou dosahovat ˇcasov´e sloˇzitosti pouh´ ych O(log n). Algoritmus s takovou ˇcasovou sloˇzitost´ı sice existuje, ale m´a velmi vysokou multiplikativn´ı konstantu, takˇze se v praxi nepouˇz´ıv´a. Pˇr´ıkladem tˇr´ıd´ıc´ı s´ıtˇe je i bitonick´e tˇr´ıdˇen´ı.
37
Algoritmus (Bitonick´e tˇr´ıdˇen´ı) Bitonick´ a tˇr´ıd´ıc´ı s´ıt’ je zaloˇzena na pouˇzit´ı bitonick´ ych posloupnost´ı a rekurze. Obvod (pro tˇr´ıdˇen´ı dat d´elky n) se dˇel´ı na dvˇe ˇca´sti: • Prvn´ı ˇc´ ast setˇr´ıd´ı (rekurzivnˇe) 1/2 vstupu vzestupnˇe, druhou polovinu sestupnˇe a t´ım vytvoˇr´ı bitonickou posloupnost. Obsahuje tedy dvˇe tˇr´ıd´ıc´ı s´ıtˇe pro tˇr´ıdˇen´ı posloupnost´ı d´elky n2 . • Druh´ a ˇc´ ast tˇr´ıd´ı jen bitonick´e posloupnosti – prvn´ı jej´ı vrstva rozdˇel´ı bitonickou posloupnost na vstupu na dvˇe bitonick´e posloupnosti (z vˇetˇs´ıch a menˇs´ıch ˇc´ısel). Dalˇs´ı vrstvy uˇz jsou opˇet implementov´any rekurzivnˇe – tedy druh´a vrstva dostane dvˇe posloupnosti a vyrob´ı z nich ˇctyˇri atd., aˇz nakonec dojde k bitonick´ ym posloupnostem“ d´elky 1. ” u, kter´e porovn´avaj´ı vˇzdy i-t´ y a k + i-t´ y K rozdˇelen´ı jedn´e bitonick´e posloupnosti d´elky k na dvˇe staˇc´ı jen k2 kompar´ator˚ prvek. Dojde sice k nˇejak´emu f´ azov´emu posuvu, ale to niˇcemu nevad´ı. Dobˇre je to vidˇet pˇri zn´azornˇen´ı na kruˇznici, doporuˇcuji prohl´ednout si postup v programu Algovision Prof. Kuˇcery (http://kam.mff.cuni.cz/~ludek/AlgovisionPage.html). Je vidˇet, ˇze poˇcet vrstev potˇrebn´ ych k dˇelen´ı bitonick´ ych posloupnost´ı d´elky N je log2 N (B(N ) = log N ). Pro celkov´ y poˇcet vrstev, a tedy dobu zpracov´ an´ı – T (n) n´ am vych´az´ı n´asleduj´ıc´ı vzorec n T (N ) = T ( ) + B(N ) = log N + log(N/2) + · · · + 1 2 z ˇcehoˇz d´ıky vzorci pro souˇcet aritmetick´e posloupnosti 1 + 2 + · · · + k = 1 T (N ) = O( log2 N ) 2
38
k(k+1) 2
vyjde
3.7
Grafov´ e algoritmy
TODO: nejake vyuziti tech algoritmu (staci priklad plusminus ke kazdemu druhu ulohy) Graf Definice Graf G je dvojice (V, E), kde V je mnoˇzina bod˚ u (vrchol˚ u) a E mnoˇzina jejich dvojic (hran). Je-li E mnoˇzinou neuspoˇradan´ ych dvojic, jde o neorientovan´y graf. Jsou-li dvojice uspoˇr´adan´e, jedn´a se o orientovan´y graf. Velikost mnoˇziny V se znaˇc´ı n, velikost E je m - |V | = n, |E| = m. Graf je moˇzn´e strojovˇe reprezentovat napˇr. pomoc´ı matice sousednosti – matice, kde je na souˇradnic´ıch (u, v) hodnota 1, pokud z u do v je hrana a 0 jinak. Pro neorientovan´e grafy je soumˇern´a podle hlavn´ı osy. Matice zab´ır´a Θ(n2 ) m´ısta v pamˇeti. Dalˇs´ı moˇznost´ı jsou seznamy soused˚ u – dvˇe pole, jedno pˇr´ısluˇsn´e vrchol˚ um, druh´e hran´am. V prvn´ım jsou uloˇzen´e indexy do druh´eho pole, urˇcuj´ıc´ı kde zaˇc´ınaj´ı seznamy hran vedouc´ıch z vrcholu (pˇr´ısluˇsej´ıc´ımu k indexu v prvn´ım poli). Pamˇet’ov´ a n´ aroˇcnost je Θ(m + n).
Prohled´ av´ an´ı do hloubky a do ˇ s´ıˇ rky Algoritmy, kter´e postupnˇe projdou vˇsechny vrcholy dan´eho souvisl´eho neorientovan´eho grafu. Algoritmus (Prohled´ av´ an´ı do ˇs´ıˇrky/Breadth-First Search) Proch´ az´ı vˇsechny vrcholy grafu postupnˇe po vrstv´ ach vzd´alenost´ı od inici´aln´ıho vrcholu. K implementaci se pouˇz´ıv´ a fronta (FIFO). BFS( V - vrcholy, E - hrany, s - startovac´ ı vrchol ){ obarvi vrcholy b´ ıle, nastav jim nekoneˇ cnou vzd´ alenost od s a pˇ redch˚ udce NULL; dej do fronty vrchol s; while( nepr´ azdn´ a fronta ){ vyber z fronty vrchol v; foreach( vˇ sechny b´ ıle obarven´ e sousedy v = u ){ obarvi u ˇ sedˇ e a nastav mu vzd´ alenost d(v) + 1 a pˇ redch˚ udce v; dej vrchol u do fronty; } v pˇ rebarvi na ˇ cerno a vyhod’ z fronty. } } Bˇeˇz´ı v ˇcase Θ(m + n), protoˇze kaˇzd´ y vrchol testuje 2x pro kaˇzdou hranu, do fronty ho d´av´a 1x a obarven´ı mu mˇen´ı 2x. Tento algoritmus je z´ akladem nˇekolika dalˇs´ıch, napˇr. pro testov´an´ı souvislosti grafu, hled´an´ı minim´aln´ı kostry nebo nejkratˇs´ı cesty. Algoritmus (Prohled´ av´ an´ı do hloubky/Depth-First Search) Proch´ az´ı postupnˇe vˇsechny vrcholy - do hloubky (pro kaˇzd´ y vrchol nejdˇr´ıv navˇst´ıv´ı prvn´ı jeho nenavˇst´ıven´ y sousedn´ı vrchol, pak prvn´ı sousedn´ı tohoto vrcholu atp. aˇz dojde k vrcholu bez nenavˇst´ıven´ ych soused˚ u, pak se vrac´ı a proch´ az´ı dalˇs´ı jeˇstˇe nenavˇst´ıven´e sousedy). Pro implementaci se pouˇz´ıv´a bud’ z´asobn´ık, nebo rekurze. Z´asobn´ıkov´a verze vypad´ a stejnˇe jako prohled´ av´ an´ı do ˇs´ıˇrky (m´ısto fronty je z´ asobn´ık). Rekurzivn´ı verze - pˇri zavol´ an´ı na startovn´ı vrchol projde cel´ y graf: DFS(v - vrchol){ oznaˇ c v jako navˇ st´ ıven´ y; foreach( vˇ sechny nenavˇ st´ ıven´ e sousedy v = u ) DFS( u ); } ˇ Casov´ a sloˇzitost je Θ(m + n), stejnˇe jako u prohled´av´an´ı do ˇs´ıˇrky.
Souvislost Definice Cesta v grafu G = (V, E) z vrcholu a do vrcholu b je posloupnost v0 , v1 , . . . , vn takov´a, ˇze v0 = a, vn = b a pro vˇsechna vi , i ∈ {1, . . . , n} je (vi−1 , vi ) ∈ E. Graf G = (V, E) je souvisl´y, pokud pro kaˇzd´e dva vrcholy u, v ∈ V existuje v G cesta z u do v. Toto plat´ı pro orientovan´e i neorientovan´e grafy.
39
Algoritmus (Testov´ an´ı souvislosti grafu/poˇc´ıt´ an´ı komponent souvislosti) Algoritmus vyuˇz´ıv´ a prohled´ av´ an´ı do ˇs´ıˇrky (nebo do hloubky) - v 1 kroku vˇzdy najde dosud nenavˇst´ıven´ y vrchol, zaˇcne z nˇej proch´ azet graf a takto projde(oddˇel´ı) jednu komponentu souvislosti. Pokud skonˇc´ı po prvn´ım kroku, graf je souvisl´ y. Poˇcet krok˚ u, potˇrebn´ ych k navˇst´ıven´ı vˇsech vrchol˚ u grafu, je z´aroveˇ n poˇctem komponent souvislosti. ˇ Casov´ a sloˇzitost je Θ(m + n), protoˇze o algoritmu plat´ı to sam´e co o prohled´av´an´ı do ˇs´ıˇrky – ˇz´adn´ y vrchol nebude pˇrid´ an do fronty v´ıce neˇz jednou a testov´ an v´ıce neˇz 2x pro kaˇzdou hranu.
Topologick´ e tˇ r´ıdˇ en´ı Definice → − Topologick´e uspoˇr´ ad´ an´ı vrchol˚ u orientovan´eho grafu G = (V, E ) je funkce t : V → {1, . . . , n} takov´a, ˇze pro kaˇzdou hranu (i, j) ∈ E je t(i) < t(j). Lze prov´est pouze pro acyklick´e orientovan´e grafy. Algoritmus (Primitivn´ı algoritmus) V kaˇzd´em kroku najde vrchol, z nˇehoˇz nevedou ˇz´ adn´e hrany. Pˇriˇrad´ı mu nejvyˇsˇs´ı voln´e ˇc´ıslo (zaˇc´ın´a od n) a odstran´ı ho ze seznamu vrchol˚ u. Uspoˇr´ ad´ an´ı takto vytvoˇren´e je topologick´e, sloˇzitost algoritmu je Θ(n(m + n)). Algoritmus (Rychl´y algoritmus) K topologick´emu uspoˇr´ ad´ an´ı se d´ a pouˇz´ıt modifikace prohled´av´an´ı do hloubky. Nen´ı tˇreba ani graf pˇredem testovat na pˇr´ıtomnost cykl˚ u, algoritmus toto objev´ı. Pro kaˇzd´ y navˇst´ıven´ y vrchol si poznamen´a ˇcas jeho opuˇstˇen´ı, uspoˇr´ ad´ an´ı podle klesaj´ıc´ıch ˇcas˚ u opuˇstˇen´ı je topologick´e. topologick´ e_tˇ r´ ıdˇ en´ ı( v - vrchol ) { global t; // ˇ cas opuˇ stˇ en´ ı, inici´ aln´ ı hodnota 0 oznaˇ c v jako navˇ st´ ıven´ y; foreach ( u in sousedn´ ı vrcholy v ) { if ( u je navˇ st´ ıven´ y, ale ne opuˇ stˇ en´ y ) { chyba - cyklus; return; } else if ( u nen´ ı navˇ st´ ıven´ y ) topologick´ e_tˇ r´ ıdˇ en´ ı( u ); } oznaˇ c v jako opuˇ stˇ en´ y v ˇ case t; t = t + 1; } ˇ Casov´ a sloˇzitost z˚ ust´ av´ a stejn´ a jako u prohled´ av´ an´ı do ˇs´ıˇrky, tedy Θ(m + n), protoˇze vˇsechny kroky prov´adˇen´e v r´ amci navˇst´ıven´ı 1 vrcholu vyˇzaduj´ı jen konstatn´ı poˇcet operac´ı. Pozn´ amka Topologick´e tˇr´ıdˇen´ı se pouˇz´ıv´ a napˇr. k zjiˇstˇen´ı nejvhodnˇejˇs´ıho poˇrad´ı proveden´ı navz´ajem z´avisl´ ych ˇcinnost´ı.
Hled´ an´ı nejkratˇ s´ı cesty v grafu Definice Ohodnocen´ı hran - v´ ahov´ a funkce je funkce, kter´ a kaˇzd´e (orientovan´e) hranˇe pˇriˇrazuje jej´ı d´elku“ nebo cenu“ jej´ıho projit´ı. ” ” Definuje se jako w : E → R. D´ e lka (orientovan´ e ) cesty p = v0 , v1 . . . , vn v ohodnocen´em grafu (grafu s v´ahovou funkc´ı) je Pn potom w(p) = i=1 w(vi−1 , vi ). Vzd´ alenost dvou vrchol˚ u u, v (v´ aha nejkr. cesty z u do v) je δ(u, v) = min{w(p)|p je cesta z u do v}, pokud nˇejak´ a cesta z u do v existuje, jinak δ(u, v) = ∞. Nejkratˇs´ı cesta p z u do v je takov´a, pro kterou w(p) = δ(u, v). Pozn´ amka Pro hled´ an´ı nejkratˇs´ı cesty v obecn´em grafu bez ohodnocen´ı hran (tj. d´elka cesty je poˇcet hran na n´ı) staˇc´ı prohled´ av´ an´ı do ˇs´ıˇrky. Algoritmus (Algoritmus kritick´e cesty (pro DAG)) Pro hled´ an´ı nejkratˇs´ı cesty do vˇsech bod˚ u z jednoho zdroje v orientovan´em acyklick´em grafu (DAG) pouˇz´ıv´ a topologick´e tˇr´ıdˇen´ı, kter´e je pro takov´ yto graf provediteln´e; spolu se zpˇresˇ nov´an´ım horn´ıch odhad˚ u vzd´alenost´ı vrchol˚ u. M´ am dan´ y startovac´ı vrchol s. Definuji d(s, v) jako horn´ı odhad vzd´alenosti s a v, tj. vˇzdy d(s, v) ≥ δ(s, v) pro lib. vrchol v. Hodnoty d(s, v) pˇred zapoˇcet´ım v´ ypoˇctu inicializuji na +∞. V algoritmu se prov´ ad´ı operace Relax“, znamenaj´ıc´ı zpˇresnˇen´ı odhadu d(s, v) za pouˇzit´ı cesty vedouc´ı z s do v, konˇc´ıc´ı ” hranou (u, v) – pokud m´ a takov´ a cesta niˇzˇs´ı v´ ahu neˇz byl pˇredchoz´ı odhad d(s, v), poloˇz´ım d(s, v) = d(s, u) + w(u, v). Tato operace zachov´ av´ a invariant d(s, v) ≥ δ(s, v). 40
Relax (u, v) { //u = source, v = destination if (v.distance > u.distance + uv.weight) { v.distance := u.distance + uv.weight v.predecessor := u } } kritick´ a cesta( V - vrcholy, E - hrany, s - startovac´ ı vrchol ){ topologicky setˇ rid’ V; inicializace - nastav d(s,v) = nekoneˇ cno pro vˇ sechny vrcholy; foreach( vrchol v, v poˇ rad´ ı podle top. tˇ r´ ıdˇ en´ ı ){ proved’ operaci Relax za pouˇ zit´ ı cest vedouc´ ıch do v pˇ res vˇ sechna moˇ zn´ a u; } } V´ ysledek d´ av´ a nejkratˇs´ı cesty d´ıky topologick´emu setˇr´ıdˇen´ı grafu – pro nejkr. cestu p z s do v plat´ı t(vi ) < t(vi+1 ) a pokud m´ am d(s, u) = δ(s, u) a provedu Relax na v podle (u, v), pak dostanu d(s, v) = δ(s, v), z ˇcehoˇz se korektnost d´ a dok´ azat indukc´ı podle poˇctu hran na cestˇe. Sloˇzitost algoritmu je Θ(n + m), protoˇze takov´ a je sloˇzitost topologick´eho tˇr´ıdˇen´ı a zbytek algoritmu kaˇzdou hranu i kaˇzd´ y vrchol testuje pr´ avˇe 1x. Algoritmus (Dijkstr˚ uv algoritmus) Pracuje na libovoln´em orientovan´em grafu s nez´ aporn´ ym ohodnocen´ım hran. Dijkstra( V - vrcholy, E - hrany, s - startovac´ ı vrchol ){ inicializace - nastav d(s,v) = nekoneˇ cno pro vˇ sechny vrcholy; S = pr´ azdn´ y; // mnoˇ zina "vyˇ r´ ızen´ ych" vrchol˚ u Q = V; // mnoˇ zina "nevyˇ r´ ızen´ ych" vrchol˚ u while( Q nen´ ı pr´ azdn´ a ){ vyber u, vrchol s nejmenˇ s´ ım d z mnoˇ ziny Q; vloˇ z vrchol u do S; foreach( v, z u do v vede hrana ) proved’ operaci Relax pro v pˇ res u; } } ˇ Casov´ a sloˇzitost pˇri implementaci mnoˇzin S a Q pomoc´ı haldy je: Θ(n · log n) pro inicializaci (n vloˇzen´ı do haldy), Θ(n · log n) celkem pro vyb´ır´ an´ı prvk˚ u s nejmenˇs´ım d, jedno proveden´ı Relax pˇri zmˇenˇe d trv´a Θ(log n) (´ uprava haldy) a provede se max. m-kr´ at; tedy celkem Θ((m + n) · log n). Algoritmus (Bellman-Ford) Bellman-Ford˚ uv algoritmus lze pouˇz´ıt nejobecnˇeji, ale je nejpomalejˇs´ı. Funguje na libovoln´em grafu (pokud najde cyklus, jehoˇz celkov´ a v´ aha je z´ aporn´ a, a tedy nejkratˇs´ı cesty nemaj´ı smysl, vrac´ı chybu). Bellman-Ford( V - vrcholy, E - hrany, s - startovac´ ı vrchol ){ inicializace - nastav d(s,v) = nekoneˇ cno pro vˇ sechny vrcholy; d(s,s) = 0; // n-1 iterac´ ı, kaˇ zd´ a projde vˇ sechny hrany for( i = 1; i < |V|; ++i ) { foreach( hrana (u,v) z E ) proved’ operaci Relax pro v pˇ res u; } // hled´ an´ ı z´ aporn´ eho cyklu foreach( hrana (u,v) z E ){ if ( d(v) > d(u) + w(u,v) ){ chyba - z´ aporn´ y cyklus; return; } } } 41
Sloˇzitost algoritmu je Θ(m · n). Vˇzdy najde nejkratˇs´ı cestu, protoˇze v grafu bez z´aporn´ ych cykl˚ u m˚ uˇze m´ıt cesta max. n − 17Kˇ c(1) vrchol˚ u. D˚ ukaz nalezen´ı z´ aporn´eho cyklu sporem, se sumou vah vˇsech hran na nˇem (poloˇz´ım < 0Kˇ c( 0)). Pozn´ amka (Nejkratˇs´ı cesty pro vˇsechny dvojice vrchol˚ u) Pro hled´ an´ı nejkratˇs´ıch cest pro vˇsechny dvojice vrchol˚ u lze bud’ pouˇz´ıt n-kr´at bˇeh nˇekter´eho z pˇredchoz´ıch algoritm˚ u, nebo Algoritmus n´ asoben´ı matic“ ˇci Floyd-Warshall˚ uv algoritmus. Ty oba pouˇz´ıvaj´ı matice sousednosti WG a poˇc´ıtaj´ı matici ” vzd´ alenost´ı DG . Prvn´ı z nich postupuje indukc´ı podle poˇctu hran na nejkr. cestˇe, vyr´ab´ı matice DG (x) pro x hran na nejkratˇs´ı cestˇe. DG (1) je WG , pro v´ ypoˇcet kroku i vˇzdy DG (i − 1) vyn´asob´ı“ DG (1) pouˇzit´ım zvl´aˇstn´ıho n´asoben´ı“, kde n´asoben´ı hodnot je ” ” nahrazeno sˇc´ıt´ an´ım a sˇc´ıt´ an´ı v´ ybˇerem minima. Sloˇzitost je s vyuˇzit´ım asociativity takto definovan´eho n´asoben´ı“ Θ(n3 log n). ” Floyd-Warshall˚ uv algoritmus jde indukc´ı podle velikosti mnoˇziny vrchol˚ u, povolen´ ych jako vnitˇrn´ı vrcholy na cest´ ach. Pouˇz´ıv´ a du,v (k) jako min. v´ ahu cesty z u do v s vnitˇr. vrcholy z mnoˇziny {1, . . . , k}. V inici´aln´ım kroku je taky DG (1) = W (G). Pro i-t´ y krok je du,v (i) = min{du,v (i − 1), du,i (i − 1) + di,v (i − 1)}. Sloˇzitost je Θ(n3 ), nav´ıc jeden krok je velice rychl´ y – celkovˇe je algoritmus vˇetˇsinou rychlejˇs´ı neˇz Bellman-Ford˚ uv a pro z´aporn´e cykly se ˇcasem na diagon´ale objev´ı z´ap. ˇc´ıslo, proto je nen´ı tˇreba testovat pˇredem.
Minim´ aln´ı kostra grafu ´ Ukolem v t´eto u ´loze je naj´ıt kostru T (acyklick´ y souvisl´ y podgraf) grafu (V, E) s celkovou minim´aln´ı vahou hran. Vˇzdy plat´ı |T | = |V | − 17Kˇ c(1). Bez u ´jmy na obecnosti lze pˇredpokl´adat, ˇze ohodnocen´ı hran jsou nez´aporn´a (lze ke vˇsem pˇriˇc´ıst konstantu a v´ ysledek se nezmˇen´ı). Algoritmus (Bor˚ uvk˚ uv / Kruskal˚ uv algoritmus) Bor˚ uvka( V - vrcholy, E - hrany ){ S = setˇ r´ ıdˇ en´ e hrany podle jejich v´ ahy; pˇ riˇ rad’ vrchol˚ um ˇ c´ ısla komponent souvislosti; F = {}; // tj. (V,F) je "les", kde kaˇ zd´ y vrchol je // jedna komponenta souvislosti while( S nen´ ı pr´ azdn´ a ){ vyber z S dalˇ s´ ı hranu (x,y); if ( ˇ c´ ıslo komponenty x != ˇ c´ ıslo komponenty y ){ F += (x,y); slij komponenty pˇ r´ ısluˇ sn´ e k x a y; } } return ( (V,F) jako minim´ aln´ ı kostru (v,E) ); } Celkov´ a sloˇzitost je Θ(m log m) pˇri pouˇzit´ı spojov´ ych seznam˚ u: Setˇr´ıdˇen´ı hran podle v´ahy Θ(m log m), nalezen´ı ˇc´ısla komponenty konstantn´ı ˇcas, max. poˇcet pˇreˇc´ıslov´ an´ı komponent pˇri sl´ev´an´ı (pˇreˇc´ıslov´av´am-li vˇzdy menˇs´ı ze sl´evan´ ych komponent) pro 1 vrchol je Θ(log n), tj. celkem Θ(n log n). Algoritmus je korektn´ı - vˇzdy nalezne kostru, protoˇze pˇrid´a pr´avˇe |V | − 17Kˇ c(1) hran a nevytvoˇr´ı nikdy cyklus. Minimalita kostry se dok´ aˇze sporem – m´ am-li F vr´ acenou algoritmem a H nˇejakou min. kostru, tak pokud je w(F ) > w(H), najdu hranu e ∈ F \ H, vezmu kostru H1 = H ∪ e \ f (a w(e) ≤ w(f )). Pokud m´am ∀e nalezen´e f takov´e, ˇze w(e) = w(f ), jsou F i H minim´ aln´ı, jinak H taky nebylo minim´ aln´ı, protoˇze H1 7Kˇ c(1) je menˇs´ı. Algoritmus (Jarn´ık˚ uv / Prim˚ uv algoritmus ) Jarn´ ık( V - vrcholy, E - hrany, r - startovn´ ı vrchol ){ Q = V; // mnoˇ zina pouˇ z´ ıvan´ ych vrchol˚ u, dosud nepˇ ripojen´ ych // ke kostˇ re F = {}; // vznikaj´ ıc´ ı kostra, v kaˇ zd´ em okamˇ ziku // je strom inicializace - nastav kl´ ıˇ c(v) na nekoneˇ cno pro vˇ sechny vrcholy; kl´ ıˇ c(r) = 0; soused(r) = NULL; while( Q je nepr´ azdn´ a ){ vyber u, prvek s nejmenˇ s´ ım kl´ ıˇ cem z Q; F += ( soused(u),u ); foreach( vrchol v, z u do v vede hrana ){ 42
if ( v je v Q a kl´ ıˇ c(v) > w(u,v) ){ kl´ ıˇ c(v) = w(u,v); soused(v) = u; } } } return ( (V,F) jako min. kostru (V,E) ); } Sloˇzitost algoritmu je Θ(m log n), pokud je Q reprezentov´ano jako bin. halda - nejv´ yˇse m-kr´at upravuji kl´ıˇc nˇejak´eho vrcholu, coˇz m´ a v haldˇe sloˇzitost Θ(log n), v´ ybˇer minima max. n-kr´at Θ(log n) a inicializace jen Θ(n). Vytvoˇren´ y graf je kostra, protoˇze nikdy nevznik´ a cyklus (pˇripojuji pr´avˇe vrcholy z Q, kter´a je na konci pr´ azdn´ a). D˚ ukaz minimality podle konstrukce – najdu prvn´ı hranu e v min. kostˇre H, kter´a nen´ı ve v´ ysledku alg. F , pak najdu f ∈ H, t.ˇz. F \ e ∪ f je kostra, z algoritmu je w(f ) ≥ w(e). Vezmu H1 = H \ f ∪ e, v´ım, ˇze w(H1 ) ≤ w(H) a tedy H1 7Kˇ c(1) je min. kostra, iterac´ı tohoto postupnˇe dostanu, ˇze Hk = F je min. kostra.
Toky v s´ıt´ıch nen´ı poˇzadav´ ano v IP a ISPS Definice (S´ıt’, tok) S´ıt’ je ˇctveˇrice (G, z, s, c), kde G je (orientovan´ y) graf, z zdrojov´ y a s c´ılov´ y vrchol (stok, spotˇrebiˇc) a c : E → R+ funkce + kapacity hran. Tok s´ıt´ı je takov´ a funkce t : EP→ R , ˇze pro P kaˇzdou hranu (u, v) je 0Kˇc (0) ≤ t((u, v)) ≤ c((u, v)) a nav´ıc pro kaˇzd´ y vrchol v kromˇe z a s (uzel s´ıtˇe ) plat´ı e=(u,v) t(e) = e=(v,w) t(e) (tj. pˇrebytek toku - rozd´ıl toho co do vrcholu vteˇce a co z nˇej odteˇce δ(t, v) je pro uzly s´ıtˇe nulov´ y). Velikost toku se definuje jako |t| = δ(t, s). Algoritmus (Ford-Fulkerson˚ uv algoritmus) Algoritmus pouˇz´ıv´ a myˇslenku zlepˇsiteln´e cesty - tj. pokud existuje v grafu neorientovan´a cesta ze z do s takov´a, ˇze pro hrany ve smˇeru od zdroje je t < c a pro hrany ve smˇeru ke zdroji t > 0Kˇ c(0), pak mohu tok zlepˇsit (o minimum rezerv). Algoritmus opakuje takov´ yto krok, dokud je moˇzn´e ho prov´est. Neˇreˇs´ı v´ ybˇer cesty, proto je dost pomal´ y a pokud nejsou hodnoty t racion´ aln´ı ˇc´ısla, m˚ uˇze se i zacyklit. Ve chv´ıli zastaven´ı algoritmu z´ısk´ am max. tok, nebot’ mnoˇzina A P= {v| ze z do v vede zlepˇsiteln´a cesta } je v tom okamˇziku ˇrez (mnoˇzina A ⊂ V takov´ a, ˇze z ∈ V , s ∈ / V ) a jeho velikost ( e∈E c(e), e = (u, v), u ∈ A, v ∈ / A) je stejn´a jako velikost z´ıskan´eho toku. Algoritmus (Dinitz˚ uv algoritmus) ˇ s´ı v´ Reˇ ybˇer zlepˇsiteln´e cesty – vyb´ır´ a vˇzdy nejkratˇs´ı cestu (coˇz obecnˇe popisuje Edmunds-Karp˚ uv algoritmus). Dinitzova varianta pouˇz´ıv´ a s´ıt’ rezerv, coˇz je graf (V, R), kde hrana e = (v, w) ∈ R, pokud m´a tok hranou kladnou rezervu, tj. r = c(v, w) − t(v, w) + t(w, v) > 0Kˇ c(0). Zlepˇsuj´ıc´ı cesta odpov´ıd´a norm´aln´ı orientovan´e cestˇe v s´ıti rezerv. Pˇrevod na p˚ uv. graf ze s´ıtˇe rezerv je jednoduch´ y, mohu pˇredpokl´ adat, ˇze jedn´ım ze smˇer˚ u mezi dvˇema vrcholy neteˇce nic. Pr˚ ubˇeh algoritmu: na zaˇc´ atku nastav´ı vˇsem hran´am rezervu r(v, w) = c(v, w). Potom postupuje po f´ az´ıch - v 1 f´ azi: • • • •
Vyhod´ı ze s´ıtˇe rezerv vˇsechny hrany, kter´e nejsou na nejkratˇs´ı cestˇe z → s (2x prohled´av´an´ı do ˇs´ıˇrky). Vezme jednu z nejkr. cest v s´ıti rezerv a zlepˇs´ı podle n´ı tok. Vyhod´ı vznikl´e slep´e cesty v s´ıti rezerv (testuji jen hrany, co vyhazuji, a jejich konc. vrcholy) Toto opakuje, dokud jsou v s´ıti rezerv cesty z → s dan´e nejkratˇs´ı d´elky.
Dalˇs´ı f´ az´ı algoritmus pokraˇcuje, dokud existuje v˚ ubec nˇejak´a cesta z → s v s´ıti rezerv. F´az´ı je t´ım p´adem max. n (max. d´elka cesty ze z do s), v 1 f´ azi se proch´ az´ı max. m cest (kles´a poˇcet pouˇziteln´ ych hran), nalezen´ı 1 cesty je O(n) (jdu pˇr´ımo) a vyhazov´ an´ı slep´ ych cest max O(m) celkem za f´ azi (kaˇzdou hranu vyhod´ım jen jednou). Celkov´a sloˇzitost je tedy O(n2 m). Algoritmus (Goldberg˚ uv algoritmus (preflow-push, algoritmus vlny)) Nehled´ a v grafu zlepˇsuj´ıc´ı cesty, v pr˚ ubˇehu v´ ypoˇctu v grafu nen´ı tok, ale vlna (ze zdroje teˇce vˇzdy v´ıce nebo rovno neˇz max. tok). Preflow – vlna“ – je funkce t : E → R+ takov´a, ˇze ∀e ∈ E : 0 ≤ t(e) ≤ c(e), tedy pˇrebytky toku ve vrcholech (δ) jsou ” povolen´e. Ve chv´ıli, kdy ˇz´ adn´ y vrchol nem´ a pˇrebytek toku (δ), dost´av´am (maxim´aln´ı) tok. Pro kaˇzd´ y vrchol v si algoritmus pamatuje v´ yˇsku“ h(v). Tak´e pracuje se s´ıt´ı rezerv. ” • Inicializace: h(z) = n, h(v, v 6= z) = 0Kˇ c(0), t(e) = 0 ∀e, δ(v) = 0 ∀v. ´ • Uvodn´ ı preflow : pˇrevede ze zdroje maximum moˇzn´eho (t(e) = c(e) po smˇeru) do sousedn´ıch vrchol˚ u. • Hlavn´ı cyklus: opakuje se, dokud existuje vnitˇrn´ı vrchol v s kladn´ ym δ. pro vrchol v: – pokud existuje hrana (v, w) nebo (w, v), t.ˇz. r(e) > 0Kˇ c(0) (v dan´em smˇeru) a h(v) ≥ h(w), potom se pˇrevede min(δ(v), r(e)) z v do w. – jinak se zv´ yˇs´ı h(v) o 1.
43
Po celou dobu bˇehu algoritmu plat´ı invariant e = (v, w), r(e) > 0 ⇒ h(v) ≤ 1 + h(w). To zaruˇcuje, ˇze nalezen´ y tok po zastaven´ı je maxim´ aln´ı (zdroj je ve v´ yˇsce n, stok 0, tedy kaˇzd´a cesta pˇrekon´av´a nˇekde rozd´ıl −33Kˇ c(2)). Vrcholy nejde zvedat donekoneˇcna, takˇze se algoritmus zastav´ı: pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı, ˇze je-li δ(v) > 0Kˇ c(0), pak existuje v s´ıti rezerv cesta v → z. To zaruˇcuje, ˇze h(v) ≤ 2n − 17Kˇ c(1) - pokud m´am vrchol v tak, ˇze h(v) = 2n − 17Kˇ c(1) a δ(v) > 0Kˇ c(0), potom existuje cesta v → z s kladn´ ymi rezervami a podle invariantu jde kaˇzd´a hrana na n´ı max. o 1 nahoru (tedy max. o n − 17Kˇ c(1) celkem). Sloˇzitost Goldbergova algoritmu je O(n2 · m).
44
3.8
Tranzitivn´ı uz´ avˇ er
Definice Tranzitivn´ı uz´ avˇ er orientovan´eho grafu je orientovan´ y graf s p˚ uvodn´ımi vrcholy a plat´ı, ˇze existuje hrana z uzlu u do uzlu v pr´ avˇe tehdy, kdyˇz v p˚ uvodn´ım orientovan´em grafu existuje libovoln´a orientovan´a cesta z uzlu u do uzlu v.
Obr´ azek 4: Tranzitivn´ı uz´ avˇer grafu (zdroj: http://zorro.fme.vutbr.cz/graphs/foil36.html)
Pozn´ amka Plat´ı, ˇze matice dosaˇzitelnosti v grafu G = matice sousednosti tranzitivn´ıho uz´avˇeru grafu G. Algoritmus Z kaˇzd´eho vrcholu vypustit DFS (Depth-first search – prohled´av´an´ı do hloubky), do spoleˇcn´e matice zaznamen´ avat dosaˇzen´e vrcholy (ˇr´ adek odpov´ıd´ a vrcholu, sloupce vrchol˚ um, kter´e jsou z nˇeho dosaˇziteln´e) – sloˇzitost O(n(n + m)). Warshall˚ uv algoritmus [k] Iterativn´ı konstrukce matice dosaˇzitelnosti, postupnˇe poˇc´ıt´a matice Wk , kde wi,j = 1, pokud mezi vrcholy i a j existuje cesta, jej´ıˇz vˇsechny vnitˇrn´ı vrcholy jsou mezi vrcholy 1 . . . k. [k+1] [k] [k] [k] Z matice Wk lze spoˇc´ıtat matici W [k+1] : Wi,j = Wi,j ||(Wi,k+1 &&Wk+1,j ) – bud’ vede mezi vrcholy i, j cesta, kter´ a nepouˇzije vrchol k + 1, nebo takov´ a, kter´ a ho pouˇzije – v tom pˇr´ıpadˇe ale mus´ı v´est cesty mezi vrcholy i, k + 1 a k + 1, j, kter´e pouˇz´ıvaj´ı pouze vrcholy 1 . . . k, jejich spojen´ım je cesta mezi vrcholy i, j Matice W 1 je matice incidence p˚ uvodn´ıho grafu. Pseudok´ od (vstup: I – matice incidence, [0, 1]n×n ): Procedure Warshall(I) W:= I; for k:=1 to n begin for i:=1 to n begin for j:=1 to n wi,j = wi,j ||(wi,k &&wk,j ) end end return W; Sloˇzitost algoritmu je jasnˇe O(n3 ) (potˇrebuje 2n3 bitov´ ych operac´ı), coˇz m˚ uˇze b´ yt lepˇs´ı pro grafy s hodnˇe hranami (poˇcet hran se bl´ıˇz´ı n2 ), neˇz sloˇzitost n ∗ DF S ( n ∗ (n + m) ≈ n ∗ (n + n2 ) = n2 + n3 ) TODO: jeˇstˇe nˇeco?
45
3.9
Algoritmy vyhled´ av´ an´ı v textu
Toto s´ u len vel’mi struˇcn´e v´ yt’ahy z wikipedie. Aktu´ alne s´ u tu len preto, aby si ˇclovek r´ ychlo vybavil, o ˇcom tie algoritmy s´ u :-) Rabin-Karp Umoˇzn ˇuje vyhl’ad´ avanie viacer´ ych ret’azcov v texte naraz - uˇzitoˇcn´e napr. na hl’adanie plagi´atov. Z´akladnou myˇslienkou je ’ vyhl ad´ avanie v texte pomocou hashov (rolling hashes - idea je s[i+1..i+m] = s[i..i+m-1] - s[i] + s[i+m])... Algoritmus pre vyhl’ad´ avanie jedn´eho ret’azca: 1 function RabinKarp(string s[1..n], string sub[1..m]) 2 hsub := hash(sub[1..m]) 3 hs := hash(s[1..m]) 4 for i from 1 to n-m+1 5 if hs = hsub 6 if s[i..i+m-1] = sub 7 return i 8 hs := hash(s[i+1..i+m]) 9 return not found Najhorˇsia zloˇzitost’ je Ω(mn). Pri vyhl’ad´ avan´ı viacer´ ych ret’azcov len spoˇc´ıtame hashe vˇsek´ ych hl’adan´ ych stringov a pri ’ n´ajden´ı niektor´eho z hashov pr´ısluˇsn´ y ret azec porovn´ame s textom... Ostatn´e algoritmy spotrebuj´ u ˇcas O(n) na n´ ajdenie 1 ret’azca a teda O(nk) na vyhl’adanie k ret’azcov. Naproti tomu tento algoritmus m´a oˇcak´avan´ u zloˇzitost’ O(n + k) - pretoˇze vyhl’ad´ avanie v hashovacej tabul’ke, ˇci je hash podret’azca textu rovn´ y hashu niektor´eho z hl’adan´eho ret’azcov, trv´ a O(1). Aho-Corasick Dok´ aˇze vyhl’ad´ avat’ viacero ret’azcov naraz - pouˇz´ıva na to trie-like ˇstrukt´ uru (koneˇcn´ y automat), ktor´ y obsahuje nasleduj´ uce prvky“: ” 1. koneˇcn´ a mnoˇzina Q - stavy 2. koneˇcn´ a abeceda A 3. transition funkcia g: Q × A → Q + {f ail} 4. failure funkcia h: Q → Q + {f ail}. h(q) = q 0 pr´ ave vtedy ked’ spomedzi vˇsetk´ ych stavov Q d´ava q 0 najdlhˇs´ı suffix z path(q). 5. koneˇcn´ a mnoˇzina F - koncov´e stavy Pr´ıklad hotov´eho“ automatu pre slov´ a P={ab, ba, babb, bb}: ”
Zloˇzitost’ vyhl’ad´ avania je line´ arna vzhl’adom k d´lˇzke textu a poˇctu n´ajden´ ych slov“ (pozn.: ten mˆoˇze byt’ aˇz kvadradick´ y” slovn´ık a, aa, aaa, aaaa; ret’azec aaaa). Trie ˇstrukt´ uru je moˇzn´e vyrobit’ raz a potom pouˇz´ıvat’ poˇcas vyhl’ad´avania - uchov´ avame si najdlˇs´ı match a pouˇz´ıvame suffix odkazy (aby sme udrˇzali linearitu v´ ypoˇctu). V´ ystavba stromu se provede prost´ ym zaˇrazov´ an´ım slov do trie-stromu podle prefix˚ u. Na t´eto struktuˇre je potom moˇzn´e v line´ arn´ım ˇcase (vzhledem k poˇctu znak˚ u hledan´ ych slov) pˇredpoˇc´ıtat hodnoty failure funkce: automat vˇzdy pust´ıme na sufix aktu´ alnˇe zkouˇsen´eho slova, bez prvn´ıho znaku. D´ıky tomu, ˇze pr˚ ubˇeˇznˇe ukl´ad´ame hodnoty nalezen´ ych slov, pro kaˇzd´e p´ısmeno provede max. 2 kroky (postup vpˇred a uloˇzen´ı hodnoty, kam bych spadnul). 46
Knuth-Morris-Pratt Obdoba Aho-Corasick, ale hl’ad´ a len jedno slovo. Samozrejme nie je potrebn´a dopredn´a funkcia (vˇzdy iba nasleduj´ uci znak), pouˇz´ıva sa partial match“ tabul’ka (failure funkcia). ” algorithm kmp_search: input: S (the text to be searched) W (the word sought) m = 0 (the beginning of the current match in S) i = 0 (the position of the current character in W) an array of integers, T (the table, computed elsewhere) while m + i is less than the length of S, do: if W[i] = S[m + i], i = i + 1 if i equals the length of W, return m otherwise, m = m + i - T[i], if i is greater than 0, i = T[i] (if we reach here, we have searched all of S unsuccessfully) return the length of S Zloˇzitost’ algoritmu je je O(k) (k je d´lˇzka S) - cyklus je vykonan´ y najviac 2k kr´at. Algoritmus na v´ yrobu tabul’ky: algorithm kmp_table: input: W (the word to be analyzed) T (the table to be filled) i = 2 (the current position we are computing in T) j = 0 (the zero-based index in W of the next character of the current candidate substring) (the first few values are fixed but different from what the algorithm might suggest) let T[0] = -1 T[1] = 0 while i is less than the length of W, do: (first case: the substring continues) if W[i - 1] = W[j], T[i] = j + 1 i = i + 1 j = j + 1 (second case: it doesn’t, but we can fall back) otherwise, if j > 0, j = T[j] (third case: we have run out of candidates. Note j = 0) otherwise, T[i] = 0 i = i + 1 Zloˇzitost’ tohoto algoritmu je O(n) (n je d´lˇzka W) - cyklus skonˇc´ı najviac po 2n iter´aci´ach.
47
3.10
Algebraick´ e algoritmy
Diskr´ etn´ı Fourierova Transformace (DFT) Diskr´etn´ı Fourierova transformace se pouˇz´ıv´ a, chceme-li zachytit hodnotu (pˇrepokl´adejme, ˇze 2π-periodick´e) funkce na intervalu [−π, π] v nˇejak´ ych n bodech. To je dobr´e napˇr. pro vzorkov´an´ı elektrick´eho nebo zvukov´eho sign´alu a jin´e operace. Pro nˇejakou funkci n´ am tak staˇc´ı zn´ at vektor dimenze n (a n je poˇcet vzork˚ u na 2π). Je to zaloˇzeno na Fourierov´ ych ˇrad´ ach – d´ a se uk´ azat, ˇze funkce 1, cos kx a sin kx pro k ≥ 1 tvoˇr´ı ortogon´aln´ı b´ azi prostoru spojit´ ych funkc´ı na intervalu [−π, π]. Protoˇze potˇrebujeme zn´at jenom koneˇcn´ y poˇcet vzork˚ uP , staˇc´ı n´am jen koneˇ c n´ y P∞ podprostor ∞ s koneˇcnou b´ az´ı. M´ ame-li rozklad nˇejak´e 2π-periodick´e funkce do Fourierovy ˇrady f (x) = c + k=1 ak sin kx + k=1 bk cos kx, d´ a se jednoduˇse uk´ azat, ˇze pro hodnoty v bodech −π, −π + nπ , −π + 2 nπ , . . . , −π + (n − 1) nπ staˇc´ı sumy do n2 − 1 pro sinusov´e ˇrady a n e – vyˇsˇs´ı koeficienty v takov´ ych bodech jsou nulov´e. Takˇze n hodnot funkce f na intervalu [−π, π] lze reprezentovat 2 pro kosinov´ vektorem n ˇc´ısel v b´ azi 1, cos x, . . . , cos n2 x, sin x, . . . , sin( n2 − 1)x. Jednoduˇseji to lze uk´ azat v komplexn´ıch ˇc´ıslech – je zn´amo, ˇze eix = cos x + i · sin x k
takˇze vektor hodnot funkce lze ekvivalentnˇe reprezentovat v b´azi ei·2π n , k ∈ {0, . . . , n}, nebot’ vˇsechny vektory p˚ uvodn´ı b´ aze lze zapsat jako line´ arn´ı kombinace vektor˚ u nov´e b´ aze. Definujeme hodnotu √ 1 n ω := ei·2π n (a to je vlastnˇe nˇeco jako“ 1) ” vid´ıme, ˇze ω k je n-periodick´ a funkce, takˇze nez´ aleˇz´ı na hranic´ıch sumace (− n2 + 1, . . . , n2 je ekvivalentn´ı 0, . . . , n − 1). Potom se posloupnost n komplexn´ıch ˇc´ısel α0 , . . . , αn−1 (napˇr. hodnot naˇs´ı funkce v bodech −π + 2πk n , k ∈ {0, . . . , n − 1}) transformuje na posloupnost n komplexn´ıch ˇc´ısel A0 , . . . , An−1 (do b´aze ω i , i ∈ {0, . . . , n − 1}) pouˇzit´ım vzoreˇcku: Aj =
n−1 X
αk ω kj
j = 0, . . . , n − 1
k=0
Tento pˇrevod oznaˇcujeme jako diskr´etn´ı Fourierovu transformaci. Inverzn´ı diskr´etn´ı Fourierova transformace je opaˇcn´ y probl´em – z n Fourierov´ ych koeficient˚ u Ak chceme zpˇetnˇe vypoˇc´ıtat , k ∈ {0, . . . , n − 1. Plat´ ı: hodnoty funkce αk v bodech −π + 2πk n αj =
n−1 1X Ak ω −kj n
j = 0, . . . , n − 1
k=0
D˚ ukaz 0 Definujeme matici W : Wp,q = ω pq , potom A = W α (vektorovˇe), takˇze a = W −1 A. Definujeme W 0 : Wp,q = ω −pq a dok´ aˇzeme, 0 ˇze W · W = n · In . M´ ame n−1 n−1 X X 0 (W · W 0 )p,q = Wp,s · Ws,q = ω (p−q)·s s=0
s=0
a potom pro Pn−1 Pn−1 Pn−1 • p = q plat´ı s=0 ω (p−q)·s = s=0 ω 0 = s=0 1 = n • p= 6 q definujeme Q := ω p−q a dostaneme geometrickou posloupnost Q0 + Q1 + · · · + Qn−1 , pro jej´ıˇz souˇcet prvn´ıch n ˇclen˚ u plat´ı vzorec n−1 X
Qs = Q0
s=0
1−1 Qn−1+1 − 1 =1 =0 Q−1 Q−1
Algoritmus (Fast Fourier transform (FFT)) Fast Fourier transform je algoritmus pro poˇc´ıt´ an´ı diskr´etn´ı Fourierovy transformace vektor˚ u rozmˇeru n = 2k v ˇcase Θ(n log n). pq M´ am-li matici Fourierov´ ych koeficient˚ u W, Wp,q = αq ω , mohu ji rozdˇelit na lich´e a sud´e sloupce, u sud´ ych vyj´ adˇrit ω q a pro spodn´ı polovinu ˇr´ adek (se sumami jdouc´ımi po dvou) mohu sn´ıˇzit exponent u ω o n/2 (d´ıky periodicitˇe) a vyjdou stejn´ a ˇc´ısla: Aj =
n−1 X
αk ω kj
j ∈ {0, . . . , n − 1}
k=0
n 2 −1
n 2 −1
Aj =
X
α2k ω 2kj + ω j
k=0
X
α2k+1 ω 2kj
A
j+ n 2
=
k=0
n − 1} 2
j ∈ {0, . . . ,
n − 1} 2
k=0 n 2 −1
n 2 −1
X
j ∈ {0, . . . ,
α2k ω
2k(j+ n 2)
+ω
(j+ n 2)
X
n
α2k+1 ω 2k(j+ 2 )
k=0
48
Pozn´ amka: pro rychl´e a jednoduch´e pochopen´ı tˇech blekt˚ u co jsem tu napsal doporuˇcuji Kuˇcer˚ uv program Algovision http://kam.mff.cuni.cz/~ludek/AlgovisionPage.html DFT je tam n´ azornˇe a pˇrehlednˇe uk´ azan´ a. TODO: Souvisej´ıc´ı obecn´e vˇeci“ o Fourierovˇe transofrmaci, pouˇzit´ı pˇri spektr´aln´ı anal´ yze (Nyquist-Shannon sampling the” orem), datov´e kompresi (Diskr´etn´ı kosinov´ a transformace), n´asoben´ı polynom˚ u (+n´asoben´ı velk´ ych integer˚ u). Euklid˚ uv algoritmus Euklid˚ uv algoritmus je postup (algoritmus), kter´ ym lze urˇcit nejvˇetˇs´ıho spoleˇcn´eho dˇelitele dvou pˇrirozen´ ych ˇc´ısel, tzn. nejvyˇsˇs´ı ˇc´ıslo takov´e, ˇze beze zbytku dˇel´ı obˇe ˇc´ısla. Algoritmus (pomoc´ı rekurze): function gcd(a, b) if b = 0 return a else return gcd(b, a mod b) Algoritmus (pomoc´ı iterace): function gcd(a, b) while b (soubor zde konˇc´ı :-( )
49
3.11
Z´ aklady kryptografie, RSA, DES
(nejsou zde uvedeny pˇr´ıklady symetrick´ ych ˇsifer, pro z´ajemce vesel´ y komiks o AES – http://www.moserware.com/2009/09/ stick-figure-guide-to-advanced.html :)) Z´ aklady kryptografie12 Definice (Kryptografick´y syst´em) Prostor otevˇren´ ych zpr´ av M , ˇsifrovan´ ych zpr´ av C, ˇsifrovac´ıch a deˇsifrovac´ıch kl´ıˇc˚ u K a K 0 . Efektivn´ı generov´ an´ı kl´ıˇc˚ u G : 0 0 N → K × K , ˇsifrov´ an´ı E : M × K → C, deˇsifrov´ an´ı D : C × K → M . • Symetrick´ e (sd´ılen´ y kl´ıˇc ke = kd ) rychl´e, kr´ atk´e kl´ıˇce, potreba menit klice a bezpecne si je vymenit • Asymetrick´ e (veˇrejn´ y kl´ıˇc ke 6= kd ) delsi klice a pomalejsi nez symetrick´e, neni potˇreba tajn´a v´ ymˇena, neni potˇreba tak ˇcasto mˇenit kl´ıˇce Definice (Nahodn´e gener´ atory) Pouˇz´ıvaj´ı se pro generov´ an´ı kl´ıˇc˚ u pro ˇsifry (napˇr RSA) a v proudov´ ych ˇsifr´ach. • HW zaˇr´ızen´ı ˇcasto zaloˇzen´ a na jevech generuj´ıc´ıch statisticky n´ahodn´e ”ˇsumov´e”sign´aly, napˇr´ıklad z tepeln´eho ˇsumu polovodiˇce. • SW jsou zaloˇzeny na pozorov´ an´ı jev˚ u v poˇc´ıtaˇci z hlediska programu n´ahodn´ ych, ˇcasto z uˇzivatelsk´eho vstupu (napˇr. PuTTYgen pouˇz´ıv´ a pro generov´ an´ı RSA kl´ıˇce pˇrej´ızdˇen´ı myˇs´ı). • Pseudon´ ahodn´ e jsou deterministick´e programy generuj´ıc´ı posloupnost ˇc´ısel pokud moˇzno nerozliˇsitelnou od n´ ahodn´e. – pˇr. kongruenˇcn´ı gener´ ator: Xn+1 = (aXn + c)modm – pouˇz´ıvaj´ı se v proudov´ ych ˇsifr´ ach Definice (Hashovaci funkce) Funkci h : U → {0, 1, . . . , m − 1} naz´ yv´ ame haˇ sovac´ı funkc´ı.13 Poˇ zadavky: • • • •
Rovnomˇern´e a n´ ahodn´e rozloˇzen´ı hodnot Odolnost na kolize (v´ ypoˇcetnˇe sloˇzit´e naj´ıt pro x 6= x h(x) = h(y)) Jednosmˇern´ a funkce (v´ ypoˇcetnˇe sloˇzit´e naj´ıt y k x pro h(x) = y) Efektivn´ı algoritmus
Vyuˇ zit´ı: CRC (kontroln´ı souˇcet), ukl´ ad´ an´ı hesel (MD5,SHA) ... Definice (Model utocnika podle Doleva a Yao) • • • • • •
M˚ uˇze z´ıskat libovolnou zpr´ avu putuj´ıc´ı po s´ıti Je pr´ avoplatn´ ym uˇzivatelem s´ıtˇe a tud´ıˇz m˚ uˇze zah´ajit komunikaci s jin´ ym uˇzivatelem M˚ uˇze se st´ at pˇr´ıjemcem zpr´ av kohokoliv M˚ uˇze zas´ılat zpr´ avy komukoliv zosobnˇen´ım se za jin´eho uˇzivatele Neumi rozume resit NP-uplne problemy (ani slozitejsi)14 Bez spr´ avn´eho kl´ıˇce nem˚ uˇze nal´ezt zpr´ avu k ˇsifrovan´e zpr´avˇe a nem˚ uˇze vytvoˇrit platnou ˇsifrovanou zpr´avu z dan´e zpr´ avy, vˇse vzhledem k nˇejak´emu ˇsifrovac´ımu algoritmu
Definice (Cile utoku) d˚ uvˇ ernost dat uˇzivatel m˚ uˇze urˇcit kdo m´ a data vidˇet, a syst´em skuteˇcnˇe dovol´ı pracovat s daty pouze povolen´ ym uˇzivatel˚ um celistvost dat moˇznost podstrˇcen´ı faleˇsn´ ych dat dostupnost syst´ emu DoS (Denial of Service) Pˇ r´ıklad Ukazku pouziti nejakeho sifrovaciho protokolu (zvolil jsem kombinace symetricka sifra sifrovani, asymetricka predani klicu k symetricke). TODO 12 sestaveno
podle vrazedneho zkouseni Jaghobem ot´ azku Haˇsov´ an´ı 14 tzn. i slabˇ s´ı: Nem˚ uˇ ze odhadnout n´ ahodn´ eˇ c´ıslo z dostateˇ cnˇ e velk´ eho prostoru 13 viz
50
Obr´azek 5: D-H protokol
Definice (protokol Diffie-Hellman) • Diffie-Hellman v´ ymena kl´ıcu je kryptografick´ y protokol, kter´ y umoˇznuje nav´azat bezpecn´e spojen´ı. Pro bezpecn´e spojen´ı je potreba si vymenit kl´ıc k symetrick´e ˇsifre pres jeˇste nezabezpecen´ y kan´al. Pr´ave tento protokol to umoˇznuje aniˇz by byl kl´ıc jednoduˇse posl´ an v otevren´e forme. • Alice si vymysl´ı velk´e prvoc´ıslo p, gener´ ator g koneˇcn´e grupy G = (Zp∗ , ·) a a ∈ [1, p − 1) vypocte A poˇsle Bobovi [g,p,A], Bob vypocte B a poˇsle ho Alici oba si vypoc´ıtaj´ı K ⇒ muzou zacit symetricky sifrovanou komunikaci • Puvodne nezabezpecoval autentifikaci ucastniku = nachylny k utoku man-in-the-middle. Man-in-the-middle muze vytvorit komunikaci s dvema ruznymi Diffie-Hellman klici, jeden s Alici a druhej s Bobem, a pak se tvarit jako Alice k Bobovi a obracene, treba pomoci dekodovani a rekodovani zprav mezi nimi. Nejaka metoda autentifikace mezi temito osobami je nutna. • Probl´emu nalezen´ı c´ısla a ze znalosti ga mod p se r´ık´a probl´em diskr´etn´ıho logaritmu. Tento probl´em je st´ ale povaˇzov´ an za velmi obt´ıˇzn´ y.
RSA (Rivest-Shamir-Adleman) Asymetrick´ a ˇsifra (r˚ uzn´e kl´ıˇce pro ˇsifrov´ an´ı a deˇsifrov´ an´ı), pouˇziteln´a jako ˇsifra s veˇrejn´ ym kl´ıˇcem. Kryptosch´ema je zaloˇzeno na Eulerove formuli. Alice a Bob se verejne dohodnou na hranici N a chtej´ı si vymenovat tajn´e zpr´avy 0 ≤ m < N . Inicializace: 1. vybrat dvˇe dostateˇcnˇe velk´ a prvoˇc´ısla p, q tak aby n = p · q < N 2. Alice spoˇc´ıt´ a ϕ(n) = (p − 1) · (q − 1) (Eulerova funkce ϕ(n) je poˇcet ˇc´ısel menˇs´ıch neˇz n, kter´a jsou s n nesoudˇeln´a) 3. vybrat e takov´e, ˇze 1 < e < ϕ(n) a e je nesoudˇeln´e s ϕ(n) – dvojice (n, e) bude veˇrejn´y kl´ıˇc (public key) 4. vybrat d tak, aby d · e ≡ 1 mod ϕ(n) takov´e d lze naj´ıt rozˇs´ıˇren´ ym euklidov´ ym algoritmem – dvojice (n, d) bude deˇsifrovac´ı kl´ıˇc (private key) ˇ Sifrov´ an´ı: 1. Alice pos´ıl´ a public key Bobovi (ˇc´ısla n a e), nech´av´a si private key 2. Bob chce Alici poslat zpr´ avu m tak spoˇc´ıt´ a: c = me mod n 3. Bob odeˇsle c Alici Deˇ sifrov´ an´ı: 1. Alice pˇrijala c 2. Spoˇc´ıt´ a: m = cd
mod n
ˇ Sifra (to, ˇze to v˚ ubec funguje, tedy, ˇze m = (me )d ) se op´ır´a o nˇekolik netrivi´aln´ıch vˇet algebry...
51
• Pro re´ aln´e pouˇzit´ı c´ısla pribliˇzne 100 aˇz 200 bitu. Kl´ıc e vol´ıme jako prvoc´ıslo vetˇs´ı neˇz (p − 1) a (q–1). Hranice bezpecnosti pro modul n je N = 1024 bitu, rozumn´e 1500 bitu, l´epe 2048 • Nen´ı zn´ ama metoda vedouc´ı k rozbit´ı tohoto algoritmu • Slabost´ı je hypotetick´ a moˇznost vytvorit elektronick´ y podpis zpr´avy bez znalosti deˇsifrovac´ıho kl´ıce na z´aklade zachycen´ı vhodn´ ych predchoz´ıch zaˇsifrovan´ ych zpr´ av. • napˇr´ıklad SSH protokol pouˇz´ıv´ a RSA kl´ıˇce
52
3.12
Pravdˇ epodobostn´ı algoritmy – testov´ an´ı prvoˇ c´ıselnosti
ˇ (tato ot´ azka nebyla asi nikdy zkouˇsena, a tak je to jenom takovy n´astˇrel Zdroj: v´ yborn´e Cepkovy slajdy na ADS2 - zda se ze je ocenuju az ted :)) Pravdˇepodobnostn´ı (n´ ahodnostn´ı) algoritmy jsou nedeterministick´e algoritmy, kter´e se snaˇz´ı naj´ıt ˇreˇsen´ı rychleji nebo ˇreˇsen´ı tˇeˇzko ˇreˇsiteln´ ych probl´em˚ u, ˇcasto NP-´ upln´ ych probl´em˚ u. Pravdˇepodobnostn´ı algoritmus se m˚ uˇze n´ahodnˇe rozhodovat mezi r˚ uzn´ ymi moˇznostmi jak pokraˇcovat. Pro stejn´ y vstup m˚ uˇze d´avat takov´ y algoritmus r˚ uzn´e v´ ysledky, kter´e mohou b´ yt dokonce nespr´ avn´e. Mnohdy se tedy na dan´em vstupu spust´ı pravdˇepodobnostn´ı algoritmus v´ıcekr´at, aby se s vˇetˇs´ı pravdˇepodobnost´ı dospˇelo ke spr´ avn´emu v´ ysledku. Pravdˇepodobnostn´ıch algoritm˚ u je mnoho typ˚ u, zde zm´ın´ıme jen dva a to algoritmy typu Las Vegas a typu Monte Carlo. Algoritmy typu Las Vegas V´ ysledek je vˇzdy spr´ avn´ y, n´ ahodnost ovlivˇ nuje pouze dobu bˇehu algoritmu, tj. po jak´e cestˇe se algoritmus ke spr´avn´emu v´ ysledku dobere. Pˇ r´ıklad (randomizovan´y QuickSort) Od deterministick´e verze se liˇs´ı n´ ahodn´ ymi v´ ybˇery pivota pˇri kaˇzd´em dˇelen´ı posloupnosti, coˇz poskytuje n´asleduj´ıc´ı v´ yhody • d´ av´ a dobr´ y pr˚ umˇern´ y ˇcas (tj. O(n log n)) i v pˇr´ıpadˇe, ˇze data na vstupu nejsou n´ahodn´e permutace – ˇz´adn´ y vstup nen´ı apriori ˇspatn´ y (pro kaˇzd´ y deterministick´ y v´ ybˇer pivota existuj´ı apriori ˇspatn´e vstupy) • m˚ uˇze b´ yt spuˇstˇen paralelnˇe v nˇekolika kopi´ıch, v´ ysledek je z´ısk´an z kopie, kde v´ ypoˇcet skonˇc´ı nejdˇr´ıve (pro deterministickou verzi nem´ a takov´ y postup ˇz´ adn´ y smysl)
Algoritmy typu Monte Carlo N´ahodnost ovlivˇ nuje jak dobu bˇehu, tak spr´ avnost v´ ysledku: algoritmus m˚ uˇze udˇelat chybu, ale pouze jednostrannˇe (u odpovˇed´ı ANO/NE) a s omezenou pravdˇepodobnost´ı. Pˇ r´ıklad (Rabin-Miller˚ uv algoritmus na testov´ an´ı prvoˇc´ıselnosti) Pro zadan´e pˇrirozen´e ˇc´ıslo n (rychle) rozhodnout zda je n prvoˇc´ıslo
Vˇ eta (Mal´ a Fermatova) Necht’ p je prvoˇc´ıslo. Potom ∀k ∈ {1, 2, . . . , p − 1} plat´ı k p−1 ≡ 1( mod p) Pokud n nen´ı prvoˇc´ıslo, tak zkus´ıme (n´ ahodnˇe) naj´ıt svˇedka“ k, poruˇsuj´ıc´ıho k n−1 ≡ 1( mod n), kter´ y dosvˇedˇcuje“, ˇze n ” ” je opravdu ˇc´ıslo sloˇzen´e (nen´ı to prvoˇc´ıslo). Probl´em - pro nˇekter´a sloˇzen´a ˇc´ısla je svˇedk˚ u pˇr´ıliˇs m´alo, takˇze je pˇr´ıliˇs mal´ a pravdˇepodobnost, ˇze nˇejak´eho svˇedka (n´ ahodnˇe) vybereme. Definice Necht’ T je mnoˇzina dvojic pˇrirozen´ ych ˇc´ısel, kde (k, n) ∈ T pokud 0 < k < n a je splnˇena alespoˇ n jedna z n´asleduj´ıc´ıch dvou podm´ınek: 1. neplat´ı k n−1 ≡ 1( mod n), 2. existuje i takov´e, ˇze m = (n − 1)/2i je pˇrirozen´e ˇc´ıslo a plat´ı 1 < N SD(k m−1 − 1, n) < n Vˇ eta (1) ˇ ıslo n je sloˇzen´e tehdy a jen tehdy, kdyˇz existuje k takov´e, ˇze (k, n) ∈ T . C´ Vˇ eta (2) Necht’ n je sloˇzen´e ˇc´ıslo. Pak existuje alespoˇ n (n − 1)/2 takov´ ych ˇc´ısel k, pro kter´e plat´ı (k, n) ∈ T . Algoritmus: Rabin-Miller(n); for i:=1 to poˇ cet do ki := n´ ahodn´ e pˇ rirozen´ e ˇ c´ ıslo z intervalu [1,n-1]; if (ki,n) in T then Return(n je sloˇ zen´ e); Return(n je prvoˇ c´ ıslo) Pokud Rabin − M iller(n) rozhodne, ˇze n je sloˇzen´e, tak je to zaruˇcenˇe spr´avn´ y v´ ysledek (byl nalezen svˇedek“), pokud ” Rabin − M iller(n) rozhodne, ˇze n je prvoˇc´ıslo, tak se m˚ uˇze jednat o chybu, ale pouze v pˇr´ıpadˇe, ˇze vˇsechna vybran´ a ki byli ne-svˇedci“ pro sloˇzen´e ˇc´ıslo n, coˇz ale m˚ uˇze (d´ıky Vˇetˇe 2) nastat nejv´ yˇse s pravdˇepodobnost´ı ” P (chyba) ≤ (1/2)pocet pokud jsou v´ ybˇery jednotliv´ ych ki vz´ ajemnˇe nez´ avisl´e Vlastnosti algoritmu: 53
• zvyˇsov´ an´ım poˇctu iterac´ı (poˇctu testovan´ ych ki ) lze dostat libovolnˇe malou (pˇredem zvolenou) pravdˇepodobnost chyby • jednotliv´e iterace (testy pro r˚ uzn´ a ki ) lze prov´ adˇet paralelnˇe ˇ Casov´ a sloˇ zitost: kaˇzd´ a iterace trv´ a jen polynomi´ alnˇe vzhledem k d´elce z´apisu ˇc´ısla n (tj. k d´elce vstupu), k tomu je ovˇsem potˇreba uk´ azat, ˇze test zda (ki , n) ∈ T je moˇzno prov´est v ˇcase polynomi´aln´ım v log n, coˇz nen´ı trivi´aln´ı (je nutn´e m´ıt dalˇs´ı znalosti z teorie ˇc´ısel)
54
3.13
Aproximaˇ cn´ı algoritmy
(tato ot´ azka asi nebyla nikdy zkouˇsena takˇze je to jenom takov´ y n´astˇrel, asi m´a cenu seto uˇcit aˇz kdyˇz pochop´ıte NP-´ upln´e ˇ probl´emy (hlavnˇe kliku a rozvrh) Zdroj: Cepkovy slajdy na ADS2) Aprox. algoritmy jsou vhodn´e tam, kde je nalezen´ı optim´aln´ıho ˇreˇsen´ı beznadˇejn´e“ (ˇcasovˇe pˇr´ıliˇs n´aroˇcn´e), typicky u NP” tˇeˇzk´ ych optimalizaˇcn´ıch u ´loh (optimalizaˇcn´ıch verz´ı NP-´ upln´ ych rozhodovac´ıch probl´em˚ u). Maj´ı n´asleduj´ıc´ı tˇri vlastnosti: 1. konstruuj´ı suboptim´ aln´ı ˇreˇsen´ı 2. poskytuj´ı odhad kvality zkonstruovan´eho ˇreˇsen´ı vzhledem k optimu 3. bˇeˇz´ı v polynomi´ aln´ım ˇcase (jinak nejsou zaj´ımav´e) Pˇ r´ıklad (maximalizaˇcn´ı u ´lohy (optimalizaˇcn´ı verze KLIKY)) Pro dan´ y neorientovan´ y graf najdi nejvˇetˇs´ı (poˇctem vrchol˚ u) kliku (´ upln´ y podgraf). Po aproximaˇcn´ım algoritmu chceme u (tj. velikost kliky) v ˇreˇsen´ı X, OPT je garanci typu f (AP ROX) ≥ 43 f (OP T ), kde f (X) je v tomto pˇr´ıpadˇe poˇcet vrchol˚ optim´ aln´ı ˇreˇsen´ı a APROX je ˇreˇsen´ı vydan´e aproximaˇcn´ım algoritmem. Pˇ r´ıklad (Pˇr´ıklad minimalizaˇcn´ı u ´lohy (optimalizaˇcn´ı verze ROZ)) Rozvrh na paralel. stroj´ıch. Pro dan´e u ´koly a dan´ y poˇcet stroj˚ u najdi nejkratˇs´ı rozvrh. Po aproximaˇcn´ım algoritmu chceme garanci typu f (AP ROX) ≤ 2f (OP T ).
Definice Chyba aproximaˇcn´ıho algoritmu je definov´ ana jako pomˇer (pod´ıl) f (AP ROX)/f (OP T ) pro minimalizaˇcn´ı u ´lohy a f (OP T )/f (AP RO pro maximalizaˇcn´ı u ´lohy. Relativn´ı chyba je pak definov´ana jako |f (AP ROX)f (OP T )|/f (OP T ). Algoritmus (Naivn´ı aproximaˇcn´ı algoritmus F RON T A) pro optimalizaˇcn´ı verzi ROZ: bere u ´koly postupnˇe podle jejich ˇc´ısel a kaˇzd´ yu ´kol vˇzdy um´ıst´ı na stroj, kter´ y je voln´ y nejdˇr´ıve. Znaˇ cen´ı: OP T = optim´ aln´ı rozvrh, Q = rozvrh zkonstruovan´ y algoritmem FRONTA, d´elka(OPT) = o, d´elka(Q) = q Vˇ eta Pokud m je poˇcet stroj˚ u, tak q ≤ ((2m − 1)/m)o a tento odhad jiˇz nelze zlepˇsit. D˚ ukaz. d˚ ukazy vˇsech vˇet z t´eto kapitoly najdete tˇreba u hippiese: http://hippies.matfyz.info/poznamky/predmet_ads2/gallery.php?ID=28 D˚ usledek Aproximaˇcn´ı algoritmus FRONTA m´ a pomˇerovou chybu 2. D˚ ukaz. 1.Tˇesnost odhadu: Pro kaˇzd´e m zkonstruujeme zad´an´ı, pro kter´e plat´ı v dokazovan´e nerovnosti rovnost, a to n´ asleduj´ıc´ım zp˚ usobem x1 = x2 = . . . = xm−1 = m − 1 (m − 1 u ´kol˚ u d´elky m − 1) xm = xm+1 = . . . = x2m−2 = 1 (m − 1 u ´kol˚ u d´elky 1) x2m−1 = m (1 u ´kol d´elky m) 2.Platnost nerovnosti: Necht’ j je u ´kol konˇc´ıc´ı jako posledn´ı v rozvrhu Q (konˇc´ıc´ı v ˇcase q) a necht’ t je okamˇzik zah´ ajen´ı u ´kolu j. Potom ˇz´ adn´ y procesor nem´ a prostoj pˇred ˇcasem t a plat´ı mq ≤ (2m − 1)o . ˇ ADAN ´ ´ FRONTA) Algoritmus (Lepˇs´ı aproximaˇcn´ı algoritmus USPOR A pro optimalizaˇcn´ı verzi ROZ: pracuje stejnˇe jako FRONTA, ale na zaˇc´atku u ´koly setˇr´ıd´ı do nerostouc´ı posloupnosti podle jejich d´elek. Znaˇ cen´ı: OPT = optim´ aln´ı rozvrh, ˇ ADAN ´ ´ FRONTA, U = rozvrh zkonstruovan´ y algoritmem USPOR A d´elka(OPT) = o, d´elka(U) = u Vˇ eta Pokud m je poˇcet stroj˚ u, tak u ≤ ((4m − 1)/3m)o a tento odhad jiˇz nelze zlepˇsit. D˚ usledek ˇ ADAN ´ ´ FRONTA m´a pomˇerovou chybu 4/3. Aproximaˇcn´ı algoritmus USPOR A D˚ ukaz. Tˇesnost odhadu: Pro kaˇzd´e lich´e m zkonstruujeme zad´an´ı, pro kter´e plat´ı v dokazovan´e nerovnosti rovnost, a to n´asleduj´ıc´ım zp˚ usobem x1 = x2 = 2m − 1 (2 u ´koly d´elky 2m − 1) x3 = x4 = 2m − 2 (2 u ´koly d´elky 2m − 2) x2m−3 = x2m−2 = m + 1 (2 u ´koly d´elky m + 1) x2m−1 = x2m = x2m+1 = m (3 u ´koly d´elky m)
55
Lemma Pokud pro vˇsechny u ´koly plat´ı xi ≤ 1/3o pak u = o. Dokonˇcen´ı d˚ ukazu: Necht’ j je u ´kol konˇc´ıc´ı jako posledn´ı v rozvrhu U (konˇc´ıc´ı v ˇcase u). Pokud xj > 1/3o tak pouˇzijeme Lemma, v opaˇcn´em pˇr´ıpadˇe je d˚ ukaz velmi podobn´ y jako pro algoritmus FRONTA.
4
Datab´ aze
Poˇ zadavky • • • • • • •
4.1
Podstata a architektury DB syst´em˚ u. Konceptu´ aln´ı, logick´ a a fyzick´ au ´roveˇ n pohled˚ u na data. Relaˇcn´ı datov´ y model, relaˇcn´ı algebra. Algoritmy n´ avrhu sch´emat relac´ı, norm´ aln´ı formy, referenˇcn´ı integrita. Z´ aklady SQL. Transakˇcn´ı zpracov´ an´ı, vlastnosti transakc´ı. Organizace dat na vnˇejˇs´ı pamˇeti, B-stromy a jejich varianty.
Podstata a architektury DB system˚ u
Zdroje: Wikipedie, slidy Dr. T. Skopala k Datab´ azov´ ym syst´em˚ um Definice (Datab´ aze) Datab´ aze je logicky uspoˇr´ adan´ a (integrovan´ a) kolekce navz´ajem souvisej´ıc´ıch dat. Je sebevysvˇetluj´ıc´ı, protoˇze data jsou uchov´ av´ ana spoleˇcnˇe s popisy, zn´ am´ ymi jako metadata (tak´e sch´ema datab´aze). Data jsou ukl´ad´ana tak, aby na nich bylo moˇzn´e prov´ adˇet strojov´e dotazy – z´ıskat pro nˇejak´e parametry vyhovuj´ıc´ı podmnoˇzinu z´aznam˚ u. Nˇekdy se slovem datab´ aze“ mysl´ı obecnˇe cel´ y datab´azov´ y syst´em. ” Definice (Syst´em ˇr´ızen´ı b´ aze dat) ˇ Syst´em ˇr´ızen´ı b´ aze dat (SRBD, anglicky database management system, DBMS) je obecn´ y softwarov´ y syst´em, kter´ y ˇr´ıd´ı sd´ılen´ y pˇr´ıstup k datab´ azi, a poskytuje mechanismy, pom´ ahaj´ıc´ı zajistit bezpeˇcnost a integritu uloˇzen´ ych dat. Spravuje datab´ azi a zajiˇst’uje prov´ adˇen´ı dotaz˚ u. Definice (Datab´ azov´y syst´em) Datab´ azov´ ym syst´emem rozum´ıme trojici, sest´ avaj´ıc´ı z: • datab´ aze • syst´emu ˇr´ızen´ı b´ aze dat • chud´ aka admina Smysl datab´ az´ı Hlavn´ım smyslem datab´ aze je schraˇ novat datov´e z´ aznamy a informace za u ´ˇcelem: • • • • •
sd´ılen´ı dat v´ıce uˇzivateli, zajiˇstˇen´ı unifikovan´eho rozhran´ı a jazyk˚ u definice dat a manipulace s daty, znovuvyuˇzitelnosti dat, bezespornosti dat a sn´ıˇzen´ı objemu dat (odstranˇen´ı redundance).
Datab´ azov´ e modely Definice (sch´ema, model) Typicky pro kaˇzdou datab´ azi existuje struktur´ aln´ı popis druh˚ u dat v n´ı udrˇzovan´ ych, ten naz´ yv´ame sch´ema. Sch´ema popisuje objekty reprezentovan´e v datab´ azi a vztahy mezi nimi. Je nˇekolik moˇzn´ ych zp˚ usob˚ u organizace sch´emat (modelov´an´ı datab´ azov´e struktury), zn´ am´ ych jako modely. V modelu jde nejen o zp˚ usob strukturov´an´ı dat, definuje se tak´e sada operac´ı nad daty provediteln´ a. Relaˇcn´ı model napˇr´ıklad definuje operace jako select“ nebo join“. I kdyˇz tyto operace se nemusej´ı pˇr´ımo ” ” vyskytovat v dotazovac´ım jazyce, tvoˇr´ı z´ aklad, na kter´em je jazyk postaven. Nejd˚ uleˇzitˇejˇs´ı modely v t´eto sekci pop´ıˇseme.
56
Pozn´ amka Vˇetˇsina datab´ azov´ ych syst´em˚ u je zaloˇzena na jednom konkr´etn´ım modelu, ale ˇc´ım d´al ˇcastˇejˇs´ı je podpora v´ıce pˇr´ıstup˚ u. Pro kaˇzd´ y logick´ y model existuje v´ıce fyzick´ ych pˇr´ıstup˚ u implementace a vˇetˇsina syst´em˚ u dovol´ı uˇzivateli nˇejakou u ´roveˇ n jejich kontroly a u ´prav, protoˇze toto m´ a velk´ y vliv na v´ ykon syst´emu. Pˇr´ıkladem necht’ jsou indexy, provozovan´e nad relaˇcn´ım modelem. Ploch´ y“ model ” Toto sice nevyhovuje u ´plnˇe definici modelu, pˇresto se jako trivi´aln´ı pˇr´ıpad uv´ad´ı. Pˇredstavuje jedinou dvoudimension´ aln´ı tabulku, kde data v jednom sloupci jsou povaˇzov´ ana za popis stejn´e vlastnosti (takˇze maj´ı podobn´e hodnoty) a data v jednom ˇr´ adku se uvaˇzuj´ı jako popis jedin´eho objektu. Relaˇ cn´ı model Relaˇcn´ı model je zaloˇzen na predik´ atov´e logice a teorii mnoˇzin. Vˇetˇsina fyzicky implementovan´ ych datab´azov´ ych syst´em˚ u ve skuteˇcnosti pouˇz´ıv´ a jen aproximaci matematicky definovan´eho relaˇcn´ıho modelu. Jeho z´akladem jsou relace (dvoudimension´ aln´ı tabulky), atributy (jejich pojmenovan´e sloupce) a dom´eny (mnoˇziny hodnot, kter´e se ve sloupc´ıch m˚ uˇzou objevit). Hlavn´ı datovou strukturou je tabulka, kde se nach´ az´ı informace o nˇejak´e konkr´etn´ı tˇr´ıdˇe entit. Kaˇzd´a entita t´e tˇr´ıdy je potom reprezentov´ ana ˇr´ adkem v tabulce – n-tic´ı atribut˚ u. Vˇsechny relace (tj. tabulky) mus´ı splˇ novat z´ akladn´ı pravidla – poˇrad´ı sloupc˚ u nesm´ı hr´at roli, v tabulce se nesm´ı vyskytovat identick´e ˇr´ adky a kaˇzd´ y ˇr´ adek mus´ı obsahovat jen jednu hodnotu pro kaˇzd´ y sv˚ uj atribut. Relaˇcn´ı datab´aze obsahuje v´ıce tabulek, mezi kter´ ymi lze popisovat vztahy (vˇsech r˚ uzn´ ych kardinalit, tj. 1 : 1, 1 : n apod.). Vztahy vznikaj´ı i implicitnˇe napˇr. uloˇzen´ım stejn´e hodnoty jednoho atributu do dvou ˇr´ adk˚ u v tabulce. K tabulk´am lze pˇridat informaci o tom, kter´a podmnoˇzina atribut˚ u funguje jako kl´ıˇc, tj. unik´ atnˇe identifikuje kaˇzd´ y ˇr´ adek, nˇekter´ y z kl´ıˇc˚ u m˚ uˇze b´ yt oznaˇcen jako prim´arn´ı. Nˇekter´e kl´ıˇce m˚ uˇzou m´ıt nˇejak´ y vztah k vnˇejˇs´ımu svˇetu, jin´e jsou jen pro vnitˇrn´ı potˇreby sch´ematu datab´aze (generovan´a ID). Hierarchick´ y model V hierarchick´em modelu jsou data organizov´ ana do stromov´e struktury – kaˇzd´ y uzel m´a odkaz na nadˇr´ızen´ y (k popisu hierarchie) a setˇr´ıdˇen´e pole z´ aznam˚ u na stejn´e u ´rovni. Tyto struktury byly pouˇz´ıv´any ve star´ ych mainframeov´ ych datab´ az´ıch, nyn´ı je m˚ uˇzeme vidˇet napˇr ve struktuˇre XML dokument˚ u. Dovoluj´ı vztahy 1 : N mezi dvˇema druhy dat, coˇz je velice efektivn´ı k popisu r˚ uzn´ ych re´ aln´ ych vztah˚ u (obsahy, ˇrazen´ı odstavc˚ u textu, tˇr´ıdˇen´e informace). Nev´ yhodou je ale nutnost zn´ at celou cestu k z´ aznamu ve struktuˇre a neschopnost syst´emu reprezentovat redundance v datech (strom nem´a cykly). S´ıt’ov´ y model S´ıt’ov´ y model organizuje data pomoc´ı dvou hlavn´ıch prvk˚ u, z´ aznam˚ u a mnoˇzin. Z´aznamy obsahuj´ı pole dat, mnoˇziny definuj´ı vztahy 1 : N mezi z´ aznamy (jeden vlastn´ık, mnoho prvk˚ u). Z´aznam m˚ uˇze b´ yt vlastn´ıkem i prvkem v nˇekolika r˚ uzn´ ych mnoˇzin´ ach. Jde vlastnˇe o variantu hierarchick´eho modelu, protoˇze s´ıt’ov´ y model je tak´e zaloˇzen na konceptu v´ıce struktur niˇzˇs´ı u ´rovnˇe z´ avisl´ ych na struktur´ ach u ´rovnˇe vyˇsˇs´ı. Uˇz ale umoˇzn ˇuje reprezentovat i redundantn´ı data. Operace nad t´ımto modelem prob´ıhaj´ı navigaˇcn´ım“ stylem: program si uchov´ av´a svoji souˇcasnou pozici mezi z´aznamy a postupuje podle z´ avislost´ı, ve ” kter´ ych se dan´ y z´ aznam n´ ach´ az´ı. Z´ aznamy mohou b´ yt i vyhled´av´any podle kl´ıˇce. Fyzicky jsou vˇetˇsinou mnoˇziny – vztahy – reprezentov´any pˇr´ımo ukazateli na um´ıstˇen´ı dat na disku, coˇz zajiˇst’uje vysok´ y v´ ykon pˇri vyhled´ av´ an´ı, ale zvyˇsuje n´ aklady na reorganizace. Smysl s´ıt’ov´e navigace mezi objekty se pouˇz´ıv´a i v objektov´ ych modelech. Objektov´ y model Objektov´ y model je aplikac´ı pˇr´ıstup˚ u zn´ am´ ych z objektovˇe-orientovan´eho programov´an´ı. Je zaloˇzen na sbliˇzov´an´ı programov´e aplikace a datab´ aze, hlavnˇe ve smyslu pouˇzit´ı datov´ ych typ˚ u (objekt˚ u) definovan´ ych na jednom m´ıstˇe; ty zpˇr´ıstupˇ nuje k pouˇzit´ı v nˇejak´em bˇeˇzn´em programovac´ım jazyce. Odstran´ı se tak nutnost zbyteˇcn´ ych konverz´ı dat. Pˇrin´aˇs´ı do datab´az´ı tak´e vˇeci jako zapouzdˇren´ı nebo polymorfismus. Probl´emem objektov´ ych model˚ u je neexistence standard˚ u (nebo sp´ıˇs produkt˚ u, kter´e by je implementovaly). Kombinac´ı objektov´eho a relaˇcn´ıho pˇr´ıstupu vznikaj´ı objektovˇe-relaˇcn´ı datab´aze – relaˇcn´ı datab´aze, dovoluj´ıc´ı uˇzivateli definovat vlastn´ı datov´e typy a operace na nich. Obsahuj´ı pak hybrid mezi procedur´aln´ım a dotazovac´ım programovac´ım jazykem.
Architektury datab´ azov´ ych syst´ em˚ u ˇ Zdroj: Wiki CVUT (st´ atnice na FELu ;-)) Architektury datab´ azov´ ych syst´em˚ u se obecnˇe dˇel´ı na • centralizovan´e (kde se datab´ aze pˇredpokl´ ad´ a fyzicky na jednom poˇc´ıtaˇci) a • distribuovan´e, pˇr´ıpadnˇe na • jednouˇzivatelsk´e a • v´ıceuˇzivatelsk´e.
57
Distribuovan´ e datab´ azov´ e syst´ emy Distribuovan´y syst´em ˇr´ızen´ı b´ aze dat je vlastnˇe speci´aln´ım pˇr´ıpadem obecn´eho distribuovan´eho v´ ypoˇcetn´ıho syst´emu. Jeho implementace zahrnuje fyzick´e rozloˇzen´ı dat (vˇcetnˇe moˇzn´ ych replikac´ı datab´aze) na v´ıce poˇc´ıtaˇc˚ u – uzl˚ u, pˇriˇcemˇz jejich popis ˇ je integrov´ an v glob´ aln´ım datab´ azov´em sch´ematu. Data v uzlech mohou b´ yt zpracov´av´ana lok´aln´ımi SRBD, komunikace je organizov´ ana v s´ıt’ov´em provozu pomoc´ı speci´ aln´ıho softwaru, kter´ y um´ı zach´azet s distribuovan´ ymi daty. Fyzicky se ˇreˇs´ı rozloˇzen´ı do uzl˚ u, sv´ azan´ ych komunikaˇcn´ımi kan´ aly, a jeho transparence (neviditelnost – navenek se m´a tv´aˇrit jako jednolit´ y syst´em). Kaˇzd´ y uzel v s´ıti je s´ am o sobˇe datab´ azov´ y syst´em a z kaˇzd´eho uzlu lze zpˇr´ıstupnit data kdekoliv v s´ıti. D´ ale se dˇel´ı na dva typy: • Federativn´ı datab´ aze – neexistuje glob´ aln´ı sch´ema ani centr´aln´ı ˇr´ıd´ıc´ı autorita, ˇr´ızen´ı je tak´e distribuovan´e. ˇ • Heterogenn´ı datab´ azov´e syst´emy – jednotliv´e autonomn´ı SRBD existuj´ı (vznikly nez´avisle na sobˇe) a jsou integrov´ any, aby spolu mohly komunikovat. V´ yhodou oproti centralizovan´ ym syst´em˚ um je vyˇsˇs´ı efektivita (data mohou b´ yt uloˇzena bl´ızko m´ısta nejˇcastˇejˇs´ıho pouˇz´ıv´ an´ı), zv´ yˇsen´ a dostupnost, v´ ykonnost a rozˇsiˇritelnost; nev´ yhodou z˚ ust´av´a probl´em sloˇzitosti implementace, distribuce ˇr´ızen´ı a niˇzˇs´ı bezpeˇcnost takov´ ych ˇreˇsen´ı. V´ıceuˇ zivatelsk´ e datab´ azov´ e syst´ emy V´ıceuˇzivatelsk´e jsou takov´e syst´emy, kter´e umoˇzn ˇuj´ı v´ıcen´asobn´ y uˇzivatelsk´ y pˇr´ıstup k dat˚ um ve stejn´em okamˇziku. V d˚ usledku moˇzn´eho souˇcasn´eho pˇr´ıstupu v´ıce uˇzivatel˚ u je nutn´e syst´em zabezpeˇcit tak, aby i nad´ale zajiˇst’oval integritu a konzistenci uloˇzen´ ych dat. Existuj´ı obecnˇe dva moˇzn´e pˇr´ıstupy: • Uzamyk´ an´ı – Dˇr´ıve ˇcasto pouˇz´ıvan´ a metoda zaloˇzen´a na uzamyk´an´ı aktualizovan´ ych z´aznam˚ u, v pˇr´ıpadˇe masivn´ıho vyuˇzit´ı aktualizaˇcn´ıch pˇr´ıkaz˚ u u n´ı ale m˚ uˇze doch´ azet k znaˇcn´ ym prodlev´am. • Multiversion Concurency Control – Modernˇejˇs´ı vyn´alez. Jeho princip spoˇc´ıv´a v tom, ˇze pˇri poˇzadavku o aktualizaci z´ aznamu v tabulce je vytvoˇrena kopie z´ aznamu, kter´ a nen´ı pro ostatn´ı uˇzivatele aˇz do proveden´eho commitu viditeln´ a.
58
4.2
Konceptualn´ı, logick´ a a fyzick´ au ´ roveˇ n pohledu na data
TODO: sjednotit terminologii, snad to popisuje to co tu m´a b´ yt, ale zdroje jsou pochybn´e (Wikipedie tady neodv´ ad´ı zrovna ˇ ide´ aln´ı pr´ aci a CVUT Wiki se moc nerozepisuje). Definice (Datov´e modelov´ an´ı) Datov´e modelov´ an´ı je proces vytvoˇren´ı konkr´etn´ıho datov´eho modelu (sch´ematu) datab´aze pomoc´ı aplikace nˇejak´eho abstraktn´ıho datab´ azov´eho modelu. Datov´e modelov´ an´ı zahrnuje kromˇe definice struktury a organizace dat jeˇstˇe dalˇs´ı implictin´ı nebo explicitn´ı omezen´ı na data do struktury ukl´ adan´a. Vrstvy modelov´ an´ı Druhy datov´ ych model˚ u mohou b´ yt tˇr´ı typ˚ u, podle tˇr´ı r˚ uzn´ ych pohled˚ u na datab´aze (tˇri vrstvy“, kter´e se navz´ajem doplˇ nuj´ı): ” • konceptu´ aln´ı sch´ema (datov´ y model) – nejabstraktnˇejˇs´ı, popisuje v´ yznam organizace datab´aze – tˇr´ıdy entit a jejich vztahy. • logick´e sch´ema – popisuje v´ yznam konceptu´ aln´ıho sch´ematu z hlediska datab´azov´e implementace – popisy tabulek, programov´ ych tˇr´ıd nebo XML tag˚ u (podle zvolen´eho datab´azov´eho modelu) • fyzick´e sch´ema – nejkonkr´etnˇejˇs´ı, popisuje fyzick´e uloˇzen´ı dat a stroje na kter´ ych syst´em pobˇeˇz´ı. Na tomto rozdˇelen´ı je d˚ uleˇzit´ a nez´ avislost jednotliv´ ych vrstev – takˇze se implementace jedn´e z nich m˚ uˇze zmˇenit, aniˇz by bylo nutn´e v´ yraznˇe upravovat ostatn´ı (samozˇrejmˇe mus´ı z˚ ustat konzistetn´ı vzhledem k ostatn´ım vrstv´am). Bˇehem implementace nˇejak´e datab´ azov´e aplikace se zaˇc´ın´ a vytvoˇren´ım konceptu´aln´ıho sch´ematu, pokraˇcuje jeho upˇresnˇen´ı logick´ ym sch´ematem a naknec jeho fyzickou implementac´ı podle fyzick´eho sch´ematu (modelu). Pozn´ amka V tomto pohledu (kter´ y je podle standardu ANSI z r. 1975) jsou datab´azov´e modely, popsan´e v pˇredchoz´ı sekci, pˇr´ıklady abstraktn´ıch logick´ ych datov´ ych model˚ u. Nˇekde je vˇsak tato u ´roveˇ n oznaˇcov´ana jako fyzick´a“ a jin´a logick´a“ se vtˇesn´ı jeˇstˇe ” ” mezi ni a konceptu´ aln´ı. Konceptu´ aln´ı sch´ ema Konceptu´ aln´ı sch´ema (datov´ y model) popisuje podstatn´e objekty (tˇr´ıdy entit, koncepty“), jejich charakteristiky (atributy) a ” vztahy mezi nimi (asociace mezi dvojicemi tˇr´ıd entit). Nepopisuje pˇr´ımo implementaci v datab´azi, jen v´ yznam nˇejak´eho celku, kter´ y bude datab´ az´ı pˇredstavov´ an. Jde o modelov´ an´ı datov´e reality“, z pohledu uˇzivatele (analytika, konstrukt´era datab´ aze). ” Pˇ r´ıklady P´ ar pˇr´ıklad˚ u vztah˚ u mezi tˇr´ıdami entit (z Wikipedie): • Each PERSON may be the vendor in one or more ORDERS. • Each ORDER must be from one and only one PERSON. • PERSON is a sub-type of PARTY. (Meaning that every instance of PERSON is also an instance of PARTY.) De-facto standardem pro konceptu´ aln´ı datov´e modelov´an´ı jsou ER-diagramy (entity-relationship diagramy). Hod´ı se hlavnˇe pro ploch´ a“ form´ atovan´ a data (takˇze tˇreba pro objektov´e nebo relaˇcn´ı datab´aze, ale ne pro XML apod.). Pouˇz´ıvaj´ı dva typy ” objekt˚ u“ – entity (tˇr´ıdy entit) a vztahy. Jde o obdobu UML z objektov´eho programov´an´ı. Pˇr´ıklad ER-diagramu se vztahem ” dvou entit je na n´ asleduj´ıc´ım obr´ azku (popisuje i dalˇs´ı vlastnosti – atributy entit a kardinality vztah˚ u):
(Obr´ azek je upraven´ y, rozˇs´ıˇren´ y a popsan´ y pˇr´ıklad ze slid˚ u Dr. T. Skopala k Datab´azov´ ym syst´em˚ um)
59
Logick´ e sch´ ema Logick´e sch´ema je datov´ y model organizace nˇejak´eho specifick´eho celku pomoc´ı jednoho z datab´azov´ ych model˚ u – podle datab´ azov´ ych model˚ u popsan´ ych v pˇredchoz´ı sekci, tj. napˇr. pomoc´ı relaˇcn´ıch tabulek, objektov´ ych tˇr´ıd nebo XML. Svoj´ı u ´rovn´ı abstrakce se nach´ az´ı mezi konceptu´ aln´ım a fyzick´ ym sch´ematem. Fyzick´ e sch´ ema Fyzick´e datov´e modely jsou modely, ktere pouˇz´ıvaj´ı databazov´e stroje smˇerem k niˇzˇs´ım vrstv´am (operaˇcn´ıho) syst´emu. V z´ asadˇe jde o r˚ uzn´e zp˚ usoby fyzick´eho uloˇzen´ı dat (tedy sch´emata organizace soubor˚ u) – sekvenˇcn´ı soubory, B-stromy apod.
60
4.3
Relaˇ cn´ı datov´ y model, relaˇ cn´ı algebra
Definice (Relaˇcn´ı datov´y model) Relaˇcn´ı sch´ema je n-tice R(A1 : D1 , A2 : D2 , ..., An : Dn ), kde mnoˇziny Di jsou tzv. (atributov´e) dom´eny (odpov´ıd´ a dat.typ˚ um v tabulk´ ach) - uv´ adˇej´ı se nepovinnˇe, mnoˇzina Ai je atribut (odpov´ıd´a sloupci hodnot v tabulce) d´ale definujme relaci 15 R ⊆ A1 × A2 ...An jako mnoˇzinu n-tic (a1 , a2 , ..., an ) (odpov´ıd´a konktr´etn´ım dat˚ um v tabulce) kde ai ∈ Ai a prvek relace r ∈ R (odpov´ıd´ a ˇr´ adku v tabulce). Pˇ r´ıklad (Relaˇcn´ı datov´y model) definujeme atributy: jm´ eno = {Nov´ ak, Star´ y, Coufal, Liˇ ska} ulice = {Hlavn´ ı, Severn´ ı, Sadov´ a} mˇ esto = {Hradec, R´ ajec, Poln´ a} pak R = {(Nov´ ak, Hlavn´ ı, Harrison), (Star´ y, Severn´ ı, R´ ajec), (Coufal, Severn´ ı, R´ ajec), (Liˇ ska, Sadov´ a, Poln´ a)} je relace na kart´ezsk´em souˇcinu (tzn. jeho podmnoˇzina) jm´ eno × ulice × mˇ esto relaˇcn´ı sch´ema: z´ akazn´ ık-sch´ ema (jm´ eno:string, ulice:string, mˇ esto:string) Definice (Relaˇcn´ı algebra) Relaˇcn´ı algebra je mnoˇzina operac´ı (un´ arn´ıch, ˇci bin´arn´ıch) na relac´ıch se sch´ematy, jejichˇz v´ ysledkem je opˇet relace (a jej´ı sch´ema). Deklarativn´ı dotazovac´ı jazyk – tj. neprocedur´aln´ı, nicm´enˇe struktura v´ yrazu nav´ad´ı na poˇrad´ı a zp˚ usob vyhodnocen´ı. V´ ysledkem je vˇzdy koneˇcn´ a relace – bezpeˇcnˇe“ definovan´e operace. ” Definice (Operace) Nezbytn´e operace pro zachov´ an´ı vyjadˇrovac´ı s´ıly jazyka: • pˇ rejmenov´ an´ı - un´ arn´ı operace, pouze se pˇrejmenuj´ı atributy sch´ematu, s daty se nic nedˇeje (tj. v´ yslekem je stejn´ a relace a stejn´e sch´ema, pouze pˇr´ısluˇsn´e atributy maj´ı jin´a jm´ena) < R, R(Ai → Bi , Aj → Bj , ...) > • sjednocen´ı - sch´emata mus´ı m´ıt stejny poˇcet atribut˚ u a kompatibiln´ı dom´eny < R1 , R1 (A) > ∪ < R2 , R2 (A) >=< R1 ∪ R2 , Rx (A) > • rozd´ıl mnoˇ zin - sch´emata mus´ı m´ıt stejny poˇcet atribut˚ u a kompatibiln´ı dom´eny < R1 , R1 (A) > – < R2 , R2 (A) >=< R1 –R2 , Rx (A) > • kart´ ezsk´ y souˇ cin - vyˇzaduje disjuktn´ı schemata, pokud existuj´ı stejn´a jm´ena atribut˚ u mus´ı se nejdˇr´ıve pˇrejmenovat < R1 , R1 (A) > × < R2 , R2 (B) >=< R1 × R2 , Rx ({R1 } × A ∪ {R2 } × B) > –zde je vhodn´e si vˇsimnout prav´e strany - t´ım ˇze Skopal ve sch´ematu provedl kart´ezsk´ y souˇcin mnoˇziny atribut˚ u s jenoprvkovou mnoˇzinou ”R1 ”vlastnˇe pˇrejmenoval atributy na ”R1 A1 , R2 A2 , ...”aby n´am ve v´ ysledn´em sch´ematu nevznikly atributy s totoˇzn´ ym jm´enem
pˇr´ıklad kart.souˇcinu • selekce - v´ ybˇer tˇech prvk˚ u u relace z R, kter´e splˇ nuj´ı logickou podm´ınku ϕ(u) – podm´ınka je zad´ana Boolsk´ ym v´ yrazem (tj. pomoc´ı spojek and, or, not) atomick´ ych formul´ı t1 Θt2 nebo t1 Θa, kde Θ ∈ {<, >, =, ≥, ≤, 6=} a ti jsou jm´ena atribut˚ u < R(ϕ), R(A) >=< {u|u ∈ R & ϕ(u)}, R(A) > 15 ano
R - relace je nˇ eco jin´ eho neˇ z R(A) - relaˇ cn´ı sch´ ema, Skopal bohuˇ zel pouˇ z´ıv´ a toto troˇsku matouc´ı znaˇ cen´ı
61
• projekce - u[C] je prvek relace zbaven´ y hodnot atribut˚ u A \ C, pˇr´ıpadn´e duplicitn´ı prvky jsou odstranˇeny < R[C], R(A) >=< {u[C] ∈ R}, R(C) > kde C ⊆ A
pˇr´ıklad projekce pro R[A, C] Operace vznikl´e skl´ ad´ an´ım z´ akladn´ıch operac´ı: • pr˚ unik - sch´emata mus´ı m´ıt stejny poˇcet atribut˚ u a kompatibiln´ı dom´eny < R1 , R1 (A) > ∩ < R2 , R2 (A) >=< R1 ∩ R2 , Rx (A) > –d´ a se vyj´ adˇrit tak´e jako: R1 ∩ R2 = (R1 ∪ R2 \ (R1 \ R2 )) \ (R1 \ R2 ) • pˇ rirozen´ e spojen´ı (natural join) - spojen´ı prvk˚ u relace pˇres stejn´e hodnoty vˇsech atribut˚ u sd´ılen´ ych mezi A a B, –pokud A∩B = , pˇrirozen´e spojen´ı je vlastnˇe kart´ezsk´ y souˇcin (spojuje se pˇres pr´azdnou mnoˇzinu, tj. libovolnˇe – vˇsechno ” se vˇs´ım“) –pokud A = B, pˇrirozen´e spojen´ı je pr˚ unik (spoj´ı se pouze stejn´e ˇr´adky) < R, R(A) > ∗ < S, S(B) >=< {u|u[A] ∈ R & u[B] ∈ S}, Rx (A ∪ B) > –lze vyj´ adˇrit pomoc´ı kart´ezsk´eho souˇcinu, selekce a projekce
pˇr´ıklad pˇrirozen´eho spojen´ı • dˇ elen´ı - definujeme si ⊕ jako zˇretˇezen´ı ˇr´ adk˚ u < R, R(A) > ÷ < S, S(B ⊂ A) >=< {t|∀s ∈ S : (t ⊕ s) ∈ R}, Rx (A − B) > –lze vyj´ adˇrit pomoc´ı kart´ezsk´eho souˇcinu a projekce: R ÷ S = R[A \ B] \ ((R[A \ B] × S) \ R)[A \ B]
pˇr´ıklad dˇelen´ı 62
Pozn´ amka (Relaˇcn´ı u ´plnost) Jestliˇze dva v´ yrazy oznaˇcuj´ı stejn´ y dotaz, jsou oba v´ yrazy ekvivalentn´ı. Dotazovac´ı jazyk, kter´ ym lze vyj´adˇrit vˇsechny konstrukce relaˇcn´ı algebry (tj. vˇsechny dotazy, kter´e lze popsat relaˇcn´ı algebrou) se naz´ yv´a relaˇcnˇe u ´pln´y. Definice (Relaˇcn´ı kalkulus) Vyuˇzit´ı apar´ atu predik´ atov´e logiky 1. ˇr´ adu pro dotazov´an´ı. Rozˇs´ıˇren´ı o datab´azov´e“ predik´aty, jejichˇz dvoj´ı forma definuje: ” –dom´enov´ y kalkul (DRK) –pracuje s daty na u ´rovni atribut˚ u –n-ticov´ y kalkul (NRK) –pracuje s daty na u ´rovni n-tic (prvk˚ u relace/ˇr´adk˚ u) V´ ysledkem dotazu v DRK / NRK je opˇet relace (a jej´ı sch´ema). Pˇ r´ıklad (srovn´ an´ı RA, DRK, NRK) definujeme rel.sch´emata: FILM(JMENO_FILMU, JMENO_HERCE) HEREC(JMENO_HERCE, ROK_NAROZENI) a dotaz je: Ve kter´ ych filmech hr´ ali vˇsichni herci? RA: F ILM ÷ HEREC[JM EN O HERCE] DRK: {(f )|F ILM (f ) ∧ ∀h(HEREC(h) ⇒ F ILM (f, h))} NRK: {f ilm[JM EN O F ILM U ] | ∀herec(HEREC(herec) ⇒ f (F ILM (f ) ∧ f.JM EN O HERCE = herec.JM EN O HERCE ∧ f.JM EN O F ILM U = f ilm.JM EN O F ILM U ))} Report (IOI 10.2.2011) a) Popiˇste relacn´ı datov´y model. Co je relacn´ı algebra a k cemu slouzi? b) Jak´e zn´ ate operace RA? Formulujte predpoklady pouzitelnosti kazd´e operace. Definujte vysledek dan´e operace nad relacemi. c) Kter´e operace jsou nezbytn´e pro zachovan´ı vyjadrovaci sily jazyka - respektive, je mozn´e nekter´e operace formulovat pomoci ostatn´ıch operaci? Kter´e a jak? Report (IOI 21.6.2011) Co je to relaˇcn´ı algebra a jak´e operace pouˇz´ıv´ a? 5.2 U kaˇzd´e operace popiˇste sch´ema relace, na kter´e se d´ a tato operace pouˇz´ıt a definujte v´ysledek operace. 5.3 Jsou vˇsechny operace nezbytn´e pro zachov´ an´ı vyjadˇrovac´ı s´ıly jazyka? (Pokud ne, kter´e jsou?) ˇ 5.4 Cemu odpov´ıd´ a operace pˇrirozen´e spojen´ı na relac´ıch, kter´e maj´ı totoˇzn´e sch´ema? ˇ 5.5 Cemu odpov´ıd´ a operace pˇrirozen´e spojen´ı na relac´ıch, jejichˇz sch´emata jsou disjunktn´ı?
63
4.4
Algoritmy n´ avrhu sch´ emat relac´ı
Norm´ aln´ı formy Normalizace, anom´ alie Normalizace datab´ az´ı je technika n´ avrhu relaˇcn´ıch datab´azov´ ych tabulek, pri kter´e se minimalizuj´ı duplicity informac´ı - a zamezuje se tak nekonzistentnosti dat. Stupnˇe normalizace se popisuj´ı“ pomoc´ı norm´ aln´ıch forem - ˇc´ım vyˇsˇs´ı forma, t´ ym ” vyˇsˇs´ı striktnost... Probl´emy ˇreˇsen´e normalizac´ı: • update anomaly – pokud se zmˇen´ı jedna kopie redundantn´ıch dat, je tˇreba zmˇenit i ostatn´ı kopie, jinak se datab´ aze stane nekonzistentn´ı, pˇr.: tabulka (ˇclovˇek, adresa, skill); kdyby se nevykonal update spr´avnˇe, m˚ uˇze tabulka z˚ ustat v nekonzistentn´ım stavu (napˇr. by se mohly zmˇenit jen nˇekter´e adresy jednoho ˇclovˇeka) • insertion anomaly – pˇri vloˇzen´ı dat pˇr´ısluˇsej´ıc´ıch jedn´e entitˇe je potˇreba z´aroveˇ n vloˇzit data i o jin´e entitˇe, napˇr. v tabulce (fakulta, datum zaloˇzen´ı, kurz) m˚ uˇzeme zaznamenat jen data pro fakulty, kter´e maj´ı kurzy... • deletion anomaly – Pˇri vymaz´ an´ı dat pˇr´ısluˇsej´ıc´ıch jedn´e entitˇe je potˇreba vymazat data patˇr´ıc´ı jin´e entitˇe. V pˇredchoz´ı tabulce bude fakulta vymaz´ ana u ´plnˇe, kdyˇz se vˇsemi kurzy. Ide´ alnˇe by relaˇcn´ı datab´ aze mˇela b´ yt navrˇzena tak, aby vyluˇcovala moˇznost takov´ ych anomali´ı. Normalizace obvykle zahrˇ nuje dekomponov´ an´ı nenormalizovan´e tabulky na dvˇe nebo v´ıce tabulek takov´ ych, ˇze po jejich spojen´ı (join) dostaneme vˇsechny p˚ uvodn´ı informace. Abychom mohli definovat norm´ aln´ı formy, potˇrebujeme zn´at funkˇcn´ı z´avislosti jednotliv´ ych atribut˚ u entit relaˇcn´ı datab´ aze a vˇedˇet, kter´e atributy jsou kl´ıˇcov´e a kter´e ne. Definice (Funkˇcn´ı z´ avislosti) ˇ Rekneme, ˇze atribut B je funkˇ cnˇ e z´ avisl´ y na atributu A (znaˇc´ıme A → B), jestliˇze pro kaˇzdou hodnotu atributu A existuje pr´ avˇe jedna hodnota atributu B. Rozˇs´ıˇren´e funkˇcn´ı z´avislosti se definuj´ı pro mnoˇzinu atribut˚ u (pro kaˇzdou n-tici atribut˚ uz nˇejak´e mnoˇziny existuje pr´ avˇe jedna hodnota z´ avisl´eho(z´avisl´ ych) atributu(atribut˚ u)). Funkˇcn´ı z´ avislosti splˇ nuj´ı tzv. Armstrongova pravidla, coˇz zahrnuje pro mnoˇziny atribut˚ u X, Y, Z: 1. 2. 3. 4.
trivi´ aln´ı z´ avislost: X ⊇ Y ⇒ X → Y transitivitu: X → Y ∧ Y → Z ⇒ X → Z kompozici: X → Y ∧ X → Z ⇒ X → Y Z dekompozici: X → Y Z ⇒ X → Y ∧ X → Z
Definice (Kl´ıˇc) Nadkl´ıˇ cem, nˇekdy t´eˇz superkl´ıˇ cem, sch´ematu A rozum´ıme kaˇzdou podmnoˇzinu mnoˇziny A, na n´ıˇz A funkˇcnˇe z´ avis´ı. Jinak ˇreˇceno nadkl´ıˇc je mnoˇzina atribut˚ u, kter´ a jednoznaˇcnˇe urˇcuje ˇr´adek tabulky. Kl´ıˇ c, nebo tak´e potenci´ aln´ı kl´ıˇ c(candidate key), sch´ematu A je takov´ y nadkl´ıˇc sch´ematu A, jehoˇz ˇz´adn´a vlastn´ı podmnoˇzina ˇ minim´ nen´ı nadkl´ıˇcem A. Cili aln´ı nadkl´ıˇc. Kaˇzd´ y atribut, kter´ y je obsaˇzen alespoˇ n v jednom potenci´aln´ım kl´ıˇci se naz´ yv´a kl´ıˇ cov´ y, ostatn´ı atributy jsou nekl´ıˇ cov´ e. Definice (Norm´ aln´ı formy) • Prvn´ı norm´ aln´ı forma – Tabulka je v prvn´ı norm´ aln´ı formˇe, jestliˇze lze do kaˇzd´eho pole dosadit pouze jednoduch´ y datov´ y typ (jsou d´ ale nedˇeliteln´e). To zahrnuje i neexistenci v´ıce sloupc˚ u tabulky se stejn´ ym druhem obsahu: ) (manager, podˇr´ızen´ y1, podˇr´ızen´ y2, podˇr´ızen´ y3) → (manager, podˇr´ızen´ y) (manager, podˇr´ızen´ı-vice hodnot v jednom sloupci) • Druh´ a norm´ aln´ı forma – Existuje kl´ıˇc a vˇsechna nekl´ıˇcov´ a pole jsou funkc´ı cel´eho kl´ıˇce (a tedy ne jen jeho ˇc´ast´ı). (custID, name, address, city, state, zip) →
(custID, name, address, zip) + (zip, city, state)
• Tˇret´ı norm´ aln´ı forma – Tabulka je ve tˇret´ı norm´ aln´ı formˇe, jestliˇze kaˇzd´ y nekl´ıˇcov´ y atribut nen´ı transitivnˇe z´avisl´ y na ˇz´adn´em kl´ıˇci sch´ematu (resp. kaˇzd´ y nekl´ıˇcov´ y atribut je pˇr´ımo z´ avisl´ y na kl´ıˇci sch´ematu) neboli je-li ve druh´e norm´aln´ı formˇe a z´aroveˇ n neexistuje jedin´ a z´ avislost nekl´ıˇcov´ ych sloupc˚ u tabulky. (deptID, deptName, managerID, hireDate) → (deptID, deptName, managerID) Atribut hireDate“ je sice funkˇcnˇe z´ avisl´ y na kl´ıˇci deptID, ale jen proto, ˇze hireDate z´avis´ı na managerID, kter´e z´ avis´ı na ” deptID. • Boyce-Coddova norm´ aln´ı forma – Pro kaˇzdou netrivi´ aln´ı z´ avislost X → Y plat´ı, ˇze X obsahuje kl´ıˇc sch´ematu R (X je nadkl´ıˇc).
64
Algoritmy n´ avrhu sch´ emat relac´ı Sch´emata relac´ı by mˇela b´ yt navrhov´ ana tak, aby odpov´ıdala pˇredem pˇripraven´emu konceptu´aln´ımu modelu (napˇr. pomoc´ı ER diagram˚ u) a z´ aroveˇ n pokud moˇzno splˇ novala co nejpˇr´ısnˇejˇs´ı poˇzadavky na norm´aln´ı formy. Pro modelov´an´ı relaˇcn´ı datab´ aze existuj´ı dva pˇr´ıstupy: 1. Z´ısk´ an´ı mnoˇziny relaˇcn´ıch sch´emat (ruˇcnˇe nebo pˇrevodem z napˇr. ER diagramu) a prov´adˇen´ı normalizace pro kaˇzdou tabulku zvl´ aˇst’ 2. N´ avrh tzv. univerz´ aln´ıho sch´ematu datab´ aze – jedna velk´a tabulka pro celou datab´azi (vˇc. platn´ ych funkˇcn´ıch z´ avislost´ı) a normalizace prov´ adˇen´ a glob´ alnˇe Prvn´ı moˇznost je relativnˇe intuitivn´ı (s ER diagramy) a jednoduch´a, ale hroz´ı riziko pˇr´ıliˇsn´eho rozdroben´ı datab´ aze na velk´ y poˇcet mal´ ych tabulek (a nadbyteˇcn´ y i vzhledem k poˇzadovan´e norm´aln´ı formˇe). V druh´em zp˚ usobu jsou entity jednotliv´ ych relac´ı vypozorov´ any“ jako efekt funkˇcn´ıch z´ avislost´ı, coˇz nen´ı pˇr´ıliˇs pr˚ uhledn´e a jednoduˇse provediteln´e, ale minimalizuje to ˇsanci na ” rozdroben´ı datab´ aze. Oba pˇr´ıstupy lze tak´e zkombinovat – pˇrev´est ER model datab´aze do sch´emat a nˇekter´a (nebo aˇz vˇsechna) potom pˇred normalizac´ı slouˇcit. Normalizace Jedin´ ym zp˚ usobem, jak u nˇejak´eho obecn´eho relaˇcn´ıho sch´ematu dos´ahnout norm´aln´ı formy (obecnˇe se poˇzaduje vˇetˇsinou 3NF nebo BCNF), je rozdˇelen´ı na nˇekolik podsch´emat. D´a se to prov´est ruˇcnˇe nebo algoritmicky a existuje v´ıce pˇr´ıstup˚ u podle poˇzadavku na norm´ aln´ı formu, bezztr´ atovost (dekompozice relace R(A, F ) do R1 (A1 , F1 ) a R2 (A2 , F2 ) je bezeztr´ atov´ a, kdyˇz A1 ∩ A2 → A1 nebo A1 ∩ A2 → A2, tedy opˇetovn´ ym spojen´ım do p˚ uvodn´ı relace nevzniknou dalˇs´ı ˇr´adky) nebo pokryt´ı z´ avislost´ı (dekompozice R(A, F ) do R1 (A1 , F1 ) zachov´av´a pokryt´ı z´avislost´ı, kdyˇz F + = F1+ ∪ F2+ – nesm´ı se ztratit z´ avislost ani v r´ amci d´ılˇc´ıho sch´ematu, ani jdouc´ı napˇr´ıˇc sch´ematy). Algoritmus (Dekompozice) Dekompozice je algoritmus, kter´ y relaˇcn´ı sch´ema pˇrevede do Boyce-Coddovy norm´aln´ı formy. Zaruˇcuje zachov´an´ı bezeztr´ atovosti, ale uˇz ne pokryt´ı z´ avislost´ı (bez ohledu na algoritmus toto u BCNF nˇekdy nen´ı moˇzn´e). Jeho bˇeh vypad´a n´asledovnˇe: 1. Vyber nˇejak´e sch´ema, kter´e nen´ı v BCNF. 2. Vezmi pro nˇej nekl´ıˇcovou z´ avislost X → Y (tak ˇze X nen´ı kl´ıˇc) a dekomponuj podle n´ı – vyhod’ ze sch´ematu Y a dej XY do zvl´ aˇstn´ı tabulky. 3. Opakuj od kroku 1, dokud existuje sch´ema, kter´e nen´ı v BCNF. Algoritmus (Synt´eza) Algoritmus synt´ezy obecnˇe dosahuje tˇret´ı norm´ aln´ı formy a zachov´av´a pokryt´ı z´avislost´ı (ale ne bezeztr´atovost). Pro relaˇcn´ı sch´ema R s mnoˇzinou funkˇcn´ıch z´ avislost´ı F vypad´ a n´asledovnˇe: 1. Udˇelej minim´ aln´ı pokryt´ı F (vzhledem k tranzitivitˇe), nazvi ho G. 2. Sluˇc funkˇcn´ı z´ avislosti z G se stejnou levou stranou a z kaˇzd´e vytvoˇr jedno sch´ema. ’ 3. Zahod sch´emata, kter´ a jsou podmnoˇziny jin´ ych. Nakonec je moˇzn´e slouˇcit sch´emata s funkˇcnˇe ekviv. kl´ıˇci (K1 ↔ K2), ale m˚ uˇze to poruˇsit norm´aln´ı formu, kter´e bylo dosaˇzeno! Pro zachov´ an´ı bezeztr´ atovosti lze do pˇridat nˇejak´e sch´ema, obsahuj´ıc´ı univerz´aln´ı kl´ıˇc cel´eho p˚ uvodn´ıho (nedˇelen´eho) sch´ematu. Pozn´ amka Pro nalezen´ı minim´ aln´ıho pokryt´ı atribut˚ u se pouˇz´ıv´a pomocn´ y algoritmus, kter´ y se chov´a takto: 1. Dekomponuj vˇsechny funkˇcn´ı z´ avislosti na element´arn´ı (na prav´e stranˇe je jen jeden sloupec) 2. Odstraˇ n z nich redundantn´ı atributy (takov´e z lev´e strany, kter´e funkˇcnˇe z´avis´ı na jin´ ych z lev´e strany) 3. Odstraˇ n redundantn´ı funkˇcn´ı z´ avislosti (tj. takov´e, kter´e jsou tranzitivn´ım d˚ usledkem jin´ ych – prav´a strana funkˇcnˇe z´ avis´ı na lev´e, i kdyˇz z mnoˇziny funkˇcn´ıch z´ avislost´ı onu redundantn´ı odstran´ım) Pro druh´ y i tˇret´ı krok je potˇreba z´ıskat atributov´y uz´ avˇer (mnoˇzina vˇsech atribut˚ u i tranzitivnˇe z´avisl´ ych na lev´e stranˇe) – to se opakovanˇe zkouˇs´ı, jestli d´ıky funkˇcn´ım z´ avislostem nedostanu z atribut˚ u p˚ uvodn´ı mnoˇziny nˇejak´e dalˇs´ı atributy (dokud nach´ az´ım dalˇs´ı, pˇrid´ av´ am je do mnoˇziny a opakuji).
Referenˇ cn´ı integrita • pom´ ah´ a udrˇzovat vztahy v relaˇcnˇe propojen´ ych datab´azov´ ych tabulk´ach, zabraˇ nuje vzniku nekonzistentn´ıch dat • kontrola pˇr´ıpustn´ ych hodnot • kontrola existence poloˇzky s dan´ ym kl´ıˇcem v druh´e tabulce (podle ciz´ıho kl´ıˇce) Chov´ an´ı pˇri poruˇsen´ı integrity: • • • • • •
ON UPDATE, ON DELETE - podm´ınka spuˇstˇen´ı akce ON . . . RESTRICT - defaultn´ı ˇreˇsen´ı (hl´ aˇsen´ı chyby) CASCADE - kask´ adov´ a aktualizace/smaz´ an´ı (smaˇze pˇr´ısluˇsn´e ˇr´adky v odkazovan´e tabulke) SET NULL - nastaven´ı odkazovan´ ych ˇr´ adk˚ u z´ avisl´e tabulky na NULL SET DEFAULT - nastaven´ı pevnˇe urˇcen´e hodnoty NO ACTION
65
4.5
Z´ aklady SQL
TODO: pˇrevzato od program´ ator˚ u“ z ot´ azky SQL“, vzhledem k tomu, ˇze u n´as se to jmenuje z´aklady SQL“ tak to moˇzn´ a ” ” ” nemus´ı b´ yt tak podrobn´e Zdroje: slidy z pˇredn´ aˇsek Datab´ azov´e syst´emy a Datab´azov´e aplikace Dr. T. Skopala a Dr. M. Kopeck´eho. Standardy SQL SQL (Structured query language) je standardn´ı jazyk pro pˇr´ıstup k relaˇcn´ım datab´az´ım (a dotazov´an´ı nad nimi). Je z´ aroveˇ n jazykem pro definici dat (definition data language), vytv´aˇren´ı a modifikace sch´emat (tabulek), manipulaci s daty (data manipulation language), vkl´ a´ an´ı, aktualizace, maz´ an´ı dat, ˇr´ızen´ı transakc´ı, definici integritn´ıch omezen´ı aj. Jeho syntaxe odr´ aˇz´ı snahu o co nejpˇrirozenˇejˇs´ı formulace poˇzadavk˚ u – je podobn´ a anglick´ ym vˇet´am“. ” SQL je standard podle norem ANSI/ISO a existuje v nˇekolika (zpˇetnˇe kompatibiln´ıch) verz´ıch (oznaˇcovan´ ych podle roku uveden´ı): SQL 86 – prvn´ı n´ astˇrel“, pr˚ unik implementac´ı SQL firmy IBM ” SQL 89 – mal´ a revize motivovan´ a komerˇcn´ı sf´erou, mnoho detail˚ u ponech´ano implementaci SQL 92 – mnohem silnˇejˇs´ı a obs´ ahlejˇs´ı jazyk. Zahrnuje uˇz • • • •
modifikace sch´emat, tabulky s metadaty, vnˇejˇs´ı spojen´ı, mnoˇzinov´e operace kask´ adov´e maz´ an´ı/aktualizace podle ciz´ıch kl´ıˇc˚ u, transakce kurzory, v´ yjimky
Standard existuje ve ˇctyˇrech verz´ıch: Entry, Transitional, Intermediate a Full. SQL 1999 – pˇrin´ aˇs´ı mnoho nov´ ych vlastnost´ı, napˇr. • • • •
objektovˇe-relaˇcn´ı rozˇs´ıˇren´ı nov´e datov´e typy – reference, pole, full-text podpora pro extern´ı datov´e soubory, multim´edia triggery, role, programovac´ı jazyk, regul´ arn´ı v´ yrazy, rekurzivn´ı dotazy ...
SQL 2003 – dalˇs´ı rozˇs´ıˇren´ı, napˇr. XML management Komerˇcn´ı syst´emy implementuj´ı SQL podle r˚ uzn´ ych norem, nˇekdy jenom SQL-92 Entry, dnes nejˇcastˇeji SQL-99, ale nikdy u ´plnˇe striktnˇe. Nˇekter´e vˇeci chyb´ı a naopak maj´ı vˇsechny spoustu nepˇrenositeln´ ych rozˇs´ıˇren´ı – napˇr. specifick´a rozˇs´ıˇren´ı pro procedur´ aln´ı, transakˇcn´ı a dalˇs´ı funkcionalitu (T-SQL (Microsoft SQL Server), PL-SQL (Oracle) ). S nov´ ymi verzemi se kompatibilita zlepˇsuje, ˇcasto je moˇzn´e pouˇz´ıvat oboj´ı syntax. Pˇrenos aplikace za bˇehu na jinou platformu je ale st´ale velice n´ aroˇcn´ y – a to t´ım n´ aroˇcnˇejˇs´ı, ˇc´ım v´ıc vˇec´ı mimo SQL-92 Entry obsahuje.Pro otestov´an´ı, zda je ˇspatnˇe syntax SQL, nebo zda jen dan´ a datab´ azov´ a platforma nepodporuje nˇekter´ y prvek, slouˇz´ı SQL valid´atory (kter´e testuj´ı SQL podle norem. Dotazy v SQL Hlavn´ım n´ astrojem dotaz˚ u v SQL je pˇr´ıkaz SELECT. Sd´ıl´ı prvky relaˇcn´ıho kalkulu i relaˇcn´ı algebry – obsahuje pr´ aci se sloupci, kvantifik´ atory a agregaˇcn´ı funkce z relaˇcn´ıho kalkulu a dalˇs´ı operace – projekce, selekce, spojen´ı, mnoˇzinov´e operace – z relaˇcn´ı algebry. Na rozd´ıl od striktn´ı formulace relaˇcn´ıho modelu datab´aze povoluje duplik´atn´ı ˇr´adky a NULLov´e hodnoty atribut˚ u. Netˇr´ıdˇen´ y dotaz v SQL sest´ av´ a z: • pˇr´ıkazu(˚ u) SELECT (hlavn´ı logika dotazov´ an´ı), to obsahuje vˇzdy • m˚ uˇze obsahovat i mnoˇzinov´e operace nad v´ ysledky pˇr´ıkaz˚ u SELECT – UNION, INTERSECTION ... V´ ysledky nemaj´ı definovan´e uspoˇr´ ad´ an´ı (resp. jejich poˇrad´ı je urˇceno implementac´ı vyhodnocen´ı dotazu). Pˇr´ıkaz SELECT vypad´ a n´ asledovnˇe (tato verze uˇz zahrnuje i tˇr´ıdˇen´ı v´ ysledk˚ u): SELECT [DISTINCT] v´ yraz1 [[AS] c_alias1] [, ...] FROM zdroj1 [[AS] t_alias1] [, ...] [WHERE podm´ ınka_ˇ r] [GROUP BY v´ yraz_g1 [, ...] [HAVING podm´ ınka_s]] [ORDER BY v´ yraz_o1 [, ...] ASC/DESC] Kde
66
• v´ yrazy mohou b´ yt sloupce, sloupce s agregaˇcn´ımi funkcemi, v´ ysledky dalˇs´ıch funkc´ı ... v´ yraz =
, , (DISTINCT) COUNT( ), [DISTINCT] [ SUM | AVG ]( ), [ MIN | MAX ]( ) a nav´ıc lze pouˇz´ıt oper´ atory +, −, ∗, /. • zdroje jsou tabulky nebo vnoˇren´e selecty • v´ yrazy i zdroje b´ yt pˇrejmenov´ any pomoc´ı AS, napˇr. pro odkazov´an´ı uvnitˇr dotazu nebo jm´ena na v´ ystupu (od SQL-92) • podm´ınka je logick´ a podm´ınka (spojovan´ a logick´ ymi spojkami AND, OR) na hodnoty dat ve zdroj´ıch: podm´ ınka = BETWEEN <x> AND , LIKE "% ... ", IS [NOT] NULL, > = <> <= < > [/ ALL / ANY <dotaz>], NOT IN [<seznam hodnot> / <dotaz>], EXIST ( <dotaz> ) • GROUP BY znamen´ a agregaci podle unik´ atn´ıch hodnot jmenovan´ ych sloupc˚ u (v ostatn´ıch sloupc´ıch vznikaj´ı mnoˇziny hodnot, kter´e se spolu s onˇemi unik´ atn´ım´ı vyskytuj´ı na stejn´ ych ˇr´adk´ach • HAVING oznaˇcuje podm´ınku na agregaci • ORDER BY definuje, podle hodnot ve kter´ ych sloupc´ıch nebo podle kter´ ych jin´ ych v´ yraz˚ u nad nimi proveden´ ych se m´ a v´ ysledek setˇr´ıdit (ASC poˇzaduje vzestupn´e setˇr´ıdˇen´ı, DESC sestupn´e). SQL nem´ a pˇr´ıkaz na omezen´ı rozsahu na nˇekter´e ˇr´adky (jako napˇr. potˇrebuji jen 50.-100. ˇr´adek v´ ypisu“), a to lze ˇreˇsit ” bud’ sloˇzitˇe standardnˇe (poˇc´ıt´ an´ı kolik hodnot je menˇs´ıch neˇz vybran´a, nav´ıc n´aroˇcn´e na hardware) nebo pomoc´ı nˇekter´eho nepˇrenositeln´eho rozˇs´ıˇren´ı. Poˇrad´ı vyhodnocov´ an´ı jednoho pˇr´ıkazu SELECT (nebereme v u ´vahu optimalizace): 1. Nejprve se zkombinuj´ı data ze vˇsech zdroj˚ u (tabulek, pohled˚ u, poddotaz˚ u). Pokud jsou oddˇeleny ˇc´arkami, provede se kart´ezsk´ y souˇcin (to sam´e co CROSS JOIN), v SQL-92 a vyˇsˇs´ım i sloˇzitˇejˇs´ı spojen´ı – JOIN ON (vnitˇrn´ı spojen´ı podle podm´ınky), NATURAL JOIN ( pˇrirozen´e“ spojen´ı podle stejn´ ych hodnot stejnˇe pojmenovan´ ych sloupc˚ u), OUTER JOIN ( vnˇejˇs´ı“ ” ” spojen´ı, do kter´eho jsou zahrnuty i z´ aznamy, pro kter´e v jednom ze zdroj˚ u nen´ı nalezeno nic, co by odpov´ıdalo podm´ınce, doplnˇenn´e NULLov´ ymi hodnotami) atd. 2. Vyˇrad´ı se vznikl´e ˇr´ adky, kter´e nevyhovuj´ı podm´ınce (WHERE) 3. Zbyl´e ˇr´ adky se seskup´ı do skupin se stejn´ ymi hodnotami uveden´ ych v´ yraz˚ u (HAVING), kaˇzd´a skupina obsahuje atomick´e sloupce s hodnotami uveden´ ych v´ yraz˚ u a mnoˇzinov´e sloupce se skupinami ostatn´ıch hodnot sloupc˚ u. 4. Vyˇrad´ı se skupiny, nevyhovuj´ıc´ı podm´ınce (HAVING) 5. V´ ysledky se setˇr´ıd´ı podle poˇzadavk˚ u 6. Vygeneruje se v´ ystup s poˇzadovan´ ymi hodnotami 7. V pˇr´ıpadˇe DISTINCT se vyˇrad´ı duplicitn´ı ˇr´ adky Pozn´ amka • Klauzule GROUP BY setˇr´ıd´ı pˇred vytvoˇren´ım skupin vˇsechny ˇr´adky dle v´ yraz˚ u v klauzuli. Proto by se mˇel seskupovat co nejmenˇs´ı moˇzn´ y poˇcet ˇr´ adek. Pokud je moˇzn´e ˇr´adky odfiltrovat pomoc´ı WHERE, je v´ ysledek efektivnˇejˇs´ı, neˇz n´ asledn´e odstraˇ nov´ an´ı cel´ ych skupin. • Klauzule DISTINCT tˇr´ıd´ı v´ ysledn´e z´ aznamy (pˇred operac´ı ORDER BY), aby naˇsla duplicitn´ı z´aznamy. Pokud to jde, je vhodn´e se bez n´ı obej´ıt. • Klauzule ORDER BY by mˇela b´ yt pouˇzita jen v nutn´ ych pˇr´ıpadech. Nen´ı pˇr´ıliˇs vhodn´e ji pouˇz´ıvat v definic´ıch pohled˚ u, nad kter´ ymi se d´ ale dˇelaj´ı dalˇs´ı dotazy
Definice a manipulace s daty, ostatn´ı pˇ r´ıkazy Standard SQL podporuje nˇekolik druh˚ u datov´ ych typ˚ u: • textov´e v n´ arodn´ı a glob´ aln´ı (UTF) znakov´e sadˇe (nˇekolika druh˚ u – promˇenn´e a pevn´e d´elky): CHARACTER(n), NCHAR(n), CHAR VARYING(n) • ˇc´ıseln´e typy – NUMERIC(p[,s]), INTEGER, INT, SMALLINT, FLOAT(presnost), REAL, DOUBLE PRECISION • datumov´e typy – DATE, TIME, TIMESTAMP, TIMESTAMP(presnost sekund) WITH TIMEZONE Datab´ azov´e servery ne vˇzdy podporuj´ı vˇsechny uveden´e typy. Nemus´ı je podporovat nativnˇe, nˇekdy si pouze pˇreloˇz´ı“ n´ azev ” typu na podobn´ y nativnˇe podporovan´ y typ. Pˇ r´ıkaz CREATE TABLE Tento pˇr´ıkaz slouˇz´ı k vytvoˇren´ı nov´e tabulky. Je nutn´e definovat jej´ı n´azev, atributy a jejich dom´eny (datov´e typy); d´ ale je mo6n´e definovat integritn´ı omezen´ı (kl´ıˇce, ciz´ı kl´ıˇce, odkazy, podm´ınky). Pˇr´ıkaz vypad´a n´asledovnˇe: CREATE TABLE <def. sloupce/i.o. tabulky, ...> 67
A uvnitˇr potom def. sloupce = [DEFAULT NULL|] [] dat.typ = [VARCHAR(n) | BIT(n) | INTEGER | FLOAT | DECIMAL ...] i.o.sloupce = [CONSTRAINT <jm´ eno>] [NOT NULL / UNIQUE / PRIMARY KEY], REFERERENCES (<sloupec>) , CHECK <podm´ ınka> akce = [ON UPDATE / ON DELETE] [CASCADE / SET NULL / SET DEFAULT / NO ACTION(hl´ aˇ sen´ ı chyby) ] i.o.tabulky = UNIQUE, PRIMARY KEY <sloupec, ... >, FOREIGN KEY <sloupec, ... >, REFERENCES (<sloupec, ... >), CHECK( <podm´ ınka> )
Pˇ r´ıkazy pro manipulaci se sch´ ematem ´ • Uprava tabulky: ALTER TABLE ADD {COLUMN} <def.sloupce>, ADD , ALTER COLUMN <sloupec> [ SET / DROP ], DROP COLUMN <sloupec>, DROP CONSTRAINT <jm´ eno i.o.> • Smaz´ an´ı tabulky (nen´ı to sam´e jako vymaz´ an´ı vˇsech dat z tabulky!): DROP TABLE • Vytvoˇren´ı pohledu“ – navenek se chov´ a jako tabulka, ale vnitˇrnˇe se pˇri kaˇzd´em dotazu provede vnoˇren´ y dotaz (kter´ y ” definic´ı pohledu zapisuji): CREATE VIEW ( <sloupec, ... > ) AS <dotaz> {WITH [ LOCAL / CASCADED ] CHECK OPTION } Nˇekter´e datab´ azov´e platformy umoˇzn ˇuj´ı do takto vytvoˇren´ ych pohled˚ u i zapisovat.
Pˇ r´ıkazy pro manipulaci s daty • Vloˇzen´ı nov´ ych dat do tabulky INSERT INTO ( <sloupec, ... > ) [VALUES ( ) / (<dotaz>) ] ´ • Uprava dat (na ˇr´ adc´ıch kter´e vyhovuj´ı podm´ınce se nastav´ı zadan´e hodnoty vybran´ ym sloupc˚ um): UPDATE SET ( <sloupec> = [ NULL / / <dotaz> ] , ... ) WHERE (<podm´ ınka>) • Smaz´ an´ı ˇr´ adk˚ u vyhovuj´ıc´ıch podm´ınce z tabulky: DELETE FROM ( WHERE <podm´ ınka> )
68
4.6
Transakˇ cn´ı zpracov´ an´ı, vlastnosti transakc´ı, uzamykac´ı protokoly, zablokov´ an´ı
Definice (Transakce) Transakce je jist´ a posloupnost nebo specifikace posloupnosti akc´ı pr´ace s datab´az´ı, jako jsou ˇcten´ı, z´apis nebo v´ ypoˇcet, se kterou se zach´ az´ı jako s jedn´ım celkem. Hlavn´ım smyslem pouˇz´ıv´ an´ı transakc´ı, tj. transakˇcn´ıho zpracov´ an´ı, je udrˇzen´ı datab´aze v konzistentn´ım stavu. Jestliˇze na sobˇe nˇekter´e operace z´ avis´ı, sdruˇz´ıme je do jedn´e transakce a t´ım zabezpeˇc´ıme, ˇze budou vykon´any bud’ vˇsechny, nebo ˇz´ adn´ a. Datab´ aze tak pˇred i po vykon´ an´ı transakce bude v konzistentn´ım stavu. Aby se uˇzivateli transakce jevila jako jedna atomick´ a operace, je nutn´e zav´est pˇr´ıkazy COMMIT a ROLLBACK. Prvn´ı z nich signalizuje datab´azi u ´spˇeˇsnost proveden´ı transakce, tj. veˇsker´e zmˇeny v datab´ azi se stanou trval´ ymi a jsou zviditelnˇeny pro ostatn´ı transakce, druh´ y pˇr´ıkaz signalizuje opak, tj. datab´ aze mus´ı b´ yt uvedena do p˚ uvodn´ıho stavu. Tyto pˇr´ıkazy vˇetˇsinou nen´ı nutn´e volat explicitnˇe, napˇr. pˇr´ıkaz COMMIT je vyvol´an po norm´aln´ım ukonˇcen´ı programu realizuj´ıc´ıho transakci. Pˇr´ıkaz ROLLBACK pro svou funkci vyˇzaduje pouˇzit´ı tzv. ˇzurn´ alu (logu) na nˇejak´em stabiln´ım pamˇet’ov´em ˇ m´ediu. Zurn´ al obsahuje historii vˇsech zmˇen datab´ aze v jist´e ˇcasov´e periodˇe. Jednoduch´ a transakce vypad´ a vˇetˇsinou takto: 1. Zaˇc´ atek transakce, 2. proveden´ı nˇekolika dotaz˚ u – ˇcten´ı a z´ apis˚ u (ˇz´ adn´e zmˇeny v datab´azi nejsou zat´ım vidˇet pro okoln´ı svˇet), 3. Potvrzen´ı (pˇr´ıkaz COMMIT) transakce (pokud se transakce povedla, zmˇeny v datab´azi se stanou viditeln´e). Pokud nˇejak´ y z proveden´ ych dotaz˚ u selˇze, syst´em by mˇel celou transakci zruˇsit a vr´atit datab´azi do stavu v jak´em byla pˇred zah´ ajen´ım transakce (operace ROLLBACK). Transakˇcn´ı zpracov´ an´ı je tak´e ochrana datab´ aze pˇred hardwarov´ ymi nebo softwarov´ ymi chybami, kter´e mohou zanechat datab´ azi po ˇc´ asteˇcn´em zpracov´ an´ı transakce v nekonzistentn´ım stavu. Pokud poˇc´ıtaˇc selˇze uprostˇred prov´adˇen´ı nˇekter´e transakce, transakˇcn´ı zpracov´ an´ı zaruˇc´ı, ˇze vˇsechny operace z nepotvrzen´ ych ( uncommitted“) transakc´ı budou zruˇseny. ” Vlastnosti transakc´ı Pod´ıvejme se nyn´ı na vlastnosti poˇzadovan´e po transakc´ıch. Obvykle se pouˇz´ıv´a zkratka prvn´ıch p´ısmen anglick´ ych n´ azv˚ u vlastnost´ı ACID – atomicity, consistency, isolation (independence), durability. atomicita – transakce se tv´ aˇr´ı jako jeden celek, mus´ı bud’ probˇehnout cel´a, nebo v˚ ubec ne. konzistence – transakce transformuje datab´ azi z jednoho konzistentn´ıho stavu do jin´eho konzistentn´ıho stavu. nez´ avislost – transakce jsou nez´ avisl´e, tj. d´ılˇc´ı efekty transakce nejsou viditeln´e jin´ ym transakc´ım. trvanlivost – efekty u ´spˇeˇsnˇe ukonˇcen´e (potvrzen´e, commited“) transakce jsou nevratnˇe uloˇzeny do datab´aze a nemohou b´ yt ” zruˇseny. Transakce mohou b´ yt v uˇzivatelsk´ ych programech prov´adˇeny paralelnˇe (sp´ıˇse zd´anlivˇe paralelnˇe, stejnˇe jako je paralelismus multitaskingu na jednoprocesorov´ ych stroj´ıch jen zd´ anliv´ y, zajist´ı to ale moˇznost paralelizace nedatab´azov´ ych“ akc´ı a pomal´e ” transakce nebrzd´ı rychl´e). Je zˇrejm´e, ˇze posloupnost transakc´ı m˚ uˇze b´ yt zpracov´ana paralelnˇe r˚ uzn´ ym zp˚ usobem. Kaˇzd´ a transakce se skl´ ad´ a z nˇekolika akc´ı. Stanoven´e poˇrad´ı prov´ adˇen´ı akc´ı v´ıce transakc´ı v ˇcase nazveme rozvrhem. Rozvrh, kter´ y splˇ nuje n´ asleduj´ıc´ı podm´ınky, budeme naz´ yvat leg´ aln´ı: • Objekt je nutn´e m´ıt uzamknut´ y, pokud k nˇemu chce transakce pˇristupovat. • Transakce se nebude pokouˇset uzamknout objekt jiˇz uzamknut´ y jinou transakc´ı (nebo mus´ı poˇckat, neˇz bude objekt odemknut). D˚ uleˇzit´ ymi pojmy pro paraleln´ı zpracov´ an´ı jsou s´eriovost ˇci uspoˇr´adatelnost. S´ eriov´ e rozvrhy zachov´avaj´ı operace kaˇzd´e transakce pohromadˇe (a prov´ ad´ı se jen jedna transakce najednou). Pro n transakc´ı tedy existuje n! r˚ uzn´ ych s´eriov´ ych rozvrh˚ u. Pro z´ısk´ an´ı korektn´ıho v´ ysledku vˇsak m˚ uˇzeme pouˇz´ıt i rozvrhu, kde jsou operace r˚ uzn´ ych transakc´ı navz´ajem prokl´ad´any. Pˇrirozen´ ym poˇzadavkem na korektnost je, aby efekt paraleln´ıho zpracov´an´ı transakc´ı byl t´ yˇz, jako kdyby transakce byly provedeny v nˇejak´em s´eriov´em rozvrhu. Pˇredpokl´ ad´ ame-li totiˇz, ˇze kaˇzd´ a transakce je korektn´ı program, mˇel by v´est v´ ysledek s´eriov´eho zpracov´ an´ı ke konzistentn´ımu stavu. O syst´emu zpracov´ an´ı transakc´ı, kter´ y zaruˇcuje dosaˇzen´ı konzistentn´ıho stavu nebo stejn´eho stavu jako s´eriov´e rozvrhy, se ˇr´ık´ a, ˇze zaruˇcuje uspoˇ r´ adatelnost. Mohou se vyskytnout probl´emy, kter´e uspoˇr´ adatelnosti zamezuj´ı. Ty naz´ yv´ame konflikty. Plynou z poˇrad´ı dvojic akc´ı r˚ uzn´ ych transakc´ı na stejn´em objektu. Existuj´ı tˇri typy konfliktn´ıch situac´ı: 1. WRITE-WRITE – pˇreps´ an´ı nepotvrzen´ ych dat 2. READ-WRITE – neopakovateln´e ˇcten´ı 3. WRITE-READ – ˇcten´ı nepotvrzen´ ych ( uncommitted“) dat ” ˇ Rekneme, ˇze rozvrh je konfliktovˇe uspoˇr´ adateln´y, je-li konfliktovˇe ekvivalentn´ı nˇejak´emu s´eriov´emu rozvrhu (tedy jsou v nˇem stejn´e, tj. ˇz´ adn´e konflikty). Test na konfliktovou uspoˇr´adatelnost se d´a prov´est jako test acykliˇcnosti grafu, ve kter´em konfliktn´ı situace pˇredstavuj´ı hrany a transakce vrcholy. Konfliktov´a uspoˇr´adatelnost je slabˇs´ı podm´ınka neˇz uspoˇr´ adatelnost – nezohledˇ nuje ROLLBACK (zotavitelnost – zachov´ an´ı konzistence, i kdyˇz kter´akoliv transakce selˇze) a dynamickou povahu datab´ aze (vkl´ ad´ an´ı a maz´ an´ı objekt˚ u). Zotavitelnosti se d´a dos´ahnout tak, ˇze kaˇzd´a transakce T je potvrzena aˇz pot´e, co jsou 69
potvrzeny vˇsechny ostatn´ı transakce, kter´e zmˇenily data ˇcten´a v T . Pokud v zotaviteln´em rozvrhu doch´az´ı ke ˇcten´ı zmˇen pouze potvrzen´ ych transakc´ı, nem˚ uˇze doj´ıt ani k jejich kask´ adov´emu ruˇsen´ı. Pˇri zpracov´ an´ı (i uspoˇr´ adateln´eho) rozvrhu m˚ uˇze doj´ıt k situaci uv´ aznut´ı – deadlocku. To nastane tehdy, pokud jedna transakce T1 ˇcek´ a na z´ amek na objekt, kter´ y m´ a pˇridˇelen´ y T2 a naopak. Situaci lze zobecnit i na v´ıce transakc´ı. Uv´aznut´ı lze bud’ pˇr´ımo zamezit charakterem rozvrhu, nebo detekovat (hled´ an´ım cyklu v grafu ˇcekaj´ıc´ıch transakc´ı, tzv. waits-for“ grafu) a jednu z ” transakc´ı zab´ıt“ a spustit znova. ” K zajiˇstˇen´ı uspoˇr´ adatelnosti a zotavitelnosti a zabezpeˇcen´ı proti kask´adov´ ym rollback˚ um a deadlocku se pouˇz´ıvaj´ı r˚ uzn´ a sch´emata (poˇzadavky na rozvrhy). Jedn´ım z nich jsou uzamykac´ı protokoly. Uzamykac´ı protokoly Vytv´ aˇren´ı rozvrh˚ u a testov´ an´ı jejich uspoˇr´ adatelnosti nen´ı pro praxi zˇrejmˇe ten nejvhodnˇejˇs´ı zp˚ usob. Pokud ale budeme transakce konstruovat podle urˇcit´ ych pravidel, tak za urˇcit´ ych pˇredpoklad˚ u bude kaˇzd´ y jejich rozvrh uspoˇr´adateln´ y. Soustavˇe takov´ ych pravidel se ˇr´ık´ a protokol. Nejzn´ amˇejˇs´ı protokoly jsou zaloˇzeny na dynamick´em zamyk´an´ı a odemyk´an´ı objekt˚ u v datab´azi. Zamyk´an´ı (operace LOCK) je akce, kterou vyvol´ a transakce na objektu, aby ho chr´anila pˇred pˇr´ıstupem ostatn´ıch transakc´ı. Definice (Dobˇre formovan´ a transakce) Transakci nazveme dobˇ re formovanou pokud podporuje pˇrirozen´e poˇzadavky na transakce: 1. 2. 3. 4.
transakce zamyk´ a objekt, chce-li k nˇemu pˇristupovat, transakce nezamyk´ a objekt, kter´ y jiˇz je touto transakc´ı uzamˇcen´ y, transakce neodmyk´ a objekt, kter´ y nen´ı touto transakc´ı zamˇcen´ y, po ukonˇcen´ı transakce jsou vˇsechny objekty uzamˇcen´e touto transakc´ı odemˇceny.
Dvouf´ azov´ y protokol (2PL) – Dvouf´ azov´ a transakce v prvn´ı f´azi zamyk´a vˇse co je potˇreba a od prvn´ıho odemknut´ı (druh´ a f´aze) jiˇz jen odemyk´ a co mˇela zamˇceno (jiˇz ˇz´ adn´ a operace LOCK). Tedy transakce mus´ı m´ıt vˇsechny objekty uzamˇceny pˇredt´ım, neˇz nˇejak´ y objekt odemkne. D´ a se dok´ azat, ˇze pokud jsou vˇsechny transakce v dan´e mnoˇzinˇe transakc´ı dobˇre formovan´e a dvouf´ azov´e, pak kaˇzd´ y jejich leg´ aln´ı rozvrh je uspoˇr´ adateln´ y. Dvouf´ azov´ y protokol zajiˇst’uje uspoˇr´ adatelnost, ale ne zotavitelnost ani bezpeˇcnost proti kask´adov´emu ruˇsen´ı transakc´ı nebo uv´aznut´ı. Striktn´ı dvouf´ azov´ y protokol (S2PL) – Probl´emy 2PL jsou nezotavitelnost a kask´adov´e ruˇsen´ı transakc´ı. Tyto nedostatky lze odstranit pomoc´ı striktn´ıch dvouf´ azov´ ych protokol˚ u, kter´e uvolˇ nuj´ı z´amky aˇz po skonˇcen´ı transakce (COMMIT). Zˇrejm´ a nev´ yhoda je omezen´ı paralelismu. 2PL nav´ıc st´ ale nevyluˇcuje moˇznost deadlocku. Konzervativn´ı dvouf´ azov´ y protokol (C2PL) – Rozd´ıl oproti 2PL je ten, ˇze transakce ˇz´ad´a o vˇsechny sv´e z´amky, jeˇstˇe neˇz se zaˇcne vykon´ avat. To sice vede obˇcas k zbyteˇcn´emu zamyk´an´ı (nev´ıme co pˇresnˇe budeme potˇrebovat, tak radˇsi zamkneme v´ıc), ale staˇc´ı to jiˇz k prevenci uv´ aznut´ı (deadlocku). Vylepˇ sen´ı“ zamykac´ıch protokol˚ u ” Sd´ılen´ e a v´ yluˇ cn´ e z´ amky – Nev´ yhodou 2PL je, ˇze objekt m˚ uˇze m´ıt uzamˇcen´ y pouze jedna transakce. Abychom uzamyk´ an´ı uˇze b´ yt provedli preciznˇeji, je dobr´e vz´ıt na vˇedom´ı rozd´ıl mezi operacemi READ a WRITE. V´yluˇcn´y z´ amek (W LOCK) m˚ aplikov´ an na objekty jak pro operaci READ tak pro WRITE, sd´ılen´y z´ amek (R LOCK) uzamyk´a objekt, kter´ y chceme pouze ˇc´ıst. Jeden objekt potom m˚ uˇze b´ yt uzamˇcen sd´ılen´ ym z´amkem v´ıce transakc´ı a zvyˇsuje se tak moˇznost paraleln´ıho zpracov´ an´ı. Budeme-li s tˇemito z´ amky zach´ azet stejnˇe jako u 2PL, opˇet m´ame zaruˇcenou uspoˇr´adatelnost rozvrhu, ovˇsem nikoliv absenci uv´aznut´ı. Strukturovan´ e uzamyk´ an´ı (multiple granularity) – Objekty jsou v tomto pˇr´ıpadˇe ch´ap´any hierarchicky dle relace obsahuje. Napˇr´ıklad datab´ aze obsahuje soubory, kter´e obsahuj´ı str´anky a ty zase obsahuj´ı jednotliv´e z´aznamy. Na tuto hierarchii se m˚ uˇzeme d´ıvat jako na strom, ve kter´em kaˇzd´ y vrchol obsahuje sv´e potomky. Kdyˇz transakce zamyk´a objekt (vrchol) zamyk´ a tak´e vˇsechny jeho potomky. Protokol se tak snaˇz´ı minimalizovat poˇcet z´amk˚ u, t´ım sn´ıˇzit reˇzii a zv´ yˇsit moˇznosti paraleln´ıho zpracov´ an´ı. Alternativn´ı protokoly ˇ Casov´ a raz´ıtka – Dalˇs´ı z protokol˚ u zaruˇcuj´ıc´ı uspoˇr´adatelnost je vyuˇzit´ı ˇcasov´ ych raz´ıtek. Na zaˇc´atku dostane transakce T ˇcasov´e raz´ıtko – T S(T ) (ˇcasov´ a raz´ıtka jsou unik´ atn´ı a v ˇcase rostou), abychom vˇedˇeli poˇrad´ı, ve kter´em by mˇeli b´ yt transakce vykon´ any. Kaˇzd´ y objekt v datab´ azi m´ a ˇctec´ı raz´ıtko – RT S(O) (read timestamp), kter´e je aktualizov´ano, kdyˇz je objekt ˇcten, a zapisovac´ı raz´ıtko – W T S(O) (write timestamp), kter´e je aktualizov´ano, kdyˇz nˇejak´a transakce objekt mˇen´ı. Pokud chce transakce T ˇc´ıst objekt O mohou nastat dva pˇr´ıpady: • T S(T ) < W T S(O), tzn. nˇekdo zmˇenil objekt O potom co byla spuˇstˇena transakce T . V tomto pˇr´ıpadˇe mus´ı b´ yt transakce zruˇsena a spouˇstˇena znovu (a tedy s jin´ ym ˇcasov´ ym raz´ıtkem). 70
• T S(T ) > W T S(O), tzn. je bezpeˇcn´e objekt ˇc´ıst. V tomto pˇr´ıpadˇe T pˇreˇcte O a RT S(O) je nastaveno na max{T S(T ), RT S(O)}. Pokud chce transakce T zapisovat do objektu O rozliˇsujeme pˇr´ıpady tˇri: • T S(T ) < RT S(O), tzn. nˇekdo ˇcetl O pot´e co byla spuˇstˇena T a pˇredpokl´ad´ame, ˇze si poˇr´ıdil lok´aln´ı kopii. Nem˚ uˇzeme tedy O zmˇenit, protoˇze by lok´ aln´ı kopie pˇrestala b´ yt platn´a a tedy je nutn´e T zruˇsit a spustit znova. • T S(T ) < W T S(O), tzn. nˇekdo zmˇenil O po startu T . V tomto pˇr´ıpadˇe pˇreskoˇc´ıme write operaci a pokraˇcujeme d´ ale norm´ alnˇe. T nemus´ı b´ yt restartov´ ana. • V ostatn´ıch pˇr´ıpadech T zmˇen´ı O a W T S(O) je nastaveno na T S(T ). Optimistick´ e protokoly – V situaci kdy se vˇetˇsina transakc´ı neovlivˇ nuje, je reˇzie v´ yˇse uveden´ ych protokol˚ u zbyteˇcnˇe velk´ a a m˚ uˇzeme pouˇz´ıt takzvan´ y optimistick´ y protokol. V protokolu m˚ uˇzeme rozliˇsit tˇri f´aze. ˇ 1. F´ aze ˇ cten´ı: Ctou se objekty z datab´ aze do lok´ aln´ı pamˇeti a jsou na nich prov´adˇeny potˇrebn´e zmˇeny. 2. F´ aze kontroly: Po dokonˇcen´ı vˇsech zmˇen v lok´ aln´ı pamˇeti je vyvol´an pokus o zaps´an´ı v´ ysledk˚ u do datab´aze. Algoritmus zkontroluje, zda nehroz´ı potenci´ aln´ı kolize s jiˇz potvrzen´ ymi transakcemi, nebo s nˇekter´ ymi pr´avˇe prob´ıhaj´ıc´ımi. Pokud konflikt existuje, je tˇreba spustit algoritmus pro ˇreˇsen´ı koliz´ı, kter´ y se je snaˇz´ı vyˇreˇsit. Pokud se mu to nepodaˇr´ı, je vyuˇzita posledn´ı moˇznost a tou je zruˇsen´ı a restartov´ an´ı transakce. 3. F´ aze z´ apisu: Pokud nehroz´ı ˇz´ adn´e konflikty, jsou data z lok´aln´ı pamˇeti zaps´any do datab´aze a transakce potvrzena.
71
4.7
Technologie XML, XML Schema
viz slidy :)
72
4.8
Organizace dat na vnˇ ejˇ s´ı pamˇ eti, B-stromy a jejich varianty
Vnˇ ejˇ s´ı pamˇ et’ Definice (Vnˇejˇs´ı pamˇet’) Vnˇejˇs´ı pamˇet’ je u ´loˇziˇstˇe dat (pamˇet’ov´e m´edium), u kter´eho je rychlost naˇc´ıt´an´ı dat zpravidla n´ızk´a a pˇr´ıstup k nim ne u ´plnˇe pˇr´ım´ y (z´ aleˇz´ı na uspoˇr´ ad´ an´ı dat na m´ediu), ne-li pouze sekvenˇcn´ı (oproti vnitˇrn´ı pamˇeti s rychl´ ym n´ahodn´ ym pˇr´ıstupem a menˇs´ı kapacitou). Pˇr´ıkladem vnˇejˇs´ı pamˇeti je pevn´ y disk nebo magnetick´a p´aska. Magnetick´e p´ asky poskytuj´ı vysokou kapacitu, ale n´ızkou rychlost a pouze sekvenˇcn´ı pˇr´ıstup. Pro jejich kapacitu je d˚ uleˇzit´ a hustota z´ aznamu, potˇrebuj´ı meziblokov´e mezery pro vyrovn´an´ı nepˇresnosti pˇret´aˇcen´ı p´asky. Pevn´e disky umoˇzn ˇuj´ı pˇr´ım´ y pˇr´ıstup, ale jeho rychlost nen´ı vˇzdy stejn´a. Ovlivˇ nuje ji fyzick´a vzd´alenost dat – pevn´ y disk m´ a nˇekolik v´ alc˚ u, na nichˇz jsou uloˇzeny jednotliv´e datov´e stopy. K v´alc˚ um pˇr´ısluˇs´ı ˇctec´ı hlavy (je jich stejnˇe jako v´ alc˚ u, ale pohybuj´ı se vˇsechny souˇcasnˇe, takˇze m˚ uˇze v 1 okamˇziku ˇc´ıst jen jedna). Disky jsou vˇetˇsinou rozdˇeleny na sektory – nejmenˇs´ı jednotku dat, kterou je moˇzn´e naˇc´ıst nebo uloˇzit (zpravidla jednotky KB). Pro rychlost pˇr´ıstupu k dat˚ um jsou d˚ uleˇzit´e tyto veliˇciny (v´ yrobcem disk˚ u jsou zpravidla ud´ av´ any pr˚ umˇern´e hodnoty): • seek (s) – pˇresun na jinou stopu, dnes zpravidla kolem 4-8 ms • (average) rotational delay (r) – otoˇcen´ı v´ alc˚ u – 1 p˚ ulot´aˇcka, pro nejˇcastˇejˇs´ı 7200rpm disk je to cca 4 ms • block transfer time (btt) – doba pˇrenesen´ı 1 bloku po sbˇernici, na ATA/100 disku se 4 KB bloky teoreticky 0.04 ms Pokud jsou data um´ıstˇena na disku za sebou sekvenˇcnˇe, rychlost jejich naˇcten´ı je mnohem vyˇsˇs´ı neˇz pˇri n´ahodn´em rozm´ıstˇen´ı, protoˇze nen´ı tˇreba prov´ adˇet pˇresuny mezi stopami a ot´aˇcen´ı v´alc˚ u nav´ıc. Pˇ r´ıklad Jak vypad´ a naˇcten´ı 1 MB dat z pevn´eho disku? Pˇredpokl´adejme, ˇze na 1 stopu se vejde 512 KB a 1 blok m´a 4 KB. Jsou-li data um´ıstˇena na disku sekvenˇcnˇe, potˇrebuji pro naˇcten´ı 1 MB dat naj´ıt prvn´ı blok a potom ˇc´ıst dvˇe cel´e stopy (2 ot´ aˇcky), tj. celkem s + r + (2 · 2r) (a pˇrenos po sbˇernici lze zanedbat, protoˇze prob´ıh´a z´aroveˇ n se ˇcten´ım). Pokud jsou data na disku n´ ahodnˇe rozprostˇrena, potˇrebuji celkem 256-kr´ at naj´ıt blok a naˇc´ıst ho: 256 · (s + r + btt), takˇze operace trv´a aˇz 100-kr´ at d´ele.
Soubor Definice (Z´ aznam, kl´ıˇc) (Logick´y) z´ aznam je jednotka dat (napˇr. v datab´ azi), m´a atributy (z nichˇz kaˇzd´ y m´a jm´eno a dom´enu – povolenou mnoˇzinu hodnot). Logick´emu z´ aznamu v reprezentaci na disku odpov´ıd´a fyzick´y z´ aznam (nˇejak´e d´elky R – pevn´e nebo promˇenn´e), kter´ y nav´ıc m˚ uˇze obsahovat jeˇstˇe dalˇs´ı data – oddˇelovaˇce, ukazatele, hlaviˇcky. Kl´ıˇc je mnoˇzina atribut˚ u, kter´ a jednoznaˇcnˇe identifikuje z´aznam; proti tomu vyhled´ avac´ı kl´ıˇc je mnoˇzina atribut˚ u, pro kterou lze nal´ezt mnoˇzinu odpov´ıdaj´ıc´ıch z´ aznam˚ u. Vyhled´avac´ı kl´ıˇce jsou tˇr´ı druh˚ u: hodnotov´ y ( obyˇcejn´e“ hodnoty nˇekter´ ych ” atribut˚ u), haˇsovan´ y a relativn´ı (pˇr´ımo pozice v souboru). Definice (Soubor) (Homogenn´ı) soubor je multimnoˇzina z´ aznam˚ u. Fyzicky na vnˇejˇs´ı pamˇeti je organizov´an do blok˚ u (str´ anek) (velikosti B, typicky nˇekolika KB) – hl. jednotkou pˇrenosu dat mezi vnitˇrn´ı a vnˇejˇs´ı pamˇet´ı. Pomˇer velikosti z´aznamu k velikosti bloku (B/R) se naz´ yv´ a blokovac´ı faktor (bbc). Z´ aznamy mohou b´ yt rozprostˇreny i pˇres nˇekolik str´anek, nebo m˚ uˇze b´ yt pouze jeden z´ aznam na 1 str´ anku; ide´ aln´ı (ale ne vˇzdy dosaˇziteln´e) je, pokud beze zbytku zaplˇ nuj´ı str´anky. Na souboru jsou definov´ any operace se z´ aznamy: insert, delete, update a fetch. Definice (Dotaz) Dotaz je kaˇzd´ a funkce, kter´ a kaˇzd´emu sv´emu argumentu pˇriˇrad´ı odpov´ıdaj´ıc´ı mnoˇzinu z´aznam˚ u ze souboru ( tot´aln´ı vyˇc´ısliteln´ a ” funkce definovan´ a na souboru“). Dotazy mohou b´ yt tˇechto typ˚ u: • Naˇcten´ı vˇsech z´ aznam˚ u (SELECT * FROM tabulka) • Na u ´plnou shodu (SELECT * FROM tabulka WHERE sloupec1 = ’hodnota’ AND sloupec2 = ’hodnota’ pro tabulku se 2 sloupci – d´ any jsou vˇsechny atributy) • Na ˇc´ asteˇcnou shodu (SELECT * FROM tabulka WHERE sloupec1 = ’hodnota’ pro tabulku se 2 sloupci – zadan´a je jen ˇc´ast atribut˚ u) • Na intervalovou shodu (ˇc´ asteˇcnou nebo u ´plnou) (SELECT * FROM tabulka WHERE sloupec1 > ’hodnota’) U soubor˚ u se sleduje rychlost proveden´ı tˇechto operac´ı.
Statick´ e metody organizace souboru
73
Definice (Sch´ema organizace souboru) Sch´ema organizace souboru je popis logick´e pamˇet’ov´e struktury, do n´ıˇz lze zobrazit logick´ y soubor, spolu s algoritmy operac´ı nad touto strukturou. Ta je obvykle tvoˇrena z logick´ ych str´anek (blok˚ u pevn´e d´elky) a m˚ uˇze popisovat v´ıce prov´ azan´ ych log. soubor˚ u, z nichˇz prim´ arn´ı soubor je ten, kter´ y obsahuje uˇzivatelsk´a data. Operace definovan´e nad sch´ematem org. souboru jsou kromˇe operac´ı nad soubory jeˇstˇe build, reorganization, open a close. Proti nˇemu stoj´ı fyzick´e sch´ema souboru – struktura nad fyzick´ ymi soubory, nejbl´ıˇze hardwaru je implementaˇcn´ı sch´ema souboru. Zajiˇstˇen´ı Vyv´ aˇzenosti struktury znamen´ a zajiˇstˇen´ı omezen´ı cesty pˇri vyhled´av´an´ı nˇejak´ ym v´ yrazem (zaruˇcen´ı asymptotick´e sloˇzitosti), nav´ıc zaruˇcen´ı rovnomˇernosti zaplnˇen´ı struktury – faktor naplnˇen´ı str´ anek. Sch´emata, kter´a splˇ nuj´ı obˇe podm´ınky, se naz´ yvaj´ı dynamick´ a, ostatn´ı jsou oznaˇcov´ ana jako statick´ a. ˇ Pozn´ amka (Casov´ e odhady) Pro sch´emata organizace soubor˚ u se poˇc´ıtaj´ı ˇcasov´e odhady proveden´ı jednotliv´ ych operac´ı – jednoduˇsˇs´ıch, jako je pˇr´ıstup k z´ aznamu (TF ), rewrite – pˇrepis bˇehem 1 ot´ aˇcky disku (TRW ), pˇr´ıp. sekvenˇcn´ı ˇcten´ı; d´ale i sloˇzitˇejˇs´ıch jako vyhled´ an´ı z´ aznamu, pˇrid´ an´ı, smaz´ an´ı a u ´prava z´ aznamu, reorganizace struktury nebo naˇcten´ı cel´eho souboru. Hromada (neuspoˇ r´ adan´ y sekvenˇ cn´ı soubor) Hromada(heap) je naprosto nejjednoduˇsˇs´ı sch´ema organizace souboru, kdy jsou z´aznamy v souboru jen n´ahodnˇe seˇrazeny za ˇ sebou. Casov´ a sloˇzitost vyhled´ av´ an´ı je O(n), pokud n je poˇcet z´aznam˚ u. Jde o nehomogenn´ı soubor, kde z´aznamy obvykle nemaj´ı pevnou d´elku. Uspoˇ r´ adan´ y sekvenˇ cn´ı soubor V uspoˇr´ adan´em sekvenˇcn´ım souboru jsou z´ aznamy ˇrazeny podle kl´ıˇce. Aktualizovan´e z´aznamy se um´ıst´ı do zvl´aˇstn´ıho souboru a aˇz pˇri dalˇs´ı operaci reorganization“ jsou pˇrid´ any do prim´arn´ıho. Sloˇzitost nalezen´ı z´aznamu je tak´e O(n), ale pokud se hled´ a ” podle kl´ıˇce, podle kter´eho jsou z´ aznamy seˇrazeny, a nav´ıc je soubor na m´ediu s pˇr´ım´ ym pˇr´ıstupem, sn´ıˇz´ı se na O(log n). Index-sekvenˇ cn´ı soubor Toto sch´ema uvaˇzuje prim´ arn´ı soubor jako sekvenˇcn´ı, uspoˇr´adan´ y podle prim´arn´ıho kl´ıˇce. Nad n´ım je pak vytvoˇren (tˇreba i v´ıce´ urovˇ nov´ y) index. Ten sest´ av´ a ze seznamu ˇc´ısel str´anek a minim´aln´ıch hodnot kl´ıˇce jim odpov´ıdaj´ıc´ıch z´aznam˚ u. Pokud m´ a index v´ıc u ´rovn´ı, prov´ ad´ı se pro vyˇsˇs´ı u ´rovnˇe to sam´e na bloc´ıch index˚ uu ´rovnˇe o 1 niˇzˇs´ı. Nejvyˇsˇs´ı u ´roveˇ n indexu se obvykle vejde do 1 bloku, tzv. master. n e, kde p = b V B ri velikosti kl´ıˇce V a pointeru Poˇcet potˇrebn´ ych u ´rovn´ı pro n z´ aznam˚ u se d´ a spoˇc´ıtat jako dlogp bbc +P c pˇ na str´ anku P . Probl´emem je pˇrid´ av´ an´ı nov´ ych z´ aznam˚ u, kdy se tyto ˇretˇez´ı za sebe v tzv. oblasti pˇreteˇcen´ı (kaˇzd´ y z nich m´ a pointer na dalˇs´ı z´ aznam v oblasti pˇreteˇcen´ı). Pro odd´alen´ı nutnosti vkl´ad´an´ı do oblasti pˇreteˇcen´ı lze inici´alnˇe bloky plnit na m´enˇe neˇz 100%. Indexovan´ y soubor Indexovan´y soubor znamen´ a prim´ arn´ı soubor plus indexy pro r˚ uzn´e vyhled´avac´ı kl´ıˇce. Neindexuj´ı se uˇz str´anky, ale pˇr´ımo z´ aznamy, a proto prim´ arn´ı soubor nemus´ı b´ yt nutnˇe setˇr´ıdˇen´ y. Index m˚ uˇze b´ yt podobn´ y jako u index-sekvenˇcn´ıho souboru, pro z´ aznamy se stejn´ ym kl´ıˇcem je ale vhodn´e, aby byly na vˇsech u ´rovn´ıch indexu kromˇe posledn´ı slouˇcen´e. Pˇri aktualizaci se nepouˇz´ıv´ a oblast pˇreteˇcen´ı, mˇen´ı se pouze index. Existuje i nˇekolik dalˇs´ıch variant index˚ u. Pro zmenˇsen´ı n´aroˇcnosti dotaz˚ u na kombinovanou ˇc´asteˇcnou shodu se pouˇz´ıv´ a kombinovan´y index pro v´ıce atribut˚ u, u nˇehoˇz je ale nutn´e pˇredem zjistit na kter´e kombinace atribut˚ u budou ˇcasto pokl´ ad´ any dotazy, a pro takov´e kombinace tento index teprve vytvoˇrit. Clusterovan´y index zaruˇcuje, ˇze z´aznamy s podobnou hodnotou indexovan´eho atributu jsou bl´ızko sebe v prim´ arn´ım souboru – napˇr. pokud je prim´arn´ı soubor podle tohoto atributu setˇr´ıdˇeny. Tento index lze pouˇz´ıt jen pro 1 atribut. Bitov´e mapy se daj´ı pouˇz´ıt jako index pro atributy s malou dom´enou (mnoˇzinou moˇzn´ ych hodnot) – pro kaˇzdou hodnotu t´eto dom´eny se vyrob´ı vektor bit˚ u stejn´e d´elky, jako je poˇcet z´aznamu v prim´arn´ım souboru, kde jedniˇcka na i-t´e pozici indikuje, ˇze i-t´ y z´ aznam m´ a pr´ avˇe tuto hodnotu atributu. To umoˇzn ˇuje jednoduch´e prov´adˇen´ı booleovsk´ ych dotaz˚ u na tento atribut. Vektory bit˚ u nav´ıc lze komprimovat, takˇze nezab´ıraj´ı tolik m´ısta. Soubor s pˇ r´ım´ ym pˇ r´ıstupem V tomto sch´ematu jsou z´ aznamy v prim´ arn´ım souboru ( adresov´em prostoru“ velikosti M ) rozpt´ yleny pomoc´ı hashovac´ı funkce. ” ˇ Casto se pouˇz´ıv´ a funkce h = k mod M 0 , kde M 0 je nejbliˇzˇs´ı prvoˇc´ıslo menˇs´ı neˇz velikost adresov´eho prostoru. Hashovac´ı funkc´ı se urˇcuje bud’ jenom ˇc´ıslo str´ anky, nebo i relativn´ı pozice v n´ı. Pˇri hashov´an´ı vznikaj´ı kolize, kter´e se daj´ı ˇreˇsit otevˇren´ym adresov´ an´ım (ˇretˇezen´ım kolizn´ıch z´ aznam˚ u za sebe), rehashov´ an´ım (dalˇs´ı funkc´ı) nebo pouˇzit´ım oblasti pˇreteˇcen´ı. Snaha je vˇetˇsinou um´ıstit kolizn´ı z´ aznamy do stejn´e str´ anky. Pokud je hashovac´ı funkce prost´ a, jedn´ a se o perfektn´ı hashov´ an´ı. Toho ale v praxi vlastnˇe nelze dos´ahnout, takˇze se tento v´ yraz pouˇz´ıv´ a i pro oznaˇcen´ı stavu, kdy je pro nalezen´ı z´aznamu potˇreba nejv´ yˇs O(1) pˇr´ıstup˚ u k m´ediu. Oˇcek´ avan´ a d´elka N ). ˇretˇezce koliz´ı pˇri poˇctu N z´ aznam˚ u v prostoru velikosti M je 1/(1 − M
74
Tˇ r´ıdˇ en´ı na vnˇ ejˇ s´ı pamˇ eti Algoritmus (Tˇr´ıdˇen´ı sl´ev´ an´ım (Mergesort)) Tento algoritmus se pouˇz´ıv´ a pro tˇr´ıdˇen´ı dat, kter´ a se nevejdou do vnitˇrn´ı pamˇeti. D´a se pouˇz´ıt i pˇri sekvenˇcn´ım pˇr´ıstupu k datov´ ym soubor˚ um. Nejjednoduˇsˇs´ı verze bez buffer˚ u vypad´a takto: • • • •
inicializace: na zaˇca´tku kaˇzd´eho kroku data rozdˇel´ı do 2 soubor˚ u naˇcte 2 z´ aznamy, kaˇzd´ y z jednoho souboru a porovn´a je ve spr´ avn´em poˇrad´ı je zap´ıˇse do v´ ystupn´ıho souboru, ze vstupn´ıho souboru si naˇcte dalˇs´ı dva v prvn´ım kroku z´ısk´ am uspoˇr´ adan´e posloupnosti d´elky 2; v dalˇs´ıch kroc´ıch vˇzdy porovn´am naˇcten´e prvky, zap´ıˇsu menˇs´ı z nich a ze souboru odkud tento poch´ azel si naˇctu dalˇs´ı, takˇze z´ısk´am vˇzdy uspoˇr´adan´e posloupnosti dvojn´asobn´e d´elky neˇz v pˇredchoz´ım kroku • po dlog ne kroc´ıch je soubor s n z´ aznamy setˇr´ıdˇen´ y. Vylepˇsen´ı se dos´ ahne napˇr. pˇr´ımo stˇr´ıdav´ ym zapisov´an´ım v´ ystupu do 2 soubor˚ u, kdy se zbav´ım nutnosti na zaˇc´ atku kaˇzd´eho kroku data dˇelit, nebo pouˇzit´ım v´ıce soubor˚ u najednou. Je taky moˇzn´e vyuˇz´ıt rostouc´ıch posloupnost´ı prvk˚ u, kter´e se v souboru nach´ azej´ı jiˇz pˇred zapoˇcet´ım tˇr´ıdˇen´ı. Algoritmus (Tˇr´ıdˇen´ı haldou) Pro tˇr´ıdˇen´ı ve vnitˇrn´ı pamˇeti se pouˇz´ıv´ a algoritmus tˇr´ıdˇen´ı haldou (heapsort), kter´ y se d´a zakomponovat do vylepˇsen´ı tˇr´ıdˇen´ı sl´ev´ an´ım (viz n´ıˇze). Jeho z´ akladem je datov´ a struktura halda (konkr´etnˇe maxim´aln´ı halda, max-heap), reprezentovan´ a jako pole z´ aznam˚ u, na kter´em je bin´ arn´ı stromov´ a struktura: z´aznam k m´a vˇzdy vyˇsˇs´ı kl´ıˇc neˇz jeho dva synov´e, nach´ azej´ıc´ı se na pozic´ıch 2k + 1 a 2k + 2 pˇri ˇc´ıslov´ an´ı od 0 (pokud tato pozice nen´ı vˇetˇs´ı neˇz velikost haldy, v opaˇcn´em pˇr´ıpadˇe z´ aznam nem´ a syny). Na pozici 0 se tak nach´ az´ı z´ aznam s nejvyˇsˇs´ım kl´ıˇcem. Postup tˇr´ıdˇen´ı je n´asledovn´ y: • nejvˇetˇs´ı prvek (z pozice 0) se prohod´ı s t´ım prvkem, jehoˇz ˇc´ıslo pozice odpov´ıd´a aktu´aln´ı velikosti haldy • velikost haldy se zmenˇs´ı o 1 • dokud neplat´ı podm´ınka, ˇze kl´ıˇc prvku z´ıskan´eho z konce haldy je vˇetˇs´ı neˇz oba kl´ıˇce jeho syn˚ u, prohazuje se tento se synem s vˇetˇs´ım kl´ıˇcem (a tak posouv´ a v haldˇe d´ al) • toto se opakuje, dokud je velikost haldy vˇetˇs´ı neˇz 1, odzadu tak v poli vznik´a setˇr´ıdˇen´a posloupnost ˇ Casov´ a sloˇzitost algoritmu je O(n · log n) pro pole z´ aznam˚ u velikosti n. Algoritmus (n-cestn´e tˇr´ıdˇen´ı) Pokud m´ am k dispozici ve vnitˇrn´ı pamˇeti n + 1 str´ anek, mohu postupovat n´asledovnˇe: • • • •
v 1. kroku naˇc´ıst do pamˇeti n str´ anek ty setˇr´ıdit pomoc´ı heapsortu (nebo i quicksortu apod.) a z´ıskat tak delˇs´ı setˇr´ıdˇen´e u ´seky (bˇehy) sl´evat vˇzdy n nejkratˇs´ıch bˇeh˚ u (pomoc´ı mergesortu) a vytv´aˇret tak jeden bˇeh toto opakovat, dokud existuje v´ıce neˇz 1 bˇeh.
ˇ Cas. sloˇzitost pro M str´ anek v souboru je O(2M dlogn M/ne). Algoritmus (Dvojit´ a halda) Delˇs´ı bˇehy pˇri sl´ev´ an´ı se daj´ı vytv´ aˇret pomoc´ı dvojit´e haldy – v pamˇeti m´am dvˇe haldy z celkem n prvk˚ u, opakovanˇe z prvn´ı haldy odeb´ır´ am a zapisuji minim´ aln´ı prvek do v´ ystupn´ıho bˇehu a naˇc´ıt´am dalˇs´ı prvek, pokud ten je vˇetˇs´ı neˇz minimum haldy, vloˇz´ım ho do prv´e haldy, pokud je menˇs´ı, vloˇz´ım ho do druh´e haldy, kter´a vznik´a od konce m´eho pole. Aˇz se prvn´ı halda vyˇcerp´ a, pouˇziji druhou a zaˇcnu nov´ y bˇeh. Toto v nejhorˇs´ım pˇr´ıpadˇe d´av´a stejnou velikost bˇeh˚ u jako obyˇcejn´a halda, pr˚ umˇernˇe je 2x lepˇs´ı.
B-stromy Definice (B-strom) B-strom ˇr´ adu m je v´ yˇskovˇe vyv´ aˇzen´ y strom, kter´ y m´a n´asl. vlastnosti: 1. Koˇren m´ a minim´ alnˇe 2 syny, pokud nen´ı s´ am listem. ıce m syn˚ u a vˇzdy o 1 m´enˇe dat. z´aznam˚ u (listy maj´ı jen datov´e 2. Kaˇzd´ y jin´ y uzel kromˇe list˚ u m´ a nejm´enˇe d m 2 e a nejv´ z´ aznamy). 3. Kl´ıˇce vˇsech z´ aznam˚ u v i-t´em podstromu uzlu A jsou vˇetˇs´ı neˇz kl´ıˇc i-t´eho z´aznamu uzlu A a menˇs´ı nebo rovny kl´ıˇci i+1-t´eho z´ aznamu. 4. vˇsechny vˇetve (cesty od koˇrene k listu) jsou stejnˇe dlouh´e. Variantou jsou redundantn´ı B-stromy, kdy vˇsechna data jsou um´ıstˇena v listech, vnitˇrn´ı uzly obsahuj´ı pouze vyhled´ avac´ı kl´ıˇce. Jin´ a moˇznost je pouˇzit´ı pouze kl´ıˇce a odkazu na cel´ y z´aznam, m´ısto vkl´ad´an´ı kompletn´ıch z´aznam˚ u do stromu.
75
Algoritmus (Operace na B-stromˇe) Vyhled´ av´ an´ı v B-stromech podle kl´ıˇce se prov´ ad´ı jednoduch´ ym pr˚ uchodem do hloubky. Vkl´ ad´ an´ı prob´ıh´ a tak, ˇze se najde m´ısto, kam z´ aznam vloˇzit, pokud nen´ı uzel pln´ y, prostˇe se z´aznam vloˇz´ı, jinak se uzel rozˇstˇep´ı, p˚ ulka prvk˚ u se d´ a vlevo, p˚ ulka vpravo a prostˇredn´ı se vloˇz´ı ( mezi nˇe“) do otce. Pokud v otci nen´ı m´ısto, pokraˇcuje ” se stejn´ ym zp˚ usobem aˇz do koˇrene, kde se pˇr´ıpadnˇe vytvoˇr´ı nov´ y uzel a udˇel´a se z nˇej koˇren. u) mus´ım pˇreb´ırat data od Odeb´ır´ an´ı prvk˚ u je opaˇcn´ y postup, v pˇr´ıpadˇe podteˇcen´ı uzlu (z˚ ustane v nˇem m´enˇe neˇz d m 2 e syn˚ sousedn´ıch uzl˚ u nebo sl´evat. V redundantn´ıch B-stromech nen´ı nutn´e pˇri maz´an´ı odstraˇ novat vyhled´avac´ı kl´ıˇc z vnitˇrn´ıch uzl˚ u – prvek s touto hodnotou se ve stromˇe uˇz nebude nach´azet, ale vyhled´avat podle jeho kl´ıˇce je d´al moˇzn´e. Lepˇs´ı naplnˇenosti uzl˚ u za cenu sn´ıˇzen´ı rychlosti se d´a dos´ahnout pomoc´ı vyvaˇzov´ an´ı str´ anek – pˇri pˇreteˇcen´ı str´ anky nejdˇr´ıv kontroluji, jestli nejsou voln´e sousedn´ı; pokud ano, pˇrerozdˇel´ım data a uprav´ım kl´ıˇce. Podobnˇe je moˇzn´e postupovat pˇri maz´ an´ı (i pokud nen´ı tˇreba sl´evat). Dalˇs´ım vylepˇsen´ım je odloˇzen´ı ˇstˇepen´ı – ke kaˇzd´emu listu nebo skupinˇe list˚ u pˇr´ısluˇs´ı str´anka pˇreteˇcen´ı, kam se vkl´ adaj´ı z´ aznamy, kter´e se uˇz do dan´eho m´ısta nevejdou. Nov´e vkl´ad´an´ı a ˇstˇepen´ı je provedeno aˇz tehdy, jestliˇze se str´ anka pˇreteˇcen´ı i vˇsechny pˇr´ısluˇsn´e uzly napln´ı. Takto upraven´ y strom s v´ıce neˇz 1 u ´rovn´ı m´a vˇzdy vˇsechny listy zaplnˇen´e (za pˇredpokladu nepouˇzit´ı maz´ an´ı). Pˇr´ısluˇs´ı-li str´ anky pˇreteˇcen´ı skupin´am list˚ u, mus´ım je pˇri maz´an´ı a pˇrid´av´an´ı list˚ u takt´eˇz ˇstˇepit a sl´evat. Definice (B+ stromy) B+ stromy jsou m´ırn´ ym vylepˇsen´ım B-strom˚ u pro zrychlen´ı intervalov´ ych dotaz˚ u: vˇsechny uzly ve stejn´e u ´rovni (a nebo jenom listy) jsou spojeny do spojov´eho seznamu (moˇzn´ a je jednosmˇern´a i obousmˇern´a varianta). Definice (B* stromy) B* stromy (ˇr´ adu m) jsou u ´pravou B-strom˚ u na z´ akladˇe vyvaˇzov´an´ı str´anek. Druh´a podm´ınka B-strom˚ u se uprav´ı tak, ˇze kaˇzd´ y uzel kromˇe koˇrene a list˚ u m´ a minim´ alnˇe d(2m − 1)/3e a max. m syn˚ u a odpov´ıdaj´ıc´ı poˇcet dat. z´aznam˚ u. Listy maj´ı opˇet jen stejn´e rozmez´ı pro poˇcet dat. z´ aznam˚ u. Pˇri vkl´ ad´ an´ı prvk˚ u se stˇepen´ı odkl´ad´a opˇet do t´e doby, dokud nejsou pln´ı i sourozenci dan´eho listu; potom se ˇstˇep´ı bud’ 2 listy do 3, nebo 3 do 4 (bud’ s pomoc´ı jednoho nebo dvou sousedn´ıch sourozenc˚ u). Odeb´ır´ an´ı podobnˇe zahrnuje sl´ev´ an´ı 3 uzl˚ u do 2 (nebo 4 do 3). Pˇri ob´em lze ve sloˇzitˇejˇs´ı variantˇe zapojit jeˇstˇe v´ıce uzl˚ u. Definice (Prefixov´e stromy (Trie)) Tento druh strom˚ u slouˇz´ı k uloˇzen´ı dat, kl´ıˇcovan´ ych ˇretˇezci. Jde o redundantn´ı stromy, data jsou uloˇzena aˇz v listech; vyhled´ avac´ı kl´ıˇce jsou vˇzdy co nejkratˇs´ı moˇzn´e prefixy ˇretˇezc˚ u, nutn´e k odliˇsen´ı uzl˚ u. Cel´e hodnoty kl´ıˇc˚ u (a dalˇs´ı data) se nach´ azej´ı aˇz v listech. Pˇri vkl´ ad´ an´ı a ˇstˇepen´ı str´ anek se nˇejakou heuristikou hled´a nejkratˇs´ı prefix, kter´ y by vznikl´e str´ anky oddˇelil. Vylepˇsen´ a varianta neukl´ ad´ a u syn˚ u pˇredponu kl´ıˇce, kterou m´a rodiˇc – je to pamˇet’ovˇe efektivnˇejˇs´ı, ale zvyˇsuje v´ ypoˇcetn´ı n´ aroky. Definice (Stromy s promˇennou d´elkou z´ aznamu) Jde o modifikaci B-stromu, kter´ a umoˇzn ˇuje do nˇej uloˇzit z´aznamy promˇenn´e d´elky. Listy se neˇstˇep´ı podle poˇctu z´ aznam˚ u, ale zhruba na poloviny podle velikosti dat. Druh´ a podm´ınka B-strom˚ u se uprav´ı n´asledovnˇe: celkov´a d´elka z´aznam˚ u v jednom uzlu je minim´ alnˇe dB/2e a maxim´ alnˇe B (kde B je nˇejak´a zvolen´a hodnota, vˇetˇs. velikost str´anky na disku). Existuje i varianta s podm´ınkou 2/3“, jako maj´ı B*-stromy. ” Probl´emem t´eto struktury je tendence delˇs´ıch z´ aznam˚ u ke stoup´an´ı ke koˇreni, ˇc´ımˇz se sniˇzuje arita z´aznam˚ u. To se ˇreˇs´ı hled´ an´ım dˇel´ıc´ıho z´ aznamu s min. d´elkou tak, aby vznikl´e uzly splˇ novaly podm´ınky stromu (a je to docela n´aroˇcn´e). Nav´ıc ˇstˇepen´ı je sloˇzitˇejˇs´ı – 1 str´ anka se m˚ uˇze ˇstˇepit na 3 (vloˇz´ım-li hodnˇe dlouh´ y z´aznam), m˚ uˇze doj´ıt ke zmenˇsen´ı stromu pˇri vloˇzen´ı apod., bˇeˇznˇe se pouˇz´ıv´ a obecn´ y algoritmus nahrazov´an´ı, jehoˇz speci´aln´ı pˇr´ıpady jsou insert a delete. Definice (V´ıcerozmˇern´e B-stromy) Pouˇz´ıvaj´ı se, je-li potˇreba efektivnˇe hledat z´ aznamy podle v´ıce atribut˚ u. Jde o propojenou mnoˇzinu strom˚ u. K jednotliv´ ym atribut˚ um pˇr´ısluˇsej´ı prvky pole odkaz˚ u na seznamy strom˚ u, ve kter´ ych se podle dan´ ych atribut˚ u d´a hledat. Pro prvn´ı atribut je potˇreba jen 1 strom, v nˇem je pro kaˇzd´ y kl´ıˇc odkaz na cel´ y strom 2. atributu (pro dalˇs´ı je to podobn´e). Stromy stejn´eho atributu jsou ve spojov´em seznamu. Mohu hledat vˇsechny z´aznamy, pro kter´e zn´am hodnoty vˇsech atribut˚ u, nebo jenom jejich podmnoˇzinu – vyˇzaduje to proj´ıt v´ıce strom˚ u, ale nen´ı tˇreba mnoˇzinov´ ych operac´ı.
5
Architektury poˇ c´ıtaˇ c˚ u a s´ıt´ı
Poˇ zadavky • • • • • • • • •
Architektury poˇc´ıtaˇce. Procesory, multiprocesory. Vstupn´ı a v´ ystupn´ı zaˇr´ızen´ı, ukl´ ad´ an´ı a pˇrenos dat. Architektury OS. Procesy, vl´ akna, pl´ anov´ an´ı. Synchronizaˇcn´ı primitiva, vz´ ajemn´e vylouˇcen´ı. Zablokov´ an´ı a zotaven´ı z nˇej. Organizace pamˇeti, alokaˇcn´ı algoritmy. Principy virtu´ aln´ı pamˇeti, str´ ankov´ an´ı. 76
• • • • •
5.1
Syst´emy soubor˚ u, adres´ aˇrov´e struktury. Bezpeˇcnost, autentifikace, autorizace, pˇr´ıstupov´ a pr´ava. ISO/OSI vrstevnat´ a architektura s´ıt´ı. TCP/IP. Spojovan´e a nespojovan´e sluˇzby, spolehlivost, zabezpeˇcen´ı protokol˚ u.
Architektury poˇ c´ıtaˇ ce
Definice (Architektura poˇc´ıtaˇca) Architektura poˇc´ıtaˇca popisuje vˇsetko, ˇco by mal vediet’ ten, ktor´ y programuje v assembleri / tvor´ı operaˇcn´ y syst´em“. Teda: ” • z ak´ ych ˇcast´ı – ˇstrukt´ ura poˇc´ıtaˇca, usporadanie • v´ yznam ˇcast´ı – funkcia ˇcasti, ich vn´ utorn´ a ˇstrukt´ ura • ako spolu ˇcasti komunikuj´ u – riadenie komuk´ acie • ako sa jednotliv´e ˇcasti ovl´ adaj´ u, ak´ a je ich funkˇcnost’ navonok Definice (V´ıce´ urovˇ nov´ a organizace poˇc´ıtaˇce) • • • • • •
Mikroprogramov´ au ´roveˇ n (priamo technick´e vybavenie poˇc´ıtaˇca) Strojov´ y jazyk poˇc´ıtaˇce (virtu´ alny stroj nad obvodov´ ym rieˇsen´ım; vybavenie – popis architekt´ ury a organiz´ acie) ´ Uroveˇ n operaˇcn´ıho syst´emu (doplnenie predch´ adzaj´ ucej u ´rovne o s´ ubor makroinˇstrukci´ı a nov´ u organiz´aciu pam¨ ati) ´ Uroveˇ n assembleru (najniˇzˇsia u ´roveˇ n l’udsky orientovan´eho jazyka) ´ Uroveˇ n vyˇsˇs´ıch programovac´ıch jazyk˚ u (obecn´e alebo probl´emovo orientovan´e; prv´a nestrojovo orientovan´a u ´roveˇ n) ´ Uroveˇ n aplikaˇcn´ıch program˚ u
Je teda potrebn´ e definovat’ • Inˇstrukˇcn´ y s´ ubor (defin´ıcia prechodovej funkcie medzi stavmi poˇc´ıtaˇca, form´at inˇstrukcie, spˆosob z´apisu, moˇznosti adresovania operandov) • Registrov´ y model (rozliˇsovanie registrov procesoru: podl’a vol’by, pomocou urˇcenia registru – explicitn´ y/implicitn´ y register; ’ podl a funkcie registru – riadiaci register/register operandu) • Definice specializovan´ ych jednotek (jednotka na v´ ypoˇcet vo floatoch; fetch/decode/execute jednotky) • Paralelismy (rozklad na u ´lohy, ktor´e sa daj´ u spracovat’ s´ uˇcasne – granularita (programy, podprogramy, inˇstrukcie...)) • Stupeˇ n predikce (schopnost’ pripravit’ sa na oˇcak´avan´ u udalost’ (naˇc´ıtanie inˇstrukcie, nastavenie prenosu d´at) – explicitn´ a predikcia, ˇstatistika, heuristiky, adapt´ıvna predikcia) • Datov´e struktury a reprezent´ aciu d´ at (spˆ osob uloˇzenia d´at v poˇc´ıtaˇci, mapovacie funkcie medzi re´alnym svetom a vn´ utorn´ ym uloˇzen´ım, minim´ alna a maxim´ alna vel’kost’ adresovatel’n´e jednotky) • Adresov´e konvencie (ako sa pristupuje k d´ atov´ ym ˇstrukt´ uram – segment+offset alebo line´ arna adres´ acia; vel’kost’ pam¨ ati a jej ˇs´ırika, povolen´e“ miesta) ” ˇ ızen´ı (spolupr´ • R´ aca procesoru a ostatn´ ych jednotiek, interakcia s okol´ım, preruˇsenia – vn´ utorne/vonkajˇsie) • Vstupy a v´ ystupy (met´ ody prenosu d´ at medzi procesorom a ostatn´ ymi jednotkami/poˇc´ıtaˇcom a okol´ım; zahrˇ nuje defin´ıcie d´ atov´ ych ˇstrukt´ ur, identifik´ acia zdroja/ciel’a, d´ atov´ ych ciest, protokoly, reakcie na chyby). ˇıˇre datov´ • S´ ych cest • Stupeˇ n sd´ılen´ı (na u ´rovni obvodov – zdiel’anie obvodov procesoru a IO; na u ´rovni jednotiek – zdiel’anie ALU viacer´ ymi procesormi) Z´ akladn´ı definice • ALU (tak´e Processing Element) Aritmeticko-logick´a jednotka - z´akladn´ı komponenta procesoru (2.z´akladn´ı je ˇradiˇc). ˇ • Radiˇ c (Control Unit) je elektronick´ a ˇr´ıdic´ı jednotka, realizovan´a sekvenˇcn´ım obvodem, kter´a ˇr´ıd´ı ˇcinnost vˇsech ˇc´ ast´ı poˇc´ıtaˇce. Toto ˇr´ızen´ı je prov´ adˇeno pomoc´ı ˇr´ıdic´ıch sign´al˚ u, kter´e jsou zas´ıl´any jednotliv´ ym modul˚ um (d´ılˇc´ım ˇc´ astem poˇc´ıtaˇce). Reakce na ˇr´ıdic´ı sign´ aly - stavy jednotliv´ ych modul˚ u - jsou naopak zas´ıl´any zpˇet ˇradiˇci pomoc´ı stavov´ ych hl´ aˇsen´ı. D´ılˇc´ı ˇc´ ast´ı poˇc´ıtaˇce je napˇr. hlavn´ı pamˇet’, kter´ a rovnˇeˇz obsahuje ˇradiˇc, kter´ y je podˇr´ızen hlavn´ımu ˇradiˇci poˇc´ıtaˇce, jenˇz je souˇc´ ast´ı CPU. • Sbˇ ernice (Bus) je sada dat.stream˚ u propojuj´ıc´ı v´ıce zaˇr´ızen´ı. Instruction Stream (ˇr´ızen´ı komunikace – poˇzadavky/potvrzen´ı, indikace typu dat na datov´ ych vodiˇc´ıch) Data Stream (pˇrenos dat mezi zdrojov´ ym a c´ılov´ ym zaˇr´ızen´ım, adresy, data, sloˇzitˇejˇs´ı pˇr´ıkazy
77
Flynn’s taxonomy The taxonomy of computer systems proposed by M. J. Flynn in 1966 has remained the focal point in the field. This is based on the notion of instruction and data streams that can be simultaneously manipulated by the machine. A stream is just a sequence of items (instruction or data). Single Instruction, Single Data stream (SISD) - A sequential computer (Von Neumann) which exploits no parallelism in either the instruction or data streams. Single control unit (CU) fetches single Instruction Stream (IS) from memory. The CU then generates appropriate control signals to direct single processing element (PE or ALU) to operate on single Data Stream (DS) i.e. one operation at a time Examples of SISD architecture are the traditional uniprocessor machines like a PC (currently manufactured PCs have multiple processors) or old mainframes.
Single Instruction, Multiple Data streams (SIMD) - A computer which exploits multiple data streams against a single instruction stream to perform operations which may be naturally parallelized. For example, an array processor or GPU.
Multiple Instruction, Single Data stream (MISD) - Multiple instructions operate on a single data stream. Uncommon architecture which is generally used for fault tolerance. Heterogeneous systems operate on the same data stream and must agree on the result. Examples include the Space Shuttle flight control computer.
Multiple Instruction, Multiple Data streams (MIMD) - Multiple autonomous processors simultaneously executing different instructions on different data. Distributed systems are generally recognized to be MIMD architectures; either exploiting a single shared memory space or a distributed memory space. 78
Z´ akladn´ı architektury poˇ c´ıtaˇ c˚ u Von Neumannova • Poˇc´ıtaˇc se skl´ ad´ a z ˇr´ıd´ıc´ı jednotky, ALU, pamˇeti a I/O jednotek ˇ • Strukt´ ura poˇc´ıtaˇca sa nemen´ı typom u ´lohy (tj. poˇc´ıtaˇc je programovan´ y obsahem pamˇeti). • Program se nejprve zavede do pamˇeti, z n´ı se postupnˇe popoˇradˇe vyb´ıraj´ı instrukce (a n´asleduj´ıc´ı krok z´avis´ı na pˇredchoz´ım), poˇrad´ı lze zmˇenit instrukcemi skoku. • Do jedn´e pamˇeti, dˇelen´e na buˇ nky stejn´e velikosti, se ukl´adaj´ı i zpracov´avan´a data. Data jsou reprezentovan´ a bin´ arnˇe. • V kaˇzd´em okamˇziku je vykon´ av´ ana jen jedna ˇcinnost. Je to architektura SISD (viz Flynnova taxonomie). Je pevnˇe dan´ a instrukˇcn´ı sada. Strojov´ a instrukce obsahuje operaˇcn´ı znak, kter´ y urˇcuje druh operace, poˇcet parametr˚ u atd., a operandov´ u ˇc´ ast – um´ıstnˇen´ı jednotliv´ ych operand˚ u. Vykonat jednu instrukci znamen´a: • • • • •
(fetch) naˇc´ıtat’ inˇstrukciu z pam¨ ati do procesoru (decode) zistit’ o ak´ u inˇstrukciu ide (load) pripravit’ zdrojov´e operandy (execute) vykonat’ oper´ aciu (store) ulozit’ ciel’ov´e operandy
Pˇri vykon´ av´ an´ı programu jsou potˇrebn´e r˚ uzn´e registry – nejd˚ uleˇzitˇejˇs´ı jsou: PC (Program Counter, obsahuje adresu n´ asleduj´ıc´ı instrukce), IR (Instruction Register, naˇcten´a instrukce pro zpracov´an´ı – jm´eno (typ) spolu s operandy (adresami)), SP (Stack Pointer, ukazatel na vrchol z´ asobn´ıku), MAR (memory access register – adresa do operaˇcn´ı pamˇeti), MBR (memory buffer register, d´ ata ˇc´ıt´ ana/zapisov´ ana do pamˇeti). Struktura jednoprocesorov´eho poˇc´ıtaˇce podle Von Neumanna:
Control-flow – v´ yznaˇcn´ ym rysem von Neumannovy architektury je zp˚ usob prov´adˇen´ı programu. Strojov´e instrukce, ze kter´ ych se kaˇzd´ y pˇr´ımo spustiteln´ y program skl´ ad´ a, se prov´adˇej´ı sekvenˇcnˇe, jedna za druhou. Tedy kaˇzd´a instrukce se provede tehdy, aˇz na ni dojde ˇrada, a nad takov´ ymi daty, jak´a jsou pr´avˇe k dispozici. Data-flow (architektura ˇ r´ızen´ a daty) – Alternativa k Control-flow. Okamˇzik proveden´ı urˇcit´e akce se ˇr´ıd´ı pˇripravenost´ı vˇsech dat, kter´ a jsou k proveden´ı urˇcit´e akce zapotˇreb´ı. V´ yhodou je moˇznost prov´adˇet v´ıce ˇcinnost´ı soubˇeˇznˇe - tedy vˇetˇs´ı potenci´ al paralelismu, kter´ y von Neumannovˇe koncepci naopak chyb´ı.
79
Harvardsk´ a Vytvoˇrena aˇz po Von Neumannovˇe, liˇs´ı se hlavnˇe t´ım, ˇze program se ukl´ad´a do jin´e pamˇeti neˇz data (tzn. jsou 2 druhy ” pamˇeti“ – instrukc´ı a dat). Pˇr´ıkladem jsou DSP procesory a mikrokontrolery. Napˇr. AVR od Atmelu, a PIC – maj´ı pamˇet’ na program a data a RISC instrukˇcn´ı sadu; v´ yhoda oddˇelen´ ych pamˇet´ı je, ˇze m˚ uˇzou m´ıt r˚ uznou bitovou hloubku – 8 bitov´e data, ale 12-, 14- ˇci 16- bitov´e instrukce - napˇr. ARM mus´ı obˇcas pouˇz´ıt v´ıce neˇz jednou instrukci na zpracov´ an´ı obsahu pln´e velikosti). Oproti Von Neumannovˇe nehroz´ı nebezpeˇc´ı pˇreps´an´ı programu sebou sam´ ym, ale kv˚ uli vˇetˇs´ımu poˇctu pamˇet’ov´ ych sbˇernic je n´ aroˇcnˇejˇs´ı na v´ yrobu. Pamˇet’ nav´ıc nelze dˇelit podle potˇreby (rozdˇelen´ı je uˇz dan´e). Pˇ r´ıklad (Naˇcrtnˇete typickou architekturu pocitace, ze kter´e bude zrejm´e um´ıst´en´ı a propojen´ı z´ akladnich stavebn´ıch prvku (procesor, pameti, radice a zar´ızeni, sbenice). Ilustrujte na u ´rovni zakladnich krok˚ u ´ınstrukcn´ıho cyklu jak procesor vykon´ av´ a program. Popiˇste typy instrukci (a napiˇste jejich pˇr´ıklady), ze kter´ych se program z pohledu procesoru skl´ ad´ a.) Typick´ a (sbˇ ernicov´ a) architektura syst´ emu:
Zpracov´ an´ı instrukc´ı • ˇ cten´ı instrukce z pamˇeti na adrese v registru PC (program counter, obsahuje adresu n´asleduj´ıc´ı instrukce) • dek´ odov´ an´ı instrukce a ˇcten´ı operand˚ u z registr˚ u • vykon´ an´ı operace odpov´ıdaj´ıc´ı instrukˇcn´ımu k´ odu (operace s obsahem registr˚ u, v´ ypoˇcet adresy a ˇcten´ı/z´apis do pamˇeti, porovn´ an´ı operand˚ u pro podm´ınˇen´ y skok) • uloˇ zen´ı v´ ysledku do registru (v´ ysledek operace s registry, data pˇreˇcten´a z pamˇeti) • posun PC na n´ asleduj´ıc´ı instrukci (n´ asleduj´ıc´ı instrukce n´asleduje bezprostˇrednˇe za pr´avˇe ˇctenou instrukc´ı, pokud nen´ı ˇreˇceno jinak - tzn. podm´ınˇen´ y/nepodm´ınˇen´ y skok, v´ yjimka) Typy instrukci (architektura MIPS): • • • • •
operace registr/registr, registr/immediate16 (ALU operace, pˇresun dat mezi registry) pˇresuny dat registr/pamˇet’ (load/store architektura) podm´ınˇen´e skoky (pˇri rovnosti/nerovnosti obsahu dvou registr˚ u) nepodm´ınˇen´e skoky (vˇcetnˇe nepˇr´ım´ ych skok˚ u a skok˚ u do podprogramu) speci´ aln´ı instrukce (pr´ ace se speci´ aln´ımi registry)
Start-up PC (zm´ aˇcknu power on“ a n´ asleduje...) ” 1. procesor zaˇcne vykon´ avat k´ od (program) BIOSu (Basic Input/Output System) 2. BIOS zjist´ı, jak´ y HW je nainstalov´ an, provede inicializaci grafick´e karty a z (uˇzivatelem definovan´eho) disku naˇcte a spust´ı boot sektor 3. boot sektor obsahuje k´ od, kter´ y s pomoc´ı sluˇzeb BIOSu pˇreˇcte z disku a spust´ı zavadˇeˇc OS 4. zavadˇeˇc OS pˇreˇcte z disku k´ od OS a spust´ı ho 5. OS nastartuje syst´emov´e sluˇzby a uˇzivatelsk´e rozhran´ı Report (Bulej) Tenhle ˇclovˇek se v tom vrtal hodnˇe, ale j´ a m´ am tu v´yhodu, ˇze jsem na stˇredn´ı chodil na elektropr˚ umyslovku, takˇze instrukc´ı a typ˚ u instrukc´ı jsem mu tam popsal spoustu a i postup, jak procesor vykon´ av´ a program, jsem vˇedˇel do detail˚ u (a do detail˚ u to chtˇel). Pˇresvˇedˇcil jsem ho asi hlavnˇe t´ım, ˇze jsem odpov´ıdal takov´ym t´ım ”samozˇrejm´ym”zp˚ usobem (”a kdyˇz procesor vykon´ a instrukci, co dˇel´ a d´ al?”-”pokraˇcuje dalˇs´ı instrukc´ı””no ale co pˇresnˇe dˇel´ a”-”no tenhle postup znovu, naˇcte dalˇs´ı instrukci...””co to pˇresnˇe znamen´ a?”-”no prostˇe zvˇetˇs´ı instruction pointer o velikost pr´ avˇe zpracovan´e instrukce a t´ım z´ısk´ a adresu n´ asleduj´ıc´ı instrukce, a opakuje tenhle postup”). 16 operand
(ˇ c´ıslo) uloˇ zen´ e pˇr´ımo ve strojov´ em k´ odu
80
Report (Peterka) Peterka si narozdiel od Skopala aj precital to co som si napisal na papier. Popisal som tam Von Neumanna a Harvardsku architekturu (napisal som tam vsetko z vypiskov). K tomu nemal vyhrady. Potom vsak prisla horsia cast ked sa ma zacal vypytovat otazky typu: myslite si ze je dobre/zle ked moze byt prepisana ta pamat kde sa nachadza program, alebo ake su vyhody programovatelneho radica... dalej sa ma pytal na SISD,SIMD,MISD,MIMD, mal som mu nakreslit MISD ... co som moc nevedel... potom sa ma spytal na rozdiel Instruction flow control/Data flow control... dialog s Peterkom mi prisiel v niektorich castiach skor ako jeho monolog s mojim prikyvovanim hlavy... Akorat jsem nebyl schopny si vzpomenout na architektury rizenou daty. A chtel vedet kolik radicu a ALU je potreba pri instrukcich SIMD,MIMD. Znamku nevim. DATA FLOW + CONTROL FLOW (asi :)) podot´ azka u mikroprocesor˚ u a architektury Report (Peterka) Von Neumannova architektura - dost temno Harvardsk´ a Architektura - z´ ablesky stroje ˇr´ızen´e daty - brrr hr˚ uza tady uˇz ot´ azky opravdu nev´ım... dod´ am jen nepodceˇ nte hardware - peterka d´ av´ a vˇzdy jednu hardwarovou a jednu s´ıt’ovou ot´ azku doplˇ nuj´ıc´ı: jak´e jsou volac´ı konvence v Pascalu a C? viz zpracovan´e ot´ azky co se stane kdyˇz zavol´ ame virtu´ aln´ı fci pˇred vol´ an´ım konstruktoru? koneˇcnˇe jsem se chytil .) Report (T˚ uma) Za ferove povazujem ze vzal v uvahu ze som IOI a nedal mi konkretnu podotazku, skor tak prehladovo vsetko od architektur, cez procesory az po IO. Na druhej strane sa dost vrtal v zberniciach o ktorych som toho vedel pramalo ( myslim, ze v tych materialoch na statnice tam toho o nich moc nebolo ). Ked som zacal hovorit o preruseni, tak ma prerusil s tym, ze ak nechcem dopadnut ako kolega predo mnou ( patrne ho vyhodil ) tak nech som ticho
81
5.2
Procesory, multiprocesory
Definice (Procesor) Procesor (CPU – central processing unit) je u ´stˇredn´ı v´ ykonnou jednotkou poˇc´ıtaˇce, kter´a ˇcte z pamˇeti instrukce a na jejich z´ akladˇe vykon´ av´ a program. Z´ akladn´ ymi s´ uˇcast’ami procesora s´ u: • ˇradiˇc nebo ˇr´ıdic´ı jednotka, kter´ a ˇr´ıd´ı tok programu, tj. naˇc´ıt´an´ı instrukc´ı, jejich dek´odov´an´ı, naˇc´ıt´an´ı operand˚ u instrukc´ı z operaˇcn´ı pamˇeti a ukl´ ad´ an´ı v´ ysledk˚ u zpracov´ an´ı instrukc´ı • sada registr˚ u k uchov´ an´ı operand˚ u a meziv´ ysledk˚ u. • jedna nebo v´ıce aritmeticko-logick´ ych jednotek (ALU), kter´e prov´ad´ı s daty aritmetick´e a logick´e operace. • nˇekter´e procesory obsahuj´ı jednu nebo nˇekolik jednotek plovouc´ı ˇc´arky (FPU), kter´e prov´ad´ı operace v plovouc´ı ˇr´ adov´e ˇc´ arce. Pozn´ amka S´ uˇcasn´e procesory navyˇse ˇcasto obsahuj´ u d’alˇsie rozsiahle funkˇcn´e bloky (cache, rˆozne perif´erie) – ktor´e z ortodoxn´eho ” hladiska“ nie s´ u priamo s´ uˇcast’ou jadra procesoru. Niektor´e procesory mˆoˇzu obsahovat’ viac jadier (+logiku sl´ uˇziacu k ich ˇ s´ım trendom je SoC (System on Chip), kde sa na ˇcipe procesora nach´adzaj´ vz´ ajomn´emu prepojeniu). Dalˇ u aj d’alˇsie subsyst´emy napr. na spracovanie zvuku, grafiky alebo pripojenie extern´ ych perif´eri´ı (tak´eto rieˇsenia sa vyuˇz´ıvaj´ u v¨aˇcˇsinou v PDA, dom´ acej elektronike, mobiloch atd’.). Dˇ elen´ı podle instruˇ cn´ı sady Podl’a inˇstrukˇcnej sady je moˇzn´e procesory rozdelit’ na: • CISC (Complex Instruction Set Computer): poskytuje rozsiahlu inˇstrukˇcn´ u sadu spolu s rˆoznymi variantami inˇstrukci´ı. Jedna inˇstrukcia napr. mˆ oˇze vykonat’ vel’a low-level oper´aci´ı (naˇc´ıtanie z pam¨ati, vykonat’ aritmetick´ u oper´aciu a v´ ysledok uloˇzit’). Tak´eto inˇstrukcie zjednoduˇsovali z´ apis programov (inˇstrukcie boli bliˇzˇsie vyˇsˇs´ım programovac´ım jazykom) a zmenˇsovali vel’kost’ programu a poˇcet pr´ıstupov do pam¨ ati – ˇco bolo v 60tych rokoch dˆoleˇzit´e. Avˇsak nie vˇzdy je vykonanie jednej zloˇzitej oper´ acie r´ ychlejˇsie ako vykonanie viac menej zloˇzit´ ych miesto toho (napr. kvˆoli zloˇzit´emu dek´odovaniu a pouˇzitiu mikrok´ odu na volanie jednoduch´ ych podinˇstrukci´ı“). Pr´ıkladmi CISC architekt´ ur procesorov s´ u System/360, Motorola ” 68000 a Intel x86. V s´ uˇcasnosti napr. x86 rozklad´a zloˇzit´e inˇstrukcie na micro-operations“ ktor´e mˆoˇzu byt’ pipeline-ou ” spracovan´e paralelne a vyˇsˇs´ı v´ ykon je tak dosahovan´ y na v¨aˇcˇsom rozsahu inˇstrukci´ı. Vd’aka tomu s´ u s´ uˇcasn´e x86 procesory minim´ alne rovnako v´ ykonn´e ako ozajstn´e RISC architekt´ ury. • RISC (Reduced Instruction Set Computer): design CPU ktor´ y uprednosˇ nuje jednoduchˇsiu inˇstrukˇcn´ u sadu a menˇsiu zloˇzitost’ adresovac´ıch modelov – vd’aka ˇcomu je moˇzn´e dosiahnut’ lacnejˇsiu implement´aciu, v¨aˇcˇsiu u ´roveˇ n paralelizmu a u ´ˇcinnejˇsie kompil´ atory. Dˆ ovodom vzniku bolo aj nevyuˇz´ıvanie celej CISC inˇstrukˇcnej sady a upredˇ nostˇ novania len obmedzenej podmnoˇziny (design´eri procesorov potom optimalizovali len tieto podmnoˇziny a tak sa zvyˇsn´e inˇstrukcie pouˇz´ıvali eˇste menej...). Kvˆ oli v¨ aˇcˇsiemu poˇctu inˇstrukci´ı vˇsak musia RISC procesory ˇcastejˇsie pristupovat’ k pam¨ ati... Pr´ıkladmi RISC procesorov s´ u napr. SPARC a ARM. V architektur´ach typu Post-RISC jde o spojen´ı RISCov´ ych vlastnost´ı s technikami zv´ yˇsen´ı v´ ykonu, jako je out-of-order vykon´av´an´ı a paralelismus. • VLIW: Very Long Instruction Word or VLIW refers to a CPU architecture designed to take advantage of instruction level parallelism (ILP). A processor that executes every instruction one after the other (i.e. a non-pipelined scalar architecture) may use processor resources inefficiently, potentially leading to poor performance. The performance can be improved by executing different sub-steps of sequential instructions simultaneously (this is pipelining), or even executing multiple instructions entirely simultaneously as in superscalar architectures. The VLIW approach, on the other hand, executes operation in parallel based on a fixed schedule determined when programs are compiled. Since determining the order of execution of operations (including which operations can execute simultaneously) is handled by the compiler, the processor does not need the scheduling hardware that the three techniques described above require. As a result, VLIW CPUs offer significant computational power with less hardware complexity (but greater compiler complexity) than is associated with most superscalar CPUs. • EPIC: (Nˇekdy oznaˇcov´ an za poddruh VLIW) Explicitly Parallel Instruction Computing (EPIC) is a computing paradigm that began to be researched in the 1990s. This paradigm is also called Independence architectures. It was used by Intel and HP in the development of Intel’s IA-64 architecture, and has been implemented in Intel’s Itanium and Itanium 2 line of server processors. The goal of EPIC was to increase the ability of microprocessors to execute software instructions in parallel, by using the compiler, rather than complex on-die circuitry, to identify and leverage opportunities for parallel execution. This would allow performance to be scaled more rapidly in future processor designs, without resorting to ever-higher clock frequencies, which have since become problematic due to associated power and cooling issues. TODO: asi opravit, moˇzn´ a zpˇresnit VLIW a EPIC a urˇcitˇe pˇreloˇzit ˇ Rekneme, ˇze procesor m´ a ortogon´ aln´ı instrukˇcn´ı sadu, pokud ˇz´adn´a instrukce nepˇredpokl´ad´a implicitnˇe pouˇzit´ı nˇekter´ ych registr˚ u. To umoˇzn ˇuje jednoduˇsˇs´ı pr´ aci algoritm˚ um pˇridˇelov´an´ı registr˚ u v pˇrekladaˇc´ıch. Pˇr´ıkladem neortogon´aln´ı instrukˇcn´ı sady je i x86.
82
Dalˇ s´ı dˇ elen´ı ˇ Dalej je moˇzn´e procesory rozdelit’ podl’a d´lˇzky operandov v bitoch (8, 16, 32, 64...), ktor´ y je procesor schopn´ y spracovat’ v jednom kroku. V embedded zariadeniach sa najˇcastejˇsie pouˇz´ıvaj´ u 4- a 8-bitov´e procesory. V PDA, mobiloch a videohr´ ach 8 resp. 16 bitov´e. 32 a viac bitov vyuˇz´ıaj´ u napr. osobn´e poˇc´ıtaˇce a laserov´e tlaˇciarne. Dˆ oleˇzitou vlastnost’ou je aj taktovacia frekvencia jadra, MIPS (millions of instructions per second) a jeho r´ ychlost’. V s´ uˇcasnosti je t’aˇzk´e d´ avat’ do s´ uvislosti v´ ykon procesorov s ich frekvenciou (resp. MIPS) – k´ ym Pentium zvl´adne na v´ ypoˇcet ˇ s´ım probl´emom“ je superskalarita procesorov, vo floatoch, jednoduch´ y 8-bitov´ y PIC na to potrebuje ovel’a viac taktov. Dalˇ ” ktor´ a im umoˇzn ˇuje vykonat’ viacero nez´ avisl´ ych inˇstrukci´ı poˇcas jedn´eho taktu. Techniky pro zv´ yˇ sen´ı v´ ykonu Zvyˇsovat’ v´ ykon (procesorov) je moˇzn´e viacer´ ymi spˆosobmi. Najjednoduchˇs´ım (a najpomalˇs´ım) typom je Subskal´ arny CPU (naˇc´ıta a sprac´ uva len jednu inˇstrukciu naraz – preto mus´ı cel´ y procesor ˇcakat’ k´ ym vykon´avanie inˇstrukcie skonˇc´ı; je tak zdrˇzovan´ y dlhˇsie trvaj´ ucimi inˇstrukciami).
Pokusy o dosiahnutie skal´ arneho a lepˇsieho v´ ykonu vy´ ustili do designov ktor´e sa spr´avaj´ u menej line´arne a viac paralelne. ˇ sa t´ Co yka paralelizmu v procesoroch, pouˇz´ıvaj´ u sa dva druhy pojmov na ich klasifik´aciu – Instruction level parallelism (zvyˇsovanie r´ ychlosti vykon´ avania inˇstrukci´ı v procesore a teda zv¨aˇcˇsovanie vyuˇzitia prostriedkov na ˇcipe) a Thread level parallelism (zv¨ aˇcˇsovanie poˇctu vl´ akien, ktor´e dok´ aˇze CPU vykon´avat’ naraz). • pipeline: Zlepˇsenie je moˇzn´e dosiahn´ ut’ pomocou instruction pipelining“-u, ktor´e je pouˇz´ıt´e vo v¨aˇcˇsine modern´ ych pro” cesorov. Umoˇzn ˇuje vykonanie viac ako jednej inˇstrukcie v jednom kroku vd’aka rozloˇzeniu spracov´avania inˇstrukcie na viac menˇs´ıch krokov:
• superskalarita: Dialˇsa moˇznost’ je pouˇzitie superscalar designu, ktor´ y obsahuje dlh´ u inˇstrukˇcn´ u pipeline a viacero identick´ ych execution jednotiek.
• Out of order execution 1. 2. 3. 4. 5. 6.
Naˇcten´ı instrukce, pˇr´ıpadnˇe jej´ı rozdroben´ı na mikroinstrukce Zaˇrazen´ı do vyˇck´ avac´ı stanice (instruction pool) Instrukce ˇcek´ a na vˇsechny svoje operandy Instrukce se vykon´ a ve sv´e v´ ykonn´e jednotce (je vyb´ır´ana z instruction poolu nez´avisle na ostatn´ıch) V´ ysledky se uchovaj´ı ve frontˇe (reorder buffer) Aˇz se vˇsechny starˇs´ı instrukce zap´ıˇs´ı do registr˚ u, zap´ıˇse se v´ ysledek t´eto instrukce (opˇetovn´e ˇrazen´ı)
• Predikce skok˚ u – hlubok´e pipeliny maj´ı probl´em, pokud podm´ınˇen´ y skok nen´ı proveden; dynamick´a predicke skok˚ u (historie CPU – vzory nˇejak´e hloubky) vs. statick´a (bez n´apovˇedy – skok vpˇred se neprovede, skok vzad se provede; s n´ apovˇedou – pˇrekladaˇc odhaduje pravdˇepodobnost skoku) • Spekulativn´ı vykon´ avan´ı – vykon´ av´ an´ı k´ odu, kter´ y nemus´ı b´ yt zapotˇreb´ı; v´ yznamn´a disproporce mezi rychlost´ı CPU a pamˇeti; typick´e vyuˇzit´ı je znaˇcn´e pˇredsunut´ı ˇctec´ıch operac´ı; CPU prov´ad´ı i odsouv´an´ı z´apisov´ ych operac´ı • Data parallelism: SIMD inˇstrukcie (napr. multimedi´alne inˇstrukcie), vektorov´e procesory...
83
Multiprocesory TODO: jde o copy & paste z Wiki ... pˇredˇelat ˇcesky/slovensky Definice (Multiprocesor) O multiprocesoru mluv´ıme, pokud je pouˇzito dvou nebo v´ıce procesor˚ u (CPU) v r´amci jednoho poˇc´ıtaˇcov´eho syst´emu. Term´ın je tak´e pouˇz´ıv´ an mluv´ıme-li o schopnosti syst´emu vyuˇz´ıvat v´ıce procesor˚ u a/nebo schopnosti rozdˇelovat u ´lohy mezi jednotliv´ ymi procesory. Vztah k dat˚ um a instrukc´ım In multiprocessing, the processors can be used to execute a single sequence of instructions in multiple contexts (singleinstruction, multiple-data or SIMD, often used in vector processing), multiple sequences of instructions in a single context (multiple-instruction, single-data or MISD, used for redundancy in fail-safe systems and sometimes applied to describe pipelined processors or hyperthreading), or multiple sequences of instructions in multiple contexts (multiple-instruction, multiple-data or MIMD). Symetrie In a multiprocessing system, all CPUs may be equal, or some may be reserved for special purposes. A combination of hardware and operating-system software design considerations determine the symmetry (or lack thereof) in a given system. For example, hardware or software considerations may require that only one CPU respond to all hardware interrupts, whereas all other work in the system may be distributed equally among CPUs; or execution of kernel-mode code may be restricted to only one processor (either a specific processor, or only one processor at a time), whereas user-mode code may be executed in any combination of processors. Multiprocessing systems are often easier to design if such restrictions are imposed, but they tend to be less efficient than systems in which all CPUs are utilized equally. Systems that treat all CPUs equally are called symmetric multiprocessing (SMP) systems. In systems where all CPUs are not equal, system resources may be divided in a number of ways, including asymmetric multiprocessing (ASMP), non-uniform memory access (NUMA) multiprocessing, and clustered multiprocessing (qq.v.). Tˇ esnost spojen´ı multiprocesor˚ u • Tightly-coupled multiprocessor systems contain multiple CPUs that are connected at the bus level. These CPUs may have access to a central shared memory (SMP or UMA), or may participate in a memory hierarchy with both local and shared memory (NUMA). The IBM p690 Regatta is an example of a high end SMP system. Intel Xeon processors dominated the multiprocessor market for business PCs and were the only x86 option till the release of AMD’s Opteron range of processors in 2004. Both ranges of processors had their own onboard cache but provided access to shared memory; the Xeon processors via a common pipe and the Opteron processors via independent pathways to the system RAM. • Chip multiprocessors, also known as multi-core computing, involves more than one processor placed on a single chip and can be thought of the most extreme form of tightly-coupled multiprocessing. Mainframe systems with multiple processors are often tightly-coupled. • Loosely-coupled multiprocessor systems (often referred to as clusters) are based on multiple standalone single or dual processor commodity computers interconnected via a high speed communication system (Gigabit Ethernet is common). A Linux Beowulf cluster is an example of a loosely-coupled system. Tightly-coupled systems perform better and are physically smaller than loosely-coupled systems, but have historically required greater initial investments and may depreciate rapidly; nodes in a loosely-coupled system are usually inexpensive commodity computers and can be recycled as independent machines upon retirement from the cluster. SMP (Symmetric Multiprocessing): viac procesorov so zdiel’anou operaˇcnou pam¨at’ou (nutn´e mechanizmy na zabr´ anenie nespr´ avnych n´ ahl’adov na pam¨ at’ a migr´ aciu procesov medzi procesormi). SMP systems allow any processor to work on any task no matter where the data for that task are located in memory; with proper operating system support, SMP systems can easily move tasks between processors to balance the workload efficiently.
84
5.3
Vstupn´ı a v´ ystupn´ı zaˇ r´ızen´ı, ukl´ ad´ an´ı a pˇ renos dat
Zaˇr´ızen´ı maj´ı r˚ uzn´e charakteristiky: druh – blokov´e (disk, s´ıt’ov´ a karta), znakov´e (kl´ avesnice, myˇs) pˇ r´ıstup – sekvenˇcn´ı (datov´ a p´ aska), n´ ahodn´ y (hdd, cd) komunikace – synchronn´ı (pracuje s daty na ˇza´dost – disk), asynchronn´ı ( nevyˇz´adan´a“ data – s´ıt’ov´a karta) ” sd´ılen´ı – sd´ılen´e (preemptivn´ı, lze odebrat – s´ıt’ov´a karta (po multiplexu OS)), vyhrazen´e (nepreemptivn´ı – tisk´ arna, sd´ılen´ı se realizuje pˇres spooling - frontou). Re´ alnˇe se rozd´ıly st´ıraj´ı. • rychlost (od nˇekolika Bps po GBps) • smˇ er dat – R/W, R/O (CD-ROM), W/O (tisk´ arna) • • • •
Propojovac´ı syst´ emy Dˇel´ı se na dvoubodov´ e spoje (vztah 1:1), jde napˇr. o pˇr´ım´e spojen´ı porty, kˇr´ıˇzov´ y pˇrep´ınaˇc, kde nen´ı nutn´a ˇz´adn´ a adresace. Druhou moˇznost´ı jsou v´ıcebodov´ e spoje, kde v´ıce u ´ˇcastn´ık˚ u sd´ıl´ı pˇrenosov´e m´edium jako napˇr. sbˇernice nebo pˇri broadcastingu. Procesor m˚ uˇze pˇristupovat k I/O zaˇr´ızen´ım dvˇema zp˚ usoby: • port-mapped I/O – speci´ aln´ı adresov´ y port CPU, kter´ y m´a i speci´aln´ı instrukce pro pr´aci (IN, OUT) s I/O zaˇr´ızen´ım, kter´ a tak´e maj´ı vlastn´ı adresov´ y prostor (bud’ pˇr´ımo vlastn´ı sbˇernici, nebo extra I/O pinem), d´ıky tomu se tak´e ˇr´ık´ a isolated I/O“, ” • memory-mapped I/O – pamˇet’ov´e mapov´ an´ı, kter´ y mapuje I/O zaˇr´ızen´ı pˇr´ımo do adresov´eho prostoru fyzick´e pamˇeti. Tato ˇc´ ast adresov´eho prostoru m˚ uˇze b´ yt vyhrazen´a trvale nebo i jen doˇcasnˇe. Zaˇr´ızen´ı poslouch´a na adresov´e sbˇernici, aby vˇedˇelo, kdy m´ a pracovat (odpov´ıdat, ...).
Sbˇ ernice Sbˇernice je sada vodiˇc˚ u propojuj´ıc´ı v´ıce zaˇr´ızen´ı. Vodiˇce jsou oddˇelen´e pro ˇr´ızen´ı (poˇzadavky, potvrzen´ı, typ dat) a data (pˇrenos dat, adresov´ an´ı). V´ yhodou je univerz´ alnost a n´ızk´a cena, nev´ yhodami pak omezen´ı d´elkou a dan´e v d˚ usledku pouˇz´ıv´ an´ı rozmanit´ ych zaˇr´ızen´ı, tak´e potenci´ aln´ı bottleneck“. ” Transakce na sbˇernici zaˇc´ın´ a poˇzadavkem (vysl´ an´ı pˇr´ıkazu a adresy c´ıle), na kter´ y mus´ı c´ıl odpovˇedˇet potvrzen´ım, naˇceˇz n´ asleduje pˇrenos dat mezi u ´ˇcastn´ıky master/initiator (kteˇr´ı pos´ılaj´ı poˇzadavek) a slave/target, kteˇr´ı pos´ılaj´ı/pˇrij´ımaj´ı data. ˇ r´ızen´ı – synchronn´ı (podle hodin, jednoduˇsˇs´ı, rychlejˇs´ı, ale omezen´a d´elka sbˇernice a stejn´ y ˇcas vˇsem) vs. asynchronn´ı (obecnˇejˇs´ı, sloˇzitˇejˇs´ı, zato bez omezen´ı d´elky, ale s niˇzˇs´ı rychlost´ı, napˇr. USB, FireWire) pˇ ridˇ elov´ an´ı – centralizovan´ e (master ˇz´ ad´ a a ˇcek´a na pˇridˇelen´ı, kter´e pˇridˇeluje arbitr podle priority a fairness, master po proveden´ı operace d´ a arbitrovi vˇedˇet, ˇze je sbˇernice opˇet voln´a) vs. distribuovan´ e, kter´e m˚ uˇze b´ yt kolizn´ı nebo zaloˇzen´e na samov´ ybˇeru“. ” Informace o stavu zaˇr´ızen´ı m˚ uˇze CPU z´ısk´ avat: • polling – aktivn´ı ˇcek´ an´ı na zmˇenu zaˇr´ızen´ı (program periodicky kontroluje stav), pro pomal´a zaˇr´ızen´ı vznik´ a znaˇcn´ a reˇzie • interrupt-driven I/O – asynchronn´ı pˇreruˇsen´ı od zaˇr´ızen´ı, kter´e samo signalizuje zmˇenu stavu, na coˇz reaguje obsluˇzn´ a rutina. CPU ovˇsem nen´ı na pˇreruˇsen´ı pˇripraven, tak mus´ı uloˇzit stav programu → stoj´ı to ˇcas. CPU mus´ı podporovat tuto signalizaci pˇreruˇsen´ı, identifikovat zdroj pˇreruˇsen´ı, vybrat spr´avnou obsluˇznou rutinu. Syst´em mus´ı zajistit doruˇcen´ı pˇreruˇsen´ı k CPU a d´ ale ˇradiˇc jejich podle priority urˇc´ı jejich poˇrad´ı (m˚ uˇze jich b´ yt v´ıce neˇz m´a CPU vstup˚ u). Pr˚ ubˇeh: 1. 2. 3. 4.
Vnˇejˇs´ı zaˇr´ızen´ı vyvol´ a poˇzadavek o pˇreruˇsen´ı I/O rozhran´ı vyˇsle sign´ al IRQ na ˇradiˇc pˇreruˇsen´ı (na port IRQ 2) ˇ c pˇreruˇsen´ı vygeneruje sign´ Radiˇ al INTR – nˇekdo“ ˇz´ad´a o pˇreruˇsen´ı a vyˇsle ho k procesoru. ” Procesor se na z´ akladˇe maskov´ an´ı rozhodne obslouˇzit pˇreruˇsen´ı a sign´alem INTA se zept´a, jak´e zaˇr´ızen´ı ˇz´ ad´ a o pˇreruˇsen´ı. ˇ c pˇreruˇsen´ı identifikuje zaˇr´ızen´ı, kter´e ˇz´ad´a o pˇreruˇsen´ı a odeˇsle ˇc´ıslo typu pˇreruˇsen´ı k procesoru 5. Radiˇ 85
(a) polling
(b) prioritn´ı zˇretˇ ezen´ı, daisy chain
(c) nez´ avisl´ eˇ za ´dosti
Obr´ azek 6: centralizovan´e pˇridˇelov´an´ı 6. 7. 8. 9.
Procesor uloˇz´ı stavov´e informace o pr´ avˇe zpracov´avan´em programu do z´asobn´ıku. Podle ˇc´ısla typu pˇr´ıchoz´ıho pˇreruˇsen´ı nalezne ve vektoru pˇreruˇsen´ı adresu pˇr´ısluˇsn´eho obsluˇzn´eho podprogramu. Vyhled´ a obsluˇzn´ y podprogram obsluhy pˇreruˇsen´ı v pamˇeti a vykon´a ho. Po proveden´ı obsluˇzn´eho programu opˇet obnov´ı uloˇzen´e stavov´e informace ze z´asobn´ıku a pˇreruˇsen´ y program pokraˇcuje d´ al.
Pˇrenos dat mezi zaˇr´ızen´ım a CPU/pamˇet´ı: 1. PIO (Programmed I/O) – data pˇren´ aˇsena za u ´ˇcasti CPU (plnˇe zamˇestn´an), pˇrenos realizov´an cyklem v programu, rychl´ y pˇrenos, ale neefektivn´ı vyuˇzit´ı CPU, pak pˇriˇslo DMA 2. DMA (Direct Memory Access) – zaˇr´ızen´ı si samo ˇr´ıd´ı pˇr´ıstup na sbˇernici a pˇren´aˇs´ı data z/do pamˇeti bez u ´ˇcasti CPU; po skonˇcen´ı pˇrenosu pˇreruˇsen´ı (ozn´ amen´ı o dokonˇcen´ı) napˇr, pˇrenos dat mezi HDD a RAM Bus mastering Slouˇz´ı pro pˇrenos dat mezi zaˇr´ızen´ım a pamˇet´ı nebo mezi dvˇema zaˇr´ızen´ımi. Jde o to, ˇze sbˇernici m˚ uˇze ˇr´ıdit (zaˇc´ıt transakci, b´ yt masterem) libovoln´ yu ´ˇcastn´ık (CPU vn´ım´ an jako jeden z nich), st´ale je nutn´e pˇrenos nastavit z programu.
DMA CPU nastav´ı pˇrenos a nech´ a DMA pracovat, aˇz je operace dokonˇcena, poˇsle se pˇreruˇsen´ı, tedy mezit´ım m˚ uˇze CPU pracovat jinde. DMA ˇradiˇc je obvod pro ˇr´ızen´ı pˇrenos˚ u na sbˇernici mezi pamˇet´ı a zaˇr´ızen´ımi nebo i pouze v pamˇeti. U multiprocesor˚ u se uˇz´ıv´ a i k pˇrenosu dat mezi j´ adry. D´ ale bˇeˇznˇe u pevn´ ych disk˚ u, grafick´ ych, zvukov´ ych a s´ıt’ov´ ych karet. DMA ˇradiˇc obsahuje registry, do kter´ ych m˚ uˇze CPU zapisovat nastaven´ı pˇrenosu (adresa v pamˇeti, poˇcet byt˚ u, smˇer r/w, jak´e zaˇr´ızen´ı) – tomu se ˇr´ık´ a burst mode, ve kter´em vystaˇc´ı jeden adresov´ y cyklus na cel´ y blok dat. D´ale se vyuˇz´ıv´a pˇri pˇrenosu dat do/z v´ıce nesouvisl´ ych buffer˚ u (scatter/gather, tak´e vektorov´e I/O). Jednou z technik, pouˇz´ıvan´ ych k pˇrenosu dat po sbˇernici ˇradiˇci DMA, je scatter-gather. Znamen´a to, ˇze v r´amci jednoho pˇrenosu se zpracov´ av´ a v´ıc ne nutnˇe souvisl´ ych blok˚ u dat. • scatter - DMA ˇradiˇc v r´ amci 1 pˇrenosu uloˇz´ı z 1 m´ısta data na nˇekolik r˚ uzn´ ych m´ıst (napˇr hlaviˇcky TCP/IP - jinak zbyteˇcn´e kop´ırov´ an´ı) • gather - napˇr. pˇri str´ ankov´ an´ı pamˇeti - naˇc´ıt´ an´ı str´anek, kter´e fyzicky na disku nemus´ı b´ yt u sebe, sloˇzen´ı na 1 m´ısto do pamˇeti. Pr´ ace ˇ radiˇ ce DMA • • • • •
generuje adresy pamˇeti a periferie, generuje ˇr´ıd´ıc´ı sign´aly pro ˇcten´ı/z´apis generuje sign´ aly pro procesor, aby zajistil, ˇze procesor nepˇristupuje (nezapisuje) na sbˇernici ˇradiˇc s´ am se chov´ a jako periferie program nastavuje parametry pˇrenosu, tj. odkud se bude pˇren´aˇset, kam, a kolik (2 ˇc´ıtaˇce, kan´al DMA) zaˇr´ızen´ı pˇripojena na kan´ al DMA, pˇri pˇrenosu je c´ılov´e zaˇr´ızen´ı aktivov´ano ˇradiˇcem, nikoliv vystaven´ım adresy
86
Posloupnost ud´ alost´ı ˇ ısla pˇred ud´ C´ alost´ı odpov´ıdaj´ı ˇc´ısl˚ um na obr´ azku n´ıˇze. • (1) • (2) (3) (4) (5) (7) • (8) (9)
program nastav´ı ˇradiˇc a periferii a povol´ı pˇrenos aktivac´ı sign´ alu DREQx periferie poˇz´ ad´ a ˇradiˇc DMA o pˇrenos slova z/do pamˇeti ˇradiˇc DMA zkontroluje nastaven´ı kan´ alu vyhodnot´ı prioritu ˇz´adosti aktivac´ı sign´ alu HOLD ˇradiˇc DMA poˇz´ ad´ a CPU o pˇridˇelen´ı sbˇernice pokud CPU nepotˇrebuje sbˇernici, odpoj´ı se od sbˇernice a signalizuje HLDA - CPU poˇr´ ad testuje HOLD na zaˇc´ atku strojov´eho cyklu po pˇrijet´ı HLDA ˇradiˇc pˇriprav´ı sbˇernici pro pˇrenos - vystav´ı adresu v pamˇeti a ˇr´ıd´ıc´ı sign´ aly pro ˇcten´ı/z´apis z/do pamˇeti/periferie ˇradiˇc DMA aktivuje sign´ al DACKx, kter´ ym vyzve periferii k vystaven´ı/pˇreˇcten´ı dat na/ze sbˇernice v z´ avislosti na reˇzimu bud’ pˇrenos konˇc´ı, nebo pokraˇcuje dalˇs´ım slovem dokud je DREQx aktivn´ı pˇri posledn´ım slovˇe ˇradiˇc aktivuje sign´ al EOP pˇri ukonˇcen´ı pˇrenosu ˇradiˇc uvoln´ı sign´ al HOLD procesor uvoln´ı HLDA a pˇripoj´ı se ke sbˇernici
Probl´emy u DMA spoˇc´ıvaj´ı v odst´ınˇen´ı CPU od pamˇeti, coˇz m˚ uˇze vyvolat pamˇ et’ovou inkoherenci, sluˇsnˇe ˇreˇceno pomoc´ı ˇ s´ı se to t´ım, DMA obejdeme cache CPU, kde mohou b´ yt aktu´ alnˇejˇs´ı hodnoty neˇz v pamˇeti, a tud´ıˇz m´ame probl´em Houstone. Reˇ ˇze procesor sleduje, na jak´e adresy se pˇristupuje a pokud tam padne nˇejak´a, kterou m´a v cache, tak to zaˇcne ˇreˇsit.
Obr´ azek 7: pamˇet’ov´a inkoherence C´ıle I/O software: • Nez´ avislost zaˇ r´ızen´ı – programy nemus´ı dopˇredu vˇedˇet, s jak´ ym pˇresnˇe zaˇr´ızen´ım budou pracovat – je jedno jestli pracuji se souborem na pevn´em disku, disketˇe nebo na CD-ROM • Jednotn´ e pojmenov´ an´ı (na UNIXu /dev) • Pˇ ripojen´ı (mount) – ˇcast´e u vymˇeniteln´ ych zaˇr´ızen´ı (disketa); moˇzn´e i u pevn´ ych zaˇr´ızen´ı (disk); nutn´e pro spr´ avnou funkci cache OS • Obsluha chyb – v mnoha pˇr´ıpadech oprava bez vˇedom´ı uˇzivatele (velmi ˇcasto zp˚ usobeno pr´avˇe uˇzivatelem) Report (Bulej + Yaghob) zapisal som vyse strany, ale to co ma yaghob na slidoch a to co je vo vypracovanom ucebnom texte ich ani trochu nezaujimalo. zaujimal ich popis DMA a preruseni, pricom sa pytali ako to presne funguje - chceli popisat instrukcie ako to moze prebiehat, ako sa to presne implementuje apod., co som bohuzial vobec nevedel
87
Report (Bulej) Prenos dat z disku do operacni pameti. Pˇrekvapivˇe dobr´y v´ysledek, nicm´enˇe den pˇredt´ım jsem si ˇcetl o DMA, takˇze bych to mˇel vˇedˇet ˇzejo :-) Chtˇel by prej jeˇstˇe vˇedˇet, ˇze to, co sed´ı na sbˇernici a ˇr´ıd´ı ten pˇrenos, se ovl´ ad´ a z procesoru tak, ˇze v tom jsou nˇejak´y registry, do kterejch se hod´ı instrukce, a taky ˇze se naˇctou data z disku do diskov´y cache, pak se vyvol´ a pˇreruˇsen´ı, a pak se teprva ty data nˇejak dostanou do RAMky, tˇrebas tim DMA nebo jinejma zp˚ usobama (a jakejma, pochopitelnˇe).
88
5.4
Architektury OS
Klasick´ a struktura – monolitick´ a Nejstarˇs´ı, uˇz IBM 360, Unix, Win., vˇsechny sluˇzby uvnitˇr, prov´adˇeny ve chr´anˇen´em m´odu, j´adro pomˇernˇe velk´e, u ´dajnˇe“ ” nejrychlejˇs´ı. Program zavol´ a sluˇzbu OS, pˇres tabulku se zjist´ı adresa pˇr´ısl. fce, ta se zavol´a a vr´at´ı v´ ysledek. Nev´ yhoda: horˇs´ı u ´drˇzba – je-li v programu chyba, m˚ uˇze poˇskodit zb´ yvaj´ıc´ı ˇc´asti syst´emu, rozˇsiˇrov´an´ı za bˇehu je komplikovan´e. Virtu´ aln´ı stroje P˚ uvodn´ı n´ apad : Virtual Machine pro IBM360 – oddˇelit multitasking od OS jako ext. stroj. Nad HW byla dalˇs´ı vrstva – Virtual Machine“ – mˇela pl´ anovat, vyr´ ab´ı pro procesy iluzi hol´eho HW; dneska napˇr. VMWare dˇel´a to sam´e. Pro IBM360 se ” dalo pouˇz´ıt v kombinaci s CMS (jedno´ ulohov´ y) i p˚ uvodn´ıho OS360 (rychlejˇs´ı neˇz OS360 na hol´em HW). Dnes: definuji abstraktn´ı stroj, pro nˇej pˇrekl´ ad´ am programy (.NET, Java) → pˇrenositelnost, kompatibilita (IBM AS400 – des´ıtky let), probl´em – pomal´e. Mikroj´ adro snaha aby ˇc´ ast bˇeˇz´ıc´ı v kernel m´ odu byla co nejmenˇs´ı (tˇreba jen cca 10 KB), nejnovˇejˇs´ı, experiment´aln´ı, ˇcasto pro Distribuovan´e OS (dnes uˇz nepouˇz´ıvan´e), hodnˇe proces˚ u & komunikace (klient/server), mikroj´adro ˇreˇs´ı jenom komunikaci. Filesyst´em apod. jsou procesy – aplikace jim pos´ılaj´ı pˇres j´adro poˇzadavky. Jedin´ y komerˇcn´ı OS – Chorus (´ ustˇredny). v´ yhoda: kdyˇz nˇeco spadne, nepoˇskod´ı to zbytek, moduly jdou mˇenit za bˇehu, komunikace jde snadno rozˇs´ıˇrit na komunikaci po s´ıti. Architektura WinNT J´ adro je pomˇernˇe mal´e (cca 1MB), schopn´e (pro vyˇsˇs´ı vrstvy jsou nˇekter´e schopnosti skryt´e), na jeho vzniku se pod´ıleli schopn´ı Unix´ aˇri. Byla zde snaha o malou velikost, pˇrenositelnost. J´adro je neutr´aln´ı vzhledem k vyˇsˇs´ım vrstv´am, nad n´ım lze vybudovat r˚ uzn´e syst´emy (Windows subsyst´em, POSIX, OS/2). Rozhran´ı OS a uˇziv. program˚ u zajiˇst’uje WinAPI, nad n´ım se nach´azej´ı r˚ uzn´e DLL, mezi kernelem a HW je hardware ” abstraction layer“, tj. kernel lze jednoduˇse upravit pro jin´e architektury (Alpha, IA-64). Grafick´e drivery jedin´e maj´ı pˇr´ım´ y pˇr´ıstup k HW (kv˚ uli v´ ykonu), ˇc´ asti API (USER, GDI) jsou implementovan´e v j´adˇre, pˇrechod mezi user a kernel reˇzimem zajiˇst’uje ntdll.dll (a je tedy vyuˇz´ıv´ an vˇsemi programy). Veˇsker´e sluˇzby a aplikace bˇeˇz´ı v user m´odu nad j´adrem.
Architektura Linuxu • Na u ´rovni SW – pˇrenositelnost; abstrakce HW. • nad HW – kernel, nad n´ım syst´emov´ a vol´ an´ı, hodnˇe podobn´e Windows.
89
5.5
Procesy, vl´ akna, pl´ anov´ an´ı
Procesy a vl´ akna Syst´emov´e vol´ an´ı je interface mezi OS (kernelspace) a uˇz´ıvatelsk´ ymi programy (userspace). Definice (Proces) Proces je inˇstancia vykon´ avan´eho programu. K´ ym program je len s´ ubor inˇstrukci´ı, proces je vlastn´ y v´ ykon“ t´ ychto inˇstrukci´ı. ” Proces m´ a vlastn´ y adresn´ y priestor (pam¨ at’), prostriedky, child procesy, glob´an´ı promˇenn´e, otevˇren´e soubory, pr´ ava a napr. aj ID (Process ID). Stavy procesu Poˇcas ˇzivota sa mˆ oˇze proces nach´ adzat’ v rˆ oznych stavoch: • beˇziaci – jeden proces na procesor, • blokovan´y – pri pouˇzit´ı blokuj´ uceho volania – I/O disku atd’., • pripraven´y – skonˇcilo blokovanie; spotreboval vˇsetok pridelen´ y ˇcas resp. vr´ atil riadenie syst´emu, ˇcak´ a na nov´e pridelenie procesora, • zombie – po ukonˇcen´ı procesu, ked’ uˇz nepracuje – ale eˇste nebol vymazan´ y. Obr´azek 8: Pˇrechody mezi stavy procesu Definice (Vl´ akno (Thread)) Vl´ akno je moˇznost’ pre program ako sa rozdelit’“ na dva alebo viac z´aroveˇ n (resp. pseudo-z´aroveˇ n) vykon´avan´ ych u ´loh. Oproti ” procesu mu nie je pridelen´ a vlastn´ a pam¨ at’ – je to len miesto vykon´avania inˇstrukci´ı v programe. Oproti procesu s´ u jeho atrib´ utmi“ len hodnota programov´ eho ˇ c´ıtaˇ ca, stav registrov CPU a z´ asobn´ık. ”
(a) Process control block
(b) Process control block s vl´ akny
Obr´ azek 9: Process control block Implementace: • User Level Threads(1.diagram) - thread management dˇel´a aplikace (nemus´ı b´ yt podporov´any OS), kaˇzd´ y proces ma thread table, kdyˇz syst´em zablokuje proces zablokuj´ı se i vˇsechny jeho thready • Kernel Threads(2.diagram) - thread management dˇel´a OS (mus´ı podporovat), thread table je glob´aln´ı, syst´em blokuje pouze jednotliv´e thready
Multithreading - schopnost syst´emu efektivnˇe pouˇz´ıvat v´ıce thread˚ u, modely: • many-to-one - mnoho user-level thread˚ u je namapov´ano na jeden kernel thread, pouˇz´ıv´a se na syst´emech nepodporuj´ıc´ıch kernel thready (napˇr. Linux - pthreads) • one-to-one - kaˇzd´ y user-level thread je namapov´an na jeden kernel thread (napˇr. win2000, Linux - NGPT) 90
Pl´ anovanie Pridel’ovanie procesorov´eho ˇcasu jednotliv´ ym procesom m´a na starosti pl´ anovaˇc. Pl´anovanie pritom mˆoˇze byt’ preempt´ıvne (plnˇe v reˇzii OS) alebo nepreempt´ıvne (vyˇzaduje spolupr´ aci s programem, kooperat´ıvne – alla Win16). Ciele pl´ anovania (niektor´ e z nich s´ u oˇ cividne protichodn´ e): • • • • •
Spravodlivost’ (kaˇzdy procesor dostane adekv´ atnu ˇcast’ ˇcasu CPU) Efekt´ıvnost’ (plne vyt’aˇzen´ y procesor) Minim´ alna doba odpovede Pr˚ uchodnost (maxim´ alny poˇcet spracovan´ ych procesov) Minim´ alna r´eˇzia syst´emu
Krit´ eri´ a pl´ anovania: • • • • •
Viazanost’ procesu na dan´e CPU a I/O (presun procesu na in´ y procesor zaberie vel’a prostriedkov) Proces je d´ avkovy/interakt´ıvny? Priorita procesu (statick´ a (nemenn´ a – okrem renice“) + dynamick´a, ktor´a sa men´ı v ˇcase kvˆoli spravodlivosti) ” Ako ˇcasto proces generuje v´ ypadky str´ anok (nejak´ y popis???) Kolik skutoˇcn´eho ˇcasu CPU proces obdrˇzel
Algoritmy: • First Come First Served (FCFS): nepreempt´ıvny, procesy pl´anov´any v poˇrad´ı, v jak´em pˇrich´azej´ı, procesy bˇeˇz´ı dokud neskonˇc´ı • Round Robin: preempt´ıvne rozˇs´ırenie FCFS, kaˇzd´ y proces m´a stejn´e povolen´e ˇcasov´e kvantum na bˇeh, po jeho uplynut´ı je proces pˇresunut na konec fronty • Pl´ anovanie s viacer´ ymi frontami: niekol’ko front, procesu z i-tej fronty je pridelen´ y procesor aˇz ked’ vo front´ ach 1, . . . , i − 1 nie je pripraven´ y ziadny proces. Ak proces skonˇcil I/O oper´aciou, je blokovan´ y a presunut´ y do fronty i − 1, ak skonˇcil preempciou, je pripraven´ y a presunut´ y do fronty i + 1. • Symmetric multiprocessing (SMP): druh v´ıceprocesorov´ ych syst´em˚ u, u kter´ ych jsou vˇsechny procesory v poˇc´ıtaˇci rovnocenn´e, fronta CPU ˇcakaj´ ucich na pripraven´e procesy (akt´ıvne (spotrebov´ava energiu) vs. pas´ıvne ˇcakanie (ˇspeci´ alne inˇstrukcie)), vzt’ah“/afinita procesov k CPU ” • TODO: Pl´ anovanie windows vs. linux??? Report (Zavoral) zhruba to co je vo vypiskach, diskusia dalej pokracovala o rozdieloch medzi vlaknami a procesmi - napr ako su implementovane vlakna v OS ktory ich nepodporuje (snazil som sa to nejak ukazat na JVM, ale podrobnosti som velmi nevedel, takze to bolo dost napovedy pana Zavorala a par slov odo mna :? ). nˇekdo jiny: som letel na Vlaknach (nevedel som ze su reprezentovane hodnotou registrov, prog. citaca a zasobnikom)
91
5.6
Synchronizaˇ cn´ı primitiva, vz´ ajemn´ e vylouˇ cen´ı
Pojmy ˇ Casov´ e z´ avisl´ e chyby (Race Conditions) Situace kde 2 nebo v´ıce proces˚ u pˇristupuje ke stejn´emu sd´ılen´emu prostˇredku, a fin´ aln´ı v´ ysledek z´ aleˇz´ı na kdo probˇehne kdy se jmenuje race conditions Pˇr´ıklad na tiskov´e frontˇe:
Kritick´ a sekce (Critical Regions) ˇc´ ast programu, kter´a dokud nen´ı dokonˇcena nen´ı moˇzn´e zaˇc´ıt jinou (napˇr. pouˇz´ıv´ a sd´ılen´e prostˇredky)
Vz´ ajemn´ e vylouˇ cen´ı (Mutual Exclusion) kritickou operaci prov´ad´ı nejv´ yˇse jeden proces. Podm´ınky vz´ajemn´eho vylouˇcen´ı: ˇ adn´e dva procesy nemohou b´ 1. Z´ yt najednou ve stejn´e kritick´e sekci 2. Nemohou b´ yt uˇcinˇeny ˇz´ adn´e pˇredpoklady o rychlosti procesu (ˇz´adn´e odhady rychlosti nebo priorit procesu, mus´ı fungovat se vˇsemi procesy) ˇ adn´ 3. Z´ y proces mimo kritickou sekci nesm´ı blokovat jin´ y proces ˇ adn´ 4. Z´ y proces nesm´ı ˇcekat nekoneˇcnˇe dlouho v kritick´e sekci (jinak dead-lock) Metody dos´ ahnut´ı vz´ ajemn´eho vylouˇcen´ı: aktivn´ı ˇcek´an´ı (busy waiting) a pasivn´ı ˇcek´an´ı/blokov´an´ı. Aktivn´ı ˇ cek´ an´ı (Busy Waiting) Vlastnosti : spotˇ rebov´ av´ aˇ cas procesoru, vhodnˇejˇs´ı pro pˇredpokl´adan´e kr´atk´e doby ˇcek´an´ı, nespotˇrebov´av´a prostˇredky OS, rychlejˇs´ı. Navrhovan´ a ˇreˇsen´ı: • Zak´ az´ an´ı pˇ reruˇ sen´ı] nevhodn´e - proces m´ a plnou kontrolu nad poˇc´ıtaˇcem • Z´ amky v promˇ enn´ e] nefunguj´ı - mezi pˇreˇctˇen´ıma nastaven´ım locku m˚ uˇze b´ yt program pˇreruˇsen - pak by si ”nevˇsim”lock == 1 a vesel pokraˇcoval, akor´ at jsme pˇridali novou race condition. int lock; void proc(void) { for (;;) { nekritick´ a_sekce(); while (lock != 0); lock = 1; kritick´ a_sekce(); lock = 0; } } • D˚ usledn´ e stˇ r´ıd´ an´ı (Strict Alternation) funguje ale poruˇsuje podm´ınku 3 - promˇenn´a turn hl´ıd´a kdo je na ˇradˇe
92
int turn = 0; void p1(void) { for (;;) { while (turn != 0); kritick´ a_sekce(); turn = 1; nekritick´ a_sekce(); } }
void p2(void) { for (;;) { while (turn != 1); kritick´ a_sekce(); turn = 0; nekritick´ a_sekce(); } }
Petersonovo ˇreˇsen´ı - zobecnˇen´ı pro N proces˚ u: #define N 2
/* poˇ cet proces˚ u */
int turn; int interested[N];
/* kdo m´ a z´ ajem */
void enter_region(int proc) { /* proc: kdo vstupuje */ int other = 1-proc; /* ˇ c´ ıslo opaˇ cn´ eho procesu */ interested[proc] = TRUE; /* m´ am z´ ajem o vstup */ turn = proc; /* nastav pˇ r´ ıznak */ while (turn == proc && interested[other] == TRUE); } void leave_region(int proc) { /* proc: kdo vystupuje */ interested[proc] = FALSE; /* uˇ z odch´ az´ ım */ } • Instrukce Test-and-Set Lock (TSL) - atomick´a operace na u ´rovni strojov´eho k´odu, nem˚ uˇze b´ yt pˇreruˇsena je nutn´e aby ji podporoval HW (vˇsechny souˇcasn´e procesory nˇejakou maj´ı): - implementace spin-locku (druh z´ amku, na nˇejˇz je tˇreba aktivnˇe ˇcekat – ˇcekaj´ıc´ı proces pˇri ˇcek´an´ı na spinlock spotˇrebov´ av´ a syst´emov´e prostˇredky) - poˇr´ ad ale m´enˇe prostˇredk˚ u neˇz pˇredchoz´ı ˇreˇsen´ı enter_region: tsl R,lock cmp jnz ret
R,#0 enter_region
leave_region: mov lock,#0 ret
; ; ; ; ; ;
naˇ cti z´ amek do registru R a nastav z´ amek na 1 byl z´ amek nulov´ y? byl-li nenulov´ y, znova n´ avrat k volaj´ ıc´ ımu - vstup do kritick´ e sekce
; uloˇ z do z´ amku 0 ; n´ avrat k volaj´ ıc´ ımu
Pasivn´ı ˇ cek´ an´ı Vlastnosti : proces je ve stavu blokov´ an, vhodn´e pro delˇs´ı doby ˇcek´an´ı, spotˇ rebov´ av´ a prostˇ redky OS, pomalejˇs´ı. Postup pouˇz´ıvaj´ıc´ı Sleep/Wakeup (implementov´ any OS, atomick´e operace - sleep usp´ı volaj´ıc´ı proces, wakeup probud´ı udan´ y proces) nefunguje (viz Probl´em producent/konzument). • Semafory – poˇc´ıt´ a poˇcet probuzen´ ych, reprezentace voln´ ych a pˇridˇelen´ ych prostˇredk˚ u Atomick´e operace (nesm´ı b´ yt pˇreruˇseny): down(semaphore* s) – zabere semafor (s--;) pokud je voln´ y (s>0), jinak ˇcek´a na uvolnˇen´ı up(semaphore* s) – uvoln´ı semafor (s++;), vzbud´ı ˇcekaj´ıc´ı proces (pokud existuje) -nutn´ a podpora OS (vˇetˇsinou v kernelu) ˇ • Mutex Speci´ alny (bin´ arny) typ semaforu, kde s´ u povolen´e len hodnoty 0 a 1 (v Up sa miesto s := s + 1 vol´ a s := 1) sa naz´ yva mutex a pouˇz´ıva sa na riadenie pr´ıstupu k jednej premennej. Vˇetˇsinou pomoc´ı TSL. 93
• Monitory Implementov´ any pˇrekladaˇcem, lze si pˇredstavit jako tˇr´ıdu C++ (vˇsechny promˇenn´e priv´atn´ı, funkce mohou b´ yt i veˇrejn´e), vz´ ajemn´e vylouˇcen´ı v jedn´e instanci (zajiˇstˇeno synchronizac´ı na vstupu a v´ ystupu do/z veˇrejn´ ych funkc´ı, synchronizace implementov´ ana blokovac´ım primitivem OS). ???TODO • Zpr´ avy Operace SEND a RECEIVE, zablokov´ an´ı odes´ılatele/pˇr´ıjemce, adresace proces/mailbox, rendez-vous... • RWL - read-write lock, bari´ ery... Ekvivalence primitiv - pomoc´ı jednoho blokovac´ıho primitiva lze implementovat jin´e blokovac´ı primitivum. Rozd´ıly mezi platformami: Windows - jednotn´e funkce pro pasivn´ı ˇcek´an´ı, ˇcek´an´ı na v´ıce primitiv, timeouty. Unix - OS implementuje semafor, knihovna pthread. Klasick´ e synchronizaˇ cn´ı probl´ emy • Probl´ em producent/konzument Producent vyr´ aba predmety, konzument ich spotreb´ uva. Medzi nimi je buffer pevnej vel’kosti (N). Konzument nem´ a ˇco spotreb´ uvat’ ak je buffer pr´ azdny; producent prestane vyr´abat’, ak je buffer pln´ y. int N = 100; int count = 0; void producer(void) { int item; while(TRUE) { produce_item(&item); if(count==N) sleep (); enter_item(item); count++; if(count == 1) wake(consumer); } } void consumer(void) { int item; while(TRUE) { if(count==0) /*pozice A*/ sleep (); remove_item(&item); count--; if(count==N-1) wake(producer); consume_item(&item); } } 1. 2. 3. 4.
Buffer je pr´ azdny, a konzument pr´ ave preˇc´ıtal count, aby zistil, ˇci je rovn´ y nule Prepl´ anovanie na producenta (”pozice A”) Producent vytvoˇr´ı item a zv´ yˇs´ı count Producent zist´ı, ˇci je count rovn´ y jednej. Zist´ı ˇze ´ano, ˇco znamen´a ˇze konzument bol predt´ ym zablokovan´ y (pretoˇze muselo byt’ 0), a zavol´ a wakeup 5. Teraz mˆ oˇze dˆ ojst’ k zablokovaniu: konzument pokraˇcuje na ”pozici A”a usp´ı se, pretoˇze si mysl´ı, ˇze nem´ a ˇco zobrat’; producent bude chv´ıl’u produkovat’ a dˆ ojde ”preplneniu”⇒ usp´ı sa; sp´ı producent aj konzument :o) ˇ sen´ı pomoc´ı semaforu: Reˇ #define N 10 typedef int semaphore; semaphore empty = N; semaphore full = 0; semaphore mutex = 1;
//a semaphore is an integer //counting empty slots //counting full slots //mutual exclusion on buffer access
void producer() { while (TRUE) { int item = produce_item(); down(&empty); //possibly sleep, decrement empty counter down(&mutex); //possibly sleep, claim mutex (set it to 0) thereafter insert_item(item); up(&mutex); //release mutex, wake up other process up(&full); //increment full counter, possibly wake up other ...
94
} } void consumer() { while(TRUE) { down(&full); down(&mutex); item = remove_item(); up(&mutex); up(&empty); consume_item(item); } }
//possibly sleep, decrement full counter //possibly sleep, claim mutex (set it to 0) thereafter //release mutex, wake up other process //increment empty counter, possibly wake up other ...
• Probl´ em obˇ edvaj´ıc´ıch filosof˚ u ˇ Pˇet filosof˚ u sed´ı okolo kulat´eho stolu. Kaˇzd´ y filosof m´a pˇred sebou tal´ıˇr ˇspaget a jednu vidliˇcku. Spagety jsou bohuˇzel slizk´e ˇ a je tˇreba je j´ıst dvˇema vidliˇckami. Zivot filosofa sest´av´a z obdob´ı j´ıdla a obdob´ı pˇrem´ yˇslen´ı. Kdyˇz dostane hlad, pokus´ı se vz´ıt dvˇe vidliˇcky, kdyˇz se mu to podaˇr´ı, naj´ı se a vidliˇcky odloˇz´ı. • Probl´ em ospal´ eho holiˇ ce Holiˇc m´ a ve sv´e ofic´ınˇe kˇreslo na holen´ı z´ akazn´ıka a pevn´ y poˇcet sedaˇcek pro ˇcekaj´ıc´ı z´akazn´ıky. Pokud v ofic´ınˇe nikdo nen´ı, holiˇc se posad´ı a sp´ı. Pokud pˇrijde prvn´ı z´ akazn´ık a holiˇc sp´ı, probud´ı se a posad´ı si z´akazn´ıka do kˇresla. Pokud pˇrijde z´ akazn´ık a holiˇc uˇz stˇrih´ a a je voln´e m´ısto v ˇcek´ arnˇe, posad´ı se, jinak odejde. Report (Bulej) 1. priklad Producent-konzument pomoci semaforu 2. stacilo napsat aktivni vs. pasivni, kriticka sekce, spinlock, semafor (obecne monitor) a pak nasledovalo par otazek, zda je mozne naprogramovat synch. primitivum bez podpory HW Report (Bulej) Mysl´ım, ˇze jsem je pochopil, aˇz kdyˇz mi to pan Skopal vysvˇetlil. To, co je v materi´ alech opravdu nestaˇc´ı. TSL je dobr´y v tom, ˇze m´ a pravˇe operaci Test and Set Lock jako atomickou. Pak jsem se pokouˇsel udˇelat semafor pro probl´em producent a konzument a dˇelal jsem ho uplnˇe ˇspatnˇe Report (Hnˇet´ynka) na jedniˇcku mus´ıte umˇet praktick´e uˇzit´ı (napˇr. z v´ıce mutex˚ u postavit semafor) Report (Bedn´ arek) Na tuhle jsem byl pˇripraven´y ze zadan´ych ot´ azek asi nejh˚ uˇr, kupodivu jsem toho k n´ı ale nakonec na pap´ır vyplodil pomˇernˇe dost a dostal k t´ematu jen m´ alo doplˇ nuj´ıc´ıch ot´ azek (nˇejak´e drobn´e praktick´e a jak implementovat mutex bez podpory OS, tj. pomoc´ı test-and-set instrukce), pak se plynule a nepozorovanˇe pˇreˇslo na zablokov´ an´ı a zotaven´ı z nˇej. Nˇeco jsem vˇedˇel, vzpomnˇel jsem ˇadn´e si na 3 ze 4 Coffmanov´ych podm´ınkek a jejich oˇsetˇren´ı, ˇctvrtou jsem pak vymyslel s Bedn´ arkovou vydatnou pomoc´ı. Z´ ot´ azky na ”klasick´e synchronizaˇcn´ı probl´emy”nebo Petersonovo ˇreˇsen´ı, tj. vˇeci, o kter´ych jsem se s´ am radˇsi nezm´ınil. na konci sa opytal, ze aky problem okrem vyhladovania moze nastat... deadlock Sleep/wakeup, semafory, monitory, spr´ avy, polling - u kaˇzd´eho ako funguje a ˇci to rob´ı aplik´ acia/OS/HW. Potom sme sa pobavili o moˇznosti implementovat’ jedno druh´ym.
95
5.7
Zablokov´ an´ı a zotaven´ı z nˇ ej
Prostˇredek je cokoliv, k ˇcemu je potˇreba hl´ıdat pˇr´ıstup (HW zaˇr´ızen´ı – tisk´arny, cpu; informace – z´aznamy v DB). Je moˇzn´e je rozdˇelit na odn´ımateln´e (lze odejmout procesu bez n´ asledk˚ u – CPU, pamˇet’) a neodn´ımateln´e (nelze odejmnout bez nebezpeˇc´ı selh´ an´ı v´ ypoˇctu – CD-ROM, tisk´ arna... tento druh zp˚ usobuje probl´emy). Pr´ ace s prostˇredky prob´ıh´ a v nˇekolika kroc´ıch: ˇz´ adost o prostˇredek (blokuj´ıc´ı, pr´avˇe tady doch´az´ı k zablokov´an´ı), pouˇz´ıv´ an´ı (napˇr. tisk), odevzd´ an´ı (dobrovoln´e/pˇri skonˇcen´ı procesu). Mnoˇzina proces˚ u je zablokov´ ana, jestliˇze kaˇzd´ y proces z t´eto mnoˇziny ˇcek´a na ud´alost, kterou m˚ uˇze zp˚ usobit pouze jin´ y proces z t´eto mnoˇziny. Coffmanovy podm´ınky Splnenie t´ ychto podmienok je nutn´e pre zablokovanie: 1. 2. 3. 4.
V´ yluˇ cn´ y pˇ r´ıstup – kaˇzd´ y prostˇredek je bud’ vlastnˇen pr´avˇe jedn´ım procesem nebo je voln´ y. Drˇ zaˇ cekej – procesy aktu´ alnˇe vlastn´ıc´ı nˇejak´e prostˇredky mohou ˇz´adat o dalˇs´ı. Neodn´ımatelnost – pˇridˇelen´e prostˇredky nemohou b´ yt proces˚ um odebr´any. ˇ an´ı do kruhu – existuje kruhov´ Cek´ y ˇretˇez proces˚ u, kde kaˇzd´ y z nich ˇcek´a na prostˇredek vlastnˇen´ y dalˇs´ım ˇcl´ ankem ˇretˇezu.
ˇ sen´ı zablokov´ Reˇ an´ı • Pˇ stros´ı algoritmus – Zablokov´ an´ı se ani nedetekuje, ani se mu nezabraˇ nuje, ani se neodstraˇ nuje, Uˇzivatel s´ am rozhodne o ˇreˇsen´ı (kill). Nespotˇrebov´ av´ a prostˇredky OS – nem´a reˇzii ani neomezuje podm´ınky provozu. (Nejˇcastˇejˇs´ı ˇreˇsen´ı – Unix, Windows) • Detekce a zotaven´ı – Hled´ a kruˇznici v orientovan´em grafu (hrany vedou od procesu, kter´ y ˇcek´a, k procesu, kter´ y prostˇredek vlastn´ı), pokud tam je kruˇznice, nastalo zablokov´an´ı a je tˇreba ho ˇreˇsit: – Odebr´ an´ı prostˇredku – dohled oper´ atora, pouze na pˇrechodnou dobu – Zab´ıjen´ı proces˚ u z cyklu (resp. mimo cyklus vlastn´ıc´ı identick´ y prostˇredek) – Rollback (OS ukl´ ad´ a stav proces˚ u, pˇri zablokov´an´ı se nˇekter´e procesy vr´at´ı do pˇredchoz´ıho stavu ⇒ ztracena pr´ ace... obdoba u DB) • Vyh´ yb´ an´ı se – Bezpeˇcn´ y stav (procesy/prostˇredky nejsou zablokov´any, existuje cesta, jak uspokojit vˇsechny poˇzadavky na prostˇredky spouˇstˇen´ım proces˚ u v jist´em poˇrad´ı); Vid’. bank´eˇr˚ uv algoritmus. Nutn´e je pˇredem zn´at vˇsechny prostˇredky, kter´e budou programy potˇrebovat; OS pak d´ av´ a prostˇredky tomu, kter´ y je nejbl´ıˇz sv´emu maximu potˇreby a nav´ıc pro kter´ y je prostˇredk˚ u dost na dokonˇcen´ı. Dnes se moc nepouˇz´ıv´a. • Pˇ redch´ azen´ı (prevence) – napaden´ı jedn´e z Coffmanovy podm´ınek 1. V´yluˇcn´y pˇr´ıstup – spooling (prostriedky spravuje jeden systemov´ y proces, ktory dohliada na to, aby jeho stav bol konzistentny (tiskarna) – pozor na m´ısto na disku) 2. Drˇz a ˇcekej – ˇz´ adat o vˇsechny prostˇredky pˇred startem procesu. Nejprve vˇsechno uvolnit a pak znovu ˇz´adat o vˇsechny najednou 3. Neodn´ımatelnost – odn´ımateln´e prostˇredky mohou b´ yt odejmuty bez n´asledk˚ u (procesor-pˇrepl´anov´an´ı, pamˇet’-swapping), neodn´ımateln´e nelze bez nebezpeˇc´ı selh´ an´ı v´ ypoˇctu ˇ an´ı do kruhu – vˇsechny prostˇredky jednoznaˇcnˇe oˇc´ıslov´any (staˇc´ı prostˇredky v nˇejak´em kontextu), procesy mohou 4. Cek´ ˇz´ adat o prostˇredky jen ve vzestupn´em poˇrad´ı • Dvojf´ azov´e zamyk´ an´ı – nejprve postupnˇe vˇsechno zamyk´am (prvn´ı f´aze). Potom se m˚ uˇze pracovat se zamˇcen´ ymi prostˇredky – a na z´ avˇer se uˇz jen odemyk´ a (druh´ a f´ aze) – vid’ transakˇcn´ı spracov´an´ı u datab´az´ı ((striktn´ı/konzervativn´ı) dvouf´ azov´e zpracov´ an´ı) Bank´ eˇ r˚ uv algoritmus: Bank´eˇr m´ a klienty a tˇem sl´ıbil jistou v´ yˇsku u ´vˇeru. Bank´eˇr v´ı, ˇze ne vˇsichni klienti potˇrebuj´ı plnou v´ yˇsi u ´vˇeru najednou. Klienti obˇcas navˇst´ıv´ı banku a ˇz´adaj´ı postupnˇe o prostˇredky do maxim´aln´ı v´ yˇsky u ´vˇeru. Aˇz klient skonˇc´ı s obchodem, vr´ at´ı bance vyp˚ ujˇcen´e pen´ıze. Bank´eˇr pen´ıze p˚ ujˇc´ı pouze tehdy, z˚ ustane-li banka v bezpeˇcn´em stavu. Probl´emy: sloˇzitost O(N 2 ), poˇzadovan´e info je typicky nedostupn´e, efektivn´ejˇs´ı b´ yv´a ˇreˇsit aˇz vznikl´e probl´emy
96
5.8
Organizace pamˇ eti, alokaˇ cn´ı algoritmy
Hierarchie pamˇ eti (smˇerem odshora dol˚ u roste velikost, cena na bajt a rychlost kles´a – a naopak. . . ): • registry CPU — 10ky-100vky bajt˚ u (IA-32: obecn´e registy p´ar 10tek), IA-64 – aˇz kB (extr´em), stejnˇe rychl´e jako CPU. • cache — z pohledu aplikac´ı nen´ı pˇr´ımo adresovateln´a; dnes ˇr´adovˇe MB, rozdˇelen´ı podle u ´ˇcelu, nˇekolik vrstev. L1 cache (cca 10ky kB) – dˇelen´e instrukce/data; L2 (cca MB) sd´ılen´e instr&data, bˇeˇz´ı na rychlosti CPU (dˇr´ıv b´ yvala pomalejˇs´ı), servery – L3 (cca 10MB). Vyrovn´ av´ a rozd´ıl rychlosti CPU a RAM. Vyuˇz´ıv´a lokality program˚ u – cyklen´ı na m´ıstˇe; sekvenˇcn´ıho pˇr´ıstupu k dat˚ um. Pokud nenajdu co chci v cache – cache-miss“, naˇc´ıt´a se potˇrebn´e z RAM (po bloc´ıch), jinak (v 95-7% ” pˇr´ıpad˚ u) nastane cache-hit“, tj. poˇzadovan´ a data v cache opravdu jsou a do RAM nemus´ım. ” • hlavn´ı pamˇet’ (RAM) — pˇr´ımo adresovateln´ a procesorem, 100MB – GB; pomalejˇs´ı neˇz CPU; CAS – doba pˇr´ıstupu na urˇc. m´ısto – nejv´ıc zdrˇzuje (v 1 sloupci uˇz ˇcte rychle, dat. tok dostateˇcn´ y), dalˇs´ı – latence – doba neˇz data doteˇcou do CPU – hraje roli vzd´ alenost (AMD- integrovan´ y ˇradiˇc v CPU) • pomocn´ a pamˇet’ — nen´ı pˇr´ımo adresovateln´ a, typicky HDD; n´ah. pˇr´ıstup, ale pomalejˇs´ı. 100GB, r˚ uzn´e druhy – IDE, SATA, SCSI; nejv´ıc zdrˇzuje pˇr´ıstupov´ a doba (ˇcas seeku) cca 2-10ms; obvykle sektor – 512 B; roli hraje i rychlost ot´ aˇcen´ı (4200 – 15000 RPM) – taky ˇr´ adovˇe ms. • z´ alohovac´ı pamˇet’ — nejpomalejˇs´ı, z teorie nejvˇetˇs´ı, dnes ale neplat´ı; typicky – p´asky; pro vˇetˇs´ı kapacitu – autoloadery ; sekvenˇcn´ı pˇr´ıstup; dnes – kv˚ uli rychlosti ˇcasto z´ alohov´an´ı RAIDem. Spr´ avce pamˇ eti: ˇc´ ast OS, kter´ a spravuje pamˇet’ovou hierarchii se naz´ yv´a spr´ avce pamˇeti (memory manager): • udrˇzuje informace o voln´e/pln´e ˇc´ asti pamˇeti • star´ a se o pˇridˇelov´ an´ı pamˇeti • a v´ ymˇenu pamˇeti s diskem“ ” Pˇ riˇ razen´ı adresy • pˇri pˇrekladu (je jiˇz zn´ amo um´ıstˇen´ı procesu, generuje se absolutn´ı k´od, PS: statick´e linkov´an´ı) • pˇri zav´ adˇen´ı (OS rozhodne o um´ıstˇen´ı – generuje se k´od s relokacemi, PS: dynamick´e linkov´an´ı) • za bˇehu (proces se m˚ uˇze stˇehovat i za bˇehu, relokaˇcn´ı registr) Overlay – Proces potˇrebuje v´ıce pamˇeti neˇz je skuteˇcnˇe k dispozici. Program´ator tedy rozdˇel´ı program na nez´ avisl´e ˇc´ asti (kter´e s v pamˇeti podle potˇreby vymˇen ˇnuj´ı) a ˇc´ ast nezbytnou pro vˇsechny ˇc´asti... Pouˇz´ıv´ano hlavnˇe v DOSu, nyn´ı se stejn´eho c´ıle dosahuje pomoc´ı virtu´ aln´ı pamˇeti V´ ymˇ ena (swapping) – dˇel´ a se, protoˇze proces mus´ı b´ yt v hlavn´ı pamˇeti, aby jeho instrukce mohly b´ yt vykon´ av´ any procesorem... Jde o v´ ymˇenu obsahu pamˇeti mezi hlavn´ı a z´aloˇzn´ı. Pˇ reklad adresy – nutn´ y, protoˇze proces pracuje v logick´em (virtu´aln´ım) adresov´em prostoru, ale HW pracuje s fyzick´ ym adresov´ ym prostorem... Spojit´ e pˇ ridˇ elov´ an´ı pamˇ eti – pˇridˇelen´ı jednoho bloku / v´ıce pamˇetov´ ych odd´ıl˚ u (pevnˇe – pamˇet’ pevnˇe rozdˇelena na ˇc´ asti pro r˚ uzn´e velikosti blok˚ u/volnˇe – v libovoln´e ˇc´ asti voln´e pamˇeti m˚ uˇze b´ yt alokov´an libovolnˇe velik´ y blok) Informace o obsazen´ı pamˇ eti – bitov´ a mapa / spojov´ y seznam voln´ ych blok˚ u (spojov´an´ı uvolnˇen´eho bloku se sousedy) Alokaˇ cn´ı algoritmy: • First-fit – prvn´ı voln´ y dostateˇcn´e velikosti – rychl´ y, obˇcas ale rozdˇel´ı velkou d´ıru • Next-fit – dalˇs´ı voln´ y dostateˇcn´e velikosti, zaˇc´ın´ a se na podledn´ı prohled´avan´e pozici – jako First-fit, ale rychlejˇs´ı • Best-fit – nejmenˇs´ı voln´ y dostateˇcn´e velikosti – pomal´ y (prohled´av´a cel´ y seznam), zanech´av´a malink´e d´ıry (ale nech´ av´ a velk´e d´ıry vcelku) • Worst-fit – nejvˇetˇs´ı voln´ y – pomal´ y (prohled´ av´ a cel´ y seznam), rozdˇel´ı velk´e d´ıry • Buddy syst´em – pamˇet’ rozdˇelena na bloky o velikosti 2n , bloky stejn´e velikosti v seznamu, pˇri pˇridˇelen´ı zaokrouhlit na nejbliˇzˇs´ı 2n , pokud nen´ı voln´ y, rozˇst´ıpnou se vˇetˇs´ı bloky na pˇr´ısluˇsn´e menˇs´ı velikosti, pˇri uvolnˇen´ı pamˇeti se sluˇcuj´ı sousedn´ı bloky (buddy) Fragmentace pamˇ eti: • extern´ı – voln´ y prostor rozdˇelen na mal´e kousky, pravidlo 50% – po nˇejak´e dobˇe bˇehu programu bude cca 50% pamˇeti fragmentov´ ano a u toho to z˚ ust´ av´ a - pl´ ytv´ an´ı m´ıstem mezi alokovan´ ymi oblastmi • intern´ı – nevyuˇzit´ı cel´eho pˇridˇelen´eho prostoru (50% velikosti posledn´ıho bloku prostoru nevyuˇzito) - pl´ ytv´ an´ı m´ıstem uvnitˇr alokovan´e oblasti • sesyp´ an´ı – pouze pˇri pˇriˇrazen´ı adresy za bˇehu, nebo segmentaci – nelze pˇri statick´em pˇridˇelen´ı adresy
97
5.9
Principy virtu´ aln´ı pamˇ eti, str´ ankov´ an´ı, algoritmy pro v´ ymˇ enu str´ anek, v´ ypadek str´ anky, str´ ankovac´ı tabulky, segmentace
Kvalitn´ı popis str´ ankov´ an´ı je tak´e tady – http://wiki.osdev.org/Paging (na t´eˇze str´ance je i popis interruption for dummies – http://wiki.osdev.org/Interrupts) Virtu´ aln´ı pamˇ et’ Virtu´ aln´ı pamˇet’ zp˚ usob spr´ avy operaˇcn´ı pamˇeti poˇc´ıtaˇce, kter´ y umoˇzn ˇuje pˇredloˇzit bˇeˇz´ıc´ımu procesu adresn´ı prostor pamˇeti, kter´ y je uspoˇr´ ad´ an jinak nebo je dokonce vˇetˇs´ı, neˇz je fyzicky pˇripojen´a operaˇcn´ı pamˇet’ RAM. Z tohoto d˚ uvodu procesor rozliˇsuje mezi virtu´aln´ımi adresami (pracuj´ı s nimi strojov´e instrukce, resp. bˇeˇz´ıc´ı proces) a fyzick´ ymi adresami pamˇeti (odkazuj´ı na konkr´etn´ı adresov´e buˇ nky pamˇeti RAM). Pˇrevod mezi virtu´ aln´ı a fyzickou adresou je zajiˇst’ov´an samotn´ ym procesorem v MMU (je nutn´ a hardwarov´ a podpora) nebo samostatn´ ym obvodem. ˇ by to bez HW podpory? Jistˇe ˇze ano VM to tak dˇelaj´ı, nicm´enˇe rychlost nen´ı nijak osˇ Slo nuj´ıc´ı, proto se do novych stroj˚ u uˇz pˇrid´ av´ a jejich HW podpora (?? ovˇeˇrit). • Umoˇzn ˇuje sd´ılen´ı pamˇeti (operaˇcn´ım syst´emem) • Vz´ ajemn´ a ochrana program˚ u (v souˇcasnosti je d˚ uleˇzitˇejˇs´ı ochrana dat neˇz vyuˇzit´ı principu lokalit), tzn. to aby jeden program nepˇrepisoval druh´emu programu jeho data a tak. • Kaˇzd´ y bˇeˇz´ıc´ı program pracuje se sv´ ym virtu´ aln´ım adresn´ım prostorem
Obr´azek 10: Virtu´aln´ı pamˇet’
Existuj´ı dvˇe z´ akladn´ı metody implementace virtu´ aln´ı pamˇeti – str´ankov´an´ı a segmentace. Str´ ankov´ an´ı Pˇri str´ ankov´ an´ı je pamˇet’ rozdˇelena na vˇetˇs´ı u ´seky stejn´e velikosti, kter´e se naz´ yvaj´ı str´anky. Spr´ava virtu´aln´ı pamˇeti rozhoduje samostatnˇe o tom, kter´ a pamˇet’ov´ a str´ anka bude zavedena do vnitˇrn´ı pamˇeti a kter´a bude odloˇzena do odkl´adac´ıho prostoru (swapu). Podporovan´e vˇsemi velk´ ymi CPU a OS, jednorozmˇern´ y VAP (virtu´aln´ı adresn´ı prostor). • VAP rozdˇelen na str´ anky (velikost je mocnina 2), FAP na r´amce (´ useky stejn´e d´elky) • pˇ revod str´ ankovac´ı tabulkou - kaˇzd´ y proces m´a svoj´ı, pˇr´ıznak existence mapov´an´ı (v.str´anka nen´ı v FAP → ud´ alost ”v´ ypadek str´ anky”→ synchronn´ı pˇreruˇsen´ı) um´ıstˇena v fyzick´e pamˇeti
• umoˇznuje oddˇelen´e VAP i sd´ılenou pamˇet’ - mapov´an´ı virtu´aln´ı str´anky 2 proces˚ u na jednu fyzickou • OS mˇen´ı tabulky str´ anek zmˇenou PTBR (Page Table Base Register) - PTBR obsahuje b´azovou adresu tabulky str´ anek procesu • Pˇr´ıklad: poloˇzka str´ ankovac´ı tabulky Intel IA32 (= x86) → jej´ı struktura je z´avisl´a na architektuˇre CPU
• v´ıce´ urovˇ nov´ e str´ ankov´ an´ı (napˇr. kv˚ uli velikosti - jedna tabulka je uˇz moc velk´a =>pomal´a)
98
• TLB (Translation Lookaside Buffer) - asociativn´ı pamˇet’ slouˇz´ıc´ı na rychl´e mapov´an´ı virtu´aln´ı str´anky na fyzickou, vyhled´ av´ a se v n´ı paralelnˇe, typicky ma 128-256 poloˇzek, vyuˇz´ıv´a princip prostorov´e lokality program˚ u (vˇetˇsina program˚ u prov´ ad´ı velk´ y poˇcet pˇr´ıstup˚ u k mal´emu poˇctu str´anek) um´ıstˇeva vˇetˇsinou v L1 nebo L2 cache na procesoru
...0-´ urovˇ nov´ e str´ ankov´ an´ı - procesor hled´ a pouze TLB, zbytek ˇreˇs´ı OS (obl´ıben´e u 64-bitov´ ych CPU - UltraSPARC III) • inverzn´ı str´ ankov´ an´ı (napˇr. kdyˇz FAP je menˇs´ı neˇz VAP, 64-bitov´e CPU - IA-64 = UtraSPARC, PowerPC) - inverzn´ı str´ ankovac´ı tabulka (IPT) nad r´ amci (nikoliv str´ ankami) spoleˇcn´a pro vˇsechny procesy, pro vyhled´av´an´ı se pouˇz´ıv´ a hashovac´ı tabulka
Akce vykon´ avan´ e pˇ ri v´ ypadku str´ anky: • • • • • • • • • •
v´ yjimka procesoru uloˇzit stav CPU (kontext) zjistit VA kontrola platnosti adresy a pr´ av nalezen´ı vhodn´eho r´ amce zruˇsit mapov´ an´ı na nalezen´ y r´ amec pokud je vyhazovan´ y r´ amec vyhazov´ an, spustit ukl´ad´an´ı na disk naˇc´ıst z disku poˇzadovanou str´ anku do r´ amce zav´est mapov´ an´ı obnovit kontext
Pˇ ri implementaci str´ ankov´ an´ı je nutno brat v u ´ vahu: • znovuspuˇstˇen´ı instrukce — je potˇreba aby procesor po v´ ypadku zkusil pˇr´ıstup do pamˇeti znova. dnes um´ı vˇsechny CPU, napˇr. 68xxx - probl´emy (pˇreruˇsen´ı v p˚ ulce instrukce) • sd´ılen´ı str´ anek — jednomu r´ amci odp. v´ıc str´ anek → pokud s n´ım nˇeco dˇel´am, t´ yk´a se to vˇsech str´anek! mus´ım vˇse ost. odmapovat. mus´ım si pamatovat mapov´ an´ı pro kaˇzd´ y r´amec - obr´acen´e tabulky. • velikost str´ anek – velk´e str´ anky → fragmentace 99
– mal´e str´ anky → mnoho registr˚ u, zvyˇsuje cenu v´ ypoˇct˚ u a zpomaluje chod – optimum 1-4kB17 • odstranˇen´ı poloˇzky z TLB pˇri ruˇsen´ı mapov´ an´ı — nestaˇc´ı zmˇenit tabulky, mus´ı se vyhodit i z TLB (kde to m˚ uˇze, ale nemus´ı b´ yt). probl´em - u multiprocesor˚ u m´ a kaˇzd´a CPU vlastn´ı TLB, tabulky jsou sd´ılen´e → CPU pˇri ruˇsen´ı mapov´ an´ı mus´ı poslat interrupt s rozkazem ke smaz´ an´ı vˇsem (i sobˇe), poˇckat na potvrzen´ı akce od vˇsech. Pˇ r´ıklad Uvaˇzujte procesor, kter´ y podporuje str´ ankovani, m´a dvou´ urovnove str´ankovaci tabulky, velikost virtu´aln´ı i fyzick´e adresy 32 bitu, velikost str´ anky 4 kB. Nakreslete form´ at strankovac´ı tabulky (poloˇzky potˇrebn´e pro pˇreklad adresy i typick´e dalˇs´ı pˇr´ıznakov´e bity, nezadan´e detaily rozumne zvolte) a v nem ilustrujte, jak se prelozi virtu´alni adresa 12345678h (nezadan´e konstanty tvoric´ı konkr´etn´ı obsah tabulky opet rozumne zvolte). Pozn.: h nakonci znamen´a ˇze je ˇc´ıslo v hex (assembler)
Algoritmy pro v´ ymˇ enu str´ anek (v´ ybˇ er obˇ eti) • Optim´ aln´ı str´ anka (v okamˇziku v´ ypadku str´ anky vyb´ır´am str´anku, na n´ıˇz se pˇristoup´ı za nejvˇetˇs´ı poˇcet instrukc´ı) - nelze implementovat a str´ anka m´ a pˇr´ıznaky Accessed a Dirty (typicky implementovateln´e v HW, moˇzno • NRU (Not Recently Used) - kaˇzd´ simulovat SW); jednou za ˇcas se smaˇzou vˇsechna A; pˇri v´ ypadku rozdˇel´ım str´anky podle A,D a vyberu str´anku z nejniˇzˇs´ı (0,1..4) nepr´ azdn´e tˇr´ıdy: 0 1 2 3
A 0 0 1 1
D 0 1 0 1
• FIFO - vyhodit nejd´ele namapovanou str´ anku - vykazuje anom´alie - Belady (zvˇetˇsen´ı poˇctu v´ ypadk˚ u str´anky, kdyˇz zv´ yˇs´ıme poˇcet str´ anek v pamˇeti), druh´ a ˇsance (´ uprava FIFO; pokud A=1, zaˇrad´ım na konec FIFO... nevykazuje anom´ alie) • Hodiny - modifikace druh´e ˇsance: kruhov´ y zoznam str´anek + iter´ator na ukazuj´ıc´ı na nejstarˇs´ı str´anku v zoznamu. Pˇri v´ ypadku (a neexistenci vol´eho r´ amce) se zjist´ı, jestli m´a *iterator nastaven´ y pˇr´ıznak Accessed. Jestli ne, tato str´ anka bude nahrazena - v opaˇcn´em pˇr´ıpadˇe se Accessed pˇr´ıznak zruˇs´ı a iterator++. Toto se opakuje, dokud nedojde k v´ ymˇenˇe. . . • LRU (Least Recently Used) - ˇcasto pouˇz´ıvan´e str´anky v posledn´ım kr´atk´em ˇcasov´em u ´ˇseku budou znovu pouˇzity, ˇc´ıtaˇc pouˇzit´ı str´ anek, moˇzn´e implementovat v HW • NFU (Not Frequently Used) - SW simulace LRU, SW ˇc´ıtaˇc ke kaˇzd´e str´ance; jednou za ˇcas projdu vˇsechna A a pˇriˇctu je k odpov´ıdaj´ıc´ım ˇc´ıtaˇc˚ um; vyb´ır´ am str´ anku s nejniˇzˇs´ım ˇc´ıtaˇcem; nezapom´ın´a - je moˇzn´a modifikace se st´arnut´ım ˇc´ıtaˇce Segmentace (uˇ z nen´ı v poˇ zadavc´ıch!!!) dnes pouze Intel IA-32, dvojrozmˇern´ y VAP • rozdˇelen´ı programu na segmenty (napr. podle ˇc´ ast´ı s r˚ uzn´ ymi vlastnostmi - k´od, data, z´asobn´ıky. . . ), r˚ uzn´e d´elky segment˚ u, ktor´e m˚ uˇzou mˇenit svoji d´elku za bˇehu • VAP dvourozmˇern´ y (segment, offset), FAP jednorozmˇern´ y (vyzer´a jako pˇri spojit´em pridˇelov´an´ı pamˇeti) • segmentov´ a pˇrevodn´ı tabulka (VA se skl´ ad´ a ze dvou ˇcast´ı S:D, v tabulce se najde adresa segmentu S. . . k t´eto adrese se pot´e pˇriˇcte D, co je um´ıstnˇen´ı adresy v FA), pˇr´ıznak existence mapov´an´ı • pˇri v´ ypadku je nutn´e mˇenit cel´ y segment (ty mohou b´ yt velk´e), je moˇzn´e segmenty sesypat - ale nelze m´ıt segment vˇetˇs´ı neˇz FAP Segmentaci je moˇzn´e kombinovat se str´ ankov´ an´ım (odstraˇ nuje nev´ yhody segmentace, neprov´ad´ı se v´ ypadky segment˚ u):
17 4kB se pouˇ z´ıvaj´ı kvuli jednoduch´ emu pˇrevodu na fyzickou adresu pomoc´ı substituce (DRAM mely temer vzdy na cipu N ˇr´ adku x 4096 sloupcu), 64bit procesory umoˇ zn ˇuj´ı pagesize aˇ z 1GB - doporucuju precist http://www.gamedeception.net/threads/212-The-Importance-of-the-4KB-Page-Boundary
100
Report (Bedn´ arek) Tˇreba mˇe pˇrekvapila Bedn´ akova ot´ azka u jedno´ urovˇ nov´yho str´ ankov´ an´ı, kdyˇz se zeptal, co z toho dˇel´ a OS a co procesor (jako co je dˇel´ ano hardwareovˇe a co softwareovˇe). Report (Bulej) Strankovaci tabulku ma kazdy proces vlastni -¿ ochrana pameti, nemuze pristoupit na cizi stranky (mozna ze to v materialech ke statnicim je, ale ja to z nich nepochopil...) Report (Skopal) Nejdriv jsem popsal k cemu to je a potom princip. Chtel popsat postup toho co se deje, kdyz se hleda nejaky pointer. Co dela HW, co OS. Pak se zeptal jestli by slo udelat strankovani bez HW podpory (coz rozumne nejde, muselo by se to resit i v prekladacich a bylo by to nefektivni). Pak se zeptal na algoritmy vyhazovani stranek. Popsal jsem FIFO a NRU a to mu stacilo. Na segmentaci nastesti nedoslo. Celkove velmi prijemne zkouseni. V zasade se spokojil s principy a nestoural moc do detailu. Report (Kofron) klasika, preˇco, kde, ako ... preˇco to funguje, ˇco sa rob´ı pri v´ypadku str´ anky, preˇco dve inˇstancie jedn´eho programu nelez´ u do kapusty aj ked’ pracuj´ u s rovnak´ymi virtu´ alnymi adresami (kaˇzd´y m´ a vlastn´ u str. tabul’ku), tvar adresy, prevody... kaˇzd´y proces m´ a vlastn´ı tabulku, jej´ı adresa v registru Report (IOI 21. 6. 2011) Dan´y procesor pouˇz´ıv´ a 32-bitovou architekturu a dvou´ urovˇ nov´e str´ ankov´ an´ı. Instrukce MOV[0x12345678], EAX zapisuje obsah registru EAX na adresu 0x12345678. Popiˇste, jak´ a operace (pˇr´ıstupy do registr˚ u a podobnˇe) vykon´ av´ a pˇri prov´ adˇen´ı t´eto instrukce procesor a jak pˇri tom spolupracuje operaˇcn´ı syst´em. Rozeberte vˇsechny moˇzn´e (z hlediska naplnˇen´ı str´ ankovac´ıch tabulek) pˇr´ıpady, nepopisujte strategie v´ymˇeny str´ anek. ˇ sen´ı: (od stevese) Reˇ pokud tomu trochu v´ıc rozum´ıˇs, tak za t´ım, stejnˇe jako j´a, hled´aˇs sloˇzitˇejˇs´ı ot´azku neˇz ve skuteˇcnosti je :-) Nap´ıˇsu to v bodech (ve skuteˇcnosti jsem to rozepisoval trochu v´ıc.). - procesor se pod´ıv´ a na registr PC, vyzvedne dalˇs´ı instrukci (tzv. fetch f´aze) - instrukce je dek´ odov´ ana v ˇradiˇci (tzv. decode f´ aze) - ˇradiˇc podle k´ odu instrukce nastav´ı vodiˇce na datov´e cestˇe - vykon´ av´ a se instrukce - registr PC += velikost instrukce - goto 1 bˇehem toho, kdykoliv se pˇristupuje do pamˇeti, m˚ uˇze vzniknout page-fault (naˇc´ıt´an´ı instrukce a potom ta adresa u instr. ˇ je typicky v´ıce´ mov). U toho jsem popsal jak str´ ankov´ an´ı funguje. Ze urovˇ nov´e, nejvyˇsˇs´ı u ´roveˇ n v nˇejak´em registru nebo ˇ minim´ alnˇe nemapovan´e pamˇeti. Ze pˇri pˇr´ıstupu str. tabulku dalˇs´ı u ´rovnˇe m˚ uˇze vzniknout dalˇs´ı page-fault, co to je TLB atd. atd. A k t´ y komunikaci s OS: kdyˇz vznikne page-fault je vyvolan´e pˇreruˇsen´ı a obsluha je pˇredan´a obsluˇzn´e rutinnˇe OS. Nˇekter´ y procesory to dˇelaj´ı u page-faultu ve str´ ankovac´ı tabulce (x86 mysl´ım), nˇekter´ y uˇz u page-faultu v TLB (urˇcitˇe MIPS) – takˇze si potom OS m˚ uˇze vyb´ırat, jak mˇenit str´ anky v samotn´e TLB. Samotn´eho mˇe zrovna tyhle vˇeci zaj´ımaj´ı, takˇze jsem si pˇred st´atnicema pˇreˇcetl Tanenbauma: Operating Systems a Pattersona: Computers Design: Hardware to software interface. Je to urˇcitˇe overkill, ale pokud budeˇs m´ıt prolistovan´ y tyhle dvˇe knihy, tak tˇe tam imho t´emˇeˇr urˇcitˇe nic nem˚ uˇze pˇrekvapit. Report (Yaghob) mel ruzn´e dotazy, jako proc je str´ anka velik´ a zrovna 4kB, jak je to se str´ ankov´ an´ım na 64-bitov´ych procesorech
101
5.10
Syst´ emy soubor˚ u, adres´ aˇ rov´ e struktury
Definice (soubor) Soubor je pojmenovan´ a mnoˇzina souvisej´ıc´ıch informac´ı, kter´a leˇz´ı v pomocn´e pamˇeti (na disku). Soubor je abstrakce, kter´ a umoˇzn ˇuje uloˇzit informaci na disk a pozdˇeji ji pˇreˇc´ıst. Abstrakce odstiˇ nuje uˇzivatele od podrobnost´ı pr´ ace s disky. Soubory • pojmenov´ an´ı souboru (umoˇzn ˇuje uˇzivateli pˇr´ıstup k jeho dat˚ um; pˇresn´a pravidla pojmenov´an´ı urˇcuje OS - mal´ a vs. velk´ a p´ısmenka, speci´ aln´ı znaky, d´elka jm´ena, pˇr´ıpony a jejich v´ yznam) • atributy soubor˚ u (opˇet urˇcuje OS) - jm´eno, typ, um´ıstˇen´ı, velikost, ochrana, ˇcasy, vlastn´ık, . . . • struktura soubor˚ u - sekvence bajt˚ u / sekvence z´ aznam˚ u / strom • typy soubor˚ u - bˇeˇzn´e soubory, adres´ aˇre (syst´emov´e soubory vytv´aˇrej´ıc´ı strukturu souborov´eho syst´emu), speci´ aln´ı soubory (znakov´e/blokov´e, soft linky) • pˇr´ıstup – sekvenˇ cn´ı – pohyb pouze vpˇred, OS m˚ uˇze pˇrednaˇc´ıtat – n´ ahodn´ y – moˇzno mˇenit aktu´ aln´ı pozici – pamˇ et’ovˇ e mapovan´ e soubory – pojmenovan´a virtu´aln´ı pamˇet’, pr´ace se souborem instrukcemi pro pr´ aci s pamˇet´ı, uˇsetˇr´ı se kop´ırov´ an´ı pamˇet´ı; maj´ı i probl´emy (pˇresn´a velikost souboru, zvˇetˇsov´an´ı souboru, velikost soubor˚ u) • voln´e m´ısto na disku - bitmapa / spojov´ y seznam voln´ ych blok˚ u Uloˇ zen´ı soubor˚ u Soubory se ukl´ adaj´ı na disk po bloc´ıch • souvisl´ a alokace - souvisl´ y sled blok˚ u • spojovan´ a alokace - blok odkazuje na dalˇs´ı • indexov´ a alokace - inode (UNIX) Adres´ aˇ re • • • •
zvl´ aˇstn´ı typ souboru operace nad adres´ aˇri - hled´ an´ı souboru / vyps´ an´ı adres´aˇre / pˇrejmenov´an´ı, vytvoˇren´ı, smaz´an´ı souboru koˇren, aktu´ aln´ı adres´ aˇr, absolutn´ı/relativn´ı cesta hierarchick´ a struktura – strom – jednoznaˇcn´e pojmenov´ an´ı (cesta) – DAG – v´ıceznaˇcn´e pojmenov´ an´ı, ale nejsou cykly – obecn´y graf – cykly vytv´ aˇr´ı probl´em pˇri prohled´av´an´ı
• implementace adres´ aˇr˚ u - z´ aznamy pevn´e velikosti, spojov´ y seznam, B-stromy Co mus´ı filesyst´ em umˇ et? mus´ı splˇ novat 3 vˇeci: spr´ avu soubor˚ u (kde jsou, jak velk´e), spr´ avu adres´ aˇr˚ u (pˇrevod jm´eno ↔ id) (nˇekdy to dˇel´a jin´ y prostˇredek, dnes vˇetˇs. um´ı FS s´ am), spr´ avu voln´eho m´ısta. nˇekdy mohou b´ yt i dalˇs´ı (odolnost proti v´ ypadk˚ um) Velikost blok˚ u – blok = nejmenˇs´ı jednotka pro pr´aci s diskem; disk pracuje s min. 1 sektorem (typicky 512 B) - nˇekdy by pak bylo moc blok˚ u → OS sdruˇz´ı nˇekolik sektor˚ u line´anˇe vedle sebe = 1 blok. velikost: velk´e = rychlejˇs´ı pr´ace, ale vnitˇrn´ı fragmentace (pr˚ umˇern´ y soubor m´ a cca p´ ar KB), mal´e = mal´a vnitˇrn´ı fragmentace, vˇetˇs´ı reˇzie na info o voln´em m´ıstˇe/ um´ıstˇen´ı souboru (zab´ır´ a v´ıc blok˚ u!), nav´ıc fragmentace soubor˚ u → zpomalen´ı. dnes m´a blok cca 2-4KB. Linky • Hard link – Na jedna data souboru se odkazuje z r˚ uzn´ ych poloˇzek v adres´aˇr´ıch (na urovni FS) • Soft link – Speci´ aln´ı soubor, kter´ y obsahuje jm´eno souboru (na urovni OS) MBR A master boot record (MBR) is a type of boot sector. It consists of a sequence of 512 bytes located at the first sector of a data storage device such as a hard disk. May be used for one or more of the following: • Holding a partition table which describes the partitions of a storage device. In this context the boot sector may also be known as a partition sector. • Bootstrapping an operating system. The BIOS built into a PC-compatible computer loads the MBR from the storage device and passes execution to machine code instructions at the beginning of the MBR. • Uniquely identifying individual disk media, with a 32-bit disk signature, even though it may never be used by the operating system.
102
FAT • System souboru FAT rozdeluje disk na dve vyznacne casti - samotnou tabulku FAT (ta je zpravidla ve dvou kopiich) a datovou oblast. Datova oblast je rozdelena na clustery (napriklad po 4096 bajtech) a FAT tabulka ma tolik polozek, kolik ma datova oblast clusteru (1:1). • FAT tabulka – obsahuje ˇcislo dalsiho clusteru v ˇradˇe + speci´aln´ı z´aznamy (oznaˇcen´ı end of clusterchain, bad cluster, reserved cluster a free cluster) • Alokace souboru – spojovan´ a, kˇzd´ y blok ukazuje na dalˇs´ı pˇres FAT tabulku
• •
• •
• •
• •
- Kdyz je nejaky cluster volny, v prislusne polozce FAT je 0. Tedy kdyz chci najit volne misto, tak staci najit libovolnou polozku FAT, ktera je 0, odpovidajici cluster pak je volny. Adresare i soubory jsou ulozeny stejne. Rozdily mezi adresari a soubory (krom daneho atributu) neexistuji. Z hlediska ulozeni na disku je adresar proste soubor, jehoz obsahem jsou adresarove polozky. Vyjimka viz root adresar. Root adres´ aˇ r – V root adresari, i ve vsech ostatnich adresarich, jsou proste jen za sebou ulozeny polozky. Kazda polozka obsahuje jmeno souboru nebo adresare, ke kteremu se vztahuje, atributy rozlisujici napriklad prave adresare od souboru, delku, prvni cluster, atd. - Root directory ma pevnou velikost ve FAT 12/16 - Polozky root adresare, ktere nejsou pouzite, jsou oznacene jako prazdne (ale porad patri do root adresare, aby velikost zustala konstantni). Pridani pak pouzije nekterou prazdnou polozku. Pokud jsou jiz vsechny polozky plne, dalsi nelze pridat. Vyhled´ av´ an´ı souboru – Postupne ... v root adresari se najde prvni podadresar cesty, v nem se najde druhy a tak dale. (tzn. line´ arn´ı struktura) Adresarova struktura je ulozena prave v jednotlivych adresarich. Napriklad, pokud je na disku soubor FOO BAR SOUBOR.TXT, tak v korenovem adresari bude polozka FOO s atributem indikujicim, ze se jedna o adresar a s cislem prvniho clusteru adresare FOO, rekneme ze 123. V clusteru 123 pak budou polozky adresare FOO, mezi nimi bude podobne polozka BAR pro adresar BAR a cislem prvniho clusteru adresare BAR, rekneme 456. A v clusteru 456 budou polozky adresare BAR, mezi kterymi bude i polozka SOUBOR.TXT ... dnes se ni setkame jeˇstˇe na flashk´ ach a pamˇet’ov´ ych kart´ach nevyhody FAT: - velikost souboru max 4 GB - svazky - FAT32 re´ alnˇe okolo 8TB (32kB clustery), nem´a ale ochranu proti fragmentaci - pr´ ava - None of the various FAT-flavours has facilities for user-based access restrictions. https://d3s.mff.cuni.cz/pipermail/osy/2005-June/000167.html http://en.wikipedia.org/wiki/File\_Allocation\_Table
NTFS • Zase rozdˇeluje odd´ıl na dvˇe ˇc´ asti tabulka MFT (jako soubor, ma ale pˇriˇrazenou pr´azdnou oblast aby se pˇri r˚ ustu nefragmentovala) a datovou oblast. • Metafiles - prvn´ıch cca 16 souboru jsou tzv. Metafiles, kaˇzd´ y se star´a o nˇeco ⇒ flexibilita napˇr. pri poskozenem povrchu pˇr´ıklady souboru: $MFT,$MFTmirr(MFT a zalozni kopie uprostred disku),$LogFile (zurnalovaci soubor),$. (root directory),$Bitmap (bitove pole volneho mista) atd... ˇ • Zurn´ al – Operace s diskem se provadeji jako Transakce, takˇze napˇr. pokud pri zapisu souboru FS zjisti ze cluster je fyz. vadn´ y, celou trasakci rollbackuje a pusti ji jinde znovu. • Dalˇs´ı vlastnosti ktere ma navic: sifrovani, komprese, hardlinky (soubor je fyz. na disku jednou a ma vic zaznamu v MFT) • MFT tabulka – obdoba FAT, vsechna metadata o souborech (jmeno,datum,prava) jsou ulozena v MFT - omoznuje pridavat ficury, muze obsahovat primo i male soubory nebo odkaz na clustery (vˇsechny) • Vnitˇrn´ı struktura adres´ aˇre se realizuje B+Stromem (lexikograficky setrideny) zase pokud je malej zustane v MFT pokud je vetsi je v clusteru a v MFT je jenom koˇrenov´ a ˇc´ast B+Stromu.
103
• • • • •
http://pages.cs.wisc.edu/~bart/537/lecturenotes/s26.html http://www.digit-life.com/articles/ntfs/ http://www.pcguide.com/ref/hdd/file/ntfs/archSector-c.html http://cs.wikipedia.org/wiki/NTFS http://ixbtlabs.com/articles/ntfs/
ext2 • Prostor je u ext2 rozdˇelen do blok˚ u, ty jsou rozdˇeleny do skupin (Block Groups) typicky jeden soubor se drˇz´ı v jedn´e skupinˇe (redukce fragmentace). Kaˇzd´ a skupina obsahuje kopii superbloku (obsahuje kritick´e informace pro boot systemu) bitmapu blok˚ u, inodes, Inode tabulku a nakonec datov´e bloky.
• inode – kaˇzd´ y soubor nebo sloˇzka je reprezentov´ ana jako inode (v inode tabulce), obsahuje pr´ava, velikost a hlavnˇe pointery na datov´e bloky (12pointer˚ u na pˇr´ım´ y odkaz a dalˇs´ı na stromovou strukturu), sloˇzky obsahuj´ı list inodes kter´e obsahuj´ı
• • • • •
Proc se porad pouziva - kv˚ uli rychlosti ˇ Zurn´ alov´ an´ı zavedeno u ext3 http://homepage.smc.edu/morgan\_david/cs40/analyze-ext2.htm http://www.science.unitn.it/~fiorella/guidelinux/tlk/node95.html http://www.linux-security.cn/ebooks/ulk3-html/0596005652/understandlk-CHP-18.html
Pl´ anov´ an´ı pohybu hlav disk˚ u • FCFS (First-Come, First-Served) - ˇz´ adn´e pl´ anov´an´ı, fronta poˇzadavk˚ u, jeden za druh´ ym • SSTF (Shortest Seek Time First) - krajn´ı ˇz´ adosti mohou ”hladovˇet” • LOOK (v´ ytah), C-LOOK (circular LOOK) - pohyb jen jedn´ım smˇerem, na konci otoˇcka
104
RAID (Redundant Array of Inexpensive Disks) • • • • • • • • •
JBOD (Just a Bunch of Disks) RAID 0 – striping, ˇz´ adn´ a redundance RAID 1 – mirroring, redundance RAID 0+1 – mirroring a striping RAID 2 – 7-bitov´ y paritn´ı Hamming˚ uv k´ od RAID 3 – 1 paritn´ı disk, po bitech na disky RAID 4 – 1 paritn´ı disk a striping RAID 5 – distribuovan´ a parita a striping RAID 6 – distribuovan´ a parita – dvojit´ a P+Q, striping
Report (Galamboˇs) inode Report (Galamboˇs) Konkretni soubory system NTFS - tady jsem popletl jak vlastne pracuje FATka, o NTFS jsem mel tak jako povesechne informace, proste nic moc jsem nevedel, ale zase jsme si popovidali, byly mi vysvetleny me omyly a nakonec oka. Jinak je pravda, ze toho chce docela hodne a dopodrobna, ale kdyz clovek rekne, ze proste k tomuhle vic nesehnal a ze podrobnosti proste nevi, pobavi se o tom s Vami a vetsinou se to da dokupy. Report (Skopal) Zkouˇsel s´ am p. Skopal a jelikoˇz jsem se FS uˇcil jako jednu z prvn´ıch ot´ azek, v n´ avalu dalˇs´ıch informac´ı jsem toho mezit´ım dost zapomnˇel. Popsal jsem jeden a p˚ ul strany obecn´ymi vlastnostmi FS, co to je soubor, adres´ aˇr atd. Popsal jsem FAT, NTFS a ext2, a to dost struˇcnˇe. Obecn´e vlastnosti ho nezaj´ımaly, hned pˇreˇsel k FAT a jej´ım nev´yhod´ am, ot´ azky byly rychl´e a dost podrobn´e, bylo vidˇet, ˇze to se mnou nebude m´ıt jednoduch´e. Pak mˇel ot´ azky na NTFS, co m´ a za spec. soubory, kdeˇze je v syst´emu implementov´ an B-strom atd. K ext2 jsme se nedostali aˇz na jedinou zm´ınku, a to je alokace soubor˚ u (ve FAT line´ arn´ı struktura, v ext2 strom). Kdyˇz poloˇzil ot´ azku na B-stromy v NTFS a po moj´ı tˇeˇzce nejist´e odpovˇedi prohl´ asil, ˇze mu to staˇc´ı a odeˇsel, bylo mi jasn´e, ˇze tohle nedopadne dobˇre. Report (Yaghob) Konkretni Filesystemy - no jeste pred dvema dny by to byla moje smrt, nastesti sem se na to vcera zameril a nasel si opravdu presne jak funguje FAT, NTFS a ext2. Nakonec z toho byly tri papiry, az jsem na sebe byl pysny U FAT bylo treba napsat, jak se to alokuje, jak vypada ta tabulka, jakou roli ma kor. adresar, jak jsou tam ulozeny adresare, soubory apod. U NTFS jsem popsal vlastnosti ktere to ma navic, jako zurnal, sifrovani a pak rozepsal MFT docela podrobne, zase jak se resi soubory, adresare. Veci jako jak jsou tam ulozeny jednotlivy volume, MBR atd po me nastesti nechtel U ext2 je asi dulezite pochopit jak ten inode funguje, jak je to tam ve skupinach bloku, co je to superblok. Prislo mi, ze hlavni duraz je kladeny na to, at se vi, jak jsou tam ulozeny adresare a soubory. Pak prislo par otazek typu, jake jsou omezeni FATky, (velikost souboru, partitiony, ale hlavne se po me chtelo slyset: prava), kde se s tim dnes setkame (flashky, pametove karty) - na ty jsem dosel po vyjmenovani win98, mobilu, zkusil jsem i routery a ind. pocitace a nakonec me uspesne dovedl ke spravne odpovedi U ext2 prislo, proc se to porad jeste pouziva,kdyz je to tak stary FS - jedine co me napadlo byla rychlost - spravne
105
5.11
Bezpeˇ cnost, autentizace, autorizace, pˇ r´ıstupov´ a pr´ ava
(z pˇredn´ aˇsek ZOS(Yaghob) a OI1(Beneˇs)) Definice • • • • •
Ochrana – s prostˇredky OS mohou pracovat pouze autorizovan´e procesy Autorizace – zjiˇstˇen´ı opr´ avnˇenosti poˇzadavku Bezpeˇ cnost – zabraˇ nuje neautorizovan´ y pˇr´ıstup do syst´emu Pˇ ristupov´ e pr´ avo – povolen´ı/zak´ az´ an´ı vykon´ avat nˇejakou operaci Dom´ ena ochrany – uchov´ an´ an´ı autorizac´ı, mnoˇzina p´ar˚ u (objekt:pr´ava) – ACL (Access Control List) – ke kaˇzd´emu objektu seznam pr´av pro uˇzivatele/skupiny – C-list (Capability List) – ke kaˇzd´emu uˇzivateli/skupinˇe seznam pr´av pro objekty – ACM (Access Control Matrix) – ˇr´ adky matice odpov´ıdaj´ı uˇzivatel˚ um, sloupce objekt˚ um. V pol´ıˇcku dan´em ˇr´ adkem a sloupcem je z´ aznam o u ´rovni opr´ avnˇen´ı odpov´ıdaj´ıc´ıho uˇzivatele k pˇr´ısluˇsn´emu objektu. Pˇr´ıstupov´ a matice je zpravidla velmi velk´ a z´ aleˇzitost, zhusta ˇr´ıdk´a.
Obr´ azek 11: Dom´eny ochrany
Bezpeˇ cnost Bezpeˇ cnostn´ı modely obecnˇ e Prvn´ı f´ az´ı tvorby bezpeˇcn´eho IS je volba vhodn´eho bezpeˇcnostn´ıho modelu. Z´akladn´ı poˇzadavky bezpeˇcnosti: utajen´ı, integrita, dostupnost, anonymita. Pˇredpokl´ adejme, ˇze um´ıme rozhodnout, zda dan´emu subjektu poskytnout pˇr´ıstup k poˇzadovan´emu objektu. Modely poskytuj´ı pouze mechanismus pro rozhodov´an´ı! • Jedno´ urovˇ nov´ e modely jsou vhodn´e pro pˇr´ıpady, kdy staˇc´ı jednoduch´e ano/ne rozhodov´an´ı, zda dan´emu subjektu poskytnout pˇr´ıstup k poˇzadovan´emu objektu a nen´ı nutn´e pracovat s klasifikac´ı dat. • V´ıce´ urovˇ nov´ e modely - M˚ uˇze existovat nˇekolik stupˇ n˚ u senzitivity a ”opr´avnˇenosti”. Tyto stupnˇe senzitivity se daj´ı pouˇz´ıt k algoritmick´emu rozhodov´ an´ı o pˇr´ıstupu dan´eho subjektu k c´ılov´emu objektu, ale tak´e k ˇr´ızen´ı zach´azen´ı s objekty. V´ıce´ urovˇ nov´ y syst´em ”rozum´ı”senzitivitˇe dat a ch´ape, ˇze s nimi mus´ı zach´azet v souladu s poˇzadavky kladen´ ymi na dan´ y stupeˇ n senzitivity. Rozhodnut´ı o pˇr´ıstupu pak nezahrnuje pouze provˇeˇren´ı ˇzadatele, ale t´eˇz klasifikaci prostˇred´ı, ze kter´eho je pˇr´ıstup poˇzadov´ an. Bezpeˇ cnost fyzick´ e pˇ renosov´ e vrstvy Bezpeˇcnost je do urˇcit´e m´ıry z´ avisl´ a na pouˇzit´em pˇrenosov´em m´ediu. u ´tok proti komunikaˇcn´ım link´am m˚ uˇze b´ yt pasivn´ı (pouze odposlech), nebo ak- tivn´ı (vkl´ ad´ an´ı dalˇs´ıch informac´ı do komunikace). V´ıce˚ urovˇ nov´ a bezpeˇ cnost v DB18 • partitioning - Datab´ aze je rozdˇelena dle stupnˇe citlivosti informac´ı na nˇekolik subdatab´az´ı, coˇz vede ke zv´ yˇsen´ı redundance s n´ aslednou zt´ıˇzenou aktualizac´ı a neˇreˇs´ı probl´em nutnosti souˇcasn´eho pˇr´ıstupu k objekt˚ um s r˚ uzn´ ym stupnˇem utajen´ı. • ˇ sifrov´ an´ı - Senzitivn´ı data jsou chr´ anˇena ˇsifrov´ an´ım pˇred n´ahodn´ ym vyzrazen´ım. Zn´a-li u ´toˇcn´ık dom´enu dan´eho atributu, m˚ uˇze snadno prov´est chosen plaintext attack (utocnik muze ukladat plaintexty podle sveho vyberu a prohlizet si ciphertexty). Tˇeˇzko totiˇz nˇekoho zbav´ıme znalosti ˇsifrovac´ıho kl´ıˇce. ˇreˇsen´ım je pouˇz´ıvat jin´ y kl´ıˇc pro kaˇzd´ y z´aznam, coˇz je vˇsak pomˇernˇe n´ aroˇcn´e. V kaˇzd´em pˇr´ıpadˇe nutnost neust´al´eho deˇsifrov´an´ı sniˇzuje v´ ykon syst´emu. • Integrity lock - Kaˇzd´ a poloˇzka v datab´ azi se skl´ad´a ze tˇr´ı ˇc´ast´ı: < vlastnidata : klasif ikace : checksum >. Vlastn´ı data jsou uloˇzena v otevˇren´e formˇe. Klasifikace mus´ı b´ yt nepadˇelateln´a, nepˇrenositeln´a a skryt´a, tak aby ˚ utoˇcn´ık nemohl vytvoˇrit, okop´ırovat ani zjistit klasifikaci dan´eho objektu. Checksum zajiˇst’uje sv´az´an´ı klasifikace s daty a integritu vlastn´ıch ˇ dat. Model byl navrˇzen jako doplnˇek (access controller) komerˇcn´ıho SRBD, kter´ y mˇel zajistit bezpeˇcnost cel´eho syst´emu. ˇsed´ a oblast na obr´ azku vyznaˇcuje bezpeˇcnostn´ı perimetr syst´emu. Access controller nevid´ı na v´ ystup datab´ aze a nen´ı schopen zajistit, na v´ ystupu oznaˇcovala data stupnˇem senzitivity. ˇ • Spolehliv´ y front-end (guard) - Syst´em je opˇet zam´ yˇslen jako doplnˇek komerˇcn´ıch SRBD, kter´e nemaj´ı implementov´ anu bezpeˇcnost. Uˇzivatel se autentizuje spolehliv´emu front-endu, kter´ y od nˇeho pˇreb´ır´a dotazy, prov´ad´ı kontrolu autorizace ˇ uˇzivatele pro poˇzadovan´ a data, pˇred´ av´ a dotazy k vyˇr´ızen´ı SRBD a na z´avˇer prov´ad´ı testy integrity a klasifikace v´ ysledk˚ u ˇ pˇred pˇred´ an´ım uˇzivateli. SRBD pˇristupuje k dat˚ um prostˇrednictv´ım spolehliv´eho access controlleru. 18 zdroj:
vypracovan´ e ot´ azky na zkouˇsku z OI1
106
Obr´ azek 12: Access Controller
Obr´ azek 13: Spolehliv´ y front-end
ˇ • Commutative Filter – Jde o proces, kter´ y pˇreb´ır´a ˚ ulohu rozhran´ı mezi uˇzivatelem a SRBD. Filtr pˇrij´ım´ a uˇzivatelovy ˇ ˇ dotazy, prov´ ad´ı jejich pˇreformulov´ an´ı a upraven´e dotazy pos´ıl´a SRBD k vyˇr´ızen´ı. Z v´ ysledk˚ u, kter´e SRBD vr´ at´ı, odstran´ı data, ke kter´ ym uˇzivatel nem´ a pˇr´ıstupov´ a pr´ ava a takto upraven´e v´ ysledky pˇred´av´a uˇzivateli. Filtr je moˇzno pouˇz´ıt k ochranˇe na ˚ urovni z´ aznam˚ u, atribut˚ u a jednotliv´ ych poloˇzek. V r´amci pˇreformulov´an´ı dotazu m˚ uˇze napˇr. vkl´ adat dalˇs´ı podm´ınky do dotazu, kter´e zajist´ı, ˇze v´ ysledek dotazu z´avis´ı jen na informac´ıch, ke kter´ ym m´a uˇzivatel pˇr´ıstup. • View - Pohled je ˇc´ ast datab´ aze, obsahuj´ıc´ı pouze data, ke kter´ ym m´a dan´ y uˇzivatel pˇr´ıstup. Pohled m˚ uˇze obsahovat i z´ aznamy nebo atributy, kter´e se v p˚ uvodn´ı datab´azi nevyskytuj´ı a vznikly nˇejakou funkc´ı z informac´ı p˚ uvodn´ı datab´ aze. Pohled je generov´ an dynamicky, prom´ıtaj´ı se tedy do nˇeho zmˇeny p˚ uvodn´ı DB. Uˇzivatel klade dotazy pouze proti sv´emu pohledu - nem˚ uˇze doj´ıt ke kompromitaci informac´ı, ke kter´ ym nem´a pˇr´ıstup. Z´aznam / atribut p˚ uvodn´ı datab´ aze je souˇc´ ast´ı pohledu, pokud alespoˇ n jedna poloˇzka z tohoto z´ aznamu / atributu je pro uˇzivatele viditeln´a, ostatn´ı poloˇzky v tomto jsou oznaˇceny za nedefinovan´e. Uˇzivatel pˇri formulov´ an´ı dotazu m˚ uˇze pouˇz´ıvat pouze omezenou sadu povolen´ ych funkc´ı. Tato ˇ metoda je jiˇz n´ avrhem smˇeˇruj´ıc´ım k vytvoˇren´ı bezpeˇcn´eho SRBD.
Autentizace Identifikace nˇeˇc´ım, co uˇzivatel v´ı, m´ a nebo je. • Hesla – slovn´ıkov´ yu ´tok (80–90% hesel je jednoduch´ ych), hrub´a s´ıla – vynucov´ an´ı d´elky a sloˇzitosti hesla • Model ot´ azka/odpovˇ ed’ (challenge-response) – napˇr. autentizace poˇc´ıtaˇc˚ u. Poˇc´ıtaˇc, kter´ y se chce autentizovat obdrˇz´ı n´ ahodn´ y dotaz, kter´ y zpracuje (napˇr. zaˇsifruje tajn´ ym kl´ıˇcem) a odeˇsle v´ ysledek. V´ ysledek je ovˇeˇren a pokud je spr´ avn´ y, autentizace je uskuteˇcnˇena. • Fyzick´ y objekt – smartcards, USB kl´ıˇce (certifik´aty) • Biometrika – otisky prst˚ u, rohovka, hlas Autentizace v prostˇ red´ı datab´ aze Kaˇzd´ y, komu je povolen pˇr´ıstup k datab´ azi, mus´ı b´ yt pozitivnˇe identifikov´an. datab´aze potˇrebuje pˇresnˇe vˇedˇet, komu odpov´ıd´ a. Protoˇze vˇsak zpravidla bˇeˇz´ı jako uˇzivatelsk´ y proces, nem´a spolehliv´e spojen´ı s j´adrem OS a tedy mus´ı prov´ adˇet vlastn´ı autentizaci. Autentizace v s´ıti Protoˇze s´ıt’ov´e prostˇred´ı zpravidla nen´ı povaˇzov´ ano za bezpeˇcn´e, je tˇreba vyuˇz´ıvat autentizaˇcn´ı mechanismy odoln´e v˚ uˇci odposlechu, resp. aktivn´ım utok˚ um. ˇcasto b´ yv´ a ˇz´ adouc´ı ˇreˇsit jednotn´e pˇrihl´aˇsen´ı (single sign on). S procesem integrace autentizaˇcn´ıch mechanism˚ u souvis´ı nutnost zaveden´ı centr´aln´ı spr´avy uˇzivatel˚ u nebo alespoˇ n synchronizace z´aznam˚ u o uˇzivatel´ıch.
Autorizace Existuj´ı r˚ uzn´e u ´rovnˇe ochrany objektu: ˇ 1. Z´ adn´ a ochrana - Je nutna alespon samovoln´ a casov´a separace proces˚ u. 2. Izolace - Procesy o sobe v˚ ubec nev´ı a syst´em zajist’uje ukryt´ı objekt˚ u pˇred ostatn´ımi procesy. 3. Sd´ılen´ı vseho nebo niceho - Vlastn´ık objektu deklaruje, zda je objekt public nebo private (tedy jen pro neho). 4. Sd´ılen´ı s omezen´ ymi pr´ıstupy - OS testuje opr´avnˇenost kaˇzd´eho pr´ıstupu k objektu. U subjektu i objektu existuje z´ aznam, zda m´ a subjekt pr´ avo pr´ıstupu k objektu. 5. Sd´ılen´ı podle zp˚ usobilosti - rozˇs´ıˇren´ı pˇredchoz´ıho - Opr´avnen´ı dynamicky z´avis´ı na aktu´aln´ım kontextu. 6. Limitovan´ e pouzit´ı objekt˚ u - Krome opr´ avnen´ı pr´ıstupu specifikujeme, jak´e operace sm´ı subjekt s objektem prov´ adet. TODO: pˇr´ıstupov´ a pr´ ava ??? Ochrana informace I. 107
5.12
Architektury OS
Klasick´ a struktura – monolitick´ a Nejstarˇs´ı, uˇz IBM 360, Unix, Win., vˇsechny sluˇzby uvnitˇr, prov´adˇeny ve chr´anˇen´em m´odu, j´adro pomˇernˇe velk´e, u ´dajnˇe“ ” nejrychlejˇs´ı. Program zavol´ a sluˇzbu OS, pˇres tabulku se zjist´ı adresa pˇr´ısl. fce, ta se zavol´a a vr´at´ı v´ ysledek. Nev´ yhoda: horˇs´ı u ´drˇzba – je-li v programu chyba, m˚ uˇze poˇskodit zb´ yvaj´ıc´ı ˇc´asti syst´emu, rozˇsiˇrov´an´ı za bˇehu je komplikovan´e. Virtu´ aln´ı stroje P˚ uvodn´ı n´ apad : Virtual Machine pro IBM360 – oddˇelit multitasking od OS jako ext. stroj. Nad HW byla dalˇs´ı vrstva – Virtual Machine“ – mˇela pl´ anovat, vyr´ ab´ı pro procesy iluzi hol´eho HW; dneska napˇr. VMWare dˇel´a to sam´e. Pro IBM360 se ” dalo pouˇz´ıt v kombinaci s CMS (jedno´ ulohov´ y) i p˚ uvodn´ıho OS360 (rychlejˇs´ı neˇz OS360 na hol´em HW). Dnes: definuji abstraktn´ı stroj, pro nˇej pˇrekl´ ad´ am programy (.NET, Java) → pˇrenositelnost, kompatibilita (IBM AS400 – des´ıtky let), probl´em – pomal´e. Mikroj´ adro snaha aby ˇc´ ast bˇeˇz´ıc´ı v kernel m´ odu byla co nejmenˇs´ı (tˇreba jen cca 10 KB), nejnovˇejˇs´ı, experiment´aln´ı, ˇcasto pro Distribuovan´e OS (dnes uˇz nepouˇz´ıvan´e), hodnˇe proces˚ u & komunikace (klient/server), mikroj´adro ˇreˇs´ı jenom komunikaci. Filesyst´em apod. jsou procesy – aplikace jim pos´ılaj´ı pˇres j´adro poˇzadavky. Jedin´ y komerˇcn´ı OS – Chorus (´ ustˇredny). v´ yhoda: kdyˇz nˇeco spadne, nepoˇskod´ı to zbytek, moduly jdou mˇenit za bˇehu, komunikace jde snadno rozˇs´ıˇrit na komunikaci po s´ıti. Architektura WinNT J´ adro je pomˇernˇe mal´e (cca 1MB), schopn´e (pro vyˇsˇs´ı vrstvy jsou nˇekter´e schopnosti skryt´e), na jeho vzniku se pod´ıleli schopn´ı Unix´ aˇri. Byla zde snaha o malou velikost, pˇrenositelnost. J´adro je neutr´aln´ı vzhledem k vyˇsˇs´ım vrstv´am, nad n´ım lze vybudovat r˚ uzn´e syst´emy (Windows subsyst´em, POSIX, OS/2). Rozhran´ı OS a uˇziv. program˚ u zajiˇst’uje WinAPI, nad n´ım se nach´azej´ı r˚ uzn´e DLL, mezi kernelem a HW je hardware ” abstraction layer“, tj. kernel lze jednoduˇse upravit pro jin´e architektury (Alpha, IA-64). Grafick´e drivery jedin´e maj´ı pˇr´ım´ y pˇr´ıstup k HW (kv˚ uli v´ ykonu), ˇc´ asti API (USER, GDI) jsou implementovan´e v j´adˇre, pˇrechod mezi user a kernel reˇzimem zajiˇst’uje ntdll.dll (a je tedy vyuˇz´ıv´ an vˇsemi programy). Veˇsker´e sluˇzby a aplikace bˇeˇz´ı v user m´odu nad j´adrem.
Architektura Linuxu • Na u ´rovni SW – pˇrenositelnost; abstrakce HW. • nad HW – kernel, nad n´ım syst´emov´ a vol´ an´ı, hodnˇe podobn´e Windows.
108
5.13
Rodina protokol˚ u TCP/IP (ARP, IPv4, IPv6, ICMP, UDP, TCP) – adresace, routing, fragmentace, spolehlivost, flow control, congestion control, NAT ISO/OSI aplikaˇcn´ı vrstva prezentaˇcn´ı vrstva relaˇcn´ı vrstva transportn´ı vrstva s´ıt’ov´ a vrstva linkov´ a vrstva fyzick´ a vrstva
TCP/IP aplikaˇcn´ı vrstva
transportn´ı vrstva s´ıt’ov´a vrstva (t´eˇz IP vrstva) vrstva s´ıt’ov´eho rozhran´ı
Obvykl´e oznaˇcenie je TCP/IP protocol suite (s´ uˇcast’ou je viac ako 100 protokolov). Architekt´ ura vznikla postupne (v akademickom prostred´ı, neskˆ or sa rozˇs´ırila aj do komerˇcnej sf´ery) – najprv vznikli protokoly, potom vrstvy – a od vzniku sa toho zmenilo len m´ alo (zmeny s´ u adit´ıvne). Je to najpouˇz´ıvanejˇsia siet’ov´a technol´ogia (IP over everything, everything over IP). Pr´ıstup autorov bol, na rozdiel od ISO/OSI, od jednoduchˇsieho k zloˇzitejˇsiemu – najprv sa vytv´araj´ u jednoduch´e rieˇsenia, ktor´e sa postupne obohacuj´ u. Aˇz sa rieˇsenie prakticky over´ı (2 nez´avisl´e implement´acie), vznikne ˇstandard. TCP/IP predpoklad´ a ˇze siete s´ u typu nespojovan´e, nespol’ahliv´e a best effort. Vˇsetk´a inteligencia je s´ ustreden´a do koncov´ ych uzlov, siet’ je hl´ upa“ ale ” r´ ychla. TCP/IP bol pˆ ovodne urˇcen´ y pre ARPAnet – nemohol mat’ teda ˇziadnu centr´alnu ˇcast’ a musel byt’ robustn´ y voˇci chyb´ am ’ (nespol ahliv´e/nespojovan´e prenosy). Dˆ oraz sa kl´ adol aj na ”internetworking”. Nebolo vˇsak poˇzadovan´e zabezpeˇcenie, mobilita ani kvalita sluˇzieb. TCP/IP nedefinuje rˆ ozne siete (ˇco sa hardv´erov´ ych vlastnost´ı t´ yka) a technol´ogie vo vrstve siet’ov´eho rozhrania – iba sa snaˇz´ı ’ nad nimi prev´ adzkovat protokol IP (okrem SLIP a PPP pre dvojbodov´e spoje). V siet’ovej vrstve je IP protokol, v transportnej jednotn´e transportn´e protokoly (TCP a UDP), v aplikaˇcnej potom jednotn´e z´aklady aplik´aci´ı (email, prenos s´ uborov, remote login...). Adresace, IPv4, IPv6 Data se v IP s´ıti pos´ılaj´ı po bloc´ıch naz´ yvan´ ych datagramy. Jednotliv´e datagramy putuj´ı s´ıt´ı zcela nez´avisle, na zaˇc´ atku komunikace nen´ı potˇreba navazovat spojen´ı ˇci jinak pˇripravovat cestu“ dat˚ um, pˇrestoˇze spolu tˇreba pˇr´ısluˇsn´e stroje nikdy pˇredt´ım ” nekomunikovaly. IP protokol v doruˇcov´ an´ı datagram˚ u poskytuje nespolehlivou sluˇzbu, oznaˇcuje se tak´e jako best effort – nejlepˇs´ı u ´sil´ı“; tj. ” vˇsechny stroje na trase se datagram snaˇz´ı podle sv´ ych moˇznost´ı poslat bl´ıˇze k c´ıli, ale nezaruˇcuj´ı prakticky nic. Datagram v˚ ubec nemus´ı dorazit, m˚ uˇze b´ yt naopak doruˇcen nˇekolikr´ at a neruˇc´ı se ani za poˇrad´ı doruˇcen´ ych paket˚ u. Pokud aplikace potˇrebuje spolehlivost, je potˇreba ji implementovat v jin´e vrstvˇe s´ıt’ov´e architektury, typicky protokoly bezprostˇrednˇe nad IP (viz TCP). Pokud by s´ıt’ ˇcasto ztr´ acela pakety, mˇenila jejich poˇrad´ı nebo je poˇskozovala, v´ ykon s´ıtˇe pozorovan´ y uˇzivatelem by byl mal´ y. Na druhou stranu pˇr´ıleˇzitostn´ a chyba nem´ıv´ a pozorovateln´ y efekt, nav´ıc se obvykle pouˇz´ıv´a vyˇsˇs´ı vrstva, kter´a ji automaticky oprav´ı. V IPv4 je adresou 32bitov´e ˇc´ıslo, zapisovan´e po jednotliv´ ych bajtech, oddˇelen´ ych teˇckami. Takov´ ych ˇc´ısel existuje celkem 232 . Urˇcit´ a ˇc´ ast adres je ovˇsem rezervov´ ana pro vnitˇrn´ı potˇreby protokolu a nemohou b´ yt pˇridˇeleny. D´ale pak praktick´e d˚ uvody vedou k tomu, ˇze adresy je nutno pˇridˇelovat hierarchicky, takˇze cel´ y adresn´ı prostor nen´ı moˇzn´e vyuˇz´ıt beze zbytku. To vede k tomu, ˇze v souˇcasnosti je jiˇz znateln´ y nedostatek IP adres, kter´ y ˇreˇs´ı r˚ uzn´ ymi zp˚ usoby: dynamick´ ym pˇridˇelov´an´ım (tzn. napˇr. kaˇzd´ y uˇzivatel dial-up pˇripojen´ı dostane doˇcasnou IP adresu ve chv´ıli, kdy se pˇripoj´ı, ale jakmile se odpoj´ı, je jeho IP adresa pˇridˇelena nˇekomu jin´emu; pˇri pˇr´ıˇst´ım pˇripojen´ı pak m˚ uˇze tent´ yˇz uˇzivatel dostat u ´plnˇe jinou adresu), pˇrekladem adres (NAT) a podobnˇe. Ke spr´ avˇe tohoto pˇridˇelov´ an´ı slouˇz´ı specializovan´e s´ıt’ov´e protokoly, jako napˇr. DHCP. Pˆ ovodn´ y koncept adries poˇc´ıtal so ˇstrukt´ urou adresy IPv4 v tvare siet’:poˇc´ıtaˇc, kde bolo delenie ˇcast´ı pevne dan´e. Neskˆ or sa to ale uk´ azalo ako pr´ıliˇs hrub´e delenie a lok´ alna ˇcast’ adresy (v r´amci jednej podsiete) moˇze m¨at’ dnes promenliv´ u d´lˇzku. Obecne plat´ı, ˇze medzi adresami v rovnakej podsieti (maj´ u rovnak´ u siet’ov´ u ˇcast’) je moˇzn´e dopravovat’ d´ata priamo – dotyˇcn´ı u ´ˇcastn´ıci s´ u prepojen´ı jedn´ ym ethernetom alebo inou lok´ alnou siet’ou. V opaˇcnom pr´ıpade sa d´ata dopravuj´ u smerovaˇcmi/routermi. Hranicu v adrese medzi adresou siete a poˇc´ıtaˇca urˇcuje dnes maska podsiete. Jedn´a sa o 32 bitov´ u hodnotu, ktor´a obsahuje jednotky tam, kde je v adrese urˇcen´ a siet’. Adresovanie siet´ı bolo v prvopoˇciatkoch internetu vyrieˇsen´e staticky – prv´ ych 8 bitov adresy urˇcovalo siet’, zvyˇsok jednotliv´e poˇc´ıtaˇce (existovat’ tak mohlo max. 256 siet´ı). S n´ astupom lok´alnych siet´ı bolo tento syst´em potrebn´e zmenit’ – zaviedli sa triedy IP adries. Existovalo 5 tried (A(zaˇciatok 0, hodnoty prv´eho bajtu 0-127, maska 255.0.0.0), B(10, 128-191, 255.255.0.0), C(110, 192-223, 255.255.255.0), D(1110, 224-239, urˇcen´e na multicast) a E(1111, 240-255, urˇcen´e ako rezerva)). Postupom ˇcasu sa ale aj toto rozdelenie uk´ azalo ako nepruˇzn´e a bol zaveden´ y CIDR (Classless Inter-Domain Routing) syst´em v ktorom je moˇzn´e ’ hranicu medzi adresou siete a lok´ alnou ˇcast ou adresy umiestnit’ l’ubovol’ne (oznaˇcuje sa potom ako kombin´acia prefixu a d´lˇzky vo forme 192.168.0.0/24, kde 24 znamen´ a ˇze adresu tvor´ı prv´ ych 24 bitov – jin´ y z´apis je pomoc´ı uˇz zmiˇ novan´e masky pods´ıtˇe, tj. 192.168.0.0 s maskou 255.255.255.0). Medzi adresami existuj´ u niektor´e tzv. vyhraden´ e adresy, ktor´e maj´ u ˇspeci´alny v´ yznam. • Adresa s (bin´ arnymi) nulami v ˇcasti urˇcuj´ ucej poˇc´ıtaˇc (192.168.0.0 (/24)) znamen´a t´ato siet’“, resp. t´ato stanica“. ” ” • Adresa s jednotkami v ˇcasti urˇcuj´ ucej poˇc´ıtaˇc (192.168.0.255 (/24)) znamen´a broadcast – vˇsesmerov´e vysielanie. • Adresy 10.0.0.0 – 10.255.255.255, 172.16.0.0 – 172.31.255.255 a 192.168.0.0 – 192.168.255.255 sa pouˇz´ıvaj´ u na adresovanie intern´ ych siet´ı – smerovaˇce tieto adresy nesmie smerovat’ d’alej do internetu. 109
IPv6 je trvalejˇs´ım rieˇsen´ım nedostatku adries – zatial’ sa ale rozˇsiruje vel’mi pozvolna. Adresa v IPv6 m´ a d´lˇzku 128 23 2 bitov (oproti 32), ˇco znamen´ a cca. 6 × 10 IP adries na 1m zemsk´eho povrchu – umoˇzn ˇuje teda, aby kaˇzd´e zariadenie na zemi malo vlastn´ u jednoznaˇcn´ u adresu. Adresa IPv6 sa zapisuje ako osem skup´ın po ˇstyroch hexadecim´alnych ˇc´ıslach (napr. 2001:0718:1c01:0016:0214:22ff:fec9:0ca5) – priˇcom u ´vodn´e nuly v ˇc´ıslach je moˇzn´e vynechat’. Ak po sebe nasleduje niekol’ko nulov´ ych skup´ın, je moˇzn´e pouˇzit’ len znaky :: – napr. ::1 miesto 0000:0000:.......:0001. Toto je moˇzn´e pouˇzit’ len raz v z´ apise adresy. RFC 4291 zav´ adza 3 typy adries: • inidividu´ alne / unicast – identifikuj´ u pr´ ave jedno rozhranie • skupinov´ e / multicast – urˇcuje skupinu zariaden´ı, ktor´ ym sa m´a spr´ava dopravit’ • v´ yberov´ e / anycast – urˇcuje tieˇz skupinu zariaden´ı, d´ata sa vˇsak doruˇcia len jedn´emu z ˇclenov (najbliˇzˇsiemu) IPv6 neobsahuje vˇsesmˇerov´e (broadcast) adresy. Byly nahrazeny obecnˇejˇs´ım modelem skupinov´ ych adres a pro potˇreby doruˇcen´ı dat vˇsem zaˇr´ızen´ım pˇripojen´ ym k urˇcit´e s´ıti slouˇz´ı speci´aln´ı skupinov´e adresy (napˇr. ff02::1 oznaˇcuje vˇsechny uzly na dan´e lince). IPv6 zav´ ad´ı tak´e koncepci dosahu (scope) adres. Adresa je jednoznaˇcn´a vˇzdy jen v r´amci sv´eho dosahu. Nejˇcastˇejˇs´ı dosah je pochopitelnˇe glob´ aln´ı, kdy adresa je jednoznaˇcn´ a v cel´em Internetu. Kromˇe toho se ˇcasto pouˇz´ıv´a dosah linkov´ y, definuj´ıc´ı jednoznaˇcnou adresu v r´ amci jedn´e linky (lok´ aln´ı s´ıtˇe, napˇr. Ethernetu). Propracovanou strukturu dosah˚ u maj´ı skupinov´e adresy (viz n´ıˇze). Adresn´ı prostor je rozdˇelen n´ asledovnˇe: prefix ::/128 ::1/128 ff00::/8 fe80::/10 ostatn´ı
v´ yznam neurˇcen´a smyˇcka (loopback) skupinov´e individu´aln´ı lok´aln´ı linkov´e individu´aln´ı glob´aln´ı
V´ ybˇerov´e adresy nemaj´ı rezervov´ anu svou vlastn´ı ˇc´ast adresn´ıho prostoru. Jsou prom´ıch´any s individu´aln´ımi a je ot´ azkou lok´ aln´ı konfigurace, aby uzel poznal, zda se jedn´ a o individu´aln´ı ˇci v´ ybˇerovou adresu. Strukturu glob´ aln´ıch individu´ aln´ıch IPv6 adres definuje RFC 3587. Je velmi jednoduch´a a de facto odpov´ıd´a (aˇz na rozmˇery jednotliv´ ych ˇc´ ast´ı) v´ yˇse uveden´e struktuˇre IPv4 adresy. n bit˚ u glob´ aln´ı smˇerovac´ı prefix
64-n bit˚ u adresa pods´ıtˇe
64 bit˚ u adresa rozhran´ı
Glob´ aln´ı smˇerovac´ı prefix je de facto tot´eˇz co adresa s´ıtˇe, n´asleduje adresa pods´ıtˇe a poˇc´ıtaˇce (pˇresnˇeji s´ıt’ov´eho rozhran´ı). V praxi je adresa pods´ıtˇe aˇz na v´ yjimky 16bitov´ a a glob´aln´ı prefix 48bitov´ y. Ten je pak pˇridˇelov´an obvyklou hierarchi´ı, jej´ıˇz st´avaj´ıc´ı pravidla jsou: • prvn´ı dva bajty obsahuj´ı hodnotu 2001 (ps´ ano v ˇsestn´actkov´e soustavˇe) • dalˇs´ı dva bajty pˇridˇeluje region´ aln´ı registr´ ator (RIR) • dalˇs´ı dva bajty pˇridˇeluje lok´ aln´ı registr´ ator (LIR) Re´ aln´ a struktura glob´ aln´ı individu´ aln´ı adresy tedy vypad´a n´asledovnˇe: 16 bit˚ u 2001
16 bit˚ u pˇridˇeluje RIR
16 bit˚ u pˇridˇeluje LIR
16 bit˚ u adresa pods´ıtˇe
64 bit˚ u adresa rozhran´ı
Adresa rozhran´ı by pak mˇela obsahovat modifikovan´ y EUI-64 identifik´ator. Ten z´ısk´ate z MAC adresy jednoduch´ ym postupem: invertuje se druh´ y bit MAC adresy a doprostˇred se vloˇz´ı dva bajty obsahuj´ıc´ı hodnotu fffe. Z ethernetov´e adresy 00:14:22:c9:0c:a5 tak vznikne identifik´ ator 0214:22ff:fec9:0ca5. Adresy zaˇc´ınaj´ uce hodnotou ff s´ u tzv. ”skupinov´e adresy”– ˇstyri nasleduj´ uce bity v nej obsahuj´ u pr´ıznaky, d’alˇsie ˇstyri potom dosah (napr. interface-local, link-local, admin-local, site-local, organization-local, global...) IPv6 d’alej podporuje QoS a bezpeˇcnost’ (IPsec). Routing Pojmem smˇ erov´ an´ı (routing, routov´ an´ı) je oznaˇcov´ ano hled´an´ı cest v poˇc´ıtaˇcov´ ych s´ıt´ıch. Jeho u ´kolem je dopravit datov´ y paket urˇcen´emu adres´ atovi, pokud moˇzno co nejefektivnˇejˇs´ı cestou. S´ıt’ov´a infrastruktura mezi odes´ılatelem a adres´atem paketu m˚ uˇze b´ yt velmi sloˇzit´ a. Smˇerov´ an´ı se proto zpravidla nezab´ yv´a celou cestou paketu, ale ˇreˇs´ı vˇzdy jen jeden krok – komu data pˇredat jako dalˇs´ımu (tzv. distribuovan´e smˇerov´ an´ı“). Ten pak rozhoduje, co s paketem udˇelat d´al. ” V pr´ıpade, ˇze je ciel’ov´ a stanica packetu v rovnakej sieti ako je odosielatel’, o doruˇcenie sa postar´a linkov´a vrstva. V opaˇcnom pr´ıpade mus´ı odosielatel’ urˇcit’ najvhodnejˇs´ı odchodz´ı smer a poslat’ datagram smerovaˇcu vo zvolenom smere. Z´ akladn´ı datovou strukturou pro smˇerov´ an´ı je smˇerovac´ı tabulka (routing table). Pˇredstavuje vlastnˇe onu sadu ukazatel˚ u, podle kter´ ych se rozhoduje, co udˇelat s kter´ ym paketem. Smˇerovac´ı tabulka je sloˇzena ze z´aznam˚ u obsahuj´ıc´ıch: • c´ılovou adresu, kter´e se dotyˇcn´ y z´ aznam t´ yk´ a. M˚ uˇze se jednat o adresu individu´aln´ıho poˇc´ıtaˇce, ˇcastˇeji vˇsak je c´ıl definov´ an prefixem, tedy zaˇca´tkem adresy. Prefix m´ıv´ a podobu 147.230.0.0/16. Hodnota pˇred lom´ıtkem je adresa c´ıle, hodnota za lom´ıtkem pak urˇcuje poˇcet v´ yznamn´ ych bit˚ u adresy. Uveden´emu prefixu tedy vyhovuje kaˇzd´a adresa, kter´a m´a v poˇc´ ateˇcn´ıch 16 bitech (ˇcili prvn´ıch dvou bajtech) hodnotu 147.230. 110
• akci urˇcuj´ıc´ı, co prov´est s datagramy, jejichˇz adresa vyhovuje prefixu. Akce mohou b´ yt dvou typ˚ u: doruˇcit pˇr´ımo adres´ atovi (pokud je dotyˇcn´ y stroj s adres´ atem pˇr´ımo spojen) nebo pˇredat nˇekter´emu ze soused˚ u (jestliˇze je adres´at vzd´ alen). Smˇerovac´ı rozhodnut´ı pak prob´ıh´ a samostatnˇe pro kaˇzd´ y proch´azej´ıc´ı datagram. Vezme se jeho c´ılov´a adresa a porovn´ a se smˇerovac´ı tabulkou n´ asledovnˇe: • Z tabulky se vyberou vˇsechny vyhovuj´ıc´ı z´ aznamy (jejichˇz prefix vyhovuje c´ılov´e adrese datagramu). • Z vybran´ ych z´ aznam˚ u se pouˇzije ten s nejdelˇs´ım prefixem. Toto pravidlo vyjadˇruje pˇrirozen´ y princip, ˇze konkr´etnˇejˇs´ı z´ aznamy (jejichˇz prefix je delˇs´ı, tedy pˇresnˇejˇs´ı; specieln´ım pˇr´ıpadem je host-specific route) maj´ı pˇrednost pˇred obecnˇejˇs´ımi (co m˚ uˇze b´ yt napˇr. i default route; ps: agregace). Zaj´ımavou ot´ azkou je, jak vznikne a jak je udrˇzov´ana smˇerovac´ı tabulka. Tento proces maj´ı obecnˇe na starosti smˇerovac´ı algoritmy. Kdyˇz jsou pak pro urˇcit´ y algoritmus definov´ana pˇresn´a pravidla komunikace a form´aty zpr´av nesouc´ıch smˇerovac´ı informace, vznikne smˇerovac´ı protokol (routing protocol). Smˇerovac´ı algoritmy m˚ uˇzeme rozdˇelit do dvou z´akladn´ıch skupin: ˇ na statick´e a dynamick´e. Casto se tak´e mluv´ı o statick´em a dynamick´em smˇerov´an´ı, kter´e je d˚ usledkem ˇcinnosti pˇr´ısluˇsn´ ych protokol˚ u. Pˇri statick´ em (t´ eˇ z neadaptivn´ım) smˇ erov´ an´ı se smˇerovac´ı tabulka nijak nemˇen´ı. Je d´ana konfigurac´ı poˇc´ıtaˇce a pˇr´ıpadn´e zmˇeny je tˇreba v n´ı prov´est ruˇcnˇe. Tato varianta vypad´a jako nepˇr´ıliˇs atraktivn´ı, ve skuteˇcnosti ale drtiv´a vˇetˇsina zaˇr´ızen´ı v Internetu smˇeruje staticky. Dynamick´ e (adaptivn´ı) smˇ erov´ an´ı pr˚ ubˇeˇznˇe reaguje na zmˇeny v s´ıt’ov´e topologii a pˇrizp˚ usobuje jim smˇerovac´ı tabulky. Na vytv´ aranie tabuliek existuje niekol’ko algoritmov – routovac´ıch protokolov (vector-distance/link-state) – RIP, BGP, OSPF. Distribuovan´ e smˇ erov´ an´ı V distribuovan´em smˇerov´ an´ı m˚ uˇze v´ ypoˇcet cesty (smˇeru pˇred´an´ı paketu) prov´adˇet bud’ kaˇzd´ y uzel nez´avisle, nebo mohou uzly kooperovat (distribuovan´ y v´ ypoˇcet). Rozliˇsuje se tak´e ˇcetnost aktualizace informac´ı. Dva z´akladn´ı algoritmy distribuovan´eho smˇerov´ an´ı jsou: • vector distance – kaˇzd´ y uzel si udrˇzuje tabulku vzd´alenost´ı, pˇr´ım´ı soused´e si vymˇen ˇuj´ı informace o cest´ach ke vˇsem uzl˚ um, tj. jde o distribuovan´ y v´ ypoˇcet, pˇren´ aˇs´ı se dost informac´ı. Trp´ı probl´emem count-to-infinity“ – tj. kdyˇz 1 uzel pˇrestane ” ˇ s´ı se existovat, postupnˇe si jeho soused´e mezi sebou pˇrehazuj´ı vzd´alenost, postupnˇe o 1 zvˇetˇsovanou (do nekoneˇcna). Reˇ pomoc´ı technik split horizon“ (neinzeruj vzd´ alenost zpˇet) a poisoned reverse“ (inzeruj zpˇet nekoneˇcno), nˇekde ale pˇresto ” ” selh´ av´ a. • link state – kaˇzd´ y uzel hled´ a zmˇeny sv´ ych soused˚ u a pokud k nˇejak´e dojde, poˇsle floodem informaci do cel´e s´ıtˇe. V´ ypoˇcet vzd´ alenost´ı dˇel´ a kaˇzd´ y uzel s´ am. Tyto algoritmy se pouˇz´ıvaj´ı u nˇekter´ ych zn´ am´ ych smˇerovac´ıch protokol˚ u: • RIP (Routing Information Protocol) – protokol z BSD Unixu, typu vector distance. Poˇc´ıt´a s max. 16 pˇreskoky, zmˇeny se updatuj´ı 2x za minutu. Informace ve smˇerovac´ı tabulce m˚ uˇze zahrnovat max. 25 s´ıt´ı, pouˇz´ıv´a split horizon & poisoned reverse. Hod´ı se ale jen pro mal´e s´ıtˇe. • OSPF (Open Shortest Path First) – jde o protokol typu link state, uzly si poˇc´ıtaj´ı vzd´alenosti do vˇsech s´ıt´ı Dijkstrov´ ym algoritmem. Pro zjiˇst’ov´ an´ı zmˇen se pos´ılaj´ı pakety ”HELLO”a ”ECHO”. M´a lepˇs´ı ˇsk´alovatelnost, hod´ı se pro vˇetˇs´ı s´ıtˇe. Hierarchick´ e smˇ erov´ an´ı, autonomn´ı syst´ emy Hierarchick´e smˇerov´ an´ı znamen´ a rozdˇelen´ı s´ıtˇe do oblast´ı (areas) a smˇerov´an´ı mezi nimi jen pˇres vstupn´ı body. Je vhodn´e pro velk´e, sloˇzitˇe propojen´e nebo r˚ uzn´ ym zp˚ usobem spravovan´e s´ıtˇe. Nad oblastmi se vytvoˇr´ı propojen´ı – backbone area (p´ ateˇrn´ı syst´em), pˇres kter´e se smˇerov´ an´ı mezi oblastmi prov´ad´ı. Cel´emu tomuto (areas + backbone area) se ˇr´ık´a autonomn´ı syst´em. Detailn´ı smˇerovac´ı informace neopouˇstˇej´ı jednotliv´e oblasti. Pro smˇerov´ an´ı v r´ amci jedn´e oblasti i mezi oblastmi v r´amci jednoho autonomn´ıho syst´emu slouˇz´ı jeden z tzv. interior gateway protocol s, m˚ uˇze b´ yt pouˇzit napˇr. OSPF nebo RIP, pˇr´ıpadnˇe dalˇs´ı jako IGRP (interior gateway routing protocol, typu vector distance) nebo EIGRP (enhaced IGRP, hybrid mezi vector distance a link state). Mezi jednotliv´ ymi autonomn´ımi syst´emy (pˇres AS boundary routers) se smˇeruje pomoc´ı exterior gateway protocolu, jedn´ım z nich je napˇr. Border Gateway Protocol (BGP). D´ıky existenci autonomn´ıch syst´em˚ u jde napˇr. pˇri peeringu stanovit, kter´ y provoz p˚ ujde pˇres peering a kter´ y v´ yˇse po upstreamu do p´ ateˇrn´ıch s´ıt´ı.
Fragmentace Maximum transmission unit (MTU) je maxim´ aln´ı velikost paketu, kter´ y je moˇzn´e pˇren´est z jednoho s´ıt’ov´eho zaˇr´ızen´ı na druh´e. Obvykl´ a hodnota MTU v pˇr´ıpadˇe Ethernetu je cca 1500 bajt˚ u, nicm´enˇe mezi nˇekter´ ymi m´ısty poˇc´ıtaˇcov´e s´ıtˇe (spojen´ ych napˇr´ıklad modemem nebo s´eriovou linkou) m˚ uˇze b´ yt maxim´aln´ı d´elka pˇrenesen´eho paketu niˇzˇs´ı. Hodnotu MTU lze zjistit prostˇrednictv´ım protokolu ICMP. Pˇri pos´ıl´ an´ı paket˚ u pˇres nˇekolik s´ıt’ov´ ych zaˇr´ızen´ı je samozˇrejmˇe d˚ uleˇzit´e nal´ezt nejmenˇs´ı MTU na dan´e cestˇe. Hodnota MTU je omezena zdola na 576 bajt˚ u. U pˇrenosov´eho protokolu TCP je pˇri smˇerov´ an´ı paketu do pˇrenosov´eho kan´alu s niˇzˇs´ım MTU neˇz je d´elka paketu, provedena fragmentace paketu. U protokolu UDP nen´ı fragmentace paketu podporov´ana a paket je v takov´em pˇr´ıpadˇe zahozen.
111
Pokud doraz´ı na smˇerovaˇc paket o velikosti vˇetˇs´ı, neˇz kterou je pˇrenosov´a trasa schopna pˇren´est (napˇr. pˇri pˇrechodu z Token Ringu pouˇz´ıvaj´ıc´ıho 4 kByte pakety na Ethernet pouˇz´ıvaj´ıc´ıho maxim´alnˇe 1,5 kByte pakety), mus´ı smˇerovaˇc zajistit tzv. fragmentaci, neboli rozebr´ an´ı paketu na menˇs´ı ˇc´ asti a c´ılov´ y uzel mus´ı zajistit opˇetovn´e sloˇzen´ı, neboli defragmentaci. Fragmenty proch´ azej´ı pˇres s´ıt’ jako samostatn´e datagramy. Aby byl koncov´ y uzel schopen fragmenty sloˇzit do origin´ aln´ıho datagramu, mus´ı b´ yt fragmenty pˇr´ısluˇsnˇe oznaˇceny. Toto oznaˇcov´an´ı se prov´ad´ı v pˇr´ısluˇsn´ ych pol´ıch IP hlaviˇcky. Pokud nesm´ı b´ yt datagram fragmentov´ an, je oznaˇcen v pˇr´ısluˇsn´em m´ıstˇe IP hlaviˇcky pˇr´ıznakem Don‘t Fragment“. Jestliˇze ” takto oznaˇcen´ y paket doraz´ı na smˇerovaˇc, kter´ y by jej mˇel poslat prostˇred´ım s niˇzˇs´ım MTU a tud´ıˇz je nutnost prov´est fragmentaci, provede smˇerovaˇc jeho zruˇsen´ı a informuje odes´ılatele chybovou zpr´avou ICMP. Aby byl c´ılov´ y uzel schopen sloˇzit origin´ aln´ı datagram, mus´ı m´ıt dostateˇcn´ y buffer do nˇehoˇz jsou jednotliv´e fragmenty ukl´ ad´ any na pˇr´ısluˇsnou pozici danou offsetem. Sloˇzen´ı je dokonˇceno v okamˇziku, kdy je vyplnˇen cel´ y datagram zaˇc´ınaj´ıc´ı fragmentem s nulov´ ym offsetem (identification a fragmentation offset v hlaviˇcke) a konˇc´ıc´ı segmentem s pˇr´ıznakem More Data Flag“ (resp. ” More Fragments) nastaven´ ym na False. V IPv4 je moˇzn´e fragmentovan´e pakety d’alej delit’; naproti tomu v IPv6 mus´ı fragment´aciu zabezpeˇcit’ odosielatel’ – nevyhovuj´ uce pakety sa zahadzuj´ u. Spolehlivost, Flow control, Congestion control Ked’ˇze TCP/IP funguje nad obecne nespojovan´ ymi a nespol’ahliv´ ymi m´ediami, spol’ahlivost’ ktor´ u TCP poskytuje nie je skutoˇcn´ a“, ale len softv´erovo emulovan´ a“ – medzil’ahl´e uzly o spojen´ı niˇc nevedia, funguj´ u nespojovane (pre komunik´ aciu ” ” sa pouˇz´ıva siet’ov´ a vrstva, transportn´ a existuje“ iba medzi koncov´ ymi uzlami). Je teda nutn´e oˇsetrit’ napr. nespol’ahlivost’ in” fraˇstrukt´ ury (str´ acanie d´ at, duplicity – priˇcom stratit’ sa mˆoˇze aj ˇziadost’ o vytvorenie pripojenia, potvrdenie...) a reboot uzlov (uzol strat´ı hist´ oriu, je potrebn´e oˇsetrit’ existuj´ uce spojenia...). Pouˇz´ıva sa cel´ a rada techn´ık, kde z´ akladom je kontinu´alne potvrdzovanie: pr´ıjemca posiela kladn´e potvrdenia; odosielatel’ po kaˇzdom odoslan´ı sp´ uˇst’a ˇcasovaˇc a ak mu do vyprˇsania nepr´ıde potvrdenie, posiela d´ata znovu. Potvrdzovanie nie je samostatn´e ale vklad´ a sa do paketov cestuj´ ucich opaˇcn´ ym smerom – piggybacking. ˇ TCP priebeˇzne kontroluje dobu obr´ atky“ a vyhodnocuje v´aˇzen´ y priemer a rozptyl dˆob obr´atky. Cakaciu dobu (na potvrdenie) ” potom vypoˇc´ıtava ako funkciu tohto v´ aˇzen´eho priemeru a rozptylu. V´ ysledn´ y efekt je potom ten, ˇze ˇcakacia doba je tesne nad strednou dobou obr´ atky. V pr´ıpade konˇstantnej doby obr´atky sa ˇcakacia doba pribliˇzuje strednej dobe obr´atky; ak kol´ıˇse, ˇcakacia doba sa zv¨ aˇcˇsuje. D´ ata v TCP sa pr´ıj´ımaj´ u/posielaj´ u po jednotliv´ ych byteoch – interne sa vˇsak bufferuj´ u a posielaj´ u aˇz po naplnen´ı buffera (priˇcom aplik´ acia si mˆ oˇze vyˇziadat’ okamˇzit´e odoslanie – oper´acia PUSH). TCP si potrebuje oznaˇcovat’ jednotliv´e byty v r´ amci pr´ udu (ked’ˇze nepracuje s blokmi) – napr. kvˆ oli potvrdzovaniu; pouˇz´ıva sa na to 32-bitov´a poz´ıcia v bytovom pr´ ude (zaˇc´ına sa od n´ ahodne zvolen´eho ˇc´ısla). TCP sa snaˇz´ı riadit’ tok d´ at – aby odosielatel’ nezahlcoval pr´ıjemcu a kvˆoli tomu nedoch´adzalo k str´ate d´at. Podstata rieˇsenia je tzv. met´ oda okienka. Okienko ud´ ava vel’kost’ vol’n´ ych bufferov na strane prij´ımaj´ uceho a odosielatel’ mˆoˇze posielat’ d´ ata aˇz do zaplnenia“ okienka. Pr´ıjemca spolu s kaˇzd´ ym potvrden´ım posiela aj svoju ponuku – u ´daj o vel’kosti okienka (window advertis” ment)., ktor´ y hovor´ı kol’ko eˇste d´ at je schopn´ y prijat’ (naviac k pr´ave potvrden´ ym). Znovu – pouˇz´ıva sa met´oda kontinu´ alneho ’ potvrd ovania. V¨ aˇcˇsina str´ at pren´ aˇsan´ ych d´ at ide skˆ or na vrub zahlteniu ako chyb´am HW a transportn´e protokoly mˆoˇzu nevhodn´ ym chovan´ım zhorˇsovat’ dˆ osledky. TCP kaˇzd´ u stratu d´ at ch´ ape ako dˆosledok zahltenia – nasadzuje opatrenia proti zahlteniu (congestion control). Po str´ ate paketu ho poˇsle znovu ale neposiela d’alˇsie a ˇcak´a na potvrdenie (tj. prechod z kontinu´alneho potvrdzovania na jednotliv´e ⇒ vysiela menej d´ at ako mu umoˇzn ˇuje okienko). Ak pr´ıde potvrdenie vˇcas, zdvojn´asob´ı mnoˇzstvo odosielan´ ych d´at – a tak pokraˇcuje k´ ym nenaraz´ı na aktu´ alnu vel’kosti okienka (postupne sa tak vracia na kontinu´alne potvrdzovanie). Dˆ oleˇzitou vlastnost’ou je aj korektn´e chovanie pri nav¨azovan´ı a ruˇsen´ı spojenia (v prostred´ı, kde mˆoˇze dˆojst’ k spomaleniu, strate, duplicite...) – pouˇz´ıva sa tzv. 3-f´ azov´ y handshake. Vytvorenie spojenia prebieha nasledovne: 1. Klient poˇsle serveru SYN paket (v pakete je nastaven´ y pr´ıznak SYN) spolu s n´ahodn´ ym sequence number (X). 2. Server tento paket prijme, zaznamen´ a si sequence number (X) a poˇsle sp¨at’ paket SYN-ACK. Tento paket obsahuje pole ’ Acknowledgement, ktor´e oznaˇcuje d alˇsie ˇc´ıslo (sequence number), ktor´e tento host oˇcak´ava (X+1). Tento host rovno vytvor´ı sp¨ atn´ u session s vlastn´ ym sekvenˇcn´ ym ˇc´ıslom (Y). 3. Klient odpovie so sekvenˇcn´ ym ˇc´ıslom (X+1) a jednoduch´ ym Acknowledgement ˇc´ıslom (Y+1) – ˇco je sekvenˇcn´e ˇc´ıslo servera+1. Pak uˇz spojen´ı povaˇzov´ ano za nav´ azan´e. Ruˇsenie spojenia funguje podobne, pos´ılaj´ı se pakety FIN (finish), FIN+ACK a ACK. Pokud v´ıce neˇz nˇejak´ y urˇcit´ y poˇcet pokus˚ u o odesl´ an´ı (po spoˇc´ıtan´ ych time-outech) jednoho z 3-way handshake paket˚ u selˇze (druh´ a strana neodeˇsle to, co mˇelo n´ asledovat), spojen´ı se povaˇzuje za pˇreruˇsen´e (i u navazov´an´ı, i u ruˇsen´ı). NAT TODO: pˇreloˇzit ty copy & paste z Wiki Network address translation (zkr´ acenˇe NAT, ˇcesky pˇreklad s´ıt’ov´ ych adres) je funkce s´ıt’ov´eho routeru pro zmˇenu IP adres packet˚ u proch´ azej´ıc´ıch zaˇr´ızen´ım, kdy se zdrojov´ a nebo c´ılov´a IP adresa pˇrev´ad´ı mezi r˚ uzn´ ymi rozsahy. Nejbˇeˇznˇejˇs´ı formou je tzv. maˇskar´ ada (maskov´ an´ı), kdy router IP adresy z nˇejak´eho rozsahu mˇen´ı na svoji IP adresu a naopak – t´ım umoˇzn ˇuje, aby poˇc´ıtaˇce ve vnitˇrn´ı s´ıti (LAN) vystupovaly v Internetu pod jedinou IP adresou. Router si drˇz´ı po celou dobu spojen´ı v pamˇeti tabulku pˇrekladu adres.
112
Pˇreklad s´ıt’ov´ ych adres je funkce, kter´ a umoˇzn ˇuje pˇrekl´ad´an´ı adres. Coˇz znamen´a, ˇze adresy z lok´aln´ı s´ıtˇe pˇreloˇz´ı na jedineˇcnou adresu, kter´ a slouˇz´ı pro vstup do jin´e s´ıtˇe (napˇr. Internetu), adresu pˇrekl´adanou si uloˇz´ı do tabulky pod n´ahodn´ ym portem, pˇri odpovˇedi si v tabulce vyhled´ a port a poˇsle pakety na IP adresu pˇriˇrazenou k dan´emu portu. NAT je vlastnˇe jednoduch´ ym proxy serverem (na siet’ovej vrstve). Komunikace Klient odeˇsle poˇzadavek na komunikace, smˇerovaˇc se pod´ıv´a do tabulky a zjist´ı, zdali se jedn´a o adresu lok´aln´ı, nebo adresu venkovn´ı. V pˇr´ıpadˇe venkovn´ı adresy si do tabulky uloˇz´ı ˇc´ıslo n´ahodn´eho portu, pod kter´ ym bude vys´ılat a k nˇemu si pˇriˇrad´ı IP adresu. Bˇehem pˇrepos´ıl´ an´ı ven“ a zmˇeny adresy v paketu mus´ı NAT tak´e pˇrepoˇc´ıtat CRC checksum TCP i IP (aby pakety ” nebyly zahazov´ any kv˚ uli ˇspatn´emu CRC, protoˇze zmˇenˇen´a adresa je jejich souˇc´ast´ı). V´ yhodami NAT s´ u umoˇznenie pripojenie viacer´ ych poˇc´ıtaˇcov do internetu cez jednu zdiel’an´ u verejn´ u IP adresu, a zv´ yˇsenie bezpeˇcnosti poˇc´ıtaˇcov za NATom (aj ked’ je to security through obscurity a nie je dobr´e postavit’ bezpeˇcnost’ iba na NATe). Nev´ yhodami potom s´ u nefunguj´ uce protokoly (napr. akt´ıvne FTP) – ˇco je zrejm´e z fungovania NATu. NAT Traversal NAT traversal refers to an algorithm for the common problem in TCP/IP networking of establishing connections between hosts in private TCP/IP networks that use NAT devices. This problem is typically faced by developers of client-to-client networking applications, especially in peer-to-peer and VoIP activities. NAT-T is commonly used by IPsec VPN clients in order to have ESP packets go through NAT. Many techniques exist, but no technique works in every situation since NAT behavior is not standardized. Many techniques require a public server on a well-known globally-reachable IP address. Some methods use the server only when establishing the connection (such as STUN), while others are based on relaying all the data through it (such as TURN), which adds bandwidth costs and increases latency, detrimental to conversational VoIP applications. Druhy uspoˇ r´ ad´ an´ı NATu • Static NAT : A type of NAT in which a private IP address is mapped to a public IP address, where the public address is always the same IP address (i.e., it has a static address). This allows an internal host, such as a Web server, to have an unregistered (private) IP address and still be reachable over the Internet. • Dynamic NAT — A type of NAT in which a private IP address is mapped to a public IP address drawing from a pool of registered (public) IP addresses. Typically, the NAT router in a network will keep a table of registered IP addresses, and when a private IP address requests access to the Internet, the router chooses an IP address from the table that is not at the time being used by another private IP address. Dynamic NAT helps to secure a network as it masks the internal configuration of a private network and makes it difficult for someone outside the network to monitor individual usage patterns. Another advantage of dynamic NAT is that it allows a private network to use private IP addresses that are invalid on the Internet but useful as internal addresses. • PAT — PAT (NAT overloading) je dalˇs´ı variantou NATu. U t´eto varianty NATu se v´ıce inside local adres mapuje na jednu inside global adresu na r˚ uzn´ ych portech. Tedy m´ame jednu veˇrejnou adresu a vnitˇrn´ı s´ıt’ oadresovanou inside local adresami. Pˇrekladov´ a tabulka je rozˇs´ıˇrena o dvˇe poloˇzky: inside local port – port, ze kter´eho byl paket odesl´ an a inside global port – ˇc´ıslo portu, na kter´ y je paket odeslan´ y ze zdrojov´eho portu poˇc´ıtaˇce mapov´an. V´ yhodou je, ˇze se tak pˇripojuje v´ıce poˇc´ıtaˇc˚ u pˇres jednu IP adresu.
ARP Address Resolution Protocol (ARP) se v poˇc´ıtaˇcov´ ych s´ıt´ıch s IP protokolem pouˇz´ıv´a k z´ısk´an´ı ethernetov´e (MAC) adresy sousedn´ıho stroje z jeho IP adresy. Pouˇz´ıv´ a se v situaci, kdy je tˇreba odeslat IP datagram na adresu leˇz´ıc´ı ve stejn´e pods´ıti jako odes´ılatel. Data se tedy maj´ı poslat pˇr´ımo adres´ atovi, u nˇehoˇz vˇsak odes´ılatel zn´a pouze IP adresu. Pro odesl´an´ı prostˇrednictv´ım napˇr. Ethernetu ale potˇrebuje zn´ at c´ılovou ethernetovou adresu. Proto vys´ılaj´ıc´ı odeˇsle ARP dotaz (ARP request) obsahuj´ıc´ı hledanou IP adresu a u ´daje o sobˇe (vlastn´ı IP adresu a MAC adresu). Tento dotaz se pos´ıl´ a linkov´ ym broadcastem – na MAC adresu identifikuj´ıc´ı vˇsechny u ´ˇcastn´ıky dan´e lok´ aln´ı s´ıtˇe (v pˇr´ıpadˇe Ethernetu na ff:ff:ff:ff:ff:ff). ARP dotaz nepˇrekroˇc´ı hranice dan´e pods´ıtˇe, ale vˇsechna k n´ı pˇripojen´a zaˇr´ızen´ı dotaz obdrˇz´ı a jako optimalizaˇcn´ı krok si zap´ıˇs´ı u ´daje o jeho odes´ılateli (IP adresu a odpov´ıdaj´ıc´ı MAC adresu) do sv´e ARP cache. Vlastn´ık hledan´e IP adresy pak odeˇsle tazateli ARP odpovˇed’ (ARP reply) obsahuj´ıc´ı vlastn´ı IP adresu a MAC adresu. Tu si tazatel zap´ıˇse do ARP cache a m˚ uˇze odeslat datagram. Informace o MAC adres´ ach odpov´ıdaj´ıc´ıch jednotliv´ ym IP adres´am se ukl´adaj´ı do ARP cache, kde jsou uloˇzeny do vyprˇsen´ı sv´e platnosti. Nen´ı tedy tˇreba hledat MAC adresu pˇred odesl´an´ım kaˇzd´eho datagramu – jednou z´ıskan´a informace se vyuˇz´ıv´ a opakovanˇe. V ˇradˇe operaˇcn´ıch syst´em˚ u (Linux, Windows XP) lze obsah ARP cache zobrazit a ovlivˇ novat pˇr´ıkazem arp. Alternativou pro poˇc´ıtaˇc bez ARP protokolu je pouˇz´ıvat tabulku pˇriˇrazen´ı MAC adres IP adres´am definovanou jin´ ym zp˚ usobem, napˇr´ıklad pevnˇe konfigurovanou. Tento pˇr´ıstup se pouˇz´ıv´a pˇredevˇs´ım v prostˇred´ı se zv´ yˇsen´ ymi n´aroky na bezpeˇcnost, protoˇze v ARP se d´ a podv´ adˇet – m´ısto skuteˇcn´eho vlastn´ıka hledan´e IP adresy m˚ uˇze odpovˇedˇet nˇekdo jin´ y a st´ ahnout tak k sobˇe jeho data. ARP je definov´ ano v RFC 826. Pouˇz´ıv´ a se pouze pro IPv4. Novˇejˇs´ı verze IP protokolu (IPv6) pouˇz´ıv´a podobn´ y mechanismus nazvan´ y Neighbor Discovery Protocol (NDP, objevov´an´ı soused˚ u“). ” Aˇckoliv se ARP v praxi pouˇz´ıv´ a t´emˇeˇr v´ yhradnˇe pro pˇreklad IP adres na MAC adresy, nebyl p˚ uvodnˇe vytvoˇren pouze pro IP s´ıtˇe. ARP se m˚ uˇze pouˇz´ıt pro pˇreklad MAC adres mnoha r˚ uzn´ ych protokol˚ u na s´ıt’ov´e vrstvˇe. ARP byl tak´e uzp˚ usoben tak, 113
aby vyhodnocoval jin´e typy adres fyzick´e vrstvy: napˇr´ıklad ATMARP se pouˇz´ıv´a k vyhodnocen´ı ATM NSAP adres v protokolu Classical IP over ATM. ICMP ICMP protokol (anglicky Internet Control Message Protocol) je jeden z j´adrov´ ych protokol˚ u ze sady protokol˚ u internetu. Pouˇz´ıvaj´ı ho operaˇcn´ı syst´emy poˇc´ıtaˇc˚ u v s´ıti pro odes´ıl´an´ı chybov´ ych zpr´av – napˇr´ıklad pro ozn´amen´ı, ˇze poˇzadovan´ a sluˇzba nen´ı dostupn´ a nebo ˇze potˇrebn´ y poˇc´ıtaˇc nebo router nen´ı dosaˇziteln´ y. ICMP se sv´ ym u ´ˇcelem liˇs´ı od TCP a UDP protokol˚ u t´ım, ˇze se obvykle nepouˇz´ıv´a s´ıtov´ ymi aplikacemi pˇr´ımo. Jedinou v´ yjimkou je n´ astroj ping, kter´ y pos´ıl´ a ICMP zpr´ avy Echo Request“ (a oˇcek´av´a pˇr´ıjem zpr´avy Echo Response“) aby urˇcil, zda ” ” je c´ılov´ y poˇc´ıtaˇc dosaˇziteln´ y a jak dlouho paket˚ um trv´a, neˇz se dostanou k c´ıli a zpˇet. ICMP protokol je souˇc´ ast sady protokol˚ u internetu definovan´a v RFC 792. ICMP zpr´avy se typicky generuj´ı pˇri chyb´ ach v IP datagramech (specifikov´ ano v RFC 1122) nebo pro diagnostick´e nebo routovac´ı u ´ˇcely. Verze ICMP pro IPv4 je zn´ am´ a jako ICMPv4. IPv6 pouˇz´ıv´ a obdobn´ y protokol: ICMPv6. ICMP zpr´ avy se konstruuj´ı nad IP vrstvou; obvykle z IP datagramu, kter´ y ICMP reakci vyvolal. IP vrstva patˇriˇcnou ICMP zpr´ avu zapouzdˇr´ı novou IP hlaviˇckou (aby se ICMP zpr´ava dostala zpˇet k p˚ uvodn´ımu odes´ılateli) a obvykl´ ym zp˚ usobem vznikl´ y datagram odeˇsle. Napˇr´ıklad kaˇzd´ y stroj (jako tˇreba mezilehl´e routery), kter´ y forwarduje IP datagram, mus´ı v IP hlaviˇcce dekrementovat pol´ıˇcko TTL ( time to live“, zb´ yvaj´ıc´ı doba ˇzivota“) o jedniˇcku. Jestliˇze TTL klesne na 0 (a datagram nen´ı ” ” urˇcen stroji prov´ adˇej´ıc´ımu dekrementaci), router pˇrijat´ y paket zahod´ı a p˚ uvodn´ımu odes´ılateli datagramu poˇsle ICMP zpr´ avu Time to live exceeded in transit“ ( bˇehem pˇrenosu vyprˇsela doba ˇzivota“). ” ” Kaˇzd´ a ICMP zpr´ ava je zapouzdˇren´ a pˇr´ımo v jedin´em IP datagramu, a tak (jako u UDP) ICMP nezaruˇcuje doruˇcen´ı. Aˇckoli ICMP zpr´ avy jsou obsaˇzen´e ve standardn´ıch IP datagramech, ICMP zpr´avy se zpracov´avaj´ı odliˇsnˇe od norm´aln´ıho zpracov´ an´ı prokol˚ u nad IP. V mnoha pˇr´ıpadech je nutn´e prozkoumat obsah ICMP zpr´avy a doruˇcit patˇriˇcnou chybovou zpr´ avu aplikaci, kter´ a vyslala p˚ uvodn´ı IP paket, kter´ y zp˚ usobil odesl´ an´ı ICMP zpr´avy k p˚ uvodci. Mnoho bˇeˇznˇe pouˇz´ıvan´ ych s´ıt’ov´ ych diagnostick´ ych utilit je zaloˇzeno na ICMP zpr´av´ach. Pˇr´ıkaz traceroute je implementov´ an odes´ıl´ an´ım UDP datagram˚ u se speci´ alnˇe nastavenou ˇzivotnost´ı v TTL pol´ıˇcku IP hlaviˇcky a oˇcek´av´an´ım ICMP odezvy Time ” to live exceeded in transit“ nebo Destination unreachable“. Pˇr´ıbuzn´a utilita ping je implementov´ana pouˇzit´ım ICMP zpr´ av ” Echo“ a Echo reply“. ” ” Nejpouˇ z´ıvanˇ ejˇ s´ı ICMP datagramy: ˇ • Echo: poˇzadavek na odpovˇed’, kaˇzd´ y prvek v s´ıti pracuj´ıc´ı na IP vrstvˇe by na tuto v´ yzvu mˇel reagovat. Casto to z r˚ uzn´ ych d˚ uvod˚ u nen´ı dodrˇzov´ ano. • Echo Reply: odpovˇed’ na poˇzadavek • Destination Unreachable: informace o nedostupnosti c´ıle, obsahuje dalˇs´ı upˇresˇ nuj´ıc´ı informaci ’ – Net Unreachable: nedostupn´ a c´ılov´ a s´ıt , reakce smˇerovaˇce na poˇzadavek komunikovat se s´ıt´ı, do kter´e nezn´ a cestu – Host Unreachable: nedostupn´ y c´ılov´ y stroj – Protocol Unreachable: informace o nemoˇznosti pouˇz´ıt vybran´ y protokol – Port Unreachable: informace o nemoˇznosti pˇripojit se na vybran´ y port • Redirect: pˇresmˇerov´ an´ı, pouˇz´ıv´ a se pˇredevˇs´ım pokud ze s´ıtˇe vede k c´ıli lepˇs´ı cesta neˇz pˇres defaultn´ı br´anu. Stanice vˇetˇsinou nepouˇz´ıvaj´ı smˇerovac´ı protokoly a proto jsou informov´any touto cestou. Funguje tak, ˇze stanice poˇsle datagram sv´e, vˇetˇsinou defaultn´ı, br´ anˇe, ta jej pˇrepoˇsle spr´ avn´ ym smˇerem a z´aroveˇ n informuje stanici o lepˇs´ı cestˇe. – Redirect Datagram for the Network: informuje o pˇresmˇerov´an´ı datagram˚ u do cel´e s´ıtˇe – Redirect Datagram for the Host: informuje o pˇresmˇerov´an´ı datagram˚ u pro jedin´ y stroj • Time Exceeded : vyprˇsel ˇcasov´ y limit – Time to Live exceeded in Transit: bˇehem pˇrenosu doˇslo ke sn´ıˇzen´ı TTL na 0 aniˇz byl datagram doruˇcen – Fragment Reassembly Time Exceeded: nepodaˇrilo se sestavit jednotliv´e fragmenty v ˇcasov´em limitu(napˇr pokud dojde ke ztr´ atˇe ˇc´ asti datagram˚ u) Ostatn´ı datagramy jsou pouˇz´ıv´ any sp´ıˇse vz´ acnˇe, nˇekdy je pouˇz´ıv´an´ı ICMP znemoˇznˇeno zcela ˇspatn´ ym nastaven´ım firewallu. UDP, TCP UDP – nespol’ahliv´ y nespojovan´ y prenos datagramov... prid´ava len porty TCP – porty+spol’ahliv´ y spojovan´ y prenos streamov... ...d’alˇsie info vid’ kapitolu o BSD Sockets :-)
114
5.14
Spojovan´ e a nespojovan´ e sluˇ zby, spolehlivost, zabezpeˇ cen´ı protokolu Spojovan´ e a nespojovan´ e sluˇ zby
Spojovan´ a obˇe strany mus´ı nav´ azat spojen´ı, kter´e je pak potˇreba ukonˇcit. Jde o stavovou komunikaci a pˇrechody mus´ı b´ yt koordinovan´e. Pro spojen´ı je nalezena jedna cesta po kter´e komunikace prob´ıh´a a mohou ji b´ yt vyhrazeny zdroje. Potˇreba oˇsetˇrit nestandartn´ı situace (v´ ypadek spojen´ı). Zachov´av´a poˇrad´ı – d´ıky jedn´e cestˇe. Kaˇzd´e spojen´e m´a sv´e ID. Nespojovan´ a Komunikuj´ıc´ı strany o sobˇe nev´ı. Komunikuje se pomoc´ı zas´ıl´an´ı zpr´av – datagram˚ u a cesta je hled´ ana pro kaˇzd´ y datagram znovu, tj nen´ı ˇz´ adn´ a pevnˇe vytyˇcena. Kaˇzd´ y datagram mus´ı n´est plnou adresu pˇr´ıjemce. Je bezstavov´ a. Neˇreˇs´ı se nestandartn´ı situace a pokraˇcuje se v pˇrenosu. Nezachov´av´a poˇrad´ı, pˇrenos jednotliv´ ych blok˚ u je vz´ajemnˇe nez´ avisl´ y, kaˇzd´ y jde jinou cestou. Spolehlivost Pˇrenosy nejsou ide´ aln´ı, m˚ uˇze doj´ıt k poˇskozen´ı, kdo se pak m´a starat o n´apravu? Spolehliv´ a pˇ renosov´ a sluˇ zba O napraven´ı se star´ a ten kdo data pˇren´aˇs´ı, mus´ı rozpoznat chybu a vyˇz´adat si nov´ y pˇrenos (opravu) Nespolehliv´ a pˇ renosov´ a sluˇ zba Kdo pˇren´ aˇs´ı se o data nestar´a a chybn´a prostˇe zahod´ı a pˇren´aˇs´ı d´al. Zajistˇen´ı spolehlivosti vyˇzaduje reˇziji a ruˇs´ı pravidelnost doruˇcov´ an´ı dat, tak´e nen´ı nikdy absolutn´ı. Nˇekomu vad´ı v´ıc horˇs´ı pravidelnost neˇz chyba v datech (obraz a zvuk). Jak´ e jsou moˇ znosti zajiˇ stˇ en´ı spolehlivosti (v z´ avislosti na dostupnosti zpˇ etn´ e vazby)? Moze byt realizovane na ktorejkolvek vrstve okrem fyzickej. Princip a sposob realizacie je v zasade rovnaky na vsetkych vrstvach. Podmienkou je rozpoznat, ze doslo k nejakej chybe pri prenose. Pri nespolahlivom prenose, sa neda robit nic. Pri spolahlivom sa postarat o napravu. Moznosti: • pouzitie samoopravnych kodov, napri Hammingove kody, problemom je velka redundacia, ktora zvysuje objem prenasanych dat, pouziva sa vynimocne • pomocou potvrdzovania: prijemca si necha znovu zaslat poskodene data, podmienkou je existenica spatnej vazby (aspon polovicny duplex, aby prijemca mohol kontaktovat odosielatela). Jak se pouˇ z´ıv´ a parita a kontroln´ı souˇ cet pro detekci chyb pˇ ri pˇ renosech? Parita: • Paritny bit: bit pridany naviac k datovym bitom. Suda parita (paritny bit je nastaveny tak, aby celkovy pocet 1 bol sudy), licha parita (1 lichy), jednickova parita (paritny bit pevne nastaveny na 1, neni zabezpecovaci efekt), nulova parita (nastaveny na 0). • Priecna parita: po jednotlivych bytoch/slovach, informacie o tom, ktory byte je poskodeny je nadbytocna, aj tak sa posiela rovno cely blok (ramec, pakec). • Podelna parita: parita zo vsetkych rovnolahlych bitov vsetkych bytov/slov Kontrolny sucet: jednotlive byty/slova/dvojslova tvoriace prenasany blok sa interpretuju ako cisla a scitaju sa, vysledny sucet sa pouzije ako zabezpecovaci udaj (obvykle sa pouzije iba cast suctu, napr nizsi byte alebo nizsie slovo. Alternativa: miesto suctu sa pocita XOR jednotlivych bitov. Je ucinnejsi ako parita, ale stale je miera zabezpecenia nizka. Jak se pouˇ z´ıv´ a CRC pro detekci chyb pˇ ri pˇ renosech? CRC = Cyclic Redundancy Check Postupnost bitu, tvoriaca blok dat, je interpretovana ako polynom, polynom nad telesom charakteristiky 2, kde bity su jeho koeficienty.
Tento polynom je vydeleny inym polynomom, vysledkom je podiel a zvysok, v roli zabezpecenia sa pouzije zvysok po deleni charakteristickym polynomom. Schopnosti detekcie su vynikajuce: vsetky shluky chyb s lichym poctom bitov, vsetky shluky chyb do velkosti n bitu, kde n je stupen charakteristickeho polynomu, vsetky shluky chyb velkosit ¿ n+1 s pravdepodobnostou 99,999
115
Spolahlivost CRC kodov sa opiera o vysledky z algebry, samotny vypocet je velmi jednoduchy a moze byt lahko implementovany v HW, pomocou XOR hradiel a posuvnych registrov. Jak´ y je princip potvrzov´ an´ı? Jak funguje jednotliv´ e a kontinu´ aln´ı potvrzov´ an´ı? Ide o obecnejsi mechanizmus, ktory sluzi viac ucelom sucasne: 1. zaistenie spolehlivosti (umoznuje, aby si prijemca vyziadal opakovane zaseialanie poskodeneho ramca), 2. riadenie toku (aby prijemca mohol regulovat tempo, akym odosielatel posiela data. Sposoby: • kladne a zaporne potvrdzovanie: potvrdzuju sa spravy, resp chybne prijate bloky • jednotlive a kontinualne potvrdzovania: podla toho, ci odosielatel vzdy caka na potvrdenie alebo odosiela do fronty. • Samostatne a nesamostatne potvrdzovanie: ci potvrdenie cestuje ako samostatny ramec/paket, alebo je vnorene do datoveho paketu. • Metoda okienka Jednotlive potvrdzovanie: Stop&Wait ARQ • ide o samostatne jednotlive potvrdzovanie, potvrdenie je prenasane ako samostatny (riadiaci) blok, potvrdzovany je kazdy jeden paket (kladne, zaporne, timeout) • pribeh: odosielatel odosle datovy ramec a caka na jeho potvrdenie (kladne, zaporne), dalsi ramec neodosiela, prijemca odosle potvrdenie, podla druhu potvrdenia odosielatel bud odosle dalsi ramec alebo opakuje prenos, timeout interpretuje ako zapornu odpoved • jednoducha a priamociara interpretacia, charatker prenosu cisto poloduplexny, napr. protokoly IPX/SPX • ma zmysel v LAN (kratka odozva), nie WAN (zpozdeni velke) Kontinualne potvrdzovanie: continuous ARQ • idea: odosielatel bude vysielat datove ramce dopredu, a prislusne potvrdenia prijimat priebezne, s urcitym zpozdenim • ak dostane zapornu odpoved: 1. selektivne opakovanie: odosle iba ramec, ktory sa poskodil (prijimatel musi ukladat do bufferu, narocne hospodarenie s pamatou), 2. navrat spat: riesi Jak´ y je rozd´ıl mezi samostatn´ ym a nesamostatn´ ym potvrzov´ an´ım? Jak funguje piggybacking? Samostatne: potvrdenie je prenasane ako samostatny ramec specialneho typu, spojene s relativne vysokou reziou, samostatne potvrdenie je male, obale je velky Nesamostatne: potvrdenie je zasielane ako sucast datovych ramcov, prenasanych v opacnom smere, ktore su potvrdzovane, tzv. piggybacking
Zabezpeˇ cen´ı protokolu Jak´ a je podstata s´ıt´ı VPN (Virtual Private Network)? Samostatn´ a pods´ıt’ jin´e s´ıtˇe (vˇeˇrejn´e datov´e s´ıtˇe). Z pohledu uˇzivatele jde o samostatnou s´ıt’. Uˇzivatel chce m´ıt vlastn´ı s´ıt’ ale nevyplat´ı se mu j´ı vybudovat. Samostatn´ y adresov´ y prostor, pˇr´ıstup k uzl˚ um mimo VPN je jen pˇres br´anu. Ekonomick´ y efekt: lacinejˇs´ı Praktiˇcnost: jednoduch´ au ´drˇzba a efekt vlastn´ı s´ıtˇe. Bezpeˇcnost: poskytuj´ı urˇcitou ochranu Spojen´ı poboˇcek firmy pˇres internet do VPN, takov´eto poboˇckov´e s´ıtˇe pak spl´ yvaj´ı do jednoho logick´eho celku. Pˇripojen´ı vzd´ alen´eho uˇzivatele do firemn´ı s´ıtˇe. Jak´ e bezpeˇ cnost´ı funkce jsou schopny zabezpeˇ cit s´ıtˇ e VPN? Funkce a sluˇzby: identifikace a autentizace uˇzivatele. Takov´ yto uˇzivatel se pak m˚ uˇze volnˇe pohybovat po VPN. Zajiˇstˇen´ı d´ uvˇernisti – ˇsifrov´ an´ı a zajiˇstˇen´ı integrity – nelze komunikaci neopr´avnˇenˇe pozmˇenit. Jak je v TCP/IP ˇ reˇ sena bezpeˇ cnost (a zabezpeˇ cen´ı)? Zabezpeˇcen´ı si mus´ı kaˇzd´ a aplikace zajistit sama (na aplikaˇcn´ı u ´rovni). Pˇrenos. Infrastruktura je tak jednoduˇs´ı rychlejˇs´ı a lacinˇejˇs´ı. V ISO/OSI to ˇreˇs´ı relaˇcn´ı vrstva. Report (Galambos) Chtel vedet, jak vypada navazovani spojeni, v jake vrstve se resi zabezpeceni a takovy ruzny nesmysly, nakonec to byla pry horsi dvojka. Report (Peterka) Zaj´ımal ho pˇredevˇs´ım zp˚ usob jak´ym lze spolehlivosti dos´ ahnout, konkr´etn´ı metody - tedy samoopravn´e k´ ody, CRC a kontroln´ı souˇcty - a jejich pouˇzit´ı v konkr´etn´ıch pˇr´ıpadech. D´ ale se tak´e ptal na rozd´ıl mezi jednotliv´ym a kontinu´ aln´ım potvrzov´ an´ım v jak´ych situac´ıch lze resp. nelze pouˇz´ıt - a piggybacking. V pohode, udelala se z toho takova lehka prochazka po lehce pribuznych tematech a dostali jsme se i k tomu, kdo muze za fragmentaci
116
6
Programovac´ı jazyky
Poˇ zadavky • • • •
6.1
Principy implementace procedur´ aln´ıch programovac´ıch jazyk˚ u, oddˇelen´ y pˇreklad, sestaven´ı. Objektovˇe orientovan´e programov´ an´ı. Neprocedur´ aln´ı programov´ an´ı, logick´e programov´an´ı. Generick´e programov´ an´ı.
Principy implementace procedur´ aln´ıch a objektov´ e orientovan´ ych programovac´ıch jazyk˚ u, oddˇ elen´ y pˇ reklad, sestaven´ı
Principy implementace proceduralnich programovacich jazyku je v zasade jednoducha vec. Je treba vedet, jak funguji zakladni veci uvnitr. Ze program ma ctyri kusy pameti (code, data, stack a heap) a co ktera dela. Jak probiha volani procedur, kam se pri nem co schova. Jak funguje rekurze, kam se ukladaji lokalni promenne a kam globalni, ... atd. Strukturovan´ e programov´ an´ı Poˇc´ıtaˇcov´ y program je nˇejak´ ym zp˚ usobem zaznamenan´ y postup poˇc´ıtaˇcov´ ych operac´ı, kter´ y speci´aln´ım zp˚ usobem popisuje praktickou realizaci zadan´e u ´lohy (tedy algoritmus v´ ypoˇctu). Program z procedur´ aln´ıho u ´hlu pohledu je vlastnˇe pˇresn´ a specifikace vˇsech krok˚ u, kter´e mus´ı poˇc´ıtaˇc vykonat, aby doˇsel k c´ıli, a jejich poˇrad´ı. Pro urˇcov´an´ı poˇrad´ı krok˚ u se pouˇz´ıvaj´ı z´akladn´ı operace ˇr´ızen´ı toku – skoky, podm´ınky, cykly apod. Jedn´ım z d˚ uleˇzit´ ych koncept˚ u procedur´ aln´ıho programov´an´ı je strukturovan´e programov´ an´ı – jeho idea je zaloˇzena na rodˇelen´ı programu na procedury (rutiny, podrutiny, metody, funkce), kter´e samy obsahuj´ı v´ yˇcet v´ ypoˇcetn´ıch krok˚ u k vykon´an´ı, mohou b´ yt ale spouˇstˇeny opakovanˇe a z libovoln´eho m´ısta v programu. Jejich v´ yhodou je mnohem n´azornˇejˇs´ı pohled na strukturu programu a snazˇs´ı udrˇzov´ an´ı k´ odu, neˇz v pˇr´ıpadˇe pouˇzit´ı jen nejjednoduˇsˇs´ıho ˇr´ızen´ı toku (tedy hlavnˇe skok˚ u, kter´e by se ve strukturovan´em programov´ an´ı spr´ avnˇe pouˇz´ıvat nemˇely). Datov´ eaˇ r´ıd´ıc´ı struktury vyˇ sˇ s´ıch programovac´ıch jazyk˚ u a jejich implementace ˇ ızen´ı toku R´ V informatice se tokem ˇr´ızen´ı rozum´ı poˇrad´ı ve kter´em se prov´adˇej´ı jednotliv´e pˇr´ıkazy programu. V imperativn´ıch (=procedur´ aln´ıch) programovac´ıch jazyc´ıch se pˇr´ıkazy pro ˇr´ızen´ı toku rozum´ı pˇr´ıkazy, kter´e dok´aˇzou zmˇenit poˇrad´ı prov´ adˇen´ı pˇr´ıkaz˚ u na jin´e neˇz pˇrirozen´e (to v jak´em jsou zaps´ any). Nˇekter´e funkcion´aln´ı jazyky tak´e obsahuj´ı takov´e pˇr´ıkazy (kter´e jiˇz nepatˇr´ı do funkcion´ aln´ıho programov´ an´ı), ale potom uˇz se jim vˇetˇsinou neˇr´ık´a pˇr´ıkazy pro ˇr´ızen´ı toku. Druhy pˇr´ıkaz˚ u pro ˇr´ızen´ı toku se mezi jazyky liˇs´ı, ale pˇribliˇznˇe mohou b´ yt rozdˇeleny do n´asleduj´ıc´ıch kategori´ı. • Pokraˇcov´ an´ı na jin´em m´ıstˇe programu (skok). • Vykon´ an´ı skupiny pˇr´ıkaz˚ u pouze pokud je splnˇena urˇcit´a podm´ınka (if-then-else) • Nevykon´ an´ı skupiny pˇr´ıkaz˚ u nebo jejich opakov´an´ı do t´e doby neˇz je splnˇena urˇcit´a podm´ınka (smyˇcka/cyklus). Cykly mohou b´ yt s podm´ınkou na zaˇc´ atku, na konci, uprostˇred, nekoneˇcn´e, s dan´ ym poˇctem opakov´an´ı. • Vykon´ an´ı skupiny pˇr´ıkaz˚ u, kter´e se nach´ azej´ı na jin´em m´ıstˇe k´od˚ u, a n´asledn´e (voliteln´e) vr´acen´ı ˇr´ızen´ı toku zpˇet (subroutines, coroutines, and continuations). • Zastaven´ı/ukonˇcen´ı programu. Pˇreruˇsen´ı a sign´ aly jsou n´ızko´ urovˇ nov´ y mechanizmus, kter´ y m˚ uˇze zmˇenit tok ˇr´ızen´ı podobnˇe jako se to dˇel´a u podprogram˚ u, ale vˇetˇsinou je vyvol´ an vnˇejˇs´ı ud´ alost´ı a nen´ı tedy pouˇzit ve smyslu ˇr´ızen´ı toku programu, jak bylo pops´ano. V´ yjimky V´ yjimky jsou speci´ aln´ım pˇr´ıkazem ˇr´ızen´ı toku, vyskytuj´ıc´ım se v nˇekter´ ych vyˇsˇs´ıch programovac´ıch jazyc´ıch. Z´akladn´ı myˇslenkou je, ˇze program m˚ uˇze na nˇejak´em m´ıstˇe vyhodit v´ yjimku (pˇr´ıkaz throw), coˇz zp˚ usob´ı, ˇze prov´adˇen´ı programu se zastav´ı a bud’ pokraˇcuje tam, kde je v´ yjimka oˇsetˇrena“ (tzv. catch blok), nebo pokud takov´e m´ısto nen´ı nalezeno, program skonˇc´ı s chybou. ” Bˇehem hled´ an´ı m´ısta oˇsetˇren´ı je datov´ a hodnota v´ yjimky uloˇzena stranou a pak m˚ uˇze b´ yt pouˇzita. Pˇri hled´ an´ı m´ısta oˇsetˇren´ı v´ yjimky (try-bloku, n´asledovan´eho catch-blokem se spr´avn´ ym datov´ ym typem v´ yjimky) se postupuje zpˇet po z´ asobn´ıku vol´ an´ı funkc´ı, tato technika se naz´ yv´a stack unwinding“ (odv´ıjen´ı z´asobn´ıku). V nˇekter´ ych ” jazyc´ıch (Java) lze definovat i akci, kter´ a se provede v kaˇzd´em pˇr´ıpadˇe, i pokud nastane v´ yjimka, jeˇstˇe pˇred odv´ıjen´ım z´ asobn´ıku – finally blok. Volac´ı konvence Pˇri vol´ an´ı procedur a funkc´ı je nejd˚ uleˇzitˇejˇs´ı z´ asobn´ık. Ukl´ad´a se na nˇej • kam se vr´ atit po vol´ an´ı • argumenty funkce (v pˇrekladem definovan´em poˇrad´ı – nutn´e m´ıt ve vˇsech modulech stejn´e; vˇetˇsinou se liˇs´ı v z´ avislosti na programovac´ım jazyku) 117
• n´ avratov´ a hodnota funkce • ukazatel na s´emanticky nadˇrazenou funkci (Pascal) Dohromady vˇsem tˇemto dat˚ um se nˇekdy ˇr´ık´ a aktivaˇcn´ı z´ aznam procedury. Po skonˇcen´ı funkce je nutn´e z´asobn´ık opˇet uklidit (vymazat zbyteˇcn´ a uloˇzen´ a data, vˇetˇsinou jen z˚ ust´ av´a n´avratov´a hodnota) a kter´a ˇc´ast programu to dˇel´a (volan´ a nebo volaj´ıc´ı procedura), z´ avis´ı opˇet na pˇrekladaˇci a konvenci jazyka. Volac´ı konvence dvou nejtypiˇctˇejˇs´ıch jazyk˚ u: • Pascal ukl´ız´ı volan´ a funkce, argumenty se ukl´ adaj´ı na z´ asobn´ık zleva doprava (nejlevejˇs´ı nejdˇr´ıv, tj. nejhloubˇeji) • C ukl´ız´ı funkce volaj´ıc´ı, argumenty se ukl´ adaj´ı zprava doleva (tj. nejlevˇejˇs´ı je na vrcholu z´asobn´ıku. Je to kv˚ uli funkc´ım s promˇenn´ ym poˇctem parametr˚ u. Volan´ a funkce mus´ı podle prvn´ıho argumentu poznat, jak´ y je skuteˇcn´ y poˇcet argument˚ u. Kdyby byl prvn´ı argument nˇekde hluboko v z´ asobn´ıku, tak v´ı prd.) Vol´ an´ı funkc´ı a procedur z pohledu procesoru 1. 2. 3. 4. 5. 6.
uloˇzen´ı vstupn´ıch parametr˚ u pro funkci pˇred´ an´ı ˇr´ızen´e do k´ odu funkce - skok“ ” z´ısk´ an´ı prostˇredk˚ u pro vykon´ an´ı funkce proveden´ı poˇzadovan´e funkce uloˇzen´ı v´ ysledk˚ u pro volaj´ıc´ıho n´ avrat do m´ısta vol´ an´ı
M´ ame registry pro data (vstupn´ı parametry a n´ avratovou hodnotu) a registr pro n´avratovou hodnotu, kam se uloˇz´ı adresa instrukce n´ asleduj´ıc´ı po instrukci vol´ an´ı (neboli hodnota Program Counteru PC + 4). V pˇr´ıpadˇe rekurzivn´ıho vol´ an´ı nebo vˇetˇs´ıho poˇctu parametr˚ u mus´ıme registry dostat na z´asobn´ık v pamˇeti (ten roste smˇerem k niˇzˇs´ım adres´ am, tj. ˇc´ım vˇetˇs´ı z´ asobn´ık, t´ım niˇzˇs´ı hodnota stack pointeru SP).
Organizace pamˇ eti Pamˇet’ procesu (spuˇstˇen´eho programu) lze rozdˇelit do nˇekolika ˇc´ast´ı: • k´ od programu (k´ odov´y segment) vytvoˇren pˇri pˇrekladu, souˇc´ ast spustiteln´eho souboru, nemˇenn´ y a m´a pevnou d´elku; obvykle b´ yv´a chr´anˇen proti z´ apisu • statick´ a data (datov´y segment) data programu, jejichˇz velikost je zn´ ama jiˇz pˇri pˇrekladu a jejichˇz pozice se bˇehem programu nemˇen´ı (je pˇripraven kompil´ atorem a jeho form´ at je takt´eˇz zadr´ atovan´ y ve spustiteln´em souboru, u inicializovan´ ych statick´ ych dat je tam cel´ y uloˇzen´ y); v jazyce C jde o glob´ aln´ı promˇenn´e a lok´aln´ı data deklarovan´a jako static, konstanty • halda (heap segment) vytv´ aˇren startovac´ım modulem (C Runtime library), ukl´adaj´ı se sem dynamicky vznikaj´ıc´ı objekty (malloc, new) – neinicializovan´ a data, i seznam voln´eho m´ısta • voln´ a pamˇet’ postupnˇe j´ı zaplˇ nuje z jedn´e strany z´ asobn´ık a z druh´e halda • z´ asobn´ık (stack segment) informace o vol´ an´ı procedur ( aktivaˇcn´ı z´ aznamy“) — n´avratov´e adresy, parametry a n´avratov´e hodnoty (nejsou-li pˇred´ av´ any ” v registrech), nˇekter´e jazyky (Pascal, C) pouˇz´ıvaj´ı i pro u ´schovu lok´aln´ıch dat. Typicky roste z´asobn´ık proti haldˇe (od konce“ pamˇeti k niˇzˇs´ım adres´ am). ” Pozn´ amka (Vnoˇren´e funkce) V Pascalu mohou b´ yt funkce definovan´e uvnitˇr jin´e funkce. Ta vnitˇrn´ı potˇrebuje pˇristupovat k promˇenn´ ym t´e vnˇejˇs´ı. Promˇenn´e jsou sice na z´ asobn´ıku, ale pouh´ y odkaz na volaj´ıc´ı funkci nestaˇc´ı, protoˇze se vnoˇren´a funkce m˚ uˇze volat rekurzivnˇe. Proto je na z´ asobn´ıku ukazatel na funkci s´emanticky nadˇrazenou. Alokace m´ısta pro r˚ uzn´ e typy promˇ enn´ ych • Dynamicky alokovan´e promˇenn´e (pˇres pointer) se alokuj´ı na haldˇe. Opakovanou alokac´ı a dealokac´ı pamˇet’ov´ ych blok˚ u r˚ uzn´e velikosti vznikaj´ı v haldˇe d´ıry“ (stˇr´ıdav´e u ´seky voln´eho a naalokovan´eho m´ısta). Existuje nˇekolik strategi´ı pro vyhled´ an´ı ” voln´eho bloku poˇzadovan´e velikosti (first-fit, next-fit, buddy syst´em) a udrˇzen´ı informac´ı o voln´em m´ıstˇe, kter´e jsou vˇetˇsinou implementov´ any v knihovn´ıch funkc´ıch jazyka (C, Pascal). • Lok´ aln´ı promˇenn´e se ukl´ adaj´ı na z´ asobn´ık, po skonˇcen´ı funkce, kter´e pˇr´ısluˇs´ı, jsou zase odstranˇeny. • Glob´ aln´ı a statick´e se ukl´ adaj´ı do segmentu pro statick´a data. Tady se d´ıry tvoˇrit nebudou, protoˇze tyhle promˇenn´e vznikaj´ı na zaˇc´ atku a zanikaj´ı na konci programu (takˇze se form´at segmentu nemˇen´ı).
118
Oddˇ elen´ y pˇ reklad, sestaven´ı Struktura programu Program se skl´ ad´ a z modul˚ u: • Pˇrekl´ ad´ any samostatnˇe kompil´ atorem • Spojov´ any linkerem Modul z pohledu program´ atora • Soubor s pˇr´ıponou .cpp (.c) Hlaviˇckov´e soubory • Soubory s pˇr´ıponou .h • Deklaruj´ı (a nˇekdy i definuj´ı) identifik´ atory pouˇz´ıvan´e ve v´ıce modulech • Vkl´ ad´ any do modul˚ u direktivou include – Direktivu zpracov´ av´ a preprocesor ˇcistˇe textovˇe – Preprocesor je integrov´ an v kompil´ atoru jako prvn´ı f´aze pˇrekladu Modul z pohledu kompil´ atoru • Samostatn´ a jednotka pˇrekladu • V´ ysledek pr´ ace preprocesoru Oddˇ elen´ y pˇ reklad
Smysl oddˇelen´eho pˇrekladu modul˚ u je urychlen´ı celkov´eho pˇrekladu – nepˇrekl´adat to, co se od minula nezmˇenilo. Oddˇelen´ y pˇreklad dnes d´ıky automatizaci makefily (viz n´ıˇze) a integrovan´ ymi prostˇred´ımi nen´ı t´emˇeˇr pro program´atora vidˇet. ...na tomto slide je vhodn´e si ujasnit, jak funguje statick´e a dynamick´e linkov´an´ı (jak a kde a kdy se opravuj´ı adresy objekt˚ u atd...): 119
• Statick´e linkov´ an´ı Po oddˇelen´em pˇrekladu jednotliv´e object moduly jeˇstˇe neobsahuj´ı pˇr´ımo adresy vˇsech funkc´ı a extern´ıch identifik´ ator˚ u, jen odkazy na nˇe. Linker se postar´ a o jejich spojen´ı dohromady. Je nutn´e, aby jm´ena byla unik´atn´ı, takˇze u pˇret´ıˇzen´ ych a virtu´ aln´ıch funkc´ı, jako je v C++, mus´ı b´ y jm´ena zpotvoˇrena tak, aby ukazovala i tˇr´ıdu, namespace, parametry a jejich typy. To m´ a na starosti compiler a ˇr´ık´ a se tomu name mangling. • Dynamick´e linkov´ an´ı Nast´ av´ a po vol´ an´ı operaˇcn´ıho syst´emu – zaveden´ı dynamick´e knihovny do pamˇeti. Jsou dvˇe moˇznosti jeho proveden´ı, prvn´ı je pr´ avˇe pˇri zav´ adˇen´ı knihovny, kdy se odkazy na vˇsechny funkce (a mezi nimi navz´ajem) napln´ı spr´avn´ ymi hodnotami (podle b´ azov´e adresy, na kterou se knihovna do pamˇeti nahraje). Druh´a moˇznost je pouˇzit´ı dvou pointer˚ u pˇri vol´ an´ı funkc´ı z knihovny – to se vytvoˇr´ı tabulka skuteˇcn´ ych adres, na kterou se z knihovny ukazuje. Prvn´ı moˇznost trv´a d´ele pˇri zav´ adˇen´ı knihovny, druh´ a je zase pomalejˇs´ı pˇri prov´ adˇen´ı, ale umoˇzn ˇuje k´od knihovny beze zmˇen sd´ılet v´ıce procesy.
Linker je program, kter´ y prij´ım´ a jeden alebo v´ıce objekt˚ u generovan´ ych kompil´atorem a sloˇz´ı je v jeden spustiteln´ y program. Objektov´ y k´ od, nebo objektov´ y soubor je reprezentace k´odu, kter´ y kompil´ator nebo assembler vytvoˇr´ı zpracov´ an´ım zdrojov´eho k´ odu. Objektov´e soubory obsahuj´ı kompaktn´ı k´od, ˇcasto naz´ yvan´ y bin´arky“ :-) Linker se typicky pouˇz´ıv´ a na vytvoˇren´ı ” spustiteln´ yho souboru nebo knihovny spojen´ım (slinkov´an´ım) objektov´ ych soubor˚ u. Z´akladn´ı ˇcast´ı objektov´eho souboru je strojov´ y k´ od (k´ od pˇrimo vykon´ avan´ y CPU poˇc´ıtaˇce). Makefile Smyslem programu make je ˇr´ızen´ı pˇrekladu a linkov´an´ı. Popis z´avislost´ı jednotliv´ ych modul˚ u a hlaviˇckov´ ych soubor˚ u je definov´ an v 1 textov´em souboru – Makefile (tj. kter´e soubory je nutn´e m´ıt aktu´aln´ı/vytvoˇren´e pro pˇreklad kter´eho souboru). Make vˇzdy po zmˇenˇe souboru pˇreloˇz´ı jen to, co na nˇem z´avis´ı. Form´at souboru make: targets: files; commands; #comment; line-begin\ line contd.; Targets – c´ıle ˇcinnost´ı / c´ılov´e soubory, moˇzno definovat vic, pˇri spuˇstˇen´ı make bez parametr˚ u se bere prvn´ı; univ. n´ astroj (nejen pro pˇreklad C/C++). Lze definovat i vlastn´ı makra (pˇr´ıkazem = <string>) a pak je pouˇz´ıvat (${makro}).
120
6.2
Objektovˇ e orientovan´ e programov´ an´ı
(podle zkouˇsen´ı Bureˇsem a T˚ umou) ´ cel objektov´ Uˇ eho programov´ an´ı In the 1960s, language design was often based on textbook examples of programs, which were generally small (due to the size of a textbook); however, when programs become very large, the focus changes. In small programs, the most common statement is generally the assignment statement; however, in large programs (over 10,000 lines), the most common statement is typically the procedure-call to a subprogram. Ensuring parameters are correctly passed to the correct subprogram becomes a major issue. Many small programs can be handled by coding a hierarchy of structures; however, in large programs, the organization is more a network of structures, and insistence on hierarchical structuring for data and procedures can produce cumbersome code with large amounts of ”tramp data”to handle various options across the entire program. Although structuring a program into a hierarchy might help to clarify some times of software, even for some special types of large programs, a small change, such as requesting a user-chosen new option (text font-color) could cause a massive ripple-effect with changing multiple subprograms to propagate the new data into the program’s hierarchy. The object-oriented approach is allegedly more flexible, by separating a program into a network of subsystems, with each controlling their own data, algorithms, or devices across the entire program, but only accessible by first specifying named access to the subsystem object-class, not just by accidentally coding a similar global variable name. Rather than relying on a structured-programming hierarchy chart, object-oriented programming needs a call-reference index to trace which subsystems or classes are accessed from other locations. Definice (Objektovˇe orientovan´e programov´ an´ı) Objektovˇe orientovan´e programov´ an´ı (zkracov´ ano na OOP, z anglick´eho Object-oriented programming) je metodika v´ yvoje softwaru. D´ a se na nˇej nahl´ednout jako na kolekci spolupracuj´ıc´ıch objekt˚ u – v protikladu k tradiˇcn´ımu pohledu, kdy se za program povaˇzuje sled instrukc´ı pro poˇc´ıtaˇc. V OOP je kaˇzd´ y objekt schopn´ y pˇrij´ımat zpr´avy, zpracov´avat data a pos´ılat zpr´ avy jin´ ym objekt˚ um. Na kaˇzd´ y objekt se tak d´ a nahl´ıˇzet jako na nez´avisl´ y mal´ y stroj“ s vlastn´ı rol´ı a zodpovˇednost´ı. ” Zjednoduˇsenˇe ˇreˇceno jde o dotaˇzen´ı konceptu data + algoritmy = program. Data tvoˇr´ı s k´odem, kter´ y je spravuje, jeden celek. Je zaloˇzeno na n´ asleduj´ıc´ıch myˇslenk´ ach, koncepci: Objekty Jednotliv´e prvky modelovan´e reality (jak data, tak souvisej´ıc´ı funkˇcnost) jsou v programu seskupeny do entit, naz´ yvan´ ych objekty. Objekty si pamatuj´ı sv˚ uj stav a navenek poskytuj´ı operace (pˇr´ıstupn´e jako metody pro vol´an´ı). Implementace objekt˚ u Z hlediska jazyka nen´ı velk´ y rozd´ıl mezi sloˇzen´ ymi datov´ ymi typy a tˇr´ıdami. Deklarace tˇr´ıdy obsahuje, stejnˇe jako u sloˇzen´eho dat. typu, datov´e poloˇzky. Nav´ıc ale obsahuje i deklarace funkc´ı (metod), kter´e s nimi pracuj´ı. Nˇekter´e funkce mohou m´ıt speci´ aln´ı vlastnosti – statick´e, virtu´aln´ı, konstruktory, destruktory. Nav´ıc vˇetˇsina jazyk˚ u pˇrid´ av´ a moˇznost oznaˇcen´ı kter´ ychkoliv poloˇzek jako veˇrejn´e nebo priv´atn´ı. Tˇr´ıdy mohou nˇekdy (C++, Java) obsahovat i vnoˇren´e datov´e typy (v´ yˇcty, ... ) a dokonce vnoˇren´e tˇr´ıdy. Za bˇehu je jedna instance tˇr´ıdy – objekt reprezentov´ana v pamˇeti pomoc´ı: • datov´ ych poloˇzek (stejnˇe jako sloˇzen´ y datov´ y typ), • skryt´ ych pomocn´ ych poloˇzek umoˇzn ˇuj´ıc´ıch funkci virtu´aln´ıch metod, v´ yjimek, RTTI a dˇediˇcnosti (identifikace typu / jeho velikosti apod.) Abstrakce Program´ ator, potaˇzmo program, kter´ y vytv´ aˇr´ı, m˚ uˇze abstrahovat od nˇekter´ ych detail˚ u pr´ace jednotliv´ ych objekt˚ u. Kaˇzd´ y objekt pracuje jako ˇcern´ a skˇr´ıˇ nka, kter´ a dok´ aˇze prov´adˇet urˇcen´e ˇcinnosti a komunikovat s okol´ım, aniˇz by vyˇzadovala znalost zp˚ usobu, kter´ ym vnitˇrnˇe pracuje. Zapouzdˇ ren´ı Zaruˇcuje, ˇze objekt nem˚ uˇze pˇr´ımo pˇristupovat k vnitˇrnostem“ jin´ ych objekt˚ u, coˇz by mohlo v´est k nekonzistenci. Kaˇzd´ y ” objekt navenek zpˇr´ıstupˇ nuje rozhran´ı, pomoc´ı kter´eho (a nijak jinak) se s objektem pracuje. Jake ma vyhody OOP proti pouze proceduralnimu programovani - Zacal jsem zapouzdrenim, kde me vcelku potrapil pure C jazykem jehoz moduly, .h soubory, pouziti staticu, ifdefu a dalsich konstruktu muze slouzit jako slusne zapouzdreni ukolem bylo rict na konkretnim jazyce co prinasi OOP navic (napr. vetsi granularita oddeleni (Java a viditelnost v Packagi, protected, final...)) We use these keywords to specify access levels for member variables, or for member functions (methods). • public variables, are variables that are visible to all classes. • private variables, are variables that are visible only to the class to which they belong. • protected variables, are variables that are visible only to the class to which they belong, and any subclasses.
121
Skl´ ad´ an´ı Objekt m˚ uˇze vyuˇz´ıvat sluˇzeb jin´ ych objekt˚ u tak, ˇze je poˇz´ad´a o proveden´ı operace. Tˇ r´ıda Tˇr´ıda definuje abstraktn´ı vlastnosti nˇejak´eho objektu, vˇcetnˇe obsaˇzen´ ych dat (atributy, pole (fields) a vlastnosti (properties)) a vˇec´ı, kter´e m˚ uˇze dˇelat (chov´ an´ı, metody a schopnosti (features)). Napˇr´ıklad tˇr´ıda Dog by obsahovala vˇeci spoloˇcn´e pro vˇsechny psy - napˇr. atributy rasa, barva srsti a schopnosti ˇstˇekat. Tˇr´ıdy poskytuj´ı v objektovˇe-orientovan´em programu modularitu a strukturu. Tˇr´ıda by typicky mˇela b´ yt rozpoznateln´ ai ne-program´ atorovi, kter´ y se ale v dan´e dom´enˇe probl´em˚ u orientuje – tzn. ˇze charakteristiky tˇr´ıdy by mˇely d´avat v kontextu ” smysl“. Podobnˇe i k´ od tˇr´ıdy by mˇel b´ yt relativnˇe samostan´e (”self-contained”)“. Vlastnosti a met´ody tˇr´ıd se dohromady ” naz´ yvaj´ı i members. Kontruktory Konstruktor je v objektovˇe orientovan´em programov´an´ı speci´aln´ı metoda tˇr´ıdy, kter´a se vol´a, kdyˇz je instance pˇrisluˇsn´eho objektu t´eto tˇr´ıdy novˇe vytv´ aˇrena. Konstruktor se podob´ a ostatn´ım metod´ am tˇr´ıdy, ale liˇs´ı se od nich t´ım, ˇze nem´a nikdy explicitn´ı n´avratov´ y typ, nedˇed´ı se a obvykle m´ a jin´ a pravidla pro modifik´ atory pˇr´ıstupu. Konstruktory inicializuj´ı datov´e ˇcleny. Spr´avnˇe napsan´ y konstruktor nech´ a objekt v platn´em“ stavu. ” Ve vˇetˇsinˇe jazyk˚ u m˚ uˇze b´ yt kontruktor pˇret´ıˇzen, takˇze m´a jedna tˇr´ıda nˇekolik konstruktor˚ u s odliˇsn´ ymi parametry. Nˇekter´e jazyky (napˇr. C++) rozliˇsuj´ı speci´ aln´ı typy konstruktor˚ u: • implicitn´ı konstruktor – konstruktor bez parametr˚ u • kop´ırovac´ı konstruktor – konstruktor, kter´ y m´ a jeden parametr typu dan´e tˇr´ıdy (nebo reference na n´ı) Dˇ ediˇ cnost Objekty jsou organizov´ any stromov´ ym zp˚ usobem, kdy objekty nˇejak´eho druhu mohou dˇedit z jin´eho druhu objekt˚ u, ˇc´ımˇz pˇreb´ıraj´ı jejich schopnosti, ke kter´ ym pouze pˇrid´ avaj´ı svoje vlastn´ı rozˇs´ıˇren´ı. Tato myˇslenka se obvykle implementuje pomoc´ı rozdˇelen´ı objekt˚ u do tˇr´ıd, pˇriˇcemˇz kaˇzd´ y objekt je instanc´ı nˇejak´e tˇr´ıdy. Kaˇzd´a tˇr´ıda pak m˚ uˇze dˇedit od jin´e tˇr´ıdy (v nˇekter´ ych programovac´ıch jazyc´ıch i z nˇekolika jin´ ych tˇr´ıd). Umoˇzn ˇuje zach´azet s mnoˇzinou tˇr´ıd, jako by byly vˇsechny reprezentov´ any t´ım sam´ ym objektem. Napˇr´ıklad zn´ am´ a hierarchie: grafick´ y objekt, bod, kruˇznice. Nav´ıc je to prostˇredek pro u ´sporu pr´ ace pˇri k´ odov´ an´ı. M´ ame dva druhy dˇediˇcnosti podle n´ asobnosti: • Jednoduch´ a dˇediˇcnost - kaˇzd´ a podtˇr´ıda dˇed´ı pouze z jedn´e supertˇr´ıdy • V´ıcen´ asobn´ a dˇediˇcnost - m˚ uˇzeme dˇedit z v´ıce tˇr´ıd A dalˇs´ı dva druhy dˇediˇcnosti podle pouˇzit´ı: • Implementation Inheritance: in which class inherits one class and implement/override its methods and properties for example Control object in which System.Windows.Forms.Textbox,System.Windows.Forms.Button both inherits their self from control class. But provides different functionality • Interface inheritance: in which a class inherits from Interface. For example IDisposable. It just inherits definition not implementation. Any type which does interface inheritance it means that it will provide defined functionality called as “Contract”. Implementace dˇ ediˇ cnosti v C++: Je-li tˇr´ıda B (pˇr´ım´ ym ˇci nepˇr´ım´ ym) potomkem tˇr´ıdy A, pak pamˇet’ov´ a reprezentace objektu typu B obsahuje ˇc´ ast, kter´ a m´ a stejn´ y tvar jako pamˇet’ov´a reprezentace samostatn´eho objektu typu A. Z kaˇzd´eho ukazatele na typ B je moˇzno odvodit ukazatel na ˇca´st typu A – tato konverze je implicitn´ı, tj. nen´ı tˇreba ji explicitnˇe uv´ adˇet ve zdrojov´em k´ odu. Tato konverze m˚ uˇze (obvykle pouze pˇri n´asobn´e dˇediˇcnosti) vyˇzadovat jednoduch´ y v´ ypoˇcet (pˇriˇcten´ı posunut´ı). Z ukazatele na typ A je moˇzno odvodit ukazatel na typ B, jen pokud konkr´etn´ı objekt, do kter´eho ukazuje ukazatel na typ A, je typu B (nebo jeho potomka). Zodpovˇednost za ovˇeˇren´ı skuteˇcn´eho typu objektu m´a program´ator a tuto konverzi je tˇreba explicitnˇe vynutit pˇretypov´ an´ım. M˚ uˇze to znamenat odeˇcten´ı posunut´ı v pamˇeti. Dˇ ediˇ cnost typu Diamant V´ıcen´ asobn´ a dˇediˇcnost bohuˇzel pˇrin´ aˇs´ı ˇradu probl´em˚ u. Z toho d˚ uvodu cel´a ˇrada objektovˇe orientovan´ ych jazyk˚ u nepodporuje v´ıcen´ asobnou dˇediˇcnost. Jeden z pˇr´ıklad˚ u je dˇediˇcnost typu diamant, kde tˇr´ıdy B a C jsou potomci nˇejak´e tˇr´ıdy A. Potom m´ a tˇr´ıda D, potomek tˇr´ıdy B a C, atributy z prapˇredka A dvakr´at. To lze ˇreˇsit pomoc´ı virtu´aln´ı dˇediˇcnosti. Implementace probl´ emu Diamant v C++: Postupuje po obou cest´ach oddˇelenˇe, takˇze objekt D pak obsahuje 2 separ´ atn´ı A objekty a k´ od pravdˇepodobnˇe skonˇc´ı na COMPILE ERROR. Pokud je dˇediˇcnost z A do B a A do C oznaˇcena jako ”virtual”(napˇr´ıklad ”class B : virtual public A”), C++ pak vytvoˇr´ı pouze 1 A objekt a jeho ˇc´asti budou spr´avnˇe fungovat. Pokud ale sm´ıch´ ame na obou virtu´ aln´ı a nevirtu´ aln´ı dˇediˇcnost dojde tak´e ke COMPILE ERROR - pˇri pˇr´ıstupu k ˇc´astem A z D.
122
Obr´ azek 14: Diamond problem
Virtu´ aln´ı metody V objektovˇe orientovan´em programov´ an´ı se pod pojmem virtu´aln´ı funkce nebo virtu´aln´ı metoda mysl´ı funkce/metoda (v k´ odu oznaˇcen´ a kl´ıˇcov´ ym slovem – typicky virtual), jej´ıˇz chov´an´ı je urˇceno definic´ı v posledn´ım objektu (ve smˇeru dˇediˇcnosti od rodiˇc˚ u k potomk˚ um), kter´ y definici funkce s danou signaturou obsahuje. Tento koncept je d˚ uleˇzitou souˇc´ast´ı polymorfismu v objektovˇe orientovan´em programov´ an´ı. Koncept virtu´ aln´ıch funkc´ı ˇreˇs´ı n´ asleduj´ıc´ı probl´em: Kdyˇz v OOP dˇed´ı nˇejak´ a tˇr´ıda od jin´e, tak instance podˇedˇen´e tˇr´ıdy m˚ uˇze b´ yt pˇretypov´ana na libovoln´eho ze sv´ ych pˇredk˚ u. Pokud vˇsak podˇedˇen´ a tˇr´ıda pˇredefinovala podˇedˇenou metody, nebude pˇri jej´ım pˇretypov´an´ı na pˇredka jasn´e, kterou z definic´ı metody pouˇz´ıt. Rozhodnut´ı ot´ azky, kterou funkci zavolat, pˇrin´ aˇs´ı pr´avˇe rozdˇelen´ı metod na virtu´aln´ı a nevirtu´aln´ı. Kdyˇz je funkce oznaˇcena jako virtu´ aln´ı, je pouˇzita definice funkce z podˇedˇen´e tˇr´ıdy (pokud existuje). V opaˇcn´em pˇr´ıpadˇe je pouˇzita definice ze tˇr´ıdy na kterou je instance tˇr´ıdy pr´ avˇe pˇretypov´ ana. Pozdn´ı vazba (late binding; virtual call): Je-li metoda nˇejak´e tˇr´ıdy virtu´aln´ı ˇci ˇcistˇe virtu´aln´ı, pak vˇsechny metody se stejn´ ym jm´enem, poˇctem a typy parametr˚ u deklarovan´e v potomc´ıch tˇr´ıdy jsou povaˇzov´any za r˚ uzn´e implementace t´eˇze funkce. Kter´ a implementace se vybere, tedy kter´e tˇelo bude zavol´ano, se rozhoduje aˇz za bˇehu programu podle skuteˇcn´eho typu cel´eho objektu. Pouˇzije se tˇelo z posledn´ıho potomka, kter´ y definuje tuto funkci a je souˇc´ast´ı cel´eho objektu. Pozdn´ı vazba m´ a smysl pouze u vyvol´ an´ı na objektu urˇcen´em odkazem. Pozdn´ı vazba je implementaˇcnˇe umoˇznˇen´ a skryt´ ym pointerem na tabulku virtu´ aln´ıch funkc´ı (VMT) uvnitˇr kaˇzd´eho objektu. Existuje pro kaˇzdou tˇr´ıdu jedna. Pˇri dˇediˇcnosti z˚ ust´av´a v cel´em objektu odkaz jeden (v C++ jich m˚ uˇze b´ yt pˇri v´ ysen´ asobn´e dˇediˇcnosti i v´ıce), ale (i pro nejvnitˇrnˇejˇs´ı“ b´ azovou tˇr´ıdu) odkazuje na tabulku odvozen´e tˇr´ıdy. V tabulce mus´ı b´ yt proto ” pointery na funkce, deklarovan´e uˇz u b´ azov´e tˇr´ıdy, um´ıstˇeny na zaˇc´atku (aby bylo moˇzn´e volat funkce b´azov´e tˇr´ıdy mezi sebou bez zmˇeny k´ odu). Polymorfismus Odkazovan´ y objekt se chov´ a podle toho, jak´ y je jeho skuteˇcn´ y typ. Pokud nˇekolik objekt˚ u poskytuje stejn´e rozhran´ı, pracuje se s nimi stejn´ ym zp˚ usobem, ale jejich konkr´etn´ı chov´an´ı se liˇs´ı. V praxi se tato vlastnost projevuje napˇr. tak, ˇze na m´ısto, kde je oˇcek´ av´ ana instance nˇejak´e tˇr´ıdy, m˚ uˇzeme dosadit i instanci libovoln´e jej´ı podtˇr´ıdy (tˇr´ıdy, kter´a pˇr´ımo ˇci nepˇr´ımo z t´eto tˇr´ıdy dˇed´ı), kter´ a se m˚ uˇze chovat jinak, neˇz by se chovala instance rodiˇcovsk´e tˇr´ıdy, ovˇsem v r´amci mantinel˚ u“, dan´ ych popisem ” rozhran´ı.
123
Pˇ r´ıklad polymorfismu, dˇ ediˇ cnosti (pˇ r´ıpadnˇ e zapouzdˇ ren´ı) v C#: namespace Program { public interface IAnimal { string Name { get; } string Talk(); } public abstract class AnimalBase { public string Name { get; private set; } protected AnimalBase(string name) { Name = name; } } public class Cat : AnimalBase, IAnimal { public Cat(string name) : base(name) { } public string Talk() { return "Meowww!"; } } public class Dog : AnimalBase, IAnimal { public Dog(string name) : base(name) { } public string Talk() { return "Arf! Arf!"; } } public class TestAnimals { // prints the following: // Missy: Meowww! // Mr. Mistoffelees: Meowww! // Lassie: Arf! Arf! // public static void Main(string[] args) { var animals = new List() { new Cat("Missy"), new Cat("Mr. Mistoffelees"), new Dog("Lassie") }; foreach (var animal in animals) { Console.WriteLine(animal.Name + ": " + animal.Talk()); } } } }
124
6.3
Neprocedur´ aln´ı programov´ an´ı, logick´ e programov´ an´ı
Neprocedur´ aln´ı programov´ an´ı Deklarativn´ı programov´ an´ı je postaveno na paradigmatu, podle nˇehoˇz je program zaloˇzen na tom, co se poˇc´ıt´a a ne jak se to poˇc´ıt´ a. Je zde deklarov´ an vstup a v´ ystup a cel´ y program je ch´ap´an jako funkce vyhodnocuj´ıc´ı vstupy pod´avaj´ıc´ı jedin´ y v´ ystup. Napˇr´ıklad i webovsk´e str´ anky jsou deklarativn´ı protoˇze popisuj´ı, jak by str´anka mˇela vypadat – titulek, font, text a obr´ azky – ale nepopisuj´ı, jak konkr´etnˇe zobrazit str´ anky na obrazovce. Logick´e programov´ an´ı a funkcion´ aln´ı programov´ an´ı jsou poddruhy deklarativn´ıho programov´an´ı. Logick´e programov´ an´ı vyuˇz´ıv´ a programov´ an´ı zaloˇzen´e na vyhodnocov´ an´ı vzor˚ u - tvrzen´ı a c´ıl˚ u. Klasick´ ym z´astupcem jazyka pro podporu tohoto stylu je Prolog. Tento pˇr´ıstup patˇr´ı pod deklarativn´ı programov´ an´ı stejnˇe jako funkcion´aln´ı programov´an´ı, nebot’ deklaruje, co je vstupem a co v´ ystupem, a nezab´ yv´ a se jak v´ ypoˇcet prob´ıh´ a. Naopak program jako posloupnost pˇr´ıkaz˚ u je paradigma imperativn´ı. Funkcion´ aln´ı programov´ an´ı patˇr´ı mezi deklarativn´ı programovac´ı principy. Alonzo Church vytvoˇril form´ aln´ı v´ ypoˇctov´ y model nazvan´ y λ-kalkul. Tento model slouˇz´ı jako z´aklad pro funkcion´ aln´ı jazyky. Funkcion´ aln´ı jazyky dˇel´ıme na: • typovan´e - Haskell • netypovan´e - Lisp, Scheme V´ ypoˇctem funkcion´ aln´ıho programu je posloupnost vz´ajemnˇe ekvivalentn´ıch v´ yraz˚ u, kter´e se postupnˇe zjednoduˇsuj´ı. V´ ysledkem v´ ypoˇctu je v´ yraz v norm´ aln´ı formˇe, tedy d´ ale nezjednoduˇsiteln´ y. Program je ch´ap´an jako jedna funkce obsahuj´ıc´ı vstupn´ı parametry maj´ıc´ı jedin´ y v´ ystup. Tato funkce pak m˚ uˇze b´ yt d´ ale rozloˇziteln´a na podfunkce. Prolog Prolog je logick´ y programovac´ı jazyk. N´ azev Prolog poch´az´ı z francouzsk´eho programmation en logique ( logick´e programov´ an´ı“). ” Byl vytvoˇren Alainem Colmerauerem v roce 1972 jako pokus vytvoˇrit programovac´ı jazyk, kter´ y by umoˇzn ˇoval vyjadˇrov´ an´ı v logice m´ısto psan´ı poˇc´ıtaˇcov´ ych instrukc´ı. Prolog patˇr´ı mezi tzv. deklarativn´ı programovac´ı jazyky, ve kter´ ych program´ ator popisuje pouze c´ıl v´ ypoˇctu, pˇriˇcemˇz pˇresn´ y postup, jak´ ym se k v´ ysledku program dostane, je ponech´an na libov˚ uli syst´emu. Prolog je vyuˇz´ıv´ an pˇredevˇs´ım v oboru umˇel´e inteligence a v poˇc´ıtaˇcov´e lingvistice (obzvl´aˇstˇe zpracov´an´ı pˇrirozen´eho jazyka, pro nˇejˇz byl p˚ uvodnˇe navrˇzen). Syntaxe jazyka je velice jednoduch´a a snadno pouˇziteln´a pravˇe proto, ˇze byl p˚ uvodnˇe urˇcen pro poˇc´ıtaˇcovˇe nepˇr´ıliˇs gramotn´e lingvisty. Prolog je zaloˇzen na predik´ atov´e logice prvn´ıho ˇr´ adu (konkr´etnˇe se omezuje na Hornovy klauzule). Bˇeh programu je pak pˇredstavov´ an aplikac´ı dokazovac´ıch technik na zadan´e klauzule. Z´akladn´ımi vyuˇz´ıvan´ ymi pˇr´ıstupy jsou unifikace, rekurze a backtracking. Interpret Prologu se snaˇz´ı nal´ezt nejobecnˇejˇs´ı substituci, kter´a spln´ı dan´ y c´ıl - tzn. nesubstituuje zbyteˇcnˇe, pokud nemus´ı uˇze b´ yt substituov´ana jedna intern´ı promˇenn´a (napˇr. pˇri hled´ an´ı (pouˇzit´ı intern´ıch promˇenn´ ych – 123 atd.). Za dvˇe promˇenn´e m˚ svisl´e u ´seˇcky – konstantn´ı X souˇradnice) – tomu se ˇr´ık´ a unifikace promˇenn´ ych. Pro promˇennou, jej´ıˇz hodnota m˚ uˇze b´ yt libovoln´ a, se v prologu uˇz´ıv´ a znak “. ” Datov´e typy v prologu se naz´ yvaj´ı termy. Z´ akladn´ım datov´ ym typem jsou atomy (zaˇc´ınaj´ı mal´ ym p´ısmenem, nebo se skl´ adaj´ı ze speci´ aln´ıch znak˚ u (+ - * / ..., nebo jsou to znakov´e ˇretˇezce (’text’)). D´ale jsou“ v prologu ˇc´ısla (v komerˇcn´ıch implemen” tac´ıch i re´ aln´ a), promˇenn´e (velk´e p´ısmeno) a struktury (definovan´e rekursivnˇe - pomoc´ı funktoru dan´e arity a pˇr´ısluˇsn´ ym poˇctem term˚ u, kter´e jsou jeho argumenty – okamzik(datum(1,1,1999),cas(10,10))). Posledn´ım typem promˇenn´ ych jsou seznamy, kter´e jsou prob´ır´ any pozdˇeji. Z´ akladn´ı principy: Programov´ an´ı v Prologu se v´ yraznˇe liˇs´ı od programov´an´ı v bˇeˇzn´ ych procedur´aln´ıch jazyc´ıch jako napˇr. C. Program v prologu je datab´ aze fakt˚ u a pravidel (dohromady se fakt˚ um a pravidl˚ um paradoxnˇe ˇr´ık´a procedury), nad kter´ ymi je moˇzno kl´ ast dotazy formou tvrzen´ı, u kter´ ych Prolog zhodnocuje jejich pravdivost (dokazatelnost z u ´daj˚ u obsaˇzen´ ych v datab´azi). Napˇr´ıklad lze do datab´ aze uloˇzit fakt, ˇze Monika je d´ıvka: d´ ıvka(monika). Pot´e lze dokazatelnost tohoto faktu provˇeˇrit ot´ azkou, na kterou Prolog odpov´ı yes (ano): ?- d´ ıvka(monika). yes. Tak´e se lze zeptat na vˇsechny objekty, o kter´ ych je zn´amo, ˇze jsou d´ıvky (stˇredn´ıkem poˇzadujeme dalˇs´ı v´ ysledky): ?- d´ ıvka(X). X = monika; no. Pravidla (z´ avislosti) se zapisuj´ı pomoc´ı implikac´ı, napˇr. syn(A,B) :- rodiˇ c(B,A), muˇ z(A).
125
Tedy: pokud B je rodiˇcem A a z´ aroveˇ n je A muˇz, pak A je synem B. Prvn´ı ˇc´asti pravidla (tj. d˚ usledku) se ˇr´ık´ a hlava a vˇsemu co n´ asleduje za symbolem :- (tedy podm´ınk´ am, nutn´ ym pro splnˇen´ı hlavy) se ˇr´ık´a tˇelo. Podm´ınky ke splnˇen´ı mohou b´ yt oddˇeleny bud’ ˇc´ arkou (pak jde o konjunkci, musej´ı b´ yt splnˇeny vˇsechny), nebo stˇredn´ıkem (disjunkce), pˇriˇcemˇz ˇc´arky maj´ı vˇetˇs´ı prioritu. Pˇ r´ıklad: Typickou uk´ azkou z´ aklad˚ u programov´ an´ı v Prologu jsou rodinn´e vztahy. sourozenec(X,Y) :- rodiˇ c(Z,X), rodiˇ c(Z,Y). rodiˇ c(X,Y) :- otec(X,Y). rodiˇ c(X,Y) :- matka(X,Y). muˇ z(X) :- otec(X,_). ˇ zena(X) :- matka(X,_). matka(marie,monika). otec(jiˇ r´ ı,monika). otec(jiˇ r´ ı,marek). otec(michal,tom´ aˇ s). Pr´ azdn´ y seznam je oznaˇcen atomem [], nepr´ azdn´ y se tvoˇr´ı pomoc´ı funktoru ’.’ (teˇcka) - .(Hlava,Tˇ elo). V praxi se to (naˇstˇest´ı ;-)) takhle sloˇzitˇe rekurzivnˇe zapisovat nemus´ı, staˇc´ı napsat [a,b,c...], resp [Zaˇ c´ atek | Tˇ elo], kde zaˇc´ atek je v´ yˇcet prvk˚ u (ne seznam) stoj´ıc´ıch na zaˇc´ atku definovan´eho seznamu, a tˇelo je (rekurzivnˇe) seznam (napˇr. [a,b,c|[]]). Aritmetick´e v´ yrazy se samy o sobˇe nevyhodnocuj´ı, dokud jim to nˇekdo nepˇrik´aˇze. Takˇze napˇr. predik´at 5*1 = 5 by selhal. Vyhodnocen´ı se vynucuje pomoc´ı oper´ atoru is (pomoc´ı = by doˇslo jen k unifikaci) - nen´ı to ale ekvivalent =“ z jin´ ych jazyk˚ u. ” Tento oper´ ator se mus´ı pouˇz´ıt na nˇejakou volnou promˇennou a aritmetick´ y v´ yraz, s jehoˇz hodnotou bude tato promˇenn´ a d´ ale sv´azan´ a (jako napˇr. X is 5*1,X=5 uspˇeje). D˚ uleˇzit´ y je i oper´ ator ˇrezu (znaˇc´ıme vykˇriˇcn´ıkem). Tento predik´at okamˇzitˇe uspˇeje, ale pˇri tom zak´aˇze backtrackov´ an´ı pˇres sebe zpˇet. (prvek1(X,[X|L]):-!. prvek1(X,[ |L]):-prvek1(X,L). - je-li prvek nalezen, je zak´az´an n´avrat = najde jen prvn´ı ˇ tedy v´ yskyt prvku). D´ ale je d˚ uleˇzit´ a negace (not(P):- P, !, fail. not(P). – uspˇeje, pokud se nepodaˇr´ı c´ıl P splnit). Rez umoˇzn ˇuje ovlivˇ novat efektivitu prologovsk´ ych program˚ u, definovat vz´ajemnˇe se vyluˇcuj´ıc´ı pouˇzit´ı jednotliv´ ych klauzul´ı procedury, definovat negaci atd. Haskell Haskell je standardizovan´ y funkcion´ aln´ı programovac´ı jazyk pouˇz´ıvaj´ıc´ı zkr´acen´e vyhodnocov´an´ı, pojmenovan´ y na poˇcest logika Haskella Curryho. Byl vytvoˇren v 80. letech 20. stolet´ı. Posledn´ım poloofici´aln´ım standardem je Haskell 98, kter´ y definuje minim´ aln´ı a pˇrenositelnou verzi jazyka vyuˇzitelnou k v´ yuce nebo jako z´aklad dalˇs´ıch rozˇs´ıˇren´ı. Jazyk se rychle vyv´ıj´ı, pˇredevˇs´ım d´ıky sv´ ym implementac´ım Hugs a GHC (viz n´ıˇze). Haskell je jazyk dodrˇzuj´ıc´ı referenˇcn´ı transparentnost. To, zjednoduˇsenˇe ˇreˇceno, znamen´a, ˇze tent´ yˇz (pod)v´ yraz m´ a na jak´emkoliv m´ıstˇe v programu stejnou hodnotu. Mezi dalˇs´ı v´ yhody tohoto jazyka patˇr´ı pˇr´ısn´e typov´ an´ı promˇenn´ych, kter´e program´ atorovi m˚ uˇze usnadnit odhalov´ an´ı chyb v programu. Haskell plnˇe podporuje pr´aci se soubory i standardn´ımi vstupy a v´ ystupy, kter´ a je ale pomˇernˇe sloˇzit´ a kv˚ uli zachov´ an´ı referenˇcn´ı transparentnosti. Jako takov´ y se Haskell hod´ı hlavnˇe pro algoritmicky n´ aroˇcn´e u ´lohy minimalizuj´ıc´ı interakci s uˇzivatelem. Pˇ r´ıklady: Definice funkce faktori´ alu: fac 0 = 1 fac n = n * fac (n - 1) Jin´ a definice faktori´ alu (pouˇz´ıv´ a funkci product ze standardn´ı knihovny Haskellu): fac n = product [1..n] Naivn´ı implementace funkce vracej´ıc´ı n-t´ y prvek Fibonacciho posloupnosti: fib 0 = 0 fib 1 = 1 fib n = fib (n - 2) + fib (n - 1) Elegantn´ı z´ apis ˇrad´ıc´ıho algoritmu quicksort: qsort [] = [] qsort (pivot:tail) = qsort left ++ [pivot] ++ qsort right where left = [y | y <- tail, y < pivot] right = [y | y <- tail, y >= pivot] TODO: popsat str´ aˇze (pˇr´ıpady, otherwise), seznamy, ˇretˇezen´ı, pattern matching u parametr˚ u funkc´ı, lok. definice (where, let) – patˇr´ı to sem? 126
Lisp Lisp je funkcion´ aln´ı programovac´ı jazyk s dlouhou histori´ı. Jeho n´azev je zkratka pro List processing (zpracov´an´ı seznam˚ u). Dnes se st´ ale pouˇz´ıv´ a v oboru umˇel´e inteligence. Nic ale nebr´an´ı ho pouˇz´ıt i pro jin´e u ´ˇcely. Pouˇz´ıv´a ho napˇr´ıklad textov´ y editor Emacs, GIMP ˇci konstrukˇcn´ı program AutoCAD. Dalˇs´ı jazyky od nˇej odvozen´e jsou napˇr´ıklad Tcl, Smalltalk nebo Scheme. Syntaxe: Nejz´ akladnˇejˇs´ım z´ apisem v Lispu je seznam. Zapisujeme ho jako: (1 2 "ahoj" 13.2) Tento seznam obsahuje ˇctyˇri prvky: • • • •
cel´e ˇc´ıslo 1 cel´e ˇc´ıslo 2 text ahoj“ ” re´ aln´e ˇc´ıslo 13,2
Jde tedy o uspoˇr´ adanou ˇctveˇrici. Vˇsimnˇete si, ˇze z´avorky nefunguj´ı tak jako v matematice, ale pouze oznaˇcuj´ı zaˇc´ atek a konec seznamu. Seznamy jsou v Lispu implementov´ any jako bin´arn´ı strom degenerovan´ y na jednosmˇernˇe v´azan´ y seznam. Co se seznamem Lisp udˇel´ a, z´ aleˇz´ı na okolnostech. Pˇ r´ıkazy: Pˇr´ıkazy p´ıˇseme tak´e jako seznam, prvn´ı prvek seznamu je vˇsak n´azev pˇr´ıkazu. Napˇr´ıklad sˇc´ıt´an´ı prov´ad´ıme pˇr´ıkazem +, coˇz interpreteru zad´ ame takto: (+ 1 2 3) Interpretr odpov´ı 6. Uk´ azka k´ odu: Program hello world lze zapsat nˇekolika zp˚ usoby. Nejjednoduˇs´ı vypad´a takto: (format t "Hello, World!") Funkce se v Lispu definuj´ı pomoc´ı kl´ıˇcov´eho slova defun: (defun hello () (format t "Hello, World!") ) (hello) Na prvn´ıch dvou ˇr´ adc´ıch je definice funkce hello, na tˇret´ım ˇr´adku je tato funkce sv´ ym jm´enem zavol´ana. Funkc´ım lze pˇred´ avat i argumenty. V n´ asleduj´ıc´ım pˇr´ıkladu je uk´ azka funkce fact, kter´a vypoˇc´ıt´a faktori´al zadan´eho ˇc´ısla: (defun fact (n) (if (= n 0) 1 (* n (fact (- n 1))) ) ) Pro v´ ypoˇcet faktori´ alu ˇc´ısla 6 pˇred´ ame tuto hodnotu jako argument funkci fact: (fact 6) N´avratovou hodnotou funkce bude hodnota 720. Logick´ e programov´ an´ı TODO (nen´ı souˇc´ ast´ı ot´ azek pro obor Programov´ an´ı)
127
6.4
Generick´ e programov´ an´ı – ˇ sablony a generika
Z´akladn´ı myˇslenkou, kter´ a se skr´ yv´ a za pojmem generick´e programov´an´ı, je rozdˇ elen´ı k´ odu programu na algoritmus a datov´ e typy takov´ ym zp˚ usobem, aby bylo moˇ zn´ e z´ apis k´ odu algoritmu ch´ apat jako obecn´ y, bez ohledu na to, nad jak´ ymi datov´ ymi typy pracuje. Konkr´etn´ı k´ od algoritmu se z nˇej st´av´a dosazen´ım datov´eho typu. U kompilovan´ ych jazyk˚ u doch´ az´ı k rozvinut´ı k´ odu v dobˇe pˇrekladu. Typick´ ym pˇr´ıkladem jazyka, kter´ y podporuje tuto formu generick´eho programov´ an´ı, je jazyk C++. Mechanismem, kter´ y zde generick´e programov´an´ı umoˇzn ˇuje, jsou takzvan´e ˇsablony (templates). Pozn´ amka (Metaprogramov´ an´ı a Generick´e programov´ an´ı) ´ Generick´e programov´ an´ı se liˇs´ı od norm´ aln´ıho t´ım, ˇze rozˇsiˇruje jazyk o moˇznosti metaprogramov´an´ı. Uzce souvis´ı s metaprogramov´ an´ım, ale negeneruje ˇz´ adn´ y dalˇs´ı zdrojov´ y k´ od (alespoˇ n ne takov´ y jak´ y by vidˇel program´ator). Liˇs´ı se od maker, protoˇze ty prov´ adˇej´ı jen preprocesorov´e ”search-and-replace”a nejsou souˇc´ast´ı gramatiky jazyka (viz n´ıˇze podrobnˇejˇs´ı srovn´ an´ı). Jedin´ a vyj´ımka jsou makra a v Common Lisp, kde parsuj´ı stromy a ne text (?? zkontrolovat Lisp). ˇ Definice (Sablony) ˇ Sablony jsou pouˇz´ıv´ any kompil´ atorem pro vygenerov´an´ı doˇcasn´eho zdrojov´eho k´odu, kter´ y se pak spoj´ı se zbytkem a je pak zkompilov´ an. V´ ystup ˇsablon m˚ uˇzou tvoˇrit compile-time konstanty , datov´e struktury i cel´e funkce. Pouˇzit´ı ˇsablon m˚ uˇze b´ yt ch´ ap´ ano jako spouˇstˇen´ı k´ odu bˇehem kompilace. Tato technika je pouˇz´ıv´ana v mnoha jazyc´ıch, napˇr´ıklad C++, Curl, D a XL. Obyˇcejn´e fce v C++ maj´ı pˇrednost pˇred generick´ ymi. Pˇ r´ıklad (Tˇr´ıda parametrizovan´ a typem (kontejner)) Pˇr´ıklad ukazuje v´ yhodu generick´eho programov´ an´ı, m´ısto abychom psali specifickou implementaci pro kaˇzd´ y typ (i kdyˇz bude k´ od t´emˇeˇr identick´ y), vytvoˇr´ıme si ˇsablonu tˇr´ıdy: template class List { T x; List *next; }; List list_of_animals; List list_of_cars; ... conductor = root; while ( conductor != NULL ) { cout<< conductor->x; conductor = conductor->next; } T reprezentuje typ kter´ y bude instanciov´ an. Vygenerovan´ y List se pak chov´a jako List podle urˇcen´eho typu. Tyto ”kontejnerytypu-T”, bˇeˇznˇe naz´ yvan´e generiky (anglicky ”generics”), je programovac´ı technika umoˇzn ˇuj´ıc´ı definici tˇr´ıdy kter´ a pˇrij´ım´ a a obsahuje r˚ uzn´e datov´e typy (neplet’me si ted’ s dynamick´ ym polymorfismem, kter´ y je algoritmicky pouˇz´ıv´a z´amˇenn´e podtˇr´ıdy). I kdyˇz toto je nejˇcastˇejˇs´ı pouˇzit´ı generick´eho programov´an´ı (a nˇekter´e jazyky implementuj´ı pouze tento aspekt), generick´e programov´ an´ı obsahuje i dalˇs´ı techniky. ˇ Pˇ r´ıklad (Sablony vs. makra) V mnoha smˇerech ˇsablony funguj´ı stejnˇe jako ˇsablony pre-procesoru, nahrazuj´ı ˇsablonovanou promˇennou dan´ ym typem. Na druhou stranu je tu mnoho rozd´ıl˚ u mezi makrem jako toto: #define min(i, j) (((i) < (j)) ? (i) : (j)) a a ˇsablonou: template T min (T i, T j) { return ((i < j) ? i : j) } Makro m´ a napˇr´ıklad tyto probl´emy: • Kompil´ ator nem˚ uˇze zkontrolovat jestli jsou parametry makra (tj. i,j) kompatibiln´ı typy. Makro se pouˇzije bez typov´e kontroly. • Hodnoty i a j jsou vyhodnoceny dvakr´ at. Napˇr´ıklad pokud jeden parametr pouˇz´ıv´a post-inkrementaci je provedena dvakr´ at (?? tohle chce ovˇeˇrit). • Protoˇze jsou makra jsou interpretov´ ana preprocesorem, chybov´e zpr´avy kompil´atoru budou ukazovat na ”rozbalen´ y”v´ ysledek makra v k´ odu a ne na makro (i kdyˇz chyba bude v nˇem).
128
Pˇ r´ıklad (Faktori´ al pomoc´ı ˇsablon) Tento pˇr´ıklad jasnˇe ukazuje v´ yhodu nad makry, v nich takto jednoduˇse rekurzivn´ı konstrukce napsat nejde (alespoˇ n v C++ ne). template struct Factorial { enum { value = N * Factorial::value }; }; template <> struct Factorial<0> { enum { value = 1 }; }; // pouˇ zit´ ı: int x = Factorial<4>::value; // == 24 int y = Factorial<0>::value; // == 1 Pˇ r´ıklad (traits) Programovac´ı technika vyuˇz´ıvaj´ıc´ı ˇsablony, ze kter´ ych nejsou vytv´aˇreny objekty. Urˇceny k doplnˇen´ı informac´ı o nˇejak´em typu. Obsahuj´ı pouze definice typ˚ u a statick´e funkce. template< typename T > struct is_void{ static const bool value = false; }; template<> struct is_void< void >{ static const bool value = true; }; // pouˇ zit´ ı: is_void::value; // false is_void::value; // true
129
Pˇ r´ıklad (policy classes) Urˇceny k definov´ an´ı urˇcit´eho chov´ an´ı. Jsou to tˇr´ıdy, ze kter´ ych obvykle nejsou vytv´aˇreny objekty a jsou pˇred´ av´ any jako parametr ˇsablon´ am. Defaultn´ı hodnotou parametru ˇcasto b´ yv´a ˇsablona traits. Hlavnˇe spojen´e s C++ (v ostatn´ıch jazyc´ıch se zat´ım nerozˇs´ıˇrilo). template < typename output_policy, typename language_policy > class HelloWorld : public output_policy, public language_policy { using output_policy::Print; using language_policy::Message; public: void Run() //behaviour method { //two policy methods Print( Message() ); } }; class OutputPolicy_WriteToCout { protected: template< typename message_type > void Print( message_type message ) { std::cout << message << std::endl; } }; class LanguagePolicy_English { protected: std::string Message() { return "Hello, World!"; } }; class LanguagePolicy_German { protected: std::string Message() { return "Hallo Welt!"; } }; int main() { /* example 1 */ HelloWorld hello_world.Run(); // Prints "Hello, World!"
hello_world;
/* example 2 * does the same but uses another policy, the language has changed */ HelloWorld hello_world2; hello_world2.Run(); // Prints "Hallo Welt!" }
130
Definice (Dynamick´y (run-time) polymorfismus) Dˇedˇen´ı + VMT = flexibilita. Zde uvedeno jako jako srovn´an´ı k ˇsablon´am. class Base { public: virtual void method() { std::cout << "Base"; } virtual ~Base() {} }; class Derived : public Base { public: virtual void method() { std::cout << "Derived"; } }; int main() { Base *pBase = new Derived; pBase->method(); //outputs "Derived" delete pBase; return 0; } Lze rozˇs´ıˇrit o ˇsablony. Definice (Statick´y (compile-time) polymorfismus) Je pˇretˇeˇzov´ an´ı fukc´ı a oper´ ator˚ u, ˇreˇs´ı se pˇri kompilaci = rychlost. Pˇr´ıpadnˇe jeho varianta s ˇsablonami: template struct base { void interface() { // ... static_cast(this)->implementation(); // ... } }; struct derived : base<derived> { void implementation(); }; Lze tak dos´ ahnout podobn´ ych vˇec´ı jako s VMT. Pouˇ zit´ı v programovac´ıch jazyc´ıch Jazyk D tak´e nab´ız´ı plnˇe generick´e ˇsablony zaloˇzen´e na sv´em pˇredch˚ udci C++ ale m´a jednoduˇsˇs´ı syntaxi. Java m´ a syntaxi generick´eho programov´ an´ı zaloˇzenou na C++ od uveden´ı J2SE 5.0 a implementuje generiky (anglicky ”generics”) neboli ”kontejnery-typu-T”(tedy pouze podmnoˇzinu generick´eho programov´an´ı). Report (IP 21.6.2011) Co je to generick´e programov´ an´ı, k ˇcemu se pouˇz´ıv´ a a v ˇcem spoˇc´ıvaj´ı jeho v´yhody? Napiˇste struˇcnou implementaci generick´e tˇr´ıdy List nebo HashTable. Popiˇste implementaci v C++ a Javˇe (asi by staˇcil i C#, ale v zad´ an´ı byla explicitnˇe napsan´ a java). Report (IP 21.6.2011 (<2007)) Popiste sablony Jak jsou implementovany (popiste jak jsou implementovany v C++ nebo Java) (to som teda fakt netusil) Report (IOI 21.6.2011 (<2007)) Co je to generick´e programov´ an´ı, k ˇcemu se pouˇz´ıv´ a a v ˇcem spoˇc´ıvaj´ı jeho v´yhody? Napiˇste struˇcnou implementaci generick´e tˇr´ıdy List nebo HashTable. Report (Yaghob) Co je to traits a policy classes, co je to statick´y polymorfismus apod. Nakonec jsem to nˇejak vymyslel a shodli jsme se na tom, ˇze to v´ım, takˇze taky za 1.
131