Statnice Jadro Aplikovana Informatika

99
Abstraktné údajové typy (AUT) - abstrakcia – nástroj v procese poznávania, myšlienkové vymedzenie podstatných znakov javu alebo predmetu, súhrn pravidiel myšlienkovej činnosti vedúcej k vymedzeniu podstatných znakov Reprezentácia AUT: štruktúrovaný údajový typ trieda Trieda – množina objektov s rovnakými vlastnosťami, správaním a vzťahom k iným objektom Objekt – konkrétny výskyt entity danej množiny – inštancia triedy - dátové položky (členské dáta, atribúty) – vlastnosti objektu - operácie (členské funkcie, metódy) – správanie sa objektu - dátové typy, ktoré vo vyšších programovacích jazykoch musia byť definované pomocou nízkoúrovňových operácii - Použitie abstraktných údajových typov namiesto primitívnych dátových typov vo vyšších programovacích jazykoch uľahčuje prácu programátora. - AUT poskytuje pre svojho klienta rozhranie na vyššej úrovni špecifikujúce chovanie objektov príslušnej triedy (napríklad v prípade triedy Stack, interface pozostáva z metód: push, pop a top definujúcich vysokoúrovňové operácie nad triedou Stack) - AUT takto zároveň ukrýva pred klientom svoje nízkoúrovňové implementačné detaily Pole Pole je homogénna štruktúra; pozostáva z prvkov, ktoré sú všetky jediného typu. Tento typ prvku poľa sa nazýva bázový alebo základný typ. Pole pokladáme za štruktúru s náhodným prístupom; všetky prvky môžu byť vybraté náhodne a sú rovnako sprístupnitelné. Na referenciu individuálneho prvku poľa je potrebné použiť meno celej štruktúry rozšírené o index, určujúci vybratý prvok. Index nadobúda hodnoty typu, definovaného ako typ indexu poľa. Metódy: empty - konštrukcia poľa prázdneho read - čítanie daného prvku poľa write - zápis daného prvku poľa na dané miesto low - dolná hranica indexu poľa high - horná hranica indexu poľa isempty - test, či je pole prázdne iseq - test, či sa dva indexy rovnajú Reťazec (string) Pod reťazcom rozumieme usporiadanú n-ticu prvkov danej množiny. Počet prvkov v reťazci určuje jeho dĺžku. Reťazec s nulovou dĺžkou nazývame prázdny reťazec. Metódy: length – vráti dĺžku reťazca empty – test, či je reťaxec prázdny append – pridanie reťazca alebo jeho časti (na koniec reťazca) compare – porovná reťazce

Transcript of Statnice Jadro Aplikovana Informatika

Page 1: Statnice Jadro Aplikovana Informatika

Abstraktné údajové typy (AUT)

- abstrakcia – nástroj v procese poznávania, myšlienkové vymedzenie podstatných znakov javu alebo predmetu, súhrn pravidiel myšlienkovej činnosti vedúcej k vymedzeniu podstatných znakov

Reprezentácia AUT: štruktúrovaný údajový typ trieda

Trieda – množina objektov s rovnakými vlastnosťami, správaním a vzťahom k iným objektomObjekt – konkrétny výskyt entity danej množiny – inštancia triedy

- dátové položky (členské dáta, atribúty) – vlastnosti objektu- operácie (členské funkcie, metódy) – správanie sa objektu

- dátové typy, ktoré vo vyšších programovacích jazykoch musia byť definované pomocou nízkoúrovňových operácii

- Použitie abstraktných údajových typov namiesto primitívnych dátových typov vo vyšších programovacích jazykoch uľahčuje prácu programátora.

- AUT poskytuje pre svojho klienta rozhranie na vyššej úrovni špecifikujúce chovanie objektov príslušnej triedy (napríklad v prípade triedy Stack, interface pozostáva z metód: push, pop a top definujúcich vysokoúrovňové operácie nad triedou Stack)

- AUT takto zároveň ukrýva pred klientom svoje nízkoúrovňové implementačné detaily

Pole

Pole je homogénna štruktúra; pozostáva z prvkov, ktoré sú všetky jediného typu. Tento typ prvku poľa sa nazýva bázový alebo základný typ. Pole pokladáme za štruktúru s náhodným prístupom; všetky prvky môžu byť vybraté náhodne a sú rovnako sprístupnitelné. Na referenciu individuálneho prvku poľa je potrebné použiť meno celej štruktúry rozšírené o index, určujúci vybratý prvok. Index nadobúda hodnoty typu, definovaného ako typ indexu poľa.

Metódy: empty - konštrukcia poľa prázdneho read - čítanie daného prvku poľa write - zápis daného prvku poľa na dané miesto low - dolná hranica indexu poľa high - horná hranica indexu poľa isempty - test, či je pole prázdne iseq - test, či sa dva indexy rovnajú

Reťazec (string)

Pod reťazcom rozumieme usporiadanú n-ticu prvkov danej množiny. Počet prvkov v reťazci určuje jeho dĺžku. Reťazec s nulovou dĺžkou nazývame prázdny reťazec.

Metódy: length – vráti dĺžku reťazcaempty – test, či je reťaxec prázdnyappend – pridanie reťazca alebo jeho časti (na koniec reťazca)compare – porovná reťazce

Page 2: Statnice Jadro Aplikovana Informatika

find – hľadanie reťazca v reťazci

Zásobník (stack)

Je typ údajov, ktorý možno zo statického hľadiska stotožniť s reťazcom. Ide tiež o postupnosť prvkov, ktorú však možno meniť iba na jednom konci. Prvky možno pridávať alebo vyberať iba na jednom konci, ktorý nazývame vrchom zásobníka. Spôsob práce so zásobníkom najlepšie charakterizuje veta "posledný dnu, prvý von". Často sa preto označuje názvom LIFO (Last In First Out).

Metódy: empty – test, či je zásobník prázdnysize – vráti veľkosť zásobníkatop – sprístupní ďalší element (prvok) zásobníkapush – pridá element do zásobníkapop – odobratie elementu z vrcholu zásobníka

Front (buffer)

Je údajová štruktúra typu FIFO (first in, first out), používaná ako buffer pri prenose a operačnej analýze. Najvýznamnejšími operáciami sú zaraď do frontu (enqueue) a vyber z frontu (dequeue). Zaraďuje sa na koniec frontu a vyberá sa zo začiatku frontu, pričom vybraná položka sa odstráni.

Metódy: empty - vytvorenie prázdneho frontu, insert - pridanie prvku do frontu, first - prečítanie prvku z frontu, remove - zrušenie prvku vo fronte, isempty - test, či je front prázdny.

Tabuľka

Tabuľka je množina prvkov identifikovateľných pomocou tzv. kľúča. Kľúč je súčasťou prvku a vyhradenou časťou prvku. V porovnaní s poľom je tabuľka určitým zovšeobecnením poľa. Pri poli je s prvkom spojený index, pri tabuľke kľúč. Na rozdiel od poľa je kľúč súčasťou prvku a môže to byť ľubovoľná časť prvku, ktorá nás z hľadiska aplikácie zaujíma. S prvkom môže byť spojených aj viac kľúčov.

Metódy: read - čítanie prvku určeného daným kľúčom write - zápis daného prvku do tabuľky isin - test, či je prvok s daným kľúčom v tabuľke delete - zrušenie prvku v tabuľke iseq - test, či sa dva kľúče rovnajú isreal - test, či sú dva kľúče v relácii kl - určenie kľúča daného prvku

Page 3: Statnice Jadro Aplikovana Informatika

Množina

Je taký typ údajov, ktorého prvkami sú konečné množiny a operáciami sú množinové operácie. Možno ju považovať za základný typ údajov, ktorý používame na špecifikáciu iných typov údajov. Niektoré typy údajov možno považovať za špeciálny prípad typu údajov množina. Pri špecifikácii typu údajov množina budeme predpokladať, že prvky množiny sú konečné množiny rovnakého typu.

Metódy: empty - vytvorenie prázdnej množiny, insert - pridanie prvku do množiny, delete - zrušenie prvku v množine, union - zjednotenie množiny, intersect -prienik množiny, isin -test, či sa nachádza prvok v množine, isempty - test, či je množina prázdna, issubset - test na podmienku, iseq - test, či sa dva prvky rovnajú.

Množinu implementujeme : logickým poľom. binárnym vyhľadávacim stromom (BVS)vyváženým stromom.

Usporiadaná množina - je tu definovaná relácia usporiadania.

Zoznam

Lineárny zoznam

Jednosmerný lineárny zoznam obsahuje prvky (uzly), z ktorých každý má jednu položku ukazovateľ. Tieto ukazovatele sú nastavené tak, aby ukazovali na prvok nasledujúci v zozname. Ak od prvku, na ktorý ukazuje ukazovateľ z, začíname prezerať zoznam, môžeme prejsť každý prvok zoznamu práve raz.

Cyklický zoznam

Cyklický zoznam je taký lineárny zoznam, ktorého uzly tvoria uzavretý "logický kruh". Ukazovateľ v poslednom uzle zoznamu nemá hodnotu NULL, ale ukazuje na prvý uzol t.j. začiatok zoznamu.

Metódy:empty - vytvorenie prázdneho zoznamu, first - (začiatok zoznamu) zoznam, ktorý bol sprístupnený prostredníctvom niektorého jeho (ľubovoľného) prvku, bude prístupný prostredníctvom prvého prvku, last - (koniec zoznamu) zoznam, ktorý bol sprístupnený prostredníctvom niektorého jeho (ľubovoľného) prvku, bude prístupný prostredníctvom jeho posledného prvku, next - (nasledujúci prvok) zoznam, ktorý bol sprístupnený prostredníctvom niektorého jeho (ľubovoľného) prvku, bude prístupný prostredníctvom nasledujúceho prvku, previous - (predchádzajúci prvok) zoznam, ktorý bol sprístupnený prostredníctvom niektorého jeho (ľubovoľného) prvku, bude prístupný prostredníctvom predchádzajúceho prvku,

Page 4: Statnice Jadro Aplikovana Informatika

read - vrátenie hodnoty toho prvku zoznamu, prostredníctvom ktorého je zoznam sprístupnený, P-insert - vloženie nového prvku pred prvok, prostredníctvom ktorého je zoznam sprístupnený, N-insert - vloženie nového prvku za prvok, prostredníctvom ktorého je zoznam sprístupnený, P-delete - zrušenie toho prvku zoznamu, prostredníctvom ktorého je zoznam sprístupnený a sprístupnenie zoznamu prostredníctvom predchádzajúceho prvku, N-delete - zrušenie toho prvku zoznamu, prostredníctvom ktorého je zoznam sprístupnený a sprístupnenie zoznamu prostredníctvom nasledujúceho prvku, isempty - test, či je zoznam prázdny.

Reprezentácia zoznamu musí zahrnovať dve veci:- reprezentáciu samotného zoznamu, t.j. všetkých prvkov v danej postupnosti, - reprezentáciu pozície prvku, prostredníctvom ktorého je zoznam prístupný. Schéma reprezentácie zoznamu:Z - samotný zoznamP - pozícia sprístupnenia. Konkrétny spôsob implementácie závisí, od voľby implementujúceho typu údajov. Veľmi elegantná je implementácia v jazyku pascal s použitím smerníkov.

Graf

Pod grafom G rozumieme dvojicu (V, H), teda G = ( V, H ), kde V je množina vrcholov, H je množina hrán. Hovoríme, že dvojica vrcholov z H, ktoré definujú príslušnú hranu, s touto hranou incidujú. Ak dvojice z H považujeme za usporiadané, hovoríme o orientovanom grafe, ak ich považujeme za neusporiadané, hovoríme o neorientovanom grafe. V aplikáciách sa najčastejšie stretávame s ohodnotenými grafmi, keď s množinou vrcholov, hrán alebo obidvoma množinami je prostredníctvom určitého zobrazenia spojená iná množina. Hovoríme potom o vrcholovo, hranovo alebo vrcholovo i hranovo ohodnotenom grafe.

Špecifikácia grafu:Vzhľadom na rozmanitosť aplikácií grafov je aj špecifikácia grafu, ako údajového typu, závislá od prostredia, v ktorom sa graf bude používať.Metódy: empty - vytvorenie grafu

V-insert - pridanie vrcholu do grafu H-insert - pridanie hrany do grafu V-delete - zrušenie vrchola v grafe H-delete - zrušenie hrany v grafe isempty - test, či je graf prázdny

Ako ďalšie operácie možno uvažovať napr. prienik grafov, zjednotenie grafov, výber špeciálneho grafu ako je kostra, cesta, cyklus, ap.

Implementácia grafu:Základný problém implementácie grafu je jeho reprezentácia. Najčastejšie sa používajú reprezentácie:

Page 5: Statnice Jadro Aplikovana Informatika

a. incidenčnou maticou, b. zoznamom. Implementácia operácií typu údajov graf si vyžaduje sprístupnenie vrcholov, ktoré je spojené s určitou formou prechádzania grafom alebo prehľadávania grafu. Aj keď je viac možností prehľadávania grafu, najčastejšie sa používajú dve: 1. prehľadávanie do šírky, paralelné prehľadávanie, 2. prehľadávanie do hĺbky. Pri prehľadávaní do šírky prezrieme začiatočný vrchol. V ďalšom kroku všetkých priamych nasledovníkov, v ďalšom všetkých ich nasledovníkov atď. Pri prehľadávaní do hĺbky postupujeme po jednej hrane resp. vrchole. Najskôr prezrieme začiatočný vrchol. Potom zistíme, či má nasledovníkov, ktorých sme ešte neprezreli. Ak áno, vyberieme jedného a celý proces opakujeme na tomto vrchole. Ak nie, zistíme, či má predchodcu. Ak áno, celý proces opakujeme na tomto vrchole. Ak nie, STOP, graf je prezretý. Pri grafe z topiku incidenčná matica a za predpokladu, že začiatočný vrchol je v 1, bude prezeranie prebiehať takto: Prehľadávanie do šírky Prehľadávanie do hĺbky v1 v1 v2,v3 v2 (v3),v4 v3 (v1) v4 (v1) (v3)

Strom

Strom, ako špeciálny prípad grafu, možno implementovať rovnakými prostriedkami ako graf. Okrem toho však využívame špecifické vlastnosti stromu. Strom možno teda implementovať pomocou incidenčnej matice, no reprezentácia incidenčnou maticou je neefektívna. Najprirodzenejšia implementácia stromov je pomocou zoznamov. Strom obsahuje množinu prvkov (vrcholov) s jedným špeciálnym vrcholom - koreňom. Nad vrcholmi je definovaná relácia (vzťah "rodič" - "dieťa"), ktorá vyjadruje hierarchickú štruktúru medzi vrcholmi. Strom môžeme definovať takto: 1. Jediný vrchol je strom. Tento vrchol je súčasne koreň tohto stromu. 2. Nech v je vrchol a S1,S2,......,Sk sú stromy s koreňmi v1,v2,.....,vk. Môžeme zostrojiť nový strom tak, že urobíme vrchol v predchodcom (otcom) vrcholov v1,v2,....,vk. V tomto strome je v koreň a S1,S2.....,Sk sú jeho podstromy. Vrcholy v1,v2,.....,vk sú nasledovníci (synovia) vrcholu v. Niekedy je užitočné považovať za strom aj tzv. prázdny strom, t.j. strom bez vrcholov. Nasledovníci vrcholu sú zvyčajne usporiadaní zľava doprava. Možno potom hovoriť o najľavejšom nasledovníkovi alebo o pravom susedovi nejakého vrcholu. Usporiadanie medzi nasledovníkmi vrcholov možno rozšíriť na všetky vrcholy stromu. Najdôležitejšie spôsoby usporiadania vrcholov stromu sú určené tzv. priamym prehľadávaním (preorder), vnútorným prehľadávaním (inorder), a spätným prehľadávaním (postorder).Podľa charakteru jednotlivých problémových aplikácií možno špecifikovať rôzne špeciálne prípady stromu. Napr. binárny strom je strom, v ktorom má každý vrchol najviac dvoch nasledovníkov označených buď ako ľavý, alebo ako pravý nasledovník.

Page 6: Statnice Jadro Aplikovana Informatika

Koreň stromu je podľa definície na prvej úrovni. Maximálnu úroveň ľubovoľného prvku v strome nazývame jeho hĺbkou alebo výškou. Ak nejaký prvok nemá nasledovníkov, hovoríme, že je koncovým prvkom alebo listom stromu.

Binárne stromy a metódy prehľadávania

Je to alebo prázdny strom, alebo strom, v ktorom každý vrchol nemá nasledovníkov alebo má ľavého nasledovníka alebo pravého nasledovníka, alebo má ľavého a pravého nasledovníka.

Binárny strom implementujeme pomocou : poľa, voľne zreťazenou pamäťou.

Rozdiel oproti usporiadanému, orientovanému stromu je vtom, že v binárnom strome je každý nasledovník buď ľavý, alebo pravý nasledovník.

Prehľadávanie: Preorder - najprv spracujeme informáciu v samotnom vrchole (napr. ju vypíšeme), potom rekurzívne spustíme tento algoritmus pre ľavý podstrom a na záver pre pravý podstrom. Inorder - najprv spracuje ľavý podstrom, potom spracuje informáciu vo vrchole a na záver pravý podstrom. Postorder - najprv spracuje ľavý, potom pravý podstrom a na záver informáciu v samotnom vrchole.

Page 7: Statnice Jadro Aplikovana Informatika

Programovacie techniky - 2. otázka : Smerníky a dynamické údaje, typ smerník, pojem dynamického údaju, prideľovanie a uvoľňovanie dynamickej pamäte, dynamické programovanie. Zreťazene zoznamy, implementácia pomocou poľa, dynamická implementácia, dvojmo zreťazene zoznamy, kruhové zoznamy, stromy a grafy.

Smerník

Charakteristickým rysom jazyka C je možnosť komplexného využívania smerníkov (pointrov) a smerníkovej aritmetiky. S použitím smerníkov sa stretávame pri spracovaní

• premenných• polí• reťazcov• parametrov funkcií• dynamických objektov• funkcií (smerník na funkciu).

Správne pochopenie a používanie smerníkov je na jednej strane silnou stránkou a prednosťou jazyka C, kým na druhej strane ich nesprávne použitie sa mení v rukách užívateľa na nebezpečnú zbraň, čo môže v lepšom prípade mať za následok prístup k "nesprávnyn" údajom, v horšom prípade i haváriu úlohy. "Voľnosť" užívateľa pri práci so smerníkmi je podmienená jeho vedomosťami a disciplínou, pretože systém niektoré okolnosti nekontroluje (ako ukážeme v ďalšom na konkrétnom príklade).

Smerník je deklarovaný pomocou operátora * (* označuje operátor dereferencie, resp. indirekcie, ktorý sprístupňuje obsah uložený na danej adrese) v tvare

typ *meno;kde typ - ľubovoľný typ jazyka C meno - identifikátor premennej typu smerník

Smerník teda obsahuje dve základné informácie o objekte, na ktorý ukazuje:

• adresu, ktorá identifikuje umiestnenie objektu (meno)• veľkosť (dĺžku) objektu (typ).

Môže nadobúdať hodnoty z množiny prirodzených čísel (adries), alebo prázdnu adresu NULL ( = 0 ). So smerníkmi súvisia 2 základné operátory:

• & - referencia (získanie adresy objektu)• * - indirekcia, dereferencia (získanie hodnoty, uloženej na adrese).

Príklad p9.1 ilustruje použitie smerníka.

/* p9_1.c ilustracia pouzitia smernika (pointra) */

Page 8: Statnice Jadro Aplikovana Informatika

main()int index,*pt1,*pt2;

index = 39; /* any numerical value */ pt1 = &index; /* the address of index */ pt2 = pt1; printf("1. hodnota %d %d %d\n",index,*pt1,*pt2); *pt1 = 13; /* this changes the value of index */ printf("2. hodnota %d %d %d\n",index,*pt1,*pt2);

Pojem dynamického údaju (dynamická údajová štruktúra)

Pri riešení niektorých úloh sú vytvárané štruktúry, ktoré menia svoj rozsah, tieto štruktúry sa nazývajú dynamické údajové štruktúry.

Typickým príkladom dynamickej údajovej štruktúry je zoznam prvkov určitého typu, na ktorom je používaná operácia pridávania prvkov a operácia odoberania prvkov.

Znamená to, že zoznam zväčšuje svoju veľkosť. Ak vieme ohraničiť počet prvkov zhora a vieme tiež, že pridávanie sa uskutočňuje na jednom konci zoznamu, tak je možné použiť na reprezentáciu zoznamu pole. Ak však pripustíme pridávanie prvkov aj doprostred zoznamu, potom reprezentácia pomocou poľa je nevýhodná, lebo operácia pridávania prvku bude vyžadovať posun mnohých iných prvkov v poli, aby bolo vytvorené miesto na uloženie nového prvku. Ak by bola povolená operácia vynechávania prvkov, tak by vznikli problémy s dierami v poli.

Operácie meniace rozsah dynamickej údajovej štruktúry sú efektívnejšie realizované, ak použijeme na ich reprezentáciu smerníky. Každý prvok zoznamu je uložený v samostatnom objekte, ktorého súčasťou je, okrem hodnoty prvku zoznamu, tiež položka obsahujúca smerník (spoj, referenciu, odkaz) na objekt, v ktorom je uložený ďalší prvok zoznamu. Operácia vloženia spočíva vo vytvorení objektu, ktorý obsahuje hodnotu nového prvku a smerník na objekt, pred ktorý sa nový prvok zaraďuje, a v zmene smerníka v tom objekte, za ktorý sa nový prvok zaraďuje.

Smerník a dynamické prideľovanie pamäte

Každý program pracuje so svojimi dátami a dátovými štruktúrami, ktoré môžu byť statické aj dynamické. Statické existujú po celý čas behu programu, v ktorom sú deklarované príslušnými deklaráciami. Miesto pre nich vyhradí kompilátor už počas prekladu. Dynamické štruktúry vznikajú a zanikajú dynamicky počas činnosti programu.

Pre dynamické prideľovanie, resp. uvoľňovanie pamäte je v rôznych implementáciách jazyka C k dispozícii rôzny počet štandardných funkcií. Na tomto mieste preto uvedieme iba dve základné funkcie - malloc() a free().

Page 9: Statnice Jadro Aplikovana Informatika

Funkcia malloc slúži pre pridelenie (alokáciu) pamäte. Má jeden argument typu unsigned int, ktorý udáva požadovaný rozsah dynamicky pridelenej pamäte. Vracia smerník (adresu) pamäťovej oblasti požadovanej dĺžky. Táto oblasť je pre úlohu rezervovaná až do jej uvoľnenia. Na uvoľnenie slúži funkcia free, ktorá má jeden argument typu smerník na rezervovanú oblasť pamäte. Príklad p9_7 ilustruje dynamické pridelenie pamäte reťazcu a jej uvoľnenie.

/* p9_7.c dynamicke pridelovanie pamate */#include <STDIO.H>#include <ALLOC.H>#include <STRING.H>

main()char str[200];register char *t;

strcpy(str,"Ukazka dynamickeho pridelovania pamate."); printf("Retazec str: %s\n",str); t = (char *)malloc(strlen(str)+1); strcpy(t,str); printf("Retazec t: %s\n",t); free(t);Do reťazca s priradíme text, potom alokujeme dynamickú pamäť pre tento reťazec (veľkosť pamäte je daná dĺžkou reťazca, t.j. strlen(s) +1). Do takto priradenej pamäte tento reťazec skopírujeme - t. Po vytlačení obsahu dynamicky pridelenej pamäte uvoľníme pamäť príkazom free(t).

Dynamické programovanie

Keď optimálne riešenie problému je možné zostrojiť pomocou optimálnych riešení jeho podproblémov a je nutné podproblémy riešiť opakovane (keď je veľa rovnakých vetiev v algoritme prehľadávania s návratom), je možné ušetriť čas použitím techniky dynamického programovania. Najprv sa vyrieši každý podproblém systémom „zdola“ - od najmenšieho po najväčší. Riešenie jednotlivých podproblémov sa ukladá do tabuľky. Takto sa každý podproblém navštívi a rieši len raz.

Hlavný rozdiel medzi dynamickým programovaním a divide & conquer je, že podproblémy v divide & conquer sú relatívne nezávislé a v dynamickom programovaní sa prekrývajú. Rozdiel medzi dynamickým programovaním a priamou rekurziou je v zapamätávaní si rekurzívnych volaní. Keď sú podproblémy nezávislé a nie je tam žiadne opakovanie, pamätanie údajov nepomáha k nájdeniu riešenia. Ak však je problém vhodne riešiteľný dynamickým programovaním, je možné zredukovať exponenciálnu časovú zložitosť na polynomiálnu.

Page 10: Statnice Jadro Aplikovana Informatika

Pole

Pole je množina prvkov rovnakého typu, ktorá je označená spoločným názvom. Pole je uložené v operačnej pamäti spojite, pričom prvý prvok (index 0) má najnižšiu a posledný prvok najvyššiu adresu. Medzi poľami a smerníkmi existuje úzka súvislosť. Práca s poľom a jeho prvkami formou používania názvu poľa a indexov je jednoduchšia, názornejšia a možno povedať apriori akceptovateľná. Používanie smerníkov vedie k rýchlejšiemu behu programu, umožňuje dynamickú alokáciu pamäte a môže redukovať celkové požiadavky na pamäť.

Meno poľa je v skutočnosti symbolická konštanta, ktorej hodnota je smerník na umiestneni prvého prvku poľa. Teda pre pole data[] identifikátor data znamená to isté ako &data[0], data + i to isté ako &data[i], čo môžeme zapísať v tvare

data + i == &data[i]

Aplikáciou operátora indirekcie * na obe strany výrazu dostaneme

*(data+i) == data[i]

Ak sa i zvyšuje o 1, referencované miesto pamäte sa zvyšuje o počet bytov (dĺžku), daný veľkosťou daného typu.

Jazyk C netestuje hranice polí, čo umožňuje zápis i čítanie mimo rozsahu poľa, pravda, so všetkými z toho vyplývajúcimi dôsledkami. Za kontrolu dodržania rozsahu poľa je preto zodpovedný programátor.

Použitie smerníka a poľa si ilustrujeme časťou programu

int *p, data[10]; p=&data[0];

potom *p = data[0] a my môžeme namiesto data[0] v ľubovoľnom výraze používať *p, resp. pre prvok data[i] *(p + i), lebo

p + i == &data[i] *(p + i) == data[i]

Z uvedeného by sa mohlo zdať, že identifikátory data a p sú ekvivalentné. Je tu však jeden podstatný rozdiel, ktorý spočíva v tom, že data je symbolická smerníková konątanta, zatiaľ čo p je smerníková premenná. Preto operácie ako p++, p = data sú prípustné, zatiaľ čo data++, resp. data = p nie sú povolené. Majme napr.

float array[100]; fp = &array[0];

Page 11: Statnice Jadro Aplikovana Informatika

potom fp++ ukazuje na array[1]. Podobne fp = fp + 10 bude ukazovať na array[10]. Predpokladajme, že

fp1 = &array[100];

Potom fp-- ukazuje na array[99], resp. fp1 = fp1 - 10 alebo fp1 -= 10 bude ukazovať na array[90].

Na smerníky (ak sa vzťahujú na prvky toho istého poľa) je možné aplikovať aj 4 relačné operátory (<, <=, >, >= ) a testovať ich rovnosť, resp. nerovnosť ( ==, != ).

Zoznam

Pre vzájomné pospájanie položiek danej množiny stačí jediný spojovací článok, ktorý ukazuje na nasledujúcu položku množiny. Týmto článkom je smerník, pričom smerník poslednej položky má hodnotu NULL. Pridanie, resp. zrušenie položky v zozname sa potom jednoducho realizuje príslušnou zmenou jednotlivých smerníkov. Pre pridanie položky 3 do zoznamu medzi položku 1 a 2 značí zmeniť smerník položky 1 tak, aby ukazoval na položku 3 a smerník položky 3 bude ukazovať na položku 2 (nadobudne predchádzajúcu hodnotu smerníka položky 1).

Zoznam predstavuje takú postupnosť, do ktorej môžeme pridávať, resp. rušiť položky na ľubovoľnom mieste, ktoré je označené premennou index (tzv. ukazovateľ, ktorý označuje ľubovoľné miesto práce so zoznamom od začiatku až po koniec). Tým sa zoznam líši od frontu, resp. zásobníka, kde je možná aktualizácia iba na koncoch postupnosti. Zoznam je teda všeobecným prípadom lineárnej dátovej štruktúry. Je charakterizovaný

• typom položiek• maximálnym počtom položiek• operáciami

o vytvoriť zoznamo vložiť položku do zoznamu na miesto označené ukazovateľomo nastaviť ukazovateľ na začiatok zoznamuo nastaviť ukazovateľ na koniec zoznamuo nastaviť ukazovateľ na ďalšiu položku zoznamuo nastaviť ukazovateľ na predchádzajúcu položku zoznamuo vrátiť položku zoznamu, označenú ukazovateľomo vrátiť dĺžku zoznamuo test na prázdnosť zoznamuo test na plnosť zoznamu

Rovnako ako v predchádzajúcom platí pri dostatočne veľkej vyhradenej pamäti, že maximálny počet položiek a test na plnosť zoznamu môžu byť nezaujímavé. Je zrejmé, že vkladať novú položku je možné len do rozsahu zoznamu a rušiť položku je možné len

Page 12: Statnice Jadro Aplikovana Informatika

v neprázdnom zozname. Každým vložením, resp. rušením položky sa príslušne mení dĺžka zoznamu.

Chybové stavy : výber položky z prázdneho zoznamu vloženie položky do plného zoznamu

Programová realizácia môže rovnako ako v predchádzajúcich prípadoch vychádzať z implementácie pomocou

• poľa• spojových štruktúr.

Typy implementácie zoznamov:

Zoznam s jednoduchou väzbouTento typ zoznamu má smerník iba na svojho nasledovníka. Ak je uzol posledný, smerník má hodnotu nil.

Zoznam s dvojitou väzbouJe to typ spájaného zoznamu, ktorý má smerník na svojho nasledovníka a aj smerník na svojho predchodcu. Ak je uzol prvý, hodnota smerníka na predchodcu má hodnotu nil a obdobne, ak je uzol posledný, tak hodnota smerníka na nasledovníka má tiež hodnotu nil.

Kruhový zoznamV kruhovom zozname smerník prev hlavy (head) ukazuje na posledný prvok a smerník next posledného prvku ukazuje na hlavu zoznamu.

Strom

Strom je nelineárna dátová štruktúra, ktorá má vrchol s konečným počtom pripojených stromových štruktúr, ktoré sa nazývajú podstromy. Vrchol stromu sa nazýva aj koreň stromu. V stromovej štruktúre teda každý prvok má jedného bezprostredného predchodcu (okrem koreňa stromu) a žiadneho, jedného či viacerých nasledovníkov. Prvok, ktorý nemá nasledovníkov, je koncový prvok alebo list stromu. Prvok, ktorý nie je listom ani

Page 13: Statnice Jadro Aplikovana Informatika

koreňom, je vnútorným vrcholom stromu. Ak je počet nasledovníkov rovný dvom, hovoríme o binárnom strome, pri väčšom počte o viaccestnom strome. Počet nasledovníkov udáva stupeň stromu. Lineárny zoznam je z tohoto hľadiska stromová štruktúra s jedným nasledovníkom, ktorá sa preto tiež nazýva degenerovaný strom. Najbežnejší spôsob zobrazenie stromu je v tvare grafu.

V ďalšom sa budeme zaoberať binárnymi stromami. Typickým príkladom binárneho stromu je rodokmeň človeka (s tým, že rodičia sú nasledníkmi). Každý vrchol stromu obsahuje vlastnú informáciu (kľúč) a môže mať dvoch nasledovníkov, ktoré sa označujú ako ľavý a pravý.

Binárne stromy sa často používajú pre reprezentáciu čiastočného usporiadania množiny údajov, ktorej prvky sa majú vyberať na základe daného kľúča. Strom, v ktorom všetky kľúče ľavého podstromu sú menšie ako kľúč vrcholu a kľúče pravého podstromu zase väčšie (pre všetky vrcholy), sa nazýva vyhľadávací, resp. usporiadaný strom. Vyhľadanie prvku v takomto strome je jednoduché a pritom efektívne : začneme pri koreni stromu a pokračujeme v príslušnom podstrome (o druhý podstrom sa viac nestaráme), až kým prvok nenájdeme alebo nedôjdeme na koniec (list) stromu.

Problematika vyhľadávania, pridávania a rušenia vrcholov v strome tvorí náplň základných operácií so stromami. Je obdobná ako u lineárneho zoznamu s tým, že musí zohľadňovať a ošetrovať viac možných situácií, ako napr.:

• prvok s kľúčom sa v strome nenachádza• prvok s kľúčom má jedného nasledovníka• uprvok s kľúčom má dvoch nasledovníkov

Na obrázkoch je rôznymi spôsobmi zobrazený ten istý strom. Najprv je to pomocou uzátvorkovného zápisu, potom pomocou množinových diagramov a nakoniec pomocou najčastejšieho grafického zobrazenia.

Page 14: Statnice Jadro Aplikovana Informatika

Ak je strom usporiadaný, nasledujúce stromy sú dva rôzne objekty.

Reprezentácia výrazu (a+b/c)*(d-e*f) a reprezentácia toho istého výrazu v strome ako dátovej štruktúre vyjadrenej pomocou smerníkov.

Graf

Graf je usporiadaná dvojica G=(V,E): konečná neprázdna množina vrcholov V a (aj prázdna) množina hrán E

Vrchol (node) sa dá intuitívne predstaviť ako mesto na mape a hrana (edge) ako cesta medzi dvoma mestami. Potom je V množina všetkých miest a E množina všetkých ciest medzi nimi.

Najčastejšia grafická reprezentácia grafov je zobrazovať vrcholy ako body alebo krúžky a hrany ako čiary medzi nimi. Vrcholy a hrany môžu byť ohodnotené. To znamená, že majú asociovanú číselnú hodnotu. Tieto grafy sa volajú hranovo alebo vrcholovo ohodnotené grafy (edge- and vertex-weighted graphs). Priradená hodnota sa nazýva váha (weight).

Page 15: Statnice Jadro Aplikovana Informatika

Hrana sa nazýva slučka (self-loop), keď je tvaru (u,u). Graf sa nazýva jednoduchý (simple), keď neobsahuje slučky a násobné hrany (viac hrán medzi rovnakými vrcholmi). Ak graf obsahuje slučky a násobné hrany, nazýva sa multigraf (multigraph). Hovoríme, že hrana (u,v) susedí (inciduje) s vrcholom u a vrcholom v. Stupeň vrcholu je počet hrán, ktoré s ním susedia. Vrchol v susedí s vrcholom u, ak existuje hrana incidentná k obom vrcholom (tj. hrana medzi nimi). Počet vrcholov grafu značíme N. Hovoríme, že graf je riedky (sparse), keď počet jeho hrán M je malý v porovnaní s počtom všetkým možných hrán N(N-1)/2. Inak hovoríme, že graf je hustý (dense).

Ak je hranám priradený smer, hovoríme o orientovaných grafoch (directed graphs) a hrany sa potom nazývajú orientované hrany. Podobne, ak nie je hranám priradený smer, sú to neorientované hrany a graf je tiež neorientovaný (undirected). Hrany v orientovaných grafoch sa zobrazujú šípkami, ktoré učujú ich smer. Odchádzjúci stupeň vrcholu (out-degree) je počet orientovaných hrán, ktoré majú v danom vrchole začiatok. Prichádzajúci stupeň vrcholu (in-degree) je počet hrán končiacich vo vrchole.

Cesta (path) z vrcholu x do vrcholu y je postupnosť vrcholov (v0, v1,..., vk) taká, že v0=x a v0=x a hrany (v0,v1),(v1),v2)),... patria do množiny hrán E. Dĺžka takejto cesty je k. Cesta je jednoduchá, ak neobsahuje žiaden vrchol viac ako raz. Cestu nazývame cyklom, ak má začiatok a koniec v tom istom vrchole. Cyklus je jednoduchý, ak neobsahuje žiaden vrchol okrem počiatočného viac ako raz.Vrchol v nazývame dosiahnuteľným z vrcholu u, ak existuje cesta z u do v. Neorientovaný graf nazývame spojitým alebo súvislým (connected), keď existuje cesta z každého vrcholu do každého iného. Komponent grafu je maximálna množina vrcholov s vlastnosťou, že každý jej vrchol je dosiahnuteľný z každého iného vrcholu v komponente.

Neorientovaný graf nazývame stromom (tree), keď je acyklický a je súvislý. Hovoríme, že strom je zakorenený (rooted), keď sme jasne vyznačili jeho najvyšší vrchol – koreň (root).Každý vrchol v strome má práve jedného otca (parent) a rôzny počet synov (children). Neorientovaný graf, ktorý neobsahuje cykly je les (forest). Orientovaný acylkický graf sa nazýva DAG (directed acyclic graph). Graf je úplný, ak obsahuje hranu medzi každou dvojicou vrcholov. Graf je bipatitný, ak môže byť rozdelený na dve množiny V a W tak, že hrany vedú len z V do W alebo z W do V.

Na obrázku je zobrazený graf G=(V, E), kde V=1,2,3,4,5 a E=(1,2),(1,3),(2,3),(3,4). Graf je jednoduchý, (lebo neobsahuje slučku ani násobnú hranu), je neorientovaný, neohodnotený, obsahuje cyklus a nie je spojitý. Graf je riedky, lebo obsahuje 4 hrany a počet možných hrán je 10. Vrchol 5 sa nazýva izolovaný. Stupeň vrcholu 3 je tri a stupeň vrcholu 5 je nula. Počet komponentov v tomto grafe je dva. Sú to (1,2,3,4) a5).

Page 16: Statnice Jadro Aplikovana Informatika

PT – tretia otázka - štátnice

Otázka z časti Programovacie techniky: Analýza zložitosti algoritmov. Pamäťová a operačná zložitosť algoritmov. Klasifikácia algoritmov usporiadania (triedenia). Algoritmy usporiadania s kvadratickou operačnou zložitosťou. Algoritmy usporiadania zložitosti n log n. Špeciálne algoritmy triedenia. Vyhľadávací problém. Jednosmerné adresné vyhľadávanie.

Vypracovanie:

Aby sme si z viacerých správne fungujúcich algoritmov mohli vybrať ten najlepší, potrebujeme mať nejaké kritérium, podľa ktorého by sme mohli algoritmy porovnávať. Kritériá, ktoré sa obyčajne používajú pri hodnotení kvality algoritmov, sa nazývajú časová a pamäťová zložitosť (alebo tiež efektivita) algoritmov.

Efektívnosť programu má dve zložky: pamäťovú a časovú.

Zložitosť: Pamäťová - potrebné množstvo pamäti pre kód i dáta, ktoré algoritmus pri výpočte so zvolenými vstupnými údajmi potrebujeČasová - čas potrebný k vykonaniu algoritmu, počet elementárnych operácií (aritmetických, logických, porovnaní apod.) bez rozlíšenia ich typu

Je potrebné rozlišovať časovú zložitosť algoritmu v najhoršom prípade a časovú zložitosť v priemernom prípade. Časová zložitosť v najhoršom prípade je funkcia udávajúca pre každú hodnotu N ako najdlhšie môže trvať výpočet algoritmu s ľubovoľnými údajmi veľkosti N. Naproti tomu časová zložitosť v priemernom prípade nám hovorí, ako dlho bude algoritmu v priemere trvať spracovanie vstupných údajov veľkosti N.

Ak máme dva rôzne algoritmy riešiace daný problém, ktorý z nich je lepší? Ak vezmeme za základ nášho hodnotenia algoritmov časové hľadisko, je lepší ten z nich, ktorý je rýchlejší, tzn. ktorý má menšiu časovú zložitosť. Nie je pritom príliš dôležité, ktorý z algoritmov má menšiu časové nároky pre malé hodnoty veľkosti vstupných údajov N, pretože malé údaje bude takmer vždy možné algoritmicky spracovať v rozumnom čase. Podstatné je, ako sa chová funkcia vyjadrujúca časovú zložitosť algoritmov pre rastúce hodnoty N. Hovoríme preto niekedy aj o asymptotickej časovej zložitosti. Časová zložitosť algoritmu býva obyčajne rastúcou funkciou. Z dvoch algoritmov budeme teda za časovo výhodnejší

1

Page 17: Statnice Jadro Aplikovana Informatika

PT – tretia otázka - štátnice

a efektívnejší považovať ten, ktorého funkcia časovej zložitosti s rastúcou hodnotou N rastie pomalšie.

Pri praktickom riešení úloh na počítači je potrebné pri voľbe vhodných algoritmov zvažovať aj to, aké veľké vstupné údaje bude program spracovávať. Ak na veľkosť očakávaných vstupných údajov nie je vopred dané žiadne obmedzenie, zvolíme samozrejme algoritmus s menšou asymptotickou časovou zložitosťou.

Pri určovaní asymptotickej časovej zložitosti algoritmov stačí charakterizovať iba rýchlosť rastu príslušnej funkcie. Presný počet elementárnych operácií, ktoré je potrebné uskutočniť pri spracovaní vstupných údajov veľkosti N, nie je tak dôležitý a nie je zvyčajne ľahké "spočítať všetky drobné". Ak máme napríklad algoritmus A s časovou zložitosťou danou funkciou: 3N2+2n-4, hovoríme, že algoritmus A má kvadratickú časovú zložitosť O(N2).

I keď sa obmedzíme iba na časovú a pamäťovú zložitosť algoritmov pri hľadaní toho najlepšieho, môžeme sa dostať do ťažkej situácie, pretože tieto dve kritériá často stoja proti sebe. Stáva sa totiž, že k zrýchleniu výpočtu musíme použiť nejakú pomocnú dátovú štruktúru slúžiacu k uchovávaniu vopred spočítaných a pripravených hodnôt. Najrýchlejší možný algoritmus riešiaci úlohu potom nie je optimálny z hľadiska pamäťových nárokov a naopak algoritmus s najmenšou pamäťovou zložitosťou zase nemusí byť najrýchlejší.

V súčasnej dobe sa obyčajne dáva prednosť časovému hľadisku a hľadajú sa čo najrýchlejšie algoritmy, a to i za cenu potreby dodatočnej pamäte.

Časovú zložitosť algoritmu môžeme vyjadriť matematickou funkciou, ktorú nazývame rád algoritmu a vyjadruje rádovú zložitosť algoritmu. Označuje sa O. Podstatná je rádová rýchlosť rastu danej funkcie pre rastúce N pri tomto type určovania časovej zložitosti. Ak zanedbáme pomalšie rastúce členy a konštanty hovoríme o asymptotickej časovej zložitosti.

Symbol „veľké O“f = O(g) ⇔ ∃ c ∃ n0 ∀ n > n0 : f(n) < c.g(n)tzn. funkcia f sa dá zhora odhadnúť funkciou g (až na multiplikatívnu konštantu a pre dostatočne veľké n)

zložitosť činnosťO ( 1 ) konštantná pridanie prvku do neutriedeného poľaO ( n ) lineárna súčet prvkov v poliO ( n2 ) kvadratická jednoduché metódy triedenia poľaO ( n3 ) kubická násobenie matícO ( nk ) polynomiálna

2

Page 18: Statnice Jadro Aplikovana Informatika

PT – tretia otázka - štátnice

O ( log n ) logaritmická hľadanie prvku v utriedenom poliO ( n . log n ) vylepšené metódy triedenia poľaO ( 2n ) exponenciálna Hanojské vežeO ( kn ), k>1(exponenciálna - možnosť spracovania iba pre pomerne prísne stanovené n, lebo rýchlosť rastu exponenciálnej funkcie je veľmi veľká)

Pr. : 3890 n2 + 16000 n - 13 O ( n2 )neuvažujú sa multiplikatívne a aditívne konštanty

Usporiadanie – triedenie: Proces preusporiadania danej množiny objektov v špecifickom poradí. Účelom triedenia je uľahčiť neskoršie vyhľadávanie prvkov triedenej množiny.

Klasifikácia algoritmov usporiadania (triedenia): Základné delenie (či sú všetky položky v operačnej pamäti):

vnútorné triedenie – predstavuje skupinu metód, ktoré predpokladajú, že všetky položky sú v hlavnej pamäti počas celého triedenia, resp. že všetky sa zmestia do operačnej pamäti.

vonkajšie triedenie – nie sú všetky položky v hlavnej pamäti. Buď sa nezmestia, alebo nie je vhodné a potrebné, aby boli. Tieto metódy sa používajú v súvislosti s ošetrením súborov.

Triedenie polí (vnútorné) Triedenie sekvenčných súborov (vonkajšie)

Klasifikácia algoritmov usporiadania (triedenia): Priame metódy

Bubble SortSelection SortInsertion SortShell Sort

Rýchle metódyHaldaPrioritný frontHeapSortQuickSortMergeSort

Triedenie v lineárnom časeCounting SortRadix SortBucket Sort

(klasifikácia zdroj: http://www.sprite.edi.fmph.uniba.sk/~szorad/vyuka.html)

Zložitosť triediacich algoritmov:

3

Page 19: Statnice Jadro Aplikovana Informatika

PT – tretia otázka - štátnice

Pamäťová zložitosť pri vnútorných triedeniach je nulová resp. sa rovná veľkosti poľa, lebo algoritmus operuje iba v už alokovanom poli a nepoužíva ďalšiu pamäť. Pri vonkajších triedeniach sa pamäť tiež využíva len minimálne – algoritmus pracuje spravidla so súbormi. Časová zložitosť sa pri triedení vypočíta súčtom časov potrebných na C porovnaní hodnôt a M presunov prvkov.

Časová zložitosť triediacich algoritmov: Algoritmus Časová zložitosťBubble sort O(n2)Shake sort O(n2)Insert sort O(n2)Select sort O(n2)Shell sort O(N * (log2 N)2)Quick sort O(N * log2 N)Merge sort O(N * log2 N)

Algoritmy usporiadania s kvadratickou operačnou zložitosťou: bubble sort – priama výmena shake sort – pretriasanie insert sort – priame vkladanie select sort – priamy výber

(nazývajú sa tiež: jednoduché priame metódy triedenia)Pozn.:

− Z týchto metód je najhoršia Bubble sort− Insert sort a Select sort sú takmer rovnocenné pre triedenie polí− Pre triedenie záznamov podľa vybraného kľúča je lepšia metóda Select sort− Permutácia, ktorou sa prvky usporadúvajú sa vykonáva na mieste− Algoritmy patria medzi tzv. asociatívne algoritmy (opakom je adresné

triedenie)o O triedenej množine nepotrebujú žiadne informácie

Algoritmy usporiadania zložitosti n log n: quick sort merge sort shell sort (O(N * (log2 N)2) )

(vylepšené, logaritmické metódy triedenia)Pozn.:

− Najlepšou metódou je Quicksort. Je vôbec považovaný za najlepšiu metódu vnútorného triedenia.

Špeciálne algoritmy triedenia: Stromové triedenie Triedenie haldou

4

Page 20: Statnice Jadro Aplikovana Informatika

PT – tretia otázka - štátnice

Dobosiewicz sort(ďalšie info k špeciálnym algoritmom a aj k vyhľadávaniu viď: http://ucm.zoner.sk/OLD/Algoritmy/predn%e1%9aky%20aa%fa%9a%20i%202006%20ucm/ - tie ppt-čka)

Vyhľadávanie – searching: Cieľom vyhľadávacích algoritmov je nájsť v množine prvkov prvok s danou

hodnotou Medzi vyhľadávanie patrí aj nájdenie minimálnej resp. maximálnej hodnoty Vyhľadávanie je spojené s vhodnou dátovou štruktúrou, ktorá hľadanie

podporujeVyhľadávací problém = cieľ je nájsť umiestnenie prvku množiny podľa určitej podmienky – kritéria vyhľadávania. (čiže hľadáme, problém je akým spôsobom)

Rozdelenie vyhľadávacích algoritmov: Jednorozmerné – polia, slovníky, prioritné zoznamy

Adresné vyhľadávacie algoritmy.Pre nájdenie pozície prvku v dátovej štruktúre používajú hodnotu tohto prvku (napr. priamy prístup k prvkom poľa pomocou indexov)

Asociatívne vyhľadávacie algoritmyPozícia prvku v dátovej štruktúre nezávisí na jeho absolútnej hodnote, ale na jeho relatívnej hodnote vzhľadom k ostatným prvkom

Viacrozmerné – vyhľadáva sa podľa viacerých kľúčov. Tomuto sa musí pochopiteľne prispôsobiť dátová štruktúra aj algoritmus. Zodpovedajú tomu databázové systémy. Delia sa:

Hľadanie úplnej zhody – zhoda všetkých hľadaných kľúčov Hľadanie čiastočnej zhody Intervalová zhoda – kľúč musí byť v určitom intervale

Základné algoritmy jednorozmerného vyhľadávania: Jednoduché sekvenčné vyhľadávanie Sekvenčné vyhľadávanie s nárazníkom Binárne vyhľadávanie

Jednoduché sekvenčné vyhľadávanie: Na prehľadávaný priestor nemá žiadne nároky. Napr. pole nemusí byť

usporiadané Postupne prechádza celý priestor, pričom sa každý prvok porovnáva s

hľadaným Algoritmicky sa realizuje cyklom s podmienkou na konci Podmienka sa definuje ako zhoda s hľadaným prvkom X alebo dosiahnutie

posledného prvku v postupnosti (i=n) Zložitosť je O(n)

Ďalšie algoritmy:

5

Page 21: Statnice Jadro Aplikovana Informatika

PT – tretia otázka - štátnice

Pre vyhľadávanie sa používajú rôzne stromové štruktúry Z nich najjednoduchšie sú binárne vyhľadávacie stromy

Zdroje: (použité aj nepoužité, môžu sa tam nájsť detailne vysvetlené jednotlivé metódy triedenia a vyhľadávania)

http://kifri.fri.uniza.sk/~kopecky/UdajoveStruktury/Tema_01.doc

http://www.gjar-po.sk/studium/informatika/inf/spracovane_otazky/03_04/3b.doc

http://www.gt12.sk/predmety/inf/materialy/ucebnica/algoritmy_a_programovanie/triedenie.pdfhttp://www.gt12.sk/predmety/inf/materialy/ucebnica/algoritmy_a_programovanie/efektivi.pdf

http://people.tuke.sk/igor.podlubny/C/Kap11.htm

http://ics.upjs.sk/~mlynarcik/Vyskum/Zlozitost/Diplomka/ - diplomová práca na túto tému

http://www.sprite.edi.fmph.uniba.sk/~szorad/vyuka.html - dobré (výsledok Bc. práce)http://www.dcs.fmph.uniba.sk/bakalarky/obhajene/getfile.php/Vizualizacia%20zakladnych%20algoritmov.pdf?id=15&fid=26&type=application%2Fpdf

http://hq.alert.sk/~mandos/fmfi-uk/Informatika/Programovanie/prednasky/pl31.html

http://ucm.zoner.sk/OLD/Algoritmy/ - dobré ppt-čka

http://www2.fiit.stuba.sk/~pospichal/halanova/implementacia%20systemu/algoritmy.htm - dobré

http://frcatel.fri.utc.sk/~paluch/grkap2-nopics.pdf

http://www.pub.ide.sk/pubs/vizualizacia_algoritmov_vo_vyucovani_programovania.pdf - nesúvisí s touto témou

http://www.mario-konrad.ch/index.php?page=20100

6

Page 22: Statnice Jadro Aplikovana Informatika

Operačné systémy a systémové programovanie

1. Operačný systém - Čo to je operačný systém, klasifikácia OS, základné funkcie OS.

Čo je to operačný systém

Vo všeobecnosti platí, že operačný systém je programové vybavenie počíta, nevyhnutné na jeho prevádzku. Operačný systém je súbor programov, ktoré umožňujú efektívnu obsluhu počítača.

OS je nadstavba hardvéru počítača, takže používateľ neprichádza do kontaktu so samotným hardvérom počítača, svoje požiadavky realizuje ovládaním operačného systému a volaním (spúšťaním) jeho služieb, teda programov. Zo systémového pohľadu sa operačný systém považuje za nadstavbu, doplnenie a rozšírenie počítačového hardvéru.

Základ počítača tvorí procesor, pamäť, I/O procesy (kanály), ktoré umožňujú komunikáciu s periférnym zariadením pripojeným k počítaču (klávesnica, obrazovka). Sú to základné prostriedky, ktoré využívajú jednotlivé programy na svoju prácu.

V prípade, že na počítači beží iba jeden program, nie je s využívaním prostriedkov žiaden problém. Avšak v prípad, že na počítači beží súčasne programov viacej, tak je potrebné pre jednotlivé programy nejakým spôsobom rozhodnúť ako využívať tieto prostriedky. Niektoré prostriedky môže v jednom momente využívať iba jeden program (napr. tlačiareň). Alebo každý program môže pre svoje potreby využívať iba časť operačnej pamäte. Preto je potrebný správca prostriedkov pre programy. A práve takýmto správcom je operačný systém. Operačný systém je správca prostriedkov.

Klasifikácia (rozdelenie) OS

Operačný systém možno klasifikovať:

• Podľa počtu užívateľov

o jednoužívateľské,o viacužívateľské (multiterminálové, sieťové)

• Podľa jadra, počtu spracovávaných úloh na: o jednoúlohovéo viacúlohové (umožňujúce multitasking, čiže zdanlivý súčasný beh

viacerých aplikácií naraz)• Podľa uloženia systému:

o pamäťovo rezidentné (pre jednoduché mikropočítače, kde je celá exekutíva (výkonná časť) pevne umiestnená v pamäti ROM)

o diskovo orientované operačné systémy, ktorých programové moduly sú umiestnené na diskových médiách a podľa potreby sú nahrávané do OP.

• Podľa určenia, akému účelu má OS slúžiť: o univerzálne operačné systém

Page 23: Statnice Jadro Aplikovana Informatika

o systémy špecializované na konkrétny účel – vývojové, riadiace, komunikačné, diagnostické...

• Podľa počítačovej platformy o pre strediskové počítače,o pre počítače strednej triedyo pre osobné počítače.

Základné funkcie OS

Operačný systém zabezpečuje čiastočne alebo úplne tieto funkcie:

• podporuje komunikáciu užívateľa s počítačomo komunikácia s užívateľom prostredníctvom periférnych zariadeno komunikácia s inými systémami (počítačmi) v sieti - pri použití sieťových

operačných systémov• prideľovanie prostriedkov systému užívateľom alebo aplikáciám• prideľovanie času užívateľom (tzv. timesharing) alebo aplikáciám (multitasking)• spravuje údaje

o organizácia programov a súborov na vonkajších pamäťových médiách (príkazový systém umožňujúci vytváranie, editovanie, prezeranie, kopírovanie, premenovávanie, mazanie, zálohovanie, komprimovanie a ďalšie operácie so súbormi)

• riadi spracovanie úloho vytváranie a spúšťanie užívateľských programov (pod prekladačmi vyšších

programovacích jazykov), ich spájanie s existujúcimi programovými knižnicami

• riadi, spravuje technické prostriedky počítača a ich komponentyo diagnostické funkcie - auto kontrola systému, možnosť analýzy a

odstraňovania chýb• podporuje bezpečnosť a spoľahlivosť výpočtového systému

o zabezpečovacie funkcie - ochraňuje systém proti strate údajov pri výpadku napätia, proti neoprávnenej alebo neodbornej manipulácii, ktorá by mohla poškodiť programové produkty

OS je teda zjednodušene súbor programov, ktorý riadi a kontroluje činnosť hardvéru, ale aj softvéru v počítači, stará sa o efektívne využitie operačnej pamäte a procesora, o optimálnu komunikáciu medzi všetkými používanými technickými aj programovými prostriedkami. Tieto funkcie operačného systému sú zabezpečované celou skupinou relatívne samostatných „nástrojov“, ktoré sa dajú kombinovať – programových modulov.

Page 24: Statnice Jadro Aplikovana Informatika

[OOSP-2] Procesy a vlákna - tvorba procesov a vlákien, komunikácia a synchronizácia, kritické oblasti, programové prostriedky vzájomného vylúčenia nad KO, odlišnosti medzi procesmi a vláknami.

Procesor v počítači vykonáva postupnosť inštrukcií, ktorá sa nazýva program. Proces pozostáva z kódu programu a dát procesu.

Proces je výraz, ktorý označuje postupnosť inštrukcií, ktoré tvoria súvislú činnosť. Proces je definovaný:

• vlastným PID číslo (Process Identificator) – 16bitové číslo priradené po vytvorení procesu• vlastnou postupnosťou vykonávateľných inštrukcií (operácií)• vlastným pamäťovým priestorom na uloženie údajov• proces pracuje s vyhradenou množinou registrov procesora • vlastný ukazovateľom adresy vykonávanej inštrukcie (control point)• hierarchiou vzťahov rodič – potomok

Atribúty procesu• UID (User Identifier) číslo užívateľa, ktorý vytvoril proces• Group–id vlastníka procesu• Priorita procesu• Aktuálny adresár, v ktorom proces vznikol

Pamäťový priestor procesu obsahuje:• výkonný segment – obsahuje vykonávateľný kód• dátový segment – obsahuje premenné a polia• segment atribútov procesu – využíva jadro OS

Tvorba procesov zabezpečujú nasledujúce systémové služby operačného systému:• fork() – vytvorenie procesu• exec() – prekryje adresný priestor procesu zadaným programom• wait() – rodičovský proces čaká na skončenie potomkov • exit() – ukončí proces a aktivuje rodičovský proces

Volanie fork vytvorí identickú kópiu procesu volajúceho túto službu, ktorý sa stáva rodičom novovzniknutého procesu (potomka). Potomok má rovnakú množinu inštrukcií programu a rovnaký obsah pamäte. Rozdiel je len v tom, že ide o dva nezávisle bežiace procesy. Jeden z nich

Page 25: Statnice Jadro Aplikovana Informatika

je pôvodný a druhý je kópia. Každý proces je pri svojom vzniku označený jedinečným číslom PID (Process Identificator).

Samotná procedúra fork má však zmysel lebo kódy procesov sú rovnaké. Preto sa používa v kombinácií s ďalšou službou jadra exec. Funkcia exec nahradí program bežiaci v procese iným programom, ktorý je zvyčajne argumentom funkcie. Proces potomok teda vymení svoju postupnosť vykonávaných inštrukcií za iný program, ktorý sa takto spustí.

Niekedy je žiaduce aby rodičovský proces čakal na ukončenie jedného alebo viacerých svojich detských procesov. Na to slúži systémové volanie wait. To blokuje volajúci proces pokiaľ niektorý z jeho detských procesov neskončil. Až po jeho ukončení je interpreter schopný prijať ďalší príkaz. Ak detský proces skončil zatiaľ čo rodičovský proces ešte nevykonal wait(), tak detský proces existuje ako zombie. Zombie proces je detský proces, ktorý ukončený a čaká kým jeho rodič vykoná wait(). Až potom je ukončený zombie stav detského procesu a proces je vymazaný.

Posledná spomenutá služba systému exit je požiadaním o ukončenie procesu. Vtedy sa údaje procesu vymazávajú z pamäte a zruší sa položka v tabuľke procesov. Každý proces ma svoju exit hodnotu, číslo ktoré po skončení vracia rodičovskému procesu. Vid signály.

Paralelné vykonávanie procesov sa realizuje prepínaním procesov, ktoré vykonáva procesor cez správca úloh (task manager). Správca úloh má všetky potrebné informácie na svoju činnosť uložené v tabuľke procesov. Prepínanie medzi procesmi, na jednom procesore sa nazýva paralelný multitasking. Existuje:

• kooperatívny multitasking – bežiaci proces sám rozhoduje o prerušení svojej činnosti a požiada systém o spustenie iného procesu

• preemptívny multitasking – každý proces je spúšťaný len na určitý časový interval, po uplynutí časového intervalu sa spúšťa ďalší proces

Kontext procesu je informácia o kompletnom stave procesu. Uložením "kontextu procesu" do pamäte je možné proces prerušiť, odložiť, znova spustiť zo stavu v akom bol prerušený. OS si drží informácie o stave procesov (kontexte procesu) v tabuľke procesov (process table). Kontext procesu obsahuje:

• PID procesu,• stav procesu,• obsah registrov,

Page 26: Statnice Jadro Aplikovana Informatika

• informácie pre plánovač procesov,• údaje o pridelenej pamäti,• štatistické info (ako dlho je spustený proces),• ....

Prepnutie činnosti procesora z jedného procesu na druhý proces znamená vymeniť kontext procesu za iný, jedná sa o tzv. prepnutie kontextu. Celý kontext prerušeného procesu sa uloží do pamäte aby bolo možné prerušený proces znova spustiť od stavu prerušenia.

Komunikácia a synchronizácia procesovMedziprocesorová (inter-process communication, skr. IPC) je súbor techník na výmenu dát medzi dvomi alebo viacerými vláknami v jednom alebo viacerých procesoch. PC môže byť tiež označovaná ako medzithreadová komunikácia. Zoznam IPC metód: zdieľaná pamäť, semafory procesov, mapovaná pamäť, kanály, fronta správ, schránky , ....

Zdieľaná pamäť• poskytuje najrýchlejší spôsob komunikácie medzi procesmi. • Nevyžaduje si systémové volania jadra.• Je potrebné zabezpečiť synchronizáciu procesov pri prístupe ku zdieľanej pamäti.• Procesy musia vykonať nasledovné kroky pre získanie ZP :

o Niektorý proces musí alokovať pamäťový segmento Procesy, ktoré chcú mať k alokovanému segmentu prístup si ho musia pripojiťo Po skončení musia všetky procesy odpojiť segmento Proces, ktorý segment vytvoril ho musí dealokovať.

• Ak je segment odpojený posledným procesom, ktorý ho používa potom je zrušený

Semafory procesov• na synchronizáciu procesov sa používa implementácia semaforov• semafor treba alokovať a inicializovať

o alokácia: int semget(key_tkey, int nsems, int semflg) key_tkey je identifikátor množiny semaforov (číselná hodnota key), int nsems počet semaforov int semflg je flag ktorý špecifikuje prístupové práva funkcia vracia ID množiny semafórov

o inicializácia: int semctl(int semid, int semnum, int cmd) int semid ID množiny semaforov int semnum index poľa semaforov int cmd riadiaci flag

o dealoácia: int semctl(int semid, int nsems, IPC_RMID, arg) IPC_RMID zruší množinu semaforov

• každý semafor ma nezáporné hodnoty.• na semafore sa vykonávajú operácie ako wait a post Tieto operácie implementuje

funkcia sem_op. Ak je sem_op:o kladné číslo – znamená inkrementovanie semafora o danú hodnotu

Page 27: Statnice Jadro Aplikovana Informatika

o záporné číslo – znamená dekrementovanie hodnoty semafora. Ak by mala byť hodnota semafóra<0 spôsobí to chybu alebo blokovanie

o Nula –znamená blokovanie operácie pokiaľ bude hodnota semafora 0

Mapovaná pamäť• umožňuje komunikáciu procesov cez zdieľané súbory ako aj rýchly prístup procesov k

súborom. • MP tvorí asociáciu medzi súbormi a pamäťou procesora. Linux rozdelí súbor do stránok a

skopíruje ich do stránok virtuálnej pamäti tak, že sú dostupné v adresnom priestore procesu. Proces môže potom pristupovať k obsahu súboru ako s prístupom do pamäte

• K súborom môže takto pristupovať aj viac procesov, čo poskytuje veľmi účinné zdieľanie pamäte

• mapovanie vykonáva funkcia mmap()• Rôzne procesy môžu komunikovať cez mapovanú pamäť asociovanú k tomu istému

súboru• MP musí byť chránená semafórom proti súčasnému prístupu viacerých procesov

podobne ako zdieľaná pamäť.

Kanály – kanál je komunikačné zariadenie, ktoré umožňuje jednosmernú komunikáciu medzi procesmi, ktoré sú vo vzájomnom vzťahu (rodič, dieťa ale aj dieťa dieťa). Kapacita kanála je obmedzená. Ak proces zapisuje rýchlejšie ako druhý proces údaje číta, tak je zapisujúci proces blokovaný a opačne. Takže kanál automaticky synchronizuje procesy. Tvorba kanála:

int pipe(int fd[2])

• argumentom je pole, ktoré obsahuje deskriptory súborov fd[0] na čítanie a fd[1] na zápis

• funkcia vracia 0 ak je kanál vytvorený úspešne, inak -1.• detský proces dedí od rodiča všetky otvorené deskriptory, teda aj deskriptory na konce

kanála

Procesy môžu komunikovať cez spoločný kanál, ktorého konce sú štandardné I/O tak, že jeden proces na jeden koniec kanála vloží, iný proces z druhého konca kanála číta. Treba však zabezpečiť aby konce kanála boli štandardné vstupy/výstupy. Na presmerovanie kanála ako štandardného I/O sa využíva dup a dup2. Na komunikáciu procesov cez kanál sa používajú aj knižničné funkcie popen a pclose. Nie sú to systémové funkcie.

FIFO – FIFO file je kanál, ktorý má meno v systéme súborov – tiež sa volá aj pomenovaný kanál. Cez FIFO môžu komunikovať aj procesy, ktoré sú nie vo vzťahu rodič – potomok. Vytvorenie FIFO:

mkfifo(path, permission)

• prvý argument je cesta k súboru

Page 28: Statnice Jadro Aplikovana Informatika

• druhý je prístup vlastníka, skupiny a ostatných, tak isto ako pre súbory

Prístup k FIFO je ako k regulárnemu súboru. Komunikácia prebieha tak, že jeden program ho musí otvoriť pre zápis a druhý pre čítanie. Pokiaľ nie je FIFO otvorený pre zápis aj pre čítanie, tak je blokovaný.

Front správ – procesy si môžu vymieňať správy cez spoločnú frontu správ, ktorá má svoj ID. Každá správa má svoj identifikačný typ a veľkosť. Veľkosť správy je v ohraničená na 4056 bytami. Tvorba fronty cez funkciu:

int msgget(key_tkey, int msgflg)

• funkcia vracia ID fronty (msgid) odpovedajúce prvému argumentu key, • druhý argument sú prístupové práva k fronte a tiež hodnoty (IPC_CREAT, IPC_EXCL).

Prenos správ môže byť:• asynchrónny prenos – bez blokovania• synchrónny prenos – s blokovaním. Pri prenose je vysielajúci proces blokovaný dovtedy

kým nedostane potvrdenie (signál), že správa bola prijatá.

Jadro OS udržuje každú správu vo fronte ako štruktúru msg definovanú v msg.h:

struct msg /* one msgstructure for each message */struct msg *msg_next; /* next message on queue */long msg_type; /* type of message */char *msg_spot; /* message text address */short msg_ts; /* message text size */

;

Funkcie pre výmenu správ sú msgsend() a msgrcv():

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtype, int sgflg);

• argument msgid je ID fronty• argument msgp je smerník na štruktúru, ktorá obsahuje typ správy (číslo) a jej text.• argument msgsz je dĺžka správy v bajtoch• argument msgtype funkcie msgrcv() špecifikuje typ správy. Jadro prezerá frontu správ a

hľadá najstaršiu správu s daným typom. Ak je msgtype=0 potom sa hľadá najstaršia správa vo fronte bez ohľadu na jej typ.

• argument msgflg špecifikuje akciu, ktorá sa vykoná, ak je splnená aspoň jedna z podmienok:

o fronta správ je prázdnao celkový počet správ vo fronte systému dosahuje limitný početo akcie pre msgrcv()sú nasledovné:

Page 29: Statnice Jadro Aplikovana Informatika

ak msgflg=IPC_NOWAIT a fronta je prázdna návrat z funkcie ak msgflg=0 proces je blokovaný pokiaľ nepríde správa do fronty, ktorá

spĺňa dané parametreo akcie pre msgflg()sú nasledovné:

ak msgflg=IPC_NOWAIT a fronta je plná, správa sa neodošle a volajúci proces ihneď ukončí zasielanie

ak msgflg=0 volajúci proces je blokovaný pokiaľ: sa fronta správ neuvolní a potom sa správa odošle alebo fronta je zrušená

Schránky – sú to obojsmerné komunikačné zariadenia, ktoré sa používajú na komunikáciu medzi procesmi bežiacimi na tom istom počítači alebo na rôznych počítačoch. Komunikácia cez schránky je typu klient–server. Schránky existujú v komunikačných doménach, kde doména je abstrakcia, ktorá poskytuje adresnú štruktúru a množinu protokolov. Procesy komunikujú len medzi schránkami rovnakého typu. Princíp činnosti:

• S: Vytvorí nepomenovanú schránku (sd_server)• S: Pomenuje vytvorenú schránku – zviditeľní ju v systéme (tým sa stane server)

C: Vytvorí nepomenovanú schránku (sd_client)• C: Snaží sa pripojiť svoju schránku so schránkou servera• S: Server čaká v zablokovanom stave na požiadavky spojenia od klientov. Pri spojení

schránok sa server odblokuje, vytvorí pracovný duplikát svojej schránky, ktorá potom vytvorí komunikačnú cestu (sd_server_spojenie) Pôvodná schránka sd_server je okamžite pripravená na komunikáciu s ďalším klientom

• S,C: Ukončenie spojenia (zatvorenie sd_server, sd_client)

Typy schránok:• SOCK_STREAM – dvojstranné spoľahlivé spojenie doručujúce pakety v poradí v akom boli

vyslané. Je v internetovej doméne s protokolom TCP• SOCK_DGRAM – doručené správy nemusia byť v poradí v akom boli vyslané, je možnosť

straty paketov. Protokol je UDP.• SOCK_SEQPACKET – obojsmerné spoľahlivé spojenie, pakety sú pevnej dĺžky a nevyžaduje

sa žiaden protokol

Tvorba schránok: int socket(int domain, int type, int protocol)• domain – určuje spôsob zápisu adresy schránky (UNIX domain PF_UNIX alebo PF_LOCAL,

Internet domain PF_INET)• type – typ schránky ako bol uvedený• protocol – špecifikuje ako sa budú údaje prenášať. 0 znamená najlepší protokol pre

danú doménu

Proces server• Vytvorí schránku volaním socket• Volaním funkcie bind priradí schránke svoju adresu, aby ho mohol klient nájsť• Volaním funkcie listen umožní pripojenie klientskeho procesu k schránke

Page 30: Statnice Jadro Aplikovana Informatika

• Volaním accept akceptuje spojenie požadované klientom vytvorením novej schránky pre komunikáciu s klientom. Pôvodná schránka slúži na akceptovanie nových spojení.

• Volaním close zruší schránku.

Proces klient • inicializáciu spojenia int connect(int sd, struct sockaddr*name, int namelen),

o sd je lokálna schránka (deskriptor súboru)o name je adresa schránky servera, líši sa podľa doményo namelen je dĺžka v bytoch štruktúry sockaddr

Prenos dát server/client pomocou funkcií read(), write() alebo int send (int sd, char * msg, int len, int flags)int recv(int sd, char *buf, int len, int flags),

Základne synchronizačné modely (viď. Prednášky pdf 4.3)

Page 31: Statnice Jadro Aplikovana Informatika

Vlákna (Threads) – nezávislý tok riadenia v procese.Každý proces má vyhradený vlastný adresný priestor a vlastné prostriedky. Proces môže svoje prostriedky zdieľať. Takto môže jeden proces v sebe obsahovať viacero nezávisle vykonávaných postupností inštrukcií, ktoré môžu bežať paralelne. Tieto nezávislé paralelne bežiace aktivity v rámci jedného procesu sa nazývajú vlákna (threads).

Použitie vlákien je spôsob, ako rozdeliť program na dve alebo viac rovnocenne vykonávaných úloh. Viaceré vlákna môžu byť vykonávané naraz – nazýva sa to multithreading. Multithreading sa obyčajne zabezpečuje buď rozdeľovaním času (kde jeden procesor prepína medzi vykonávaním rôznych vlákien) alebo paralelné spracovanie dát - multiprocessing (kde sú vlákna vykonávané na viacerých procesoroch (SMP) či jadrách procesora (CMP)).

Vlákna môžu vykonávať odlišné časti programu v tom istom čase. V procese existuje vždy jedno základné vlákno, ktoré vykonáva program sekvenčne. Základné vlákno môže vytvárať ďalšie vlákna, ktoré vykonávajú ten istý proces v tom istom programe.

Z hľadiska spravovania vlákien OS rozdeľujeme vlákna na:• vlákna na užívateľskej úrovne (ULT) – na tejto úrovni jadro nevie nič o existencii vlákien.

Správa vlákien je na aplikačnej úrovni a využíva sa knižnica vlákien. Nevýhoda je, že jadro blokuje procesy a tým aj všetky vlákna v procese. Taktiež, že vlákna toho istého procesu nemôžu súčasne bežať na dvoch procesoroch.

• vlákna na úrovni jadra (KLT) – na tejto úrovni je správa vlákien vykonávaná jadrom cez systémové volania. Jadro môže rozvrhovať viac vlákien jedného procesu na viacej procesoroch. Blokovanie je len na úrovni vlákien. Nevýhodou je, že prepínanie vlákien v rámci jedného procesu vyžaduje službu jadra, čo spomaľuje výpočet.

• KLT/ULT – kombinácia výhod predošlých dvoch.

Knižnica vlákien je špeciálna knižnica pre vlákna na užívateľskej úrovni, ktorá umožňuje:• rušenie a vytváranie vlákien• predávanie dát a správ medzi vláknami• plánovanie behu vlákien• uchovávanie a obnova kontextu vláken

Tvorba vlákien – na tvorbu nového vlákna sa využíva funkcia pthread_create:

int pthread_create(pthread_t *thread_id, pthread_attr_t *thread_attribute, void*( *thread_function)(void *), void *arg);

kde:• thread_id je smerník na premennú typu pthread_t, v ktorej je uložené ID nového

vlákna• thread_attribute je smerník na premennú typu pthread_attr_t, ak je NULL potom je

vlákno vytvorené s predvolenými hodnotami

Page 32: Statnice Jadro Aplikovana Informatika

• thread_function je smerník na funkciu – vlastné telo vlákna, ktorá sa má vykonať a jej typ je void*( *)(void *)

• arg je smerník typu void, ktorý obsahuje argumenty funkcie vlákna, s ktorými sa bude vykonávať

• návrat z funkcie pthread_create je okamžitý a pôvodné vlákno pokračuje na nasledujúcej inštrukcii, zatiaľ čo nové vlákno začne vykonávať thread_function

Odovzdanie argumentov vlákna – každú thread funkciu sa definuje štruktúra, ktorá obsahuje parametre, ktoré očakáva thread funkcia. Smerník na túto štruktúru sa uvádza ako 4 argument vo funkcii pthread_create. Týmto spôsobom sa dá jednoducho využiť tá istá thread funkcia pre viacej vlákien tým, že sa vykonáva ten istý kód programu s rôznymi dátami.

Pripojenie vlákien – využíva sa ak nejaké vlákno (A) chce čakať, pokiaľ iné vlákno (B) skončí a odovzdá návratovú hodnotu. Obyčajne rodičovské, môže čakať návratovú hodnotu potomka. Vlákno(A) sa volaním funkcie pthread_join zablokuje pokým sa vlákno (B) skončí a odovzdá hodnotu. Zápis je následovný:

pthread_join(pthrad_thread_id, void* return_value)kde

• prvý argument špecifikuje ID vlákna na ukončenie, ktorého sa čaká• druhý argument je smerník na premennú, do ktorého sa odpamätá návratová hodnota

vlákna. Môže byť aj NULL ak nás návratová hodnota nezaujíma

Atribúty vlákna – používajú sa na definovanie vlastností vlákna. Sú v poradí druhým argumentom vo funkcii pthread_create. Na vytvorenie vlákna s požadovanými vlastnosťami treba prispôsobiť jeho argumenty nasledovne:

1. Vytvoriť pthread_attr_t premennú (štruktúru).2. Volať funkciu pthread_attr_init s argumentom smerník na štruktúru.3. Modifikovať atribúty štruktúry na požadované hodnoty.4. Vytvoriť vlákno s danými atribútmi.5. Uvoľniť štruktúru atribútov volaním funkcie pthread_attr_destroy. Premenná

pthread_attr_t sa tým nezruší môže byť neskôr opäť inicializovaná.

Tá istá štruktúra atribútov sa môže použiť pre niekoľko vlákien.

Ukončenie (zrušenie) vlákien – za normálnych okolností sa na ukončenie vlákna sa využíva funkcia pthread_exit:

void pthread_exit(void* arg)

Vysvetlenie:• funkcia pthread_exit ukončí volajúce vlákno• návratová hodnota vlákna je daná v PTHREAD_CENCELED,• neuvoľňuje žiadne prostriedky procesu.

Page 33: Statnice Jadro Aplikovana Informatika

• zrušené vlákno môže byť neskôr synchronizované

Vlákno môže byť zrušené:• asynchrónne – kedykoľvek počas výkonu• synchrónne – požiadavky na zrušenie sú vo fronte a vlákno je zrušené len ak dosiahne

špecifikované miesto počas výkonu. Je to preto lebo vlákno môže alokovať nejaké zdroje a pokiaľ ich neuvoľní nemalo by byť zrušené.

Sú sekcie, v ktorých nemožno zrušiť vlákno – kritická sekcia. Kritická sekcia je postupnosť kódu programu, ktorý musí byť vykonaný celý.

Synchronizácia vlákien• zaistenie konzistencie zdieľaných údajov.• postupný prístup viacerých vlákien k synchronizačným objektom• zaistenie bezpečnosti spoločných údajov

Problém vznikne ak dve vlákna ukončia svoje úlohy približne v rovnakom čase a vo fronte zostane už len jedna úloha. Prvé vlákno zistí, že frontaje nie prázdna, priradí adresu úlohy do next_joba je prerušené. Druhé vlákno urobí to isté a keďže úloha ešte nebola zo zoznamu vybraná obe vlákna sa budú snažiť vykonať tú istú úlohu!

Používa sa na blokovanie prístupu do CS pre iné vlákna. Zabezpečuje exkluzívny prístup do CS pre vlákno, ktoré zámku používa. Mutexj e špeciálna zámka, ktorá môže súčasne uzamknúť len jedno vlákno. Ak je zámka už uzamknutá a druhé vlákno sa pokúša ju znovu uzamknúť je zablokované. Zámku môže odomknuť len to vlákno, ktoré ju uzamklo.

Zámky sa deklaruje typom pthread_mutex_t Inicializuje sa funkciou:

pthread_mutex_init(pthread_mutex_t*pmut, pthread_mutexattr_t*pattrmut)

• prvý argument je smerník na zámku• druhý argument je smerník na atribúty zámky. A je druhý argument NULL predpokladajú

sa predvolené atribúty.

Ak zámka nebola už uzamknutá uzamkne sa a funkcia okamžite ukončí návratom. Ak už bola uzamknutá iným vláknom výkon funkcie je zablokovaný a pokračuje len ak je zámka odomknutá iným vláknom. Na uzamknutej zámke môže byť blokovaných aj viac vlákien. Keď je zámka odomknutá je odblokované len jedno vlákno (nepredikovateľne), ostatné ostanú zablokované.

Typy zámok:• Rýchly mutex (default) môže spôsobiť deadlockv prípade ak sa ho pokúša znovu zamknuť

to isté vlákno a je na zámku tiež blokované a nemôže ho teda odomknúť.• Rekurzívny mutex nespôsobuje deadlock. Môže byť zamknutý niekoľko krát tým istým

vláknom. Zámka si pamätá počet zamknutí. Na odomknutie sa musí toľkokrát volať funkcia pthread_mutex_unlock.

Page 34: Statnice Jadro Aplikovana Informatika

• Error-checkingmutex nespôsobí deadlock lebo detekuje po ďalšom uzamknutí zámky tým istým vláknom chybový stav EDEADLK.

Príklad deadloku – nastane deadlock, keďže vlákna uzamkýnajú zámky v rôznom poradí:

Thread 1 Thread 2/* use resource 1 */ /* use resource 2 */pthread_mutex_lock(&m1); pthread_mutex_lock(&m2);/* NOW use resources 2 + 1 */ /* NOW use resources 1 + 2 */pthread_mutex_lock(&m2); pthread_mutex_lock(&m1);pthread_mutex_unlock(&m1); pthread_mutex_unlock(&m2);

Semafóry sú vhodné prostriedky na synchronizáciu viacerých vlákien.

Uvažujme opäť zreťazený zoznam úloh, ktoré vykonávajú vlákna. Program pracuje ak je fronta úloh vytvorená predom alebo ak prichádzajú nové úlohy do fronty aspoň tak rýchlo ako sú spracovávané vláknami. Avšak ak vlákna pracujú veľmi rýchlo fronta úloh bude prázdna a vlákna budú zrušené. Ak budú neskôr prichádzať do fronty ďalšie úlohy už nebude vlákien na ich spracovanie.

Semafór obsahuje počítadlo hodnoty, ktorého sú nezáporné čísla. Obsahuje tiež dve základné operácie:

• wait – dekrementuje hodnotu semafóra o 1 a ak je hodnota 0 blokuje vlákno, ktoré túto operáciu volá pokiaľ nebude hodnota kladná.

• Post – inkrementuje hodnotu semafóra o 1. Ak bola hodnota predtým 0 a vlákna boli blokované na wait operácii jedno z nich bude odblokované (wait operácia sa skončí a semafór sa dekrementuje opäť na nulu)

Podmienkové premenné (PP) sa používajú na blokovanie vlákien pokiaľ je nie špecifikovaná podmienka pravdivá. Vždy sa používajú spolu so zámkou, pretože keď sa PP testuje musí byť uzamknutá. Keď je podmienka false vlákno je na PP blokované uvolní zámku a čaká na zmenu podmienky. Ak iné vlákno zmení podmienku, signalizuje túto zmenu, čakajúce vlákna sa zobudia, zamknú PP a znovu odtestujú podmienku. Vždy keď program urobí inštrukciu, ktorá môže zmeniť podmienku chránenú PP je treba vykonať tieto kroky:

• Uzamknúť zámku pridruženú k PP• Vykonať inštrukciu, ktorá môže zmeniť podmienku• Vyslať signál PP, že nastala zmena podmienky• Odomknúť zámku pridruženú k PP

Kritické oblastiPri multithreadingu jedno vlákno napríklad môže nastavova jedu i viac premenných a alšieť č ď vlákno tieto premenné používa. Niekedy to môže spôsobova problémy, niekedy nie. ť

Page 35: Statnice Jadro Aplikovana Informatika

Predstavme si ale, že vlákna zdie ajú nieko ko premenných alebo dátovú štruktúru. Býva asté,ľ ľ č že hodnoty jednotlivých premenných alebo položiek jednej štruktúry musia by navzájomť konzistentné. Opera ný systém avšak môže vlákno preruši niekde uprostred nastavovaniač ť položiek štruktúry. Vlákno, ktoré štruktúru používa, bude postavené pred nekonzistentné dáta.

Výsledkom je kolízia a nie je ažké si predstavi , ako môže takáto situácia vies ku zrúteniuť ť ť celého programu. Potrebujeme akýsi programový ekvivalent semaforov, ktorý by nám umožnil koordinova a synchronizova chod vlákien. A presne k tomu slúži ť ť kritická sekcia. Kritická sekcia je v zásade blok kódu, ktorý musí prebehnú nerušene. Mechanizmus kritických sekciíť zavádza „vzájomnú výlu nos “, termín, s ktorým sa vč ť problematike synchronizácie vlákien ešte stretneme. V ur itom okamihu môže kritickú sekciu vlastni iba jediné vlákno. Jedno vlákno tedač ť môže vstúpi do kritickej sekcie, nastavi všetky položky zdie anej architektúry a potom kritickúť ť ľ sekciu opusti . Iné vlákno, ktoré štruktúru tiež používa vstupuje do kritickej sekcie pred ítanímť č údajov zo štruktúry a potom ju opustí. Tým je zaistené, že dáta v štruktúre budú vždy konzistentné.

Programové prostriedky vzájomného vylúčenia nad KO(…)

Odlišnosti medzi procesmi a vláknamiPorovnanie vlákien a procesovProcesy v tradičných multitaskingových operačných systémoch sa od vlákien odlišujú najmä tým, že procesy:

• sú spravidla nezávislé,• obsahujú značnú informáciu o svojom stave,• majú oddelený adresný priestor• interagujú len prostredníctvom mechanizmov na medziprocesorovú komunikáciu, ktoré

poskytuje operačný systém.

Na druhej strane viacero vlákien priamo zdieľa stavové informácie procesu, ako aj pamäť a ďalšie zdroje. zmena kontextu medzi vláknami jedného procesu je spravidla rýchlejšia ako zmena kontextu medzi procesmi.

Zatiaľ čo bežné procesy sú navzájom oddelené, vlákna zdieľajú nielen spoločný pamäťový priestor, ale i ďalšie štruktúry.Na rozdiel od procesov zdieľajú vlákna v programe ten istý adresný priestor (globálne premenné). Keďže majú vlastný stack môže vykonávať každé vlákno odlišný kód programu a volať podprogramy bežným spôsobom. Každé volanie podprogramu v každom vlákne má svoje vlastné lokálne premenné, ktoré sa pamätajú do stacku vlákna.

Vlákno si však môže vytvoriť svoje špecifické premenné. Súto premenné, ktorých kópiu vlastní každé vlákno osobitne. Pretože zdieľajú všetky vlákna ten istý pamäťový priestor na tieto premenné (thread-specificdata) sa nemožno odvolávať ako na normálne premenné.

Page 36: Statnice Jadro Aplikovana Informatika

Vlákno sa podobá procesu, odlišný je spôsob zdieľania prostriedkov a súvisiaci kontext.

Page 37: Statnice Jadro Aplikovana Informatika

3. Jadro OS Funkcie jadra, správa procesov, princíp činnosti plánovača, správa pamäte.

Jadro OS

Jadro OS (kernel) je program, ktorý koordinuje činnosť ostatných programov a sprostredkúva im prostriedky počítača.Hlavné úlohy jadra :

Správa procesovSpráva pamätiSpráva zariadení(v niektorej literature je aj) poskytuje systémové volania

Poznáme niekoľko typov jadier:MonolitickéMikrojadroHybridné jadroNanojadroExojadro

Monolitické jadroV monolitickom jadre bežia všetky služby operačného systému spolu s hlavným vláknomjadra a v tej iste oblasti pamäte. Ak sú dobre napísané, tak sú veľmi účinné, lebo umožňujú neobmedzený a efektívny prístup k hardware. Hlavnou nevýhodou je závislosť medzi systémovými komponentmi – chyba v ľubovoľnom ovládači môže zhodiť celý systém a veľké jadrá môžu byť ťažko udržovateľné

Mikrojadro"'Mikrokernel'" je minimálny počítačový operačný systém kernel ktorý, vo svojej najčistejšej podobe, neposkytuje takmer žiadne služby operačného systému, iba "mechanizmus" potrebný na implementáciu takých služieb ako je nízko úrovňový adresový priestorový manažment, vláknový manažment a vnútro procesovú komunikáciu (IPC). Ak mikrokernel rozlišuje medzi kernelovským a používateľským módom, tak mikrokernel je jedinou časťou systému vykonávanou v kernel móde. Skutočné služby operačného systému sú poskytované servermi "používateľského módu". Tie zahŕňajú ovládače zariadenia, protokolový zásobník, súborový systém a kód používateľského rozhrania.

Hybridné jadroHybridné jadro je jadro operačného systému, ktoré kombinuje vlastnosti monolitického jadra a mikrojadra. Táto kategória je kontroverzná, kvôli podobnosti s monolitickým jadrom.

Myšlienkou tejto kvázi-kategórie je mať štruktúru jadra podobnú mikrojadru, ale implementovanú ako monolitické jadro. Na rozdiel od mikrojadra, všetky (alebo skoro všetky) služby bežia v jadrovom pamäťovom priestore.

Príkladom hybridného jadra je Windows NT (NT, 2000, 2003, XP, Vista) a BeOS.

Page 38: Statnice Jadro Aplikovana Informatika

NanojadráV nano jadre sú takmer všetky služby riešené ovládačmi zariadení. Tým má vlastné jadro ešte menšie požiadavky na pamäť ako mikrokernel.

ExojadroJe typ jadra, ktoré nezahŕňa hardware do teoretických modelov. Namiesto toho alokuje fyzické zdroje ako je čas procesoru, stránky pamäti a bloky na disku priamo rôznym programom.

3.1. Správa procesov

Proces - bežiaci program. Každému spustenému programu zodpovedá istý proces. Po prihlásení sa do systému je každému užívateľovi pridelená jedna kópia shellu, ktorá beží až do jeho odhlásenia => tento bežiaci program je procesom. Každý príkaz spustený z tohto shellu je opäť procesom. Viacero úloh beží naraz len zdanlivo , striedajú sa => zdieľanie času. Procesy môžu spúšťať iné procesy – svojich potomkov, ktoré sa môžu vykonávať súbežne s rodičom alebo rodič môže čakať na ich výsledky (vo-laním služby wait výkonného jadra OS). Okrem procesov spustených používateľom beží v modernom OS aj niekoľko systémových procesov. V Unixe ich nazývame démonmi, pretože existujú mimo vedomia používateľov a mimo dosahu ich terminálov. Existuje démon pre tlač súborov (lpd), démon pre swapovanie (démon pre odkladanie stránok na disk a pre ich spätné nahrávanie), pre prihlasovenie vzdia-lených používateľov cez ssh (sshd), démon pre umožnenie sťahovania súborov vzdialeným používate-ľom po sieti protokolom FTP (ftpd) apod. V modernejšej terminológii sa termín démon čoraz častejšie zamieňa termínom agent. Operačný systém by mal umožniť :

1vytváranie a ukončovanie procesov, 2pozastavenie a reaktiváciu procesov, 3synchronizáciu procesov a 4komunikáciu medzi procesmi (aj po sieti).

5.1. Zavádzanie a vykonávanie úloh

Proces je úloha (program) zavedená do pamäte na vykonanie. Ak desať používateľov používa napríklad textový editor vi, spustili jediný program (v pamäti sa nachádza iba raz), ale ide o desať samostatných procesov. Proces pozostáva z kódu programu (v našom príklade jediný v pamäti) a dát procesu (globálne dáta, zásobníky zodpovedajúce postupnosti volaní podprogramov a hromada, ktorá slúži na prideľovanie ďal-šej pamäte). Toto spolu s hodnotami registrov počítača charakterizuje proces v operačnom systéme na danom počítači.

5.2. Stav procesu

Stav procesu vyjadruje vzťah OS a procesu. Proces môže byť novovytvorený (new), bežiaci (running, práve je vykonávaný pomocou CPU), pripravený (ready, čaká na pridelenie CPU), čakajúci (waiting, nevykonáva sa, pretože čaká na dokončenie I/O požiadavky, na komunikáciu s iným procesom, na uply-nutie zadaného časového úseku alebo

Page 39: Statnice Jadro Aplikovana Informatika

na ukončenie činnosti svojho potomka) a ukončený (terminated, skončil prácu alebo bol násilne ukončený a systém ho z pamäte odstráni). Proces má svoj životný cyklus pozostávajúci z pripustenia (admit) novovytvoreného procesu do stavu pripravený, naplánovania (dispatch) procesu – stane sa bežiacim (a je opakovane prepínaný do stavu pri-pravený podľa prioritných pravidiel) a čakania na výskyt udalosti (stlačenie klávesy u editora). Po výsky-te udalosti, na ktorú proces čakal, sa zasa prepína do stavu pripravený. Poslednou fázou je samozrejme ukončenie procesu. Za bežných okolností používateľa ani programátora životný cyklus procesu ne-zaujíma. Operačný systém si drží informácie o procesoch v špeciálnej tabuľke procesov. Tabuľka pozostáva z PCB – process control blocks. Každá položka tabuľky obsahuje kontext procesu. Sú to všetky podstatné údaje o procese: PID (identifikačné číslo) procesu, stav procesu (či je bežiaci, pripravený, ...), obsah regis-trov (vrátane registra IP určujúceho pamäťovú adresu ďalšej inštrukcie), informácie pre plánovač proce-sov, údaje o pridelenej pamäti, účtovnícke informácie (koľko času CPU program spotreboval), stav I/O (priradené zariadenie, otvorené súbory).

Scheduller - (plánovač) - prvý proces, ktorý sa rozbehne po spustení operačného systému. Zodpovedá za to, ktorý z bežiacich procesov bude pripustený k procesoru, má PID=0. Za ním je spustený Init (PID=1), ktorý udržuje v chode všetky démony.

Démon - proces, ktorý jedná bez toho, aby bol k tomu vyzvaný užívateľom. Môže byť aktívny po celú dobu behu systému, alebo môže byť spúšťaný len v určitých okamihoch. Napríklad HTTP Démon vo WWW serveri čaká a obsluhuje volania hostu cez http protokol (napríklad Netscape).

Správa súborov (File System and File Management) prispôsobuje fyzikálne charakteristiky zariadenia ako je disk na logické zariadenie. Typicky sú dáta prenášané z disku na disk v blokoch. Bloky majú veľkosť 512 bajt. Je to najmenšia časť dát vhodná na fyzický prenos na disk. Túto blokovú operáciu zabezpečuje rôznymi spôsobmi operačný systém.

Správa vstupných / výstupných zariadení (IO) => jednotný prístup k I/O zariadeniam a k súborom. Pre efektívnejšiu komunikáciu s I/O zariadeniami (napríklad s tlačiarňou) sa používa metóda vyrovnávacích pamätí (Buffers). Buffery sú zriaďované v operačnej pamäti (napríklad v MS DOS príkazom Buffers v config.sys), takže dochádza k zmenšovaniu rozsahu pamäte. Príliš veľký počet bufferov má tiež za následok predĺženie času potrebného na vykonanie požiadavky, lebo treba dlhšie prehľadávať ich zoznam. (Kompromis 16 - 32, max. 50).

Adresár - udržuje pre operačný systém informáciu o jednotlivom súbore (jeho mene, veľkosti, ochrane, čase poslednej zmeny a o umiestnení na disku). Používajú sa 3 spôsoby organizácie adresárov:

• Jednoduchý adresár, organizovaný lineárnym spôsobom. Umiestnenie súboru v adresári sa musí hľadať sekvenčne, čo má vplyv na trvanie procesu hľadania a je pociťované ako negatívna vlastnosť. Napriek tomu VMS, UNIX, OS/2 a MS DOS používajú lineárne prehľadávanie adresárov. Tieto operačné systémy pri použití pamäte cache, v ktorej je uložená informácia o posledne

Page 40: Statnice Jadro Aplikovana Informatika

používanom adresári, môžu rýchlejšie získať informáciu o často používaných súboroch bez prístupu na disk.

• Na skrátenie hľadania môže byť použitá predtriedená organizačná schéma adresára. napríklad na základe binárneho hľadania usporiadaný adresár.

• Na organizáciu adresára použiť transformačnú tabuľku. Na základe mena súboru pridelí nejaká transformačná funkcia súboru index. Táto stratégia môže byť zdrojom kolízii ak podobné mená produkujú rovnaký index.

Všetky operačné systémy (VMS, UNIX, OS/2 a MS DOS) používajú mnoho úrovňovú organizáciu adresárov, kde napríklad každý uživateľ má svoj adresár ovládaný spoločným "adresárom adresárov". V jedno úrovňovom adresári by mená súborov museli byť jednoznačne odlišné. UNIX ako prvý zaviedol stromovú štruktúru, v ktorej súbory sú udržované na rôznych úrovniach. Meno súboru je potom špecifikované aj cestou, => zoznamom všetkých adresárov z úrovne koreňového adresára až na úroveň adresára, v ktorom sa nachádza súbor.

Prístup k súborom môže byť zorganizovaný rôzne:

• Sekvenčne - postupne záznam za záznamom. Nevýhoda, že sa nedá čítať záznam zo stredu súboru.

• Priamy prístup - nie je obmedzené poradie prístupu. Napríklad číta záznam 100, potom záznam 50 a pod.

• Indexovaný - usporiadaný na základe kľúčov, podobne ako v databázach.

Alokácie súborov môže používať:

• Súvislý spôsob ukladania súborov - súbory zaberajú určitý blok. Používa sa pre zrýchlenie prenosov, pretože sa minimalizuje pohyb hlavy disku. Keď sa disk zaplní a niektoré súbory sa z neho vymažú dochádza ku fragmentácii. (=> potreba dostatočného voľného priestoru na disku alebo použiť kompresiu súborov, ktorá je však nevhodná pri on line práci)

• Spôsob ukladania súborov pomocou odkazu (link) - každý blok alebo sekcia súboru obsahuje ukazovateľ na nasledujúci blok (alebo segment) súboru. Aby pointer nezaberal miesto pre ukladanie súborov, je potrebný zvláštny disk na uloženie info o ukazovateľoch. Žiadny z operačných systémov (VMS, UNIX, OS/2 a MS DOS) nepoužíva tento systém.

• Indexované alokovanie (nepliesť s indexovaným prístupom k súboru) - kombinácia súvislého spôsobu s odkazmi. Odkazy sa nachádzajú v indexovej tabuľke v pamäti. Každý index určuje určitý segment súboru. Pretože indexové vstupy sú uložené v pamäti je prístup k súboru rýchly aj keď je súbor rozložený na disku. V rámci segmentu je usporiadanie súvislé.

6. Plánovanie procesov

Plánovanie času procesora – základná funkcia OSPrideľovaním procesora jednotlivým procesom sa práca celého počítačového systému zefektívni.

Page 41: Statnice Jadro Aplikovana Informatika

6.1 Základné princípy

- plánovanie – základ multiprogramovania(Základnou myšlienkou multiprogramovania je, aby stále bežalo niekoľko procesov, aby sa procesor maximálne využíval)

- prepínanie CPU medzi procesmi OS – zefektívnenie práce počítača

Prakticky v OS existujú 4 typy plánovania:- dlhodobé- strednodobé- krátkodobé- plánovanie obsluhy V/V požiadaviek

Plánovanie času procesora tvorí podstatnú časť návrhu OS.

6.2 Cykly práce procesora a periférií

Pozorovaním činností procesov sa zistilo, že vykonanie procesu pozostáva z cyklov práce procesora a čakania V/V operácie. Práca procesu začína cyklom procesora a pokračuje striedaním cyklu procesora so stavmi čakania na V/V. Proces končí zasa cyklom procesora, aby mohol byť dokončený štandardnými dokončovacími operáciami.

6.3 Preemptívne plánovanie

Rozhodovanie o plánovaní času procesora sa môže urobiť vždy pri jednom z nasledujúcich prechodov:

1. Keď proces prepína zo stavu bežiaci do stavu čakajúci (čakanie na dokončenie V/V operácie alebo čakanie na ukončenie potomka).

2. Keď proces prepína zo stavu bežiaci do stavu pripravený.3. Keď proces prepína zo stavu čakajúci do stavu pripravený.4. Keď proces končí.

Pri prechodoch v bodoch 1 a 4 nie je možnosť výberu pre plánovanie. Nový proces sa musí vybrať pre vykonanie.Keď sa plánovanie vykoná len v prípadoch 1 a 4 hovoríme, že ide o nepreemptívne plánovanie, inak plánovanie je preemptívne. Pri nepreemptívnom plánovaní, keď sa raz procesor pridelí procesu, proces sa vykoná až do svojho ukončenia, alebo pokiaľ nevznikne požiadavka na V/V. Táto metóda plánovania je použitá v OS Microsoft Windows. Pre určité HW platformy je toto jediná možná metóda plánovania, pretože nevyžaduje špeciálny HW (napr. časovač).Preemptívne plánovanie je náročnejšie.

6.4 Dispečer

- ďalší komponent, ktorý sa zúčastňuje na plánovaní času procesora- je to modul, ktorý umožňuje procesu riadiť procesy vybrané krátkodobým plánovačom

Page 42: Statnice Jadro Aplikovana Informatika

- jeho funkcie sú: prepínanie kontextu, prepínanie do používateľského režimu, skok na príslušnú adresu po opätovnom spustení programu.

- musí byť čo najrýchlejší, pretože sa volá pri každom prepnutí procesov.

6.5 Kritériá plánovania

Jednotlivé plánovacie algoritmy majú rôzne vlastnosti a môžu uprednostňovať rôzne skupiny procesov. Pri výbere algoritmu pre danú situáciu musíme mať na vedomí vlastnosti jednotlivých algoritmov.Pre posudzovanie vlastností plánovacích algoritmov je možné zvoliť rôzne kritériá. Podľa toho, ktoré charakteristiky sú zvolené na porovnanie algoritmov, je možné získať značné rozdiely pri určovaní optimálneho algoritmu.Používané kritériá sú nasledujúce:

Využitie procesora (v reálnom systéme by malo byť v hraniciach 40% pre málo zaťažený systém, do 90% pre silne zaťažený systém). Priepustnosť (ak procesor spracováva proces – vykonáva prácu; meranie vykonanej práce – počet ukončených procesov pre danú časovú jednotku). Čas vykonania (časový interval od vzniku procesu do jeho ukončenia; je to súčet času čakania na vstup do pamäte, času stráveného vo fronte pripravených procesov, času vykonávania a času V/V operácií). Čas čakania (algoritmy plánovania neovplyvňujú čas, ktorý proces venuje vykonávaniu V/V operácií, ale len čas, ktorý proces strávi vo fronte pripravených procesov). Čas odozvy (čas od vystavenia požiadavky do prvej odozvy na túto požiadavku).

Vo všeobecnosti je žiadúce maximalizovať využitie procesora a priepustnosť a minimalizovať čas vykonania, čas čakania a odozvy. Avšak niekedy je žiadúce optimalizovať maximálne a minimálne hodnoty namiesto priemerných hodnôt. Napr. ak chceme aby všetci používatelia dostali dobré služby, budeme sa snažiť minimalizovať maximálnu dobu odozvy.

6.6 Plánovacie algoritmy

- plánovanie času procesora rieši problém, ktorému procesu z frontu pripravených procesov má byť pridelený procesor

6.6.1 Spracovanie v poradí príchodu (FCFS – First Come, First Served)- Najjednoduchší z algoritmov plánovania. - Podľa tohto algoritmu proces, ktorý požiadal prvý o pridelenie procesora ho dostane

ako prvý. - Implementácia tohto algoritmu sa uskutočňuje pomocou frontu FIFO. - Keď proces vstúpi do frontu pripravených procesov, jeho riadiaci blok (PCB) sa zaradí

na koniec frontu. Keď sa procesor uvoľní, pridelí sa procesu, ktorý je na čele frontu. Bežiaci proces sa odstráni z frontu.

- Stredná doba čakania pri použití FCFS je často veľmi dlhá.

Page 43: Statnice Jadro Aplikovana Informatika

- Nie je preemptívny – keď proces dostane raz pridelený procesor, vykonáva sa až do ukončenia, alebo kým nepožiada o V/V operáciu

- Môže neúmerne predĺžiť čas čakania krátkych procesov.- Je ťažko použiteľný v time-sharingových systémoch, kde je dôležité, aby každý

používateľ získal čas procesora v pravidelných intervaloch a nie je žiadúce, aby jeden proces zadržal procesor na dlhšiu dobu.

6.6.2 Najkratší proces najskôr (SJF – Shortest Job First)- Poradie spracovania sa určuje podľa požadovanej doby obsluhy procesu.- Keď sa procesor uvoľní, pridelí sa procesu, ktorý požaduje najmenšiu dobu na svoje

dokončenie (ak proces bol čiastočne spracovaný).- Ak dva procesy majú rovnaké požadované doby obsluhy, vyberajú sa podľa poradia

príchodu.- Je optimálny v tom, že dáva najlepšie výsledky v priemernej dobe čakania pre danú

množinu procesov- Nedostatkom je to, že treba dopredu vedieť dĺžku požadovanej doby obsluhy. (Pri

dávkovom spracovaní môžeme použiť časový limit pre spracovanie dávky, ktorý zadáva používateľ.)

- Často sa používa pri dlhodobom plánovaní.- Aj keď dáva optimálne výsledky, nedá sa použiť na krátkodobé plánovanie, pretože

nie je známa dĺžka ďalšej požiadavky procesu na čas procesora. (Jeden možný prístup je odhad tejto hodnoty, ktorú nevieme, ale môžeme predpovedať. Očakávame, že ďalšia požiadavka bude mať dĺžku podobnú predchádzajúcim. Potom na základe predpovedaných dĺžok môžeme vybrať proces s najmenšou požiadavkou.)

- Môže byť preemptívny aj nepreemptívny. Výber sa robí, keď do frontu pripravených procesov príde nový proces a predchádzajúci sa ešte vykonáva. Nový proces môže mať menšie požiadavky na čas procesora ako zostávajúce požiadavky práve vykonávaného procesu. Preemptívny algoritmus prepne bežiaci proces, zatiaľ čo nepreemptívny ho nechá dobehnúť. Preemptívny algoritmus sa niekedy nazýva plánovanie podľa najkratšej doby na vykonanie (SRTF – Shortest Remaining Time First).

6.6.3 Prioritné plánovanie- Každý proces má pridelenú prioritu a procesor je pridelený procesu s najvyššou

prioritou. - Procesy s rovnakou prioritou sa plánujú podľa poradia príchodu (FCFS).- Priority patria obyčajne do pevného intervalu celých čísel. Neexistuje všeobecne

prijaté ustanovenie, že 0 je najnižšia alebo najvyššia priorita. Niektoré systémy používajú menšie čísla na označenie menšej priority, iné naopak.

- Priority môžu byť definované buď interne alebo externe.- Interne definované priority využívajú niektoré merateľné hodnoty, aby určili prioritu

procesu, napr. časové limity, požiadavky na pamäť, počet otvorených súborov, pomer priemerných požiadaviek na V/V k priemeru požiadaviek na procesor.

- Externé priority sa nastavujú podľa kritérií, ktoré sú externé vzhľadom na OS, ako napr. dôležitosť procesu, alebo nejaké pracovné faktory, vyplývajúce z povahy nasadenia.

- Môže byť preemptívne alebo nepreemptívne. Keď proces príde do frontu pripravených procesov, jeho priorita sa porovnáva s prioritou bežiaceho procesu. Pri preemptívnom plánovaní proces bude prepnutý, ak priorita nového procesu je vyššia ako jeho. Pri

Page 44: Statnice Jadro Aplikovana Informatika

nepreemptívnom plánovaní nový proces sa umiestni na začiatok frontu pripravených procesov.

- Hlavný problém – nekonečné blokovanie (starvácia). Proces, ktorý je pripravený na spustenie, ale nedostáva procesor, sa môže pokladať za blokovaný. Je možné, že v silne zaťaženom systéme niektoré procesy s nižšou prioritou budú čakať nekonečne dlho na pridelenie procesora. Všeobecne môžu nastať dva prípady: buď proces bude niekedy spustený alebo systém spadne a zrušia sa všetky nedokončené procesy s nižšou prioritou. Riešením tohto problému je postupné zvyšovanie priority procesov, ktoré dlho čakajú.

6.6.4 Cyklické plánovanie (Round Robin)- Je navrhnutý špeciálne pre time-sharing-ové systémy.- Podobá sa FCFS, ale je preemptívny.- Definuje sa malý časový úsek – časové kvantum, ktoré je obyčajne od 10 do 100 ms.- Front pripravených procesov sa spracováva ako cyklický front. Plánovač prideľuje

postupne každému procesu z frontu jedno časové kvantum.- Implementuje sa tak, že front pripravených procesov je typu FIFO. Nový proces sa

pridáva na jeho koniec. Plánovač vyberá proces vždy zo začiatku frontu, nastavuje časovač na 1 časové kvantum a spúšťa proces.

- Ďalšia činnosť procesu môže byť nasledovná: proces môže potrebovať procesor na menší čas ako je časové kvantum a v takomto prípade uvoľní dobrovoľne procesor. Plánovač vyberie a spustí ďalší z pripravených procesov. Ak proces potrebuje čas dlhší ako je časové kvantum, po uplynutí kvanta časovač spôsobí prerušenie. Zapamätá sa kontext procesu a proces sa uloží na koniec frontu, z ktorého sa vyberie ďalší pripravený proces.

- Výkonnosť algoritmu silne závisí od veľkosti časového kvanta

6.6.5 Plánovanie s viacerými frontmi- Táto trieda plánovacích algoritmov bola navrhnutá pre situácie, kedy sa procesy dajú

ľahko rozdeliť na rôzne skupiny (napr. veľmi často sa procesy v systéme delia na interaktívne a dávkové, tieto dve skupiny majú odlišné požiadavky na čas odozvy a tiež môžu mať odlišné potreby plánovania).

- Delí front pripravených procesov na niekoľko frontov. Procesy sú zaraďované do príslušného frontu podľa niektorej vlastnosti procesu – napr. veľkosť, priorita, typ procesu atď.

- Každý front má svoj plánovací algoritmus.- Musí sa tu vykonať aj plánovanie medzi frontami, ktoré sa bežne implementuje ako

preemptívne plánovanie s pevnými prioritami. Iná alternatíva plánovania je rozdelenie času procesora medzi frontmi. Každý front dostáva určitú časť času procesora a delí ju medzi procesy vo fronte.

- Procesy sú pevne spojené s jedným frontom a nemenia ho, kým sa nedokončia ( je to dané tým, že rozdelenie procesov je urobené na základe charakteristiky procesu, ktorá zostáva nemenná.

6.6.6 Plánovanie s viacerými frontmi so spätnou väzbou (Multilevel feedback)- Dovoľuje procesom pohybovať sa medzi frontmi.- Základná myšlienka je rozdeliť procesy podľa ich požiadaviek na cyklus procesora.- Plánovač používajúci fronti so spätnou väzbou je definovaný pomocou týchto

parametrov: počet frontov,

Page 45: Statnice Jadro Aplikovana Informatika

plánovací algoritmus pre každý front, metóda, ktorá sa používa, na určenie momentu, kedy proces má byť

presunutý do frontu s vyššou prioritou, metóda, ktorá sa používa, na určenie momentu, kedy proces má byť

presunutý do frontu s nižšou prioritou, metóda, ktorá sa používa, na určenie frontu, do ktorého sa zaradí

proces, ktorý potrebuje byť obslúžený.- Je to najuniverzálnejší plánovací algoritmus, ale aj najzložitejší.- Môže byť prispôsobený pre rôzne systémy, ale potrebuje starostlivý výber parametrov,

aby sa docielilo optimálne plánovanie.

6.7 Plánovanie viacprocesorového systému

Plánovanie procesov v systéme s viacerými procesmi je zložitejšia úloha, ako v jednoprocesorovom systéme. Aj v tomto prípade boli vyskúšané viaceré algoritmy, ale žiadny nie je ideálny.Problémy sprevádzajúce plánovanie viacprocesorového systému:

Procesory v systéme sú väčšinou funkčne identické (homogénne). To znamená, že procesy môžu byť vykonávané na ľubovoľnom procesore. Ak sú procesory neidentické (Heterogénne), znamená to, že proces môže byť vykonaný len na procesore, pre ktorý bol inštrukčný súbor skompilovaný. To je prípad niektorých distribuovaných systémov. Pokiaľ máme k dispozícii niekoľko identických procesorov, môžeme použiť stratégiu zdieľania zaťaženia (load sharing). To znamená, že sa práca delí medzi jednotlivé procesory. Obyčajne sa udržuje jeden front pripravených procesov a keď sa niektorý procesor uvoľní, pridelí sa mu jeden proces z frontu. Podľa tejto schémy sa môžu uplatniť dva prístupy. Podľa prvého každý procesor sa sám stará o svoju prácu. Keď sa uvoľní, preskúma front pripravených procesov a vyberie si proces na vykonávanie. Táto úloha je zložitá, pretože potrebuje synchronizáciu prístupu k spoločným dátovým štruktúram. Druhý prístup je taký, že sa určí jeden procesor ako plánovací a on prideľuje procesom procesory. Niektoré systémy riešia všetky problémy spojené s plánovaním, V/V a inými systémovými aktivitami tak, že jeden procesor je tzv. master server. Tento prípad asymetrického multiprocesingu je jednoduchší ako symetrický multiprocesing, kedy sú procesory rovnocenné, lebo len jeden procesor pracuje so systémovými dátami, a tak odpadá potreba synchronizovať k nim prístup.

Scheduller - (plánovač) - prvý proces, ktorý sa rozbehne po spustení operačného systému. Zodpovedá za to, ktorý z bežiacich procesov bude pripustený k procesoru, má PID=0. Za ním je spustený Init (PID=1), ktorý udržuje v chode všetky démony.

Správa súborov (File System and File Management) prispôsobuje fyzikálne charakteristiky zariadenia ako je disk na logické zariadenie. Typicky sú dáta prenášané z disku na disk v blokoch. Bloky majú veľkosť 512 bajt. Je to najmenšia časť dát vhodná na

Page 46: Statnice Jadro Aplikovana Informatika

fyzický prenos na disk. Túto blokovú operáciu zabezpečuje rôznymi spôsobmi operačný systém.

Správa vstupných / výstupných zariadení (IO) => jednotný prístup k I/O zariadeniam a k súborom. Pre efektívnejšiu komunikáciu s I/O zariadeniami (napríklad s tlačiarňou) sa používa metóda vyrovnávacích pamätí (Buffers). Buffery sú zriaďované v operačnej pamäti (napríklad v MS DOS príkazom Buffers v config.sys), takže dochádza k zmenšovaniu rozsahu pamäte. Príliš veľký počet bufferov má tiež za následok predĺženie času potrebného na vykonanie požiadavky, lebo treba dlhšie prehľadávať ich zoznam. (Kompromis 16 - 32, max. 50).

Adresár - udržuje pre operačný systém informáciu o jednotlivom súbore (jeho mene, veľkosti, ochrane, čase poslednej zmeny a o umiestnení na disku). Používajú sa 3 spôsoby organizácie adresárov:

Jednoduchý adresár, organizovaný lineárnym spôsobom. Umiestnenie súboru v adresári sa musí hľadať sekvenčne, čo má vplyv na trvanie procesu hľadania a je pociťované ako negatívna vlastnosť. Napriek tomu VMS, UNIX, OS/2 a MS DOS používajú lineárne prehľadávanie adresárov. Tieto operačné systémy pri použití pamäte cache, v ktorej je uložená informácia o posledne používanom adresári, môžu rýchlejšie získať informáciu o často používaných súboroch bez prístupu na disk.

Na skrátenie hľadania môže byť použitá predtriedená organizačná schéma adresára. napríklad na základe binárneho hľadania usporiadaný adresár.

Na organizáciu adresára použiť transformačnú tabuľku. Na základe mena súboru pridelí nejaká transformačná funkcia súboru index. Táto stratégia môže byť zdrojom kolízii ak podobné mená produkujú rovnaký index.

Všetky operačné systémy (VMS, UNIX, OS/2 a MS DOS) používajú mnoho úrovňovú organizáciu adresárov, kde napríklad každý uživateľ má svoj adresár ovládaný spoločným "adresárom adresárov". V jedno úrovňovom adresári by mená súborov museli byť jednoznačne odlišné. UNIX ako prvý zaviedol stromovú štruktúru, v ktorej súbory sú udržované na rôznych úrovniach. Meno súboru je potom špecifikované aj cestou, => zoznamom všetkých adresárov z úrovne koreňového adresára až na úroveň adresára, v ktorom sa nachádza súbor.

Prístup k súborom môže byť zorganizovaný rôzne: Sekvenčne - postupne záznam za záznamom. Nevýhoda, že sa nedá čítať záznam zo stredu súboru.Priamy prístup - nie je obmedzené poradie prístupu. Napríklad číta záznam 100, potom záznam 50 a pod.Indexovaný - usporiadaný na základe kľúčov, podobne ako v databázach.

Alokácie súborov môže používať:

Súvislý spôsob ukladania súborov - súbory zaberajú určitý blok. Používa sa pre zrýchlenie prenosov, pretože sa minimalizuje pohyb hlavy disku. Keď sa disk zaplní a niektoré súbory sa z neho vymažú dochádza ku fragmentácii. (=> potreba dostatočného voľného priestoru na disku alebo použiť kompresiu súborov, ktorá je však nevhodná pri on line práci)

Spôsob ukladania súborov pomocou odkazu (link) - každý blok alebo sekcia súboru obsahuje ukazovateľ na nasledujúci blok (alebo segment) súboru. Aby pointer nezaberal

Page 47: Statnice Jadro Aplikovana Informatika

miesto pre ukladanie súborov, je potrebný zvláštny disk na uloženie info o ukazovateľoch. Žiadny z operačných systémov (VMS, UNIX, OS/2 a MS DOS) nepoužíva tento systém.

Indexované alokovanie (nepliesť s indexovaným prístupom k súboru) - kombinácia súvislého spôsobu s odkazmi. Odkazy sa nachádzajú v indexovej tabuľke v pamäti. Každý index určuje určitý segment súboru. Pretože indexové vstupy sú uložené v pamäti je prístup k súboru rýchly aj keď je súbor rozložený na disku. V rámci segmentu je usporiadanie súvislé.

Práca s pamäťou

Alokácia pamäti - akcia pri ktorej sa vyhradzuje pamäťový priestor:

dynamická - miesto v pamäti sa alokuje počas behu programu,statická - miesto v pamäti sa alokuje už počas prekladu, teda pred spustením prekladu.

Premená:globálna - existencia premenej sa začína so spustením programu a končí s ukončením programu,lokálna - existencia premenej sa začína pri vstupe do podprogramu (funkcie alebo procedúry), v ktorom je definovaná a končí sa so zakončením podprogramu. Lokálna premená je dostupná len z podprogramu, v ktorom je definovaná.

Statická alokácia premených vyhradzuje miesto v dátovej oblasti. Globálne premnné môžu byť alokované len staticky. Kľúčové slovo extern sa používa pri oddelenom preklade súborov, keď je treba, aby dva alebo viac súborov sdieľali tú istú premennú. Táto globálna premenná je v jednom súbore definovaná bez kľúčového slova extern a vo všetkých ostatných musí byť definovaná s použitím extern.

Pri vymedzovaní dynamickej pamäte určitej dlžky počas behu programu sa používa zásobník - stack. Existencia lokálnych premených začína pri vstupe do podprogramu a končí pri výstupe z tohto podprogramu.Pri prideľovaní dynamickej pamäte si treba uvedomiť, že síce žiadame o pridelenie určitého počtu bajtov, ale je vecou operačného systému koľko pamäte naviac sa skutočne pridelí. Napr. MSDOS prideľuje pamäť po tzv. paragrafoch, čo sú násobky 16-tich bajtov. Dôvodom tohto "plytvania pamäte" je zjednodušenie administratívy.

Fyzický adresový priestor, FAPje operačná pamäť fyzicky prítomná v počítači. Predstavujeme si ho ako lineárne pole adresovateľných jednotiek: bytov (1B=8 bitov), očíslovaných adresami od 0 po MAX (napr. 0..FFFF, 0..FFFFFFFF).Logický adresový priestor, LAPje pamäť ako abstrakcia, na ktorú sa jednotlivé programy (a tým aj procesy) odvolávajú pri adresácii.V jednoduchých architektúrach LAP je "podmnožinou" FAP, ale sú dnes bežné aj také architektúry, kde mapovanie LAP na FAP je zložité a dokonca súčet veľkostí LAPov môže prekročiť veľkosť FAP (ako sa potom procesy zmestia do op. pamäti? povieme si to).

Hardvérová jednotka správy pamäti, MMU

Page 48: Statnice Jadro Aplikovana Informatika

(memory management unit) ovláda pamäť. Úlohou MMU je namapovať logické adresy generované procesom na fyzické adresy zrozumiteľné hardvéru, keď sa CPU obracia prostredníctvom MMU k pamäti, a to pri:- načítavaní inštrukcie (fetch),- čítaní dát (load),- zapisovaní dát (store),Z hľadiska MMU sa jedná o prúd adries, nerobí rozdiely medzi dátami a inštrukciami. Akým spôsobom sa ale tieto adresy generujú bežiacim programom (procesom)? Adresy z hľadiska programu (procesu)Adresy sú v rôznych etapách spustenia programu reprezentované rôzne.V zdrojovom programepoužívame adresy symbolické dobre známe premenné alebo identifikátory Pri preklade programusa tieto adresy zmenia prekladačom na tzv relokovateľné adresy ("14 bytov od začiatku modulu X", "17 bytov pod vrcholom zásobníka").Počas behu programumáme logické adresy procesu (LAP) jediná adresácia, ktorá je "zrozumiteľná" MMU, ktorý ju namapuje na FAP. Pridelenie adries(address binding) dátam a inštrukciám programu sa podľa toho môže odohrať v troch fázach:Počas prekladuPočas prekladu vzniká relatívný (relokovateľný) kód.Ojedinele sa používa aj absolútny kód, ktorý sa dá zaviesť len na pevne určenú adresu v op. pamäti, keďže adresy sú pevne určené. V istom zmysle reprezentantom tohto prístupu sú .com súbory v MS DOSe.Počas zavedenia programu do pamätiAdresy v kóde zadané relatívne (relokovateľné, "premiestniteľné" adresy) sa pri zavedení programu modifikujú podľa umiestnenia programu v pamäti.Počas behu programuAk operačný systém povoľuje premiestnenie adresového priestoru počas behu programu, adresy sa musia prepočítavať po každom premiestnení. Toto schéma musí byť podporované hardverom (MMU) pozri ďalej napr. relokačné a limitné registre.

Schémy pre zefektívnenie práce s pamäťouDynamické zavedenie (loading)Procedúra sa nenačíta do pamäti, pokiaľ to nie je nutné. Pri prvom volaní sa zavedie z relokovateľného formátu uloženého na disku.Výhoda: zriedkavo volané procedúry sa vôbec nezavedú (typicky napr. ošetrenie exotických chýb).Nevýhoda: časová réžia na prvé volanie každej procedúry.Dynamické zostavovanie (linking)Zostavovací program (linker) kombinuje jednotlivé moduly programu a predpripravené knižnice a vytvára vykonateľný súbor. Pri dynamickom zostavovaní sa tzv. dynamicky linkované knižnice nepridajú do vykonateľného súboru, pridá sa len akýsi "odkaz" hovoriaci "toto je volanie procedúry f() z knižnice libX". Pri prvom volaní procedúry f sa vyhľadá knižnica libX v systéme súborov a zavedie sa.Výhody: menšie vykonateľné súbory, možnosť vylepšiť knižnicu (napr. opraviť drobné chyby) bez nutnosti zmeniť vykonateľné programy.

Page 49: Statnice Jadro Aplikovana Informatika

Nevýhoda: nutnosť verzionovať knižnice (veľké, nekompatibilné zmeny knižníc znemožňujú spoluprácu s programami kompilovanými so starou verziou knižnice).Reprezentantom tohoto prístupu sú DLL v MS Windows a shared libraries v systémoch UNIX.Prekrývanie (overlay)Často štruktúra programu je taká, že určité časti kódu sa používajú len v určitých etapách behu programu. Napr. kompilátor najprv vykoná lexikálnu a syntaktickú analýzu, potom generuje kód a jediným "spoločným bodom" týchto dvoch fáz je vnútorná forma programu. Potom je možné rozčlenenie programu na prekrývané moduly: určité spoločné časti sú zavedené vždy, iné sa zavádzajú a odstraňujú z pamäti podľa potreby. Táto metóda nepotrebuje podporu od OS, len od prekladača (vie to napr. aj Borland Pascal).Odkladanie na disk (swapping)Proces, ktorý je v stave bežiaci, musí byť v pamäti. Na druhej strane ostatné procesy (čakajúce, pripravené) sa môžu dočasne odsunúť na disk a znovu sa zaviesť až vtedy, keď sú naplánované. Výhody: táto metóda umožňuje "opticky" zväčšiť súčet veľkostí LAP procesov nad veľkosť FAP.Nevýhoda: obrovský nárast trvania prepnutia kontextu (disky sú pomalé). Táto "čistá" forma odkladania sa dnes už skoro nepoužíva odkladajú sa nie celé adresové priestory procesov, ale menšie bloky pamäti pozri ďalej (virtuálna pamäť stránkovanie na žiadosť). Prideľovanie pamätiV tejto časti rozoberieme najčastejšie používané metódy mapovania LAP na FAP, ako MMU zabezpečí mapovanie LAP na FAP a vzájomnú ochranu LAP procesov. Súvislá alokáciaLAP procesu je uložený v súvislej oblasti FAP. Jedna oblasť (typicky oblasť nižších adries obsahujúca aj vektory prerušení) je vyhradená pre OS, ďaľšie oblasti sú určené procesom. Podľa počtu a veľkosti týchto oblastí rozoznávame niekoľko možností:- jedna oblasť (okrem oblasti pre OS) jeden proces,- viac oblastí rovnakej veľkosti každý proces vo svojej oblasti- viac oblastí premenlivej veľkosti každý proces vo svojej oblasti, veľkosť oblasti je určená nárokmi procesu.Mapovanie LAP na FAP a ochrana pamätisa uskutočnuje pomocou dvoch registrov: bázového (alebo relokačného) a limitného. Pri prepínaní kontextu sa tieto registre naplnia špecifickými hodnotami pre proces, na ktorý sa prepína. LAP procesu i sa chápe ako pole bytov číslované od 0 po hodnotu maximálnej adresy procesu 0..max(i). Pri zavedení procesu sa rozhodne o fyzickej adrese priradenej logickej adrese 0 (začiatku LAP) to bude hodnota bázového registra pre daný proces. Hodnota limitného registra daného procesu bude max(i).

Pri spracovaní v MMU,keď CPU vygeneruje logickú adresu a, MMU najprv overí, či a<=max(i) (tým sa zabezpečí ochrana: neadresujeme "nad" vyhradenou fyzickou adresou; adresovať "pod" sa nedá: adresy sú bez znamienka), v prípade neúspechu sa vyvolá prerušenie: programová chyba a proces sa ukončí. Ak sa test podaril, a sa pripočíta k hodnote R bázového registra a dostaneme fyzickú adresu. Znamená to napr., že pri hodnote R=10000 sa logická adresa a=314 namapuje na FA 10314 ak 314<=max(i), t.j. daný proces používa aspoň 315 bytov pamäti.Nevýhody:Pre jednu oblasť je to samozrejme znemožnenie multitaskingu. V prípade rovnako veľkých oblastí je to interná fragmentácia a obmedzenie veľkosti procesov (ak oblasti majú 100KB, tak na proces veľkosti 10KB vyplýtvame 90KB op. pamäti, ak máme 10 voľných oblastí po 100KB, nespustíme proces, ktorý chce 101KB).

Page 50: Statnice Jadro Aplikovana Informatika

Pri premenlivých veľkostiach oblastí je to externá fragmentácia: môže sa stať, že po spustení a ukončení niekoľkých procesov bude FAP vyzerať ako ementál a veľkosť najväčšieho súvislého voľného bloku ("diery") bude výrazne menšia, než súčet veľkostí všetkých voľných oblastí zase sa nemusí podariť spustiť proces s veľkými pamäťovými nárokmi.Riešením je kompaktifikácia: presunúť obsadené oblasti tak, aby vznikla jediná veľká voľná oblasť. Zvláštna opatrnosť musí byť venovaná ukončeniu procesov a uvoľňovaniu pamäti: susedné diery sa musia spojiť! Ak proces žiada o ďaľšiu pamäť, ale za jeho oblasťou nie je už voľný priestor, žiadosť sa musí zamietnuť. StránkovanieRiešením problémov fragmentácie pri súvislej alokácii je stránkovanie. Tu dovolíme, aby FAP priradený procesu nebol súvislý. FAP je rozdelený na bloky pevnej dĺžky rámce (typicky 1/2, 1, 2, 4 KB). LAP procesu je taktiež rozdelený na bloky rovnakej veľkosti: stránky.Tabuľka stránok (TS) procesuurčuje priradenie rámcov stránkam. Pri prepnutí kontextu sa prepne aj tabuľka stránok (typicky adresa tabuľky stránok bežiaceho procesu je v špeciálnom registri a stačí zmeniť túto hodnotu).Ak proces požiada o ďaľšiu pamäť,OS mu pridelí ďaľší voľný rámec (ak existuje). Takto pridelené rámce neležia súvisle za sebou.Pri spracovaní v MMUsa logická adresa rozdelí na číslo stránky p a offset na stránke d (typicky niekoľko prvých bitov adresy dáva p a zvyšok d preto je veľkosť stránky mocnina 2). p sa použije ako index do TS a získa sa tým hodnota f: číslo rámca. Fyzická adresa je:f*r + d, kde r je veľkosť rámca.OchranaDo TS sa pridajú ďaľšie bity (okrem f), ktoré definujú prístupové práva procesu k danej stránke (napr read, write, readonly a pod). Okrem toho jeden bit označuje stránku ako platnú/neplatnú či stránka patrí do LAP procesu alebo nie (veľkosť TS je totiž rovnaká pre všetky procesy bez ohľadu na ich pamäťové nároky).ZdieľanieStránkovanie dokonca umožňuje zdieľať stránky medzi procesmi: stačí, ak dva procesy majú rovnaké číslo rámca niekde vo svojej TS. Pomocou bitov pre ochranu sa dá nastaviť aj to, že jeden z procesov na danú stránku len zapisuje, druhý len číta (a tým dané procesy komunikujú: spomeňte si na producenta a konzumenta). Typickejšia situácia je pri zdieľamí vykonateľného kódu (inštrukcií, nie dát!): tieto stránky sú označené readonly a môžu byť zdieľané viacerými procesmi ktoré majú ten istý program.Nevýhody: interná fragmentáciau na poslednej stránke procesu (priemerne pol stránky na proces), zvýšenie času na context switch, veľkosť TS atď. SegmentáciaStránkovanie striktne oddeľuje LAP a FAP, mapovanie je "neprirodzené". Je to vyvolané tým, že sa na LAP dívame ako na lineárne pole bytov. Prirodzenejší pohľad na LAP je programátorský: vidíme rôzne procedúry alebo skupiny súvisiacich procedúr (napr. knižnice), rôzne oblasti dát (polia, zásobníky). Pri segmentácii LAP si predstavíme ako neusporiadanú kolekciu segmentov: pomenovaných oblastí premenlivej dĺžky, ktoré obsahujú kód alebo dáta, ktoré spolu nejak súvisia, sú sémanticky (významovo) zviazané. Z dôvodov efektívnosti sa pri behu nepoužíva meno, ale číslo segmentu.Pri mapovaní LAP na FAP

Page 51: Statnice Jadro Aplikovana Informatika

sa každý segment zobrazí do súvislej oblasti FAP podobne, ako sa celý LAP procesu zobrazoval pri súvislej alokácii. Budeme teda potrebovať bázovú a limitnú hodnotu, ale pre každý segment. Tieto hodnoty sa ukladajú v tabuľke segmentov procesu, v ktorej sa vyhľadáva pomocou čísla segmentu. Segmenty sa vo FAP neprekrývajú.Segmenty obyčajne vytvára prekladač, v niektorých prípadoch je jeho chovanie ovplyvniteľné.Pri spracovaní v MMUsa logická adresa rozdelí na číslo segmentu s a offset v segmente d (typicky niekoľko prvých bitov adresy dáva s a zvyšok d). s sa použije ako index do TS a získa sa tým hodnota l: veľkosť (limit) segmentu a hodnota b: bázová adresa segmentu. MMU najprv porovná d a l: ak d>l, znamená to chybu adresácie a proces sa obyčajne ukončí. V opačnom prípade získame fyzickú adresu ako b+d.Ochrana a zdieľanieTeraz nám príde vhod, že segmenty sú sémantické entity: obsahujú spolu súvisiace veci (kód, dáta). Preto môžu byť segmenty označené prístupovými právami a zdieľané procesmi tak, ako rámce, ale všetko je prirodzenejšie.Nevýhody: Nenastáva interná fragmentácia, ale môže nastať externá, rovnako, ako pri súvislej alokácii LAP procesov s premenlivou dĺžkou oblastí. Situácia je ale lepšia, lebo segmenty sú menšie, než LAP celého procesu. Segmentované stránkovanieVýhody a nevýhody segmentácie a stránkovania sa dajú užitočne skombinovať pomocou segmentovaného stránkovania. Tieto schémy môžu byť veľmi komplikované, načrtneme len základnú myšlienku.Základom je segmentácia, t.j. prvotná fáza prevodu LA na FA je segmentácia. Ako výsledok nedostaneme hneď FA, ale tzv. lineárnu adresu. Táto adresa sa potom stránkuje, t.j. priestor lineárnych adries je rozdelený na stránky a týmto stránkam sa v druhej fáze prevodu priraďujú rámce popísaným algoritmom stránkovania: takto dostaneme FA. Virtuálna pamäťTáto technika umožňuje beh procesov, ktorých LAP nie je celý vo FAP, t.j. celý proces nie je zavedený v op. pamäti. Jedna z možných implementácií je stránkovanie na žiadosť, ktoré tu stručne a veľmi zjednodušene popíšeme.Stránkovanie na žiadosťZákladom je stránkovanie (alebo segmentované stránkovanie). Každý rámec má ale priradené miesto aj v sekundárnej pamäti (disku) tzv. odkladacej oblasti (toto je zjednodušenie!). Nie každá stránka procesu musí byť v op. pamäti, niektoré môžu byť na disku. Čo sa ale stane, ak sa proces snaží pristúpiť k stránke, ktorá je odložená? Nastane tzv. výpadok stránky (page fault) proces prejde do stavu čakajúci a OS prenesie stránku do op. pamäti. V podstate proces môže začať svoj beh tak, že len jeho "úvodná stránka" (začiatok programu) je v op. pamäti, ostatné sú odložené. Po prenesení chýbajúcej stránky do op. pamäti proces prejde do stavu pripravený a eventuálne sa dostane k procesoru.Pri tejto schéme súčet veľkostí LAP procesov v systéme môže prekročiť veľkosť FAP: čo rozhoduje, je súčet veľkostí stránok, ktoré sú v op. pamäti (nie sú odložené). Samozrejme, môže nastať situácia, že po výpadku stránky chceme stránku odloženú zaviesť z disku do op. pamäti, ale nie je voľný žiaden rámec vo FAP. V takomto prípade sa jeden z obsadených rámcov musí odložiť na disk. Algoritmy výberu tejto obete prekračujú rámec prednášky.

Page 52: Statnice Jadro Aplikovana Informatika

7. Objasnite relačný dátový model.

DatabázaPo íta ová č č databáza (niekedy aj báza dát alebo databanka) je kolekcia štruktúrovaných dát alebo informácií uložených v po íta ovom systémeč č , takým spôsobom, že po íta ovýč č program, alebo lovekč môže použi ť dopytovací jazyk (angl.: query language) na získavanie týchto informácií. Takto získané informácie môžu by použité pri ť rozhodovacom procese. Po íta ový program používaný na správu dát a tvorbu query sa ozna uje č č č DBMS. Vlastnos ami a návrhom DBMS sa zaoberá ť informatika.

Typická [query] zodpovedá otázky typu "Ko ko párov topánok vyrobených Ba om sa predaloľ ť v marci v Bratislave a Košiciach?" Na to, aby databáza bola schopná zodpoveda takútoť otázku je nutné, aby mala informácie ko ko akých topánok sa predalo vrátane ľ dátumu a miesta predaja. Termín databáza vznikol v prostredí výpo tovej techniky. Hoci jeho významč sa rozšíril, a môže ozna ova aj neelektronické databázy, tento lánok sa zaoberáč ť č po íta ovými databázami. Kolekcie dát podobné databázam existovali už pred č č priemyselnou revolúciou napríklad vo forme ú tovníckych záznamov a kníh a neskôr č kartoték.

Základným konceptom databáza je kolekcia záznamov, alebo iastkových informácií.č Typicky, v každej databáze existuje popis štruktury dát a typu dát, ktoré sú v databáze: tento popis sa nazýva logická schéma. Táto schéma popisuje objekty, ktoré sú v databáze a vz ahyť medzi nimi. Existuje viacero rôznych spôsobov tvorby schém t.j. modelovania databázovej štruktúry: tieto sa nazývajú databázovými modelmi (alebo modelmi dát). V sú astnosti ječ najviac používaným rela ný modelč . Rela ný model sa dá vysvetli tak, že kompletný súhrnč ť dát je uchovávaný v tabu kách pozostávajúcich z riadkov a st pcov (presná definícia používaľ ĺ matematický pojem relácie). Tento model reprezentuje vz ahy použitím tých istých hodnôt voť viacerých tabu kách. Iné modely, napríklad ľ hierarchický model alebo sie ový modelť používajú explicitnejšiu reprezentáciu vz ahov.ťV širšom zmysle sú sú as ou databázy aj softvérové nástroje, ktoré slúžia na manipuláciu ač ť prístup k uloženým dátam.

Predchodcom databáz boli papierové kartotéky. Umož ovali zara ovanie nových položiek aň ď usporiadanie dát pod a rôznych ľ kritérií (kategórií). Všetky operácie robil lovek. Správač takýchto kartoték bola v mnohom podobná správe dnešných databáz.

Dátové modely:1. Entitno-relačný model2. Systém pre správu súborov3. Hierarchický model4. Sieťový model5. Relačný model6. Objektovo orientované SRBD

Relačný model

Relačný dátový model (RDM) organizuje údaje do tzv. usporiadaných entít - tabuliek. Relačnú databázu užívateľ vníma ako sústavu v čase sa meniacich normalizovaných tabuliek s usporiadanými stĺpcami. V RDM sa každá položka stáva doménou (stĺpcom) tabuľky a každý záznam tvorí korež (riadok). Rôzne množiny z komplexného sieťového modelu sa stávajú rôznymi tabuľkami, ktoré identifikujú jednotlivé položky pomocou názvov stĺpcov v prvom riadku. Ako príklad si uveďme opäť

Page 53: Statnice Jadro Aplikovana Informatika

skladovú databázu Žilinskej bicyklovej fabriky, spol. s r.o. usporiadanú tentoraz do relačného tvaru (Obr. 4.11). V každej tabuľke má jeden alebo viac stĺpcov rovnaký názov ako v inej tabuľke. Tieto spoločné stĺpce vytvárajú relácie medzi jednotlivými tabuľkami. Samotné názvy stĺpcov v jednotlivých tabuľkách nemusia byť nevyhnutne zhodné ako v našom príklade, stačí, aby dáta v spoločných stĺpcoch mali rovnaký typ a doménu. Ak chceme nájsť určitý tovar od určitého dodávateľa, SRBD vyhľadá v tabuľke TOVAR názov tovaru, v stĺpci D# nájde číslo dodávateľa a vztiahne ho k obdobnému údaju v stĺpci D# v tabuľke DODÁVATELIA, kde nájde názov firmy a meno kontaktného pracovníka. Pre zistenie ceny tovaru sa využije relácia medzi stĺpcami T# a D# v tabuľke TOVAR a rovnomennými stĺpcami v tabuľke CENY. Jednotlivé relácie môžu byť aj kombinované: užívateľ môže požiadať SRBD o zobrazenie dodávateľa, názvu tovaru, ceny a minimálneho odberu, pre ktorý táto cena platí.

Na to, aby bolo možné dátové tabuľky efektívne ukladať do pamäti a manipulovať s nimi, musiatieto tabuľky spĺňať nasledujúce vlastnosti:

1. Každá entita (tabuľka) má v RDM svoj jednoznačný názov, ktorý ju v databáze identifikuje.2. Každá entita (tabuľka) obsahuje len kortéži (riadky, záznamy) rovnakého typu.3. Každá doména (stĺpec) tabuľky má svoj názov – meno, ktorým je identifikovaný v RDM. Ak

sa v rôznych tabuľkách vyskytujú rovnaké domény, môžu byť pomenované rôzne, ale praktickejšie je pomenovať ich rovnako, pretože ide o rovnaké veličiny. Pri rovnakom pomenovaní ich však musíme odlišovať príponou - t.j. kvalifikovať ich príslušnosťou k určitej tabuľke.

4. Každý stĺpec obsahuje hodnoty rovnakého atribútu a tieto hodnoty musia byť z domény skalárnych hodnôt rovnakého typu - t.j. napr. len samé číslice, len textové reťazce, len logické hodnoty a pod.

5. Každý kortéž (riadok) tabuľky zodpovedá jednému výskytu entity daného typu. 6. Každý riadok je jednoznačne identifikovateľný. Pre identifikáciu sa používa zvláštny atribút -

tzv. primárny kľúč.7. Na poradí stĺpcov a riadkov v tabuľke nezáleží.8. Všetky hodnoty v danom riadku sú jednoznačne a úplne závislé na primárnom kľúči.9. Každá bunka tabuľky (ak je obsadená) musí obsahovať len jednoduchú hodnotu príslušnej

domény (t.j. nie opakujúcu sa skupinu hodnôt). Kľúčové hodnoty musia byť vždy obsadené - t.j. nesmú obsahovať NULL (Hodnota NULL indikuje, že príslušná hodnota nie je známa).

Celý RDM je tvorený sústavou entít (tabuliek), ktoré majú uvedené vlastnosti. Aby sme mali zaručenú integritu RDM, musí byť starostlivo vyriešená problematika kľúčov. Sledujeme dvojakú integritu RDM:

- integritu kotéží, ktorá zaručuje, že každá entita bude v RDM jednoznačne identifikovateľná. To je dané tým, že žiadna z veličín tvoriacich primárny kľúč nebude mať hodnotu NULL.- referenčnú integritu, ktorá zaručuje, že sústava tabuliek bude navzájom prepojená s možnosťou spájať vzájomne hodnoty z navzájom súvisiacich tabuliek RDM.

Ako už bolo uvedené skôr, primárny kľúč slúži na jednoznačnú identifikáciu kortéži (riadku) v každej tabuľke. Primárny kľúč môže byť tvorený jedným alebo viacerými doménami (atribútmi) - hovoríme potom o jednoduchom alebo zloženom kľúči. Primárny kľúč musí spĺňať nasledujúce požiadavky:

- jedinečnosť, t.j. v tabuľke sa nesmú vyskytnúť dve a viac rovnakých hodnôt kľúča;- minimalizáciu, t.j. v prípade, že kľúč je vytvorený zložením viacerých hodnôt, potom žiadna z

týchto hodnôt nemôže byť vypustená bez porušenia zásady jedinečnosti kľúča.Primárny kľúč môže byť v prípade potreby tvorený aj všetkými hodnotami v riadku.

Pri rozhodovaní o voľbe primárneho kľúča zvažujeme niekedy rôzne domény (atribúty), ktoré by mali spĺňať funkciu kľúčových hodnôt. Hovoríme potom a tzv. možných kľúčoch (candidate keys). To

Page 54: Statnice Jadro Aplikovana Informatika

býva v situácii, keď existuje viac identifikačných hľadísk - napr. zamestnanca môžeme identifikovať jeho osobným číslom (spravidla prideleným zamestnávateľom) alebo jeho rodným číslom. Keď sa pre jeden z možných kľúčov rozhodneme, druhý zostáva ako alternatívny kľúč.

Ak chceme zabezpečiť skôr uvádzanú referenčnú integritu, musíme umožniť spájať výskyty jednotlivých riadkov entít (riadky tabuliek), ktoré k sebe logicky patria. Toto umožňujú tzv. cudzie kľúče (foreign keys). Ide vždy o primárne kľúče alebo ich časť z inej entity (tabuľky). Pre uvažovaný príklad sú cudzie kľúče uvedené na spojniciach jednotlivých tabuliek (Obr. 4.12). Problém referenčnej integrity spočíva nielen v prepojení všetkých tabuliek, ale aj v tom, aby toto prepojenie bolo sémanticky správne. To znamená, že predpokladáme, že v tabuľke TOVAR sa neobjaví riadok s uvedením tovaru od dodávateľa, ktorý nemá záznam v tabuľke DODÁVATELIA. Ak by sa taký tovar skutočne objavil, SRBD musí takýto stav rozoznať a vyžiadať si riešenie. Obdobné problémy treba riešiť napríklad pri vyraďovaní niektorého tovaru z tabuľky TOVAR. V takom prípade sa musia zrušiť aj všetky odpovedajúce záznamy z tabuľky CENA.

Page 55: Statnice Jadro Aplikovana Informatika

8. Objasnite proces úpravy dát pri projektovaní databáz, konkrétne normalizáciu dát.

Normalizácia

Závažným rozhodnutím, pred ktoré je postavený projektant databázy je definovanie tabuliek a následne relácií medzi nimi. Proces dekompozície dát do podmnožín pre jednotlivé tabuľky sa nazýva normalizácia. Normalizácia vychádza z požiadavky na efektívne ukladanie dát do pamäti, t.j. minimalizáciu nadbytočnosti (redundancie) pri zachovaní integrity a konzistencie databázy a pri zachovaní požadovaného informačného obsahu. Pri tom sa musí dbať o zaručenie efektívnej práce s RDM, predovšetkým jednoznačnosť a správnosť odpovedí na dopyty. RDM definuje celkom 5 úrovní normalizácie, pričom každá úroveň redukuje množstvo duplicitných dát. V praxi sa používajú len prvé 3 úrovne normalizácie. Základnou myšlienkou normalizácie je postupný rozklad pôvodných nenormalizovaných tabuliek do sústavy viacerých menších tabuliek tak, aby sa dosiahlo zmenšenie nárokov na pamäť bez straty informácií pôvodne v tabuľke obsiahnutých, t.j. s možnosťou kedykoľvek vytvoriť pôvodné tabuľky. Ide nám o tzv. bezstratovú dekompozíciu. Vlastný postup dekompozície sa realizuje v jednotlivých normalizačných krokoch odpovedajúcich jednotlivým normálnym formám (Obr. 4.13):

- Prvá normálna forma (1NF) vyžaduje, aby jednotlivé stĺpce obsahovali vždy len hodnoty z homogénnej dátovej domény bez opakujúcich sa hodnôt (t.j. jedno políčko - jedna hodnota).

- Druhá normálna forma (2NF) vyžaduje, aby všetky nekľúčové hodnoty v riadku boli významovo úplne závislé na kľúčových hodnotách daného riadku.

- Tretia normálna forma (3NF) rieši problém tzv. tranzitívnej závislosti, kedy niektorá nekľúčová hodnota závisí od inej nekľúčovej hodnoty v danom riadku. Možno povedať, že RDM je znormalizovaný do 3NF, ak každý atribút je buď kľúčovým atribútom alebo je svojou hodnotou jednoznačne závislý na celom kľúči (t.j. všetkých kľúčových hodnotách).

- Štvrtá a piata normálna forma riešia niektoré špeciálne prípady viachodnotových závislostí. Pre praktické použitie spravidla nie sú potrebné a uspokojíme sa s normalizáciou do 3NF.

Ako príklad normalizácie si pozrime tabuľku TOVAR (Obr. 4.11). Hoci stĺpce T# a „Názov tovaru“ obsahujú určité opakujúce sa (duplicitné) informácie, každý riadok je jedinečný, pretože hodnoty v stĺpci D# sú odlišné. Na túto tabuľku môžeme aplikovať ďalšiu úroveň normalizácie tým, že stĺpec D# rozdelíme na viac stĺpcov (Obr. 4.14). To ešte viac redukuje priestor potrebný na uloženie informácie o skladovanom tovare, aj keď to o niečo zväčšuje rozsah tabuľky CENY, v ktorej musí byť stĺpec D# nahradený stĺpcami D1 a D2. Tieto zmeny nijako neovplyvnia štruktúru tabuľky DODÁVATELIA. V správne navrhnutom relačnom SRBD sa informácia o štruktúrach tvoriacich databázu zapisujúdo zvláštnej množiny tabuliek, ktoré sa nazývajú systémové tabuľky alebo databázový slovník. Tieto informácie obsahujú dátové prvky ako názvy tabuliek, názvy stĺpcov v týchto tabuľkách a typy dát ukladaných do jednotlivých stĺpcov. SRBD zaobchádza s týmito systémovými tabuľkami rovnako ako s ostatnými tabuľkami, takže programátor ich môže prehľadávať, aby zistil názvy tabuliek v databáze alebo názvy stĺpcov v každej tabuľke. Najdôležitejšou výhodou relačného modelu oproti hierarchickému alebo sieťovému je jeho veľká pružnosť (flexibilita). Zmena štruktúry databázy spočíva v jednoduchom pridaní stĺpca do tabuľky, jeho zrušení prípadne vytvorení novej tabuľky alebo zrušení existujúcej, čo minimálne ovplyvní ostatné tabuľky. Vďaka možnosti definovania vzťahov (relácií) medzi jednotlivými stĺpcami rôznych tabuliek je možné jednoducho vytvoriť novú tabuľku ako podmnožinu (projekciu) existujúcich tabuliek. To, že na zmenu štruktúry nie je potrebné nanovo

Page 56: Statnice Jadro Aplikovana Informatika

vytvárať celú štruktúru databázy sa pozitívne odrazí na zachovaní integrity dát.

Normalizacia 2

Normalizácia je proces eliminovania duplicitných údajov v relačných databázach. Správne normalizované databázy majú návrh, ktorý reflektuje pravé závislosti medzi sledovanými položkami a umožňuje rýchlu zmenu údajov bez rizika vzniku nekonzistencie.

Normálne formy

Edgar Frank Codd pôvodne definoval 3 normálne formy. Prvá NF vyžaduje, aby boli tabu kyľ vytvorené z primárneho k ú a a nieko kých ľ č ľ atomických atribútov, druhá a tretia sa zaoberajú vz ahom nek ú ových atribútov k ť ľ č primárnemu k ú uľ č . Tieto sa dajú zosumarizova akoť požiadavka, aby všetky nek ú ové atribúty boli funk ne závislé na „k ú i, celom k ú i aľ č č ľ č ľ č ni om inom ako na k ú i“. V praxi je vä šina aplikácií v 3NF plne normalizovaná. Výskumč ľ č č však objavil potenciálne anomálie operácie update v databázach v 3NF. BCNF je alšímď zlepšením 3NF, ktoré sa pokúša tieto anomálie odstráni .ťŠtvrtá a piata normálna forma sa zaoberajú konkrétne reprezentáciou vz ahov 1:N a M:N.ť Šiesta NF sa vz ahuje iba na ť temporálne databázy.

Prvá normálna forma (1NF)Prvá normálna forma požaduje aby každý atribút obsahoval len atomické hodnoty, to znamená hodnoty ktoré sú alej nedelite né.ď ľ

Druhá normálna forma (2NF)Druhá normálna forma požaduje aby relácia bola v 1NF a zárove každý nek ú ový atribútň ľ č bol na primárnom k ú iľ č úplne funk ne závislý (na celom k ú i, nie len na jeho podmnožine).č ľ čNapríklad relácia:

Študent (primárny klúč)Kód predmetu (primárny klúč)Názov predmetuZnámka

nie je v 2NF, pretože názov predmetu nie je závislý na celom k ú i, ale len na jeho asti (a toľ č č na kóde predmetu). Na prevod do 2NF by bolo potrebné ju rozdeli na dve, pri om zť č pôvodnej relácie by sme odstránili názov predmetu a vytvorili by sme novú reláciu:

Kód predmetu (primárny klúč)Názov predmetu

Tretia normálna forma (3NF) Relácia je v tretej normálnej forme, pokia je v 2NF a žiaden nek ú ový atribút nie jeľ ľ č tranzitívne funk ne závislý od primárneho k ú a. To znamená že všetky neklú ové atribútyč ľ č č musia by navzájom nezávislé.ťNapríklad relácia:

Číslo predmetu (primárny klúč)Názov predmetuČíslo učiteľaMeno učiteľa

Page 57: Statnice Jadro Aplikovana Informatika

nie je v tretej normálne forme, pretože meno u ite a je závislé od ísla u ite a. Prevod byč ľ č č ľ opä pozostával z dekompozície.ť

Boyce – Coddova normálna forma (BCNF)

Štvrtá normálna forma (4NF) Tabu ka je vo štvrtej normálnej forme vtedy, ak je v tretej normálnej forme a opisuje len jedenľ fakt alebo súvislos (t.j. nespájajú sa nezávislé opakované skupiny).ť

Normalizacia 3

Normální formyPojem normálních forem se používá ve spojitosti s dob e navrženými tabulkami. Správnř ě vytvo ené tabulky spl ují 4 základní normální formy.ř ň

1. normální forma (1NF)První, nejjednodušší, normální forma (zna íme č 1NF) íká, že všechny atributy jsou atomické,ř tj. dále již ned litelné (jinými slovy, hodnotou nesmí být relace). M jme nap . tabulkuě ě ř ADRESA, která bude mít sloupce JMÉNO, PŘÍJMENÍ a BYDLIŠTĚ. Napln ní tabulkyě nech odpovídá reálnému sv tu:ť ě

JMÉNO P ÍJMENÍŘ BYDLIŠTĚjan novák Ostravská 16, Praha 16000petr nový Svitavská 8, Brno 61400jan nová ekč Na bradlech 1147, Ostrava 79002Pokud bychom v této tabulce cht li vypsat všechny pracovníky, jejichž PS je rovno ur itéě Č č hodnot , dostali bychom se do potíží, nebo bychom to nemohli zjistit p ímo a jednoduše. Aě ť ř to proto, že atribut BYDLIŠTĚ není atomický, skládá se z n kolika ástí: ě č ULICE, ČÍSLO, MĚSTO a PSČ. Správný návrh tabulky, který bude respektovat 1NF bude vypadat následovn :ě

JMÉNO P ÍJMENÍŘ ULICE ÍSLOČ M STOĚ PSČjan novák Ostravská 16 Praha 16000petr nový Svitavská 8 Brno 61400jan nová ekč Na bradlech 1147 Ostrava 79002Obecn bychom se m li snažit, aby obsahem jedné databázové položky byla práv jednaě ě ě hodnota (ur itého databázového typu).č

2. normální forma (2NF)Tabulka spl uje ň 2NF, práv když spl uje ě ň 1NF a navíc každý atribut, který není primárním klí em je na primárním klí i úpln závislý. To znamená, že se nesmí v ádku tabulky objevitč č ě ř položka, která by byla závislá jen na ásti primárního klí e. Z definice vyplývá, že problémč č 2NF se týká jenom tabulek, kde volíme za primární klí více položek než jednu. Jinými slovy,č pokud má tabulka jako primární klí jenom jeden sloupec, pak č 2NF je spln na triviáln .ě ě Nech máme tabulku ť PRACOVNÍK, která bude vypadat následovn (atribut ě ČÍS_PRAC zna íč íslo pracovišt , kde daný pracovník pracuje, atribut č ě NÁZEV_PRAC uvádí jméno daného

pracovišt ):ě

ÍSLOČ JMÉNO P ÍJMENÍŘ ÍS_PRACČ NÁZEV_PRAC

Page 58: Statnice Jadro Aplikovana Informatika

1 jan novák 10 studovna2 petr nový 15 centrála3 jan nová ekč 10 studovnaJaký primární klí zvolíme v této tabulce? Pokud zvolíme pouze č ČÍSLO, je to špatn , neboě ť zcela ur it název pracovišt , kde zam stnanec pracuje, není závislý na íslu pracovníka.č ě ě ě č Takže za primární klí musíme vzít dvojici (č ČÍSLO,ČIS_PRAC). Tím nám ovšem vznikl nový problém. Položky JMÉNO, PŘÍJMENÍ a NÁZEV_PRAC nejsou úpln závislé na dvojiciě zvoleného primární klí e. A tedy d láme, co d láme, nejsme schopni vybrat takový primárníč ť ě ě klí , aby tabulka spl ovala č ň 2NF. Jak z tohoto problému ven? Obecn p evedení do tabulky,ě ř která již bude spl ovat ň 2NF, znamená rozpad na dv a více tabulek, kde každá už budeě spl ovat ň 2NF. Takovému "rozpadu" na více tabulek se odborn íká ě ř dekompozice rela níhoč schématu. Správn navržené tabulky spl ující ě ň 2NF budou vypadat následovn (tabulkaě PRACOVNÍK a PRACOVIŠTĚ):

ÍSLOČ JMÉNO P ÍJMENÍŘ IS_PRACČ1 jan novák 102 petr nový 153 jan nová ekč 10

ÍSLOČ NÁZEV10 studovna15 centrálaDále si všimn te, že pokud tabulka nespl uje ě ň 2NF, dochází asto k redundanci. Konkrétn vč ě p vodní tabulce informace, že pracovišt íslo 10 se jmenuje "studovna", byla obsaženaů ě č celkem dvakrát. Redundance je jev, který obvykle nespln ní ě 2NF doprovází. O tom, že redundance je nežadoucí, net eba pochybovat. Zkuste si rozmyslet, jak byste postupovali vř obou p íkladech, kdyby ve vaší spole nosti došlo ke zm n názvu pracovišt íslo 10 zeř č ě ě ě č "studovna" na "klubovna".

3. normální forma (3NF)Rela ní tabulky spl ují t etí normální formu (č ň ř 3NF), jestliže spl ují ň 2NF a žádný atribut, který není primárním klí em, není tranzitivn závislý na žádném klí i. Nejlépe to op t vysv tlíč ě č ě ě následující p íklad. M jme tabulku ř ě PLATY, která bude vypadat takto:

ÍSLOČ JMÉNO P ÍJMENÍŘ FUNKCE PLAT1 jan novák technik 150002 petr nový vedoucí 215003 jan nová ekč správce 17500Pomineme zatím fakt, že tato tabulka nespl uje ani ň 2NF, což je základní p edpoklad pro ř 3NF. Chci zde jen vysv tlit pojem ě tranzitivní závislost. Nebudeme p emýšlet, co je primární klí ,ř č na první pohled vidíme, že konkrétn atributy ě JMÉNO, PŘÍJMENÍ a FUNKCE závisí na atributu ČÍSLO (ten by nejspíš byl primárním klí em). Dále m žeme vid t, že atribut č ů ě PLAT z ejm je funk n závislý na atributu ř ě č ě FUNKCE a pokud vememe v úvahu, že ČÍSLO->FUNKCE a FUNKCE->PLAT, dostaneme díky jevu nazývanému tranzitivita, že ČÍSLO->PLAT. Postup, jak dostat tabulky do 3NF, je podobný jako v p ípad ř ě 2NF, tj. op tě provedeme dekompozici (tabulka FUNKCE a PLATY):

ÍSLOČ JMÉNO P ÍJMENÍŘ FUNKCE1 jan novák technik

Page 59: Statnice Jadro Aplikovana Informatika

2 petr nový vedoucí3 jan nová ekč správceFUNKCE PLATtechnik 21500vedoucí 17500správce 15000Z hlediska základních t í normálních forem, jsou tyto dv tabulky již v po ádku. Zř ě ř praktického hlediska je vhodn jší použít n jaký íselník funkcí, abychom splnili podmínku,ě ě č že primární klí v tabulkách má být co nejkratší délky. Nejlepší zápis je tedy následující:č

ÍSLOČ JMÉNO P ÍJMENÍŘ CIS_FUN1 jan novák 1212 petr nový 1563 jan nová ekč 127

ÍSLOČ FUNKCE PLAT121 technik 21500156 vedoucí 17500127 správce 15000

Boyce-Coddova normální formaPoslední prakticky užívanou formou je tzv. Boyce-Coddova normální forma (BCNF). Tabulka spl uje ň BCNF, práv když pro dv množiny atribut ě ě ůA a B platí: A->B a sou asn č ě B není podmnožinou A, pak množina A obsahuje primární klí tabulky. Tato forma zjednodušuječ práci s tabulkami, ve v tšin p ípad , pokud dob e postupujeme p i tvorb tabulek, abyě ě ř ů ř ř ě spl ovaly postupn ň ě 1NF, 2NF a 3NF, forma BCNF je spln na.ě

Page 60: Statnice Jadro Aplikovana Informatika

Popíšte niektoré najdôležitejšie pojmy z teórie databáz (na logickej úrovni)

Databázový systém:Databázový systém (DBS) tvorí databáza (DB) a systém riadenia bázy dát

(SRBD). Zjednodušene môžeme písať: DBS = DB + SRBD

Systém riadenia bázy dát (SRBD) je programové vybavenie, ktoré umožní zabezpečiť všetky požadované vlastnosti databázového systému a manipulovať s dátami.

Databáza:Počítačová databáza (niekedy aj báza dát alebo databanka) je kolekcia

štruktúrovaných dát alebo informácií uložených v počítačovom systéme, takým spôsobom, že počítačový program, alebo človek môže použiť dopytovací jazyk (query language) na získavanie týchto informácií.

Relačný model:Relačný model definuje spôsob, akým je možné dáta reprezentovať (štruktúra

dát), spôsoby ich ochrany (integritu dát) a nakoniec operácie, ktoré môžeme nad dátami vykonávať (manipuláciu s dátami).

Relačný model nepredstavuje jedinú metódu spravovania dát. Existujú aj iné možnosti, ako hierarchický, sieťový alebo hviezdicový model.

Charakteristické vlastnosti relačných databáz:• všetky dáta sa pomyselne dajú reprezentovať v pravidelne usporiadaných

štruktúrach s riadkami a stĺpcami, ktorým hovoríme relácie• všetky hodnoty v databáze sú skalárne. To znamená, že v každej konkrétnej

pozícii riadku a stĺpca danej relácie sa nachádza (presnejšie práve jedna) hodnota

• operácie v databáze sa vykonávajú vždy nad celou reláciou a ich výsledkom je opäť iná celá relácia.

Čo je relácia? Reláciou môže byť čokoľvek, čo je usporiadané do štruktúry riadkov a stĺpcov a čo obsahuje skalárne hodnoty (matematicky: Nech existuje množina domén D= D1,D2, ...,Dn nad množinou Ω , potom reláciou je podmnožina karteziánskeho súčinu domén D1xD2x ...xDn.). Relácia zodpovedá tabuľke.

Vlastnosti relácie:1. Neobsahuje duplicitné n-tice - táto vlastnosť vychádza s faktu, že telo

relácie je matematická množina (množina n-tíc), a podľa definície neobsahuje duplicitné prvky. Základným predpokladom pre splnenie tohto bodu je nutná existencia primárneho kľúča v každej relácii (pozri definíciu primárneho kľúča). Primárny kľúč môže byť tvorený jedným atribútom alebo zložením niekoľkých atribútov relácie.

2. n-tice sú neusporiadané (zhora dolu) – n-tice tvoria matematickú množinu (nie je usporiadaná) hoci z praktického hľadiska je často vhodné udržiavať

Page 61: Statnice Jadro Aplikovana Informatika

reláciu ako usporiadanú množinu. Z druhej strany neusporiadanosť umožňuje zjednodušiť algoritmy pre prácu nad reláciou.

3. m-tice atribútov sú neusporiadané (zľava doprava) – m-tice tvoria matematickú množinu (nie je usporiadaná). Táto vlastnosť hovorí o tom, že k jednotlivým stĺpcom alebo k hodnotám atribútu pristupuje prostredníctvom identifikátoru (meno atribútu) a nie podľa pozície v riadku. To umožní tvorbu programov nezávislých na dátach.

4. hodnoty atribútov sú atomické – túto vlastnosť môžeme vyjadriť aj inak (menej formálne): každému atribútu je priradená vždy len jedna hodnota a nie množina hodnôt. Je potrebné, aby všetky atribúty boli atomické, čím dosiahneme to, že v relácii sa nemôžu vyskytovať tzv. opakujúce sa skupiny atribútov, ktoré sa vyskytujú v nenormalizovaných záznamoch. Hodnota atribútu je vždy skalár a nie množina. "Relácia neobsahuje opakujúce sa skupiny". Relácii bez opakujúcich sa skupín hovoríme, že je normalizovaná.

Doména:Doména je množina hodnôt rovnakého významu (napr.: vek, priezvisko).

Hodnoty v doméne sú rovnakého dátového typu – číslo, reťazec znakov, dátum atď. Je to obor hodnôt, ktoré tvorí množina všetkých prípustných platných hodnôt, ktoré smie určitá položka obsahovať.

Aký je rozdiel medzi oborom hodnôt a dátovým typom?Dátový typ je fyzický pojem, obor hodnôt je pojem logický: “číslo“ je dátový typ, zatiaľ čo “vek“ predstavuje už obor hodnôt, obsahujúci “čísla“.Položka “Priezvisko“ a položka “Adresa“ majú rovnaký dátový typ – je to reťazec znakov. Ale už z názvom je zrejmé, že budú mať iný obor hodnôt, takže patria do rôznych domén.

Kartézsky súčin množín A, B:Majme množinu usporiadaných dvojíc [x,y], pre ktoré platí, že x patrí do

množiny A a y patrí do množiny B. Potom platí, že počet prvkov v kartézskom súčine je daný počtom prvkov v množine A krát počet prvkov v množine B. Ak máme množinu A = 1, 2, 3 a množinu B = a, b, potom je kartézsky súčin M = A x B daný takto: M = [1,a], [1,b], [2,a], [2,b], [3,a], [3,b].

Vlastne relácia je ľubovoľná podmnožina kartézskeho súčinu (napr. R = [1,a], [2,b], [3,a] ). To, aké prvky bude relácia obsahovať, je definované práve konkrétnym SQL príkazom s určenými podmienkami.

Entita:Entita je čokoľvek, o čom v systéme potrebujeme uchovávať informácie. Pri

zahájení prác na návrhu dátového modelu nie je zostavenie prvotného zoznamu entít vôbec obtiažne. Ak si rozoberieme priestor problémov, používame podstatné mená ako vhodných kandidátov na entity (Autori píšu knihy – autori, Čitatelia požičiavajú knihy – čitatelia).

Udalosti medzi jednotlivými entitami sa nazývajú vzťahy. Vzťah medzi knihou a dodávateľom je dodávať, medzi knihou a čitateľom je požičiavať.

Page 62: Statnice Jadro Aplikovana Informatika

Atribúty:Navrhovaný systém bude o každej entite zaznamenávať, sledovať

a vyhodnocovať určité skutočnosti. Týmto skutočnostiam (údajom) sa hovorí atribúty danej entity. Ak knižný systém obsahuje entitu kniha, chceme o nej viesť údaje o názve, autorovi, vydavateľstve, dodávateľovi, cene atď. Toto všetko sú atribúty. Nie vždy bývajú atribúty jednoznačné . Určovanie atribútov je sémantický proces. To znamená, že sa budeme rozhodovať podľa významu dát a podľa spôsobu ich využitia. Zjednodušene povedané, atribúty sú v podstate stĺpce relácie (tabuľky).

Meno relácie Atribúty

KLINCE Katalogove-cislo

Hrubka-mm

Dlzka-mm

10326 2 4010334 3 80

n-tice 10345 4 12010352 5 15010364 6 200

Vzťahy:Okrem atribútov jednotlivých entít musíme v dátovom modeli určiť vzťahy,

definované medzi rôznymi entitami. Z tvrdenia Čitatelia si požičiavajú knihy tak vyplýva existencia určitého vzťahu medzi entitami čitateľ a kniha. Entity, zapojené do určitého vzťahu, sa nazývajú účastníkmi. Počet účastníkov označujeme ako stupeň vzťahu.

Kardinalita vzťahu:Pod kardinalotou vzťahu rozumieme počet výskytu objektov oboch entít, ktoré

sa vzťahu účastina. Vzťah medzi ľubovoľnými dvomi entitami môže byť typu 1:1, 1:n a m:n.

1:1 – je vzťah, v ktorom na obidvoch stranách vystupuje iba jeden objekt danej entity. Tieto vzťahy sú v realite veľmi zriedkavé. Príkladom môže byť vzťah manželia medzi entitami Muž a Žena. V prípade monogamnej spoločnosti je zrejmé, že jedna žena má iba jedného muža a naopak, jeden muž má iba jednu ženu.1:n – (jedna k viacej) býva v dátovom modeli najčastejšie. Na jednej strane je jediný objekt entity, ktorý je vo vzťahu s jedným alebo viacerými objektmi druhej entity. Ako príklad poslúži vzťah čitateľ – kniha, kde jeden čitateľ môže mať požičanú jednu alebo viac kníh, alebo naopak, viacej kníh môže byť požičaných práve iba jedným čitateľom.

m:n – (viac ku viac) je špecifickým vzťahom, v ktorom vystupuje viac objektov na oboch stranách. Napríklad každý učiteľ vyučuje mnoho žiakov a každý žiak chodí na hodiny k mnohým učiteľom.

Page 63: Statnice Jadro Aplikovana Informatika

E-R a E-R-A diagramy:Model entít a vzťahov, ktorý popisuje dáta ako entity, atribúty a vzťahy medzi

nimi sa zobrazujú pomocou diagramov pomenovaných ako diagramy entít a vzťahov, ktoré poznáme pod skratkou E-R diagramy (entity – relationship diagram). Ak v E-R diagramoch uvádzame aj atribúty entít, hovoríme o E-R-A diagramoch (Entity – Relationship – Attribute diagram). V E-R diagramoch sa entity označujú pomocou obdĺžnikov, atribúty pomocou elipsy alebo oválov a vzťahy sa znázorňujú spojovacou čiarou medzi entitami.

Kľúče:Tabuľky môžu tiež obsahovať určenú vlastnosť alebo sériu vlastnosti ktoré

môžu fungovať ako "kľúč", ktorý môže byt použitý na osobitú identifikáciu každého stĺpca v tabuľke.Jednoznačný identifikátor v tabuľke, ktorý je reprezentovaný stĺpcom alebo skupinou stĺpcov sa nazýva primárny kľúč. Sekundárny kľúč môžu tvoriť ostatné atribúty tabuľky mimo primárneho kľúča. Ak potrebujeme vytvoriť tabuľku podľa sekundárneho kľúča, potom obvykle vytvárame tzv. indexný súbor, čo je pomocný súbor, v ktorom sú uvedené podľa sekundárneho kľúča odkazy do hlavnej tabuľky. Väzby medzi reláciami sa riešia umiestnením hodnoty primárneho kľúča do inej relácie, v tejto novej relácii potom hovoríme o tzv. cudzom kľúči.

Kľúče sú bežne používané na pripojenie alebo kombinovanie dát z dvoch alebo viacerých tabuliek. Napríklad zákaznícka tabuľka môže obsahovať stĺpec nazvaný MIESTO, ktorý obsahuje hodnotu, ktorú priradíme kľúču tabuľky MIESTO. Kľúče sú

Page 64: Statnice Jadro Aplikovana Informatika

taktiež praktické pri vytváraní ukazovateľov, ktoré umožňujú rýchle získanie dát z rozsiahlej tabuľky.

Page 65: Statnice Jadro Aplikovana Informatika

Relačné dátové typy:a, Numerické dátové typy (angl. Numeric) – t. j. také dáta s ktorými vieme vykonávať zmysluplné aritmetické operácie.

b, Znakové dátové typy (angl. Character) uvádzané často ako textové alebo reťazové premenné môžu obsahovať ľubovoľné znaky a symboly. Nie sú určené pre matematické operácie, ale existuje viacero funkcií pre ich spracovanie.

c, Časové dátové typy (angl. Date). Obsahom týchto dátových typov je kalendárny dátum v špeciálnom formáte známom ako juliánsky dátový formát a údaj času (od 0:00 do 24:59:59 hodín). S týmto dátovým typom je možné vykonávať určité aritmetické operácie, napríklad odčítaním dvoch dátumov získame počet dní medzi týmito dátumami.

d, Logický dátový typ (angl. Logical) môže nadobúdať len dve hodnoty PRAVDA/NEPRAVDA – ANO/NIE (angl. TRUE, FALSE – YES/NO).

K týmto základným dátovým typom dopĺňajú rozličné systémy DDL aj ďalšie typy:

- Dátový typ „Mena (angl. Currency) je odvodený od číselnému dátového typu. Hodnota meny je odvodená z nastavenia meny v operačnom systéme MS Windows môžu byť využívané v matematických výpočtoch

- Dátový typ „Automatické číslo“ (angl. AutoNumber) – je to celé číslo, ktoré nie je možné ručne zaktualizovať. Takmer výhradne sa používa ako jednoznačný identifikátor záznamu v tabuľke.

- Dátový typ BLOB (z angl. Binary Large Objects - binárné veľké objekty)- používa sa pre uloženie veľkých neštruktúrovaných typov údajov ako napr. grafické súbory, audio a video sekvencie, dlhé texty. Dáta typu BLOB sa typicky uschovávajú mimo ich záznamu v samotných blokoch a záznam obsahuje ukazovateľ na príslušný objekt.

Špeciálne dátové typy v MS Access:

- Dátový typ „Objekt OLE“ (angl. OLE object) sú operačným systémom podporované objekty (entity) vo forme celého súboru pripojené, alebo vložené do tabuľky MS Access. Môžu to byť grafický, zvukový, video súbor, tabuľka Excel, dokument Word, atď.

- Dátový typ „Hypertextový odkaz (angl. Hyperlink) je textová premenná s vlastnosťami odkazu k súboru alebo k Internetovskej stránke. Praktickou výhodou tohto dátového typu je, že klepnutím na text v bunke tabuľky aktivujeme hypertextový odkaz.

Page 66: Statnice Jadro Aplikovana Informatika

SQL: – je všeobecnou normou, ktorá umožňuje používateľom pracujúcim v rôznych

počítačových a databázových prostrediach vytvoriť jednotné komunikačné prostredie. Jazyk obsahuje príkazy pre definovanie dát (Create Table), pre manipuláciu s údajmi (Select, Insert, Delete), pre tvorbu používateľských pohľadov (Create View) ai. S nástupom koncepcie client-server dostal jazyk aj ďalšiu úlohu – je normou pre rôznych výrobcov databázových systémov a tak sa stal spojovacím článkom medzi rôznymi systémami. Všetky veľké databázové systémy vedia dnes realizovať dotazy pripravené v jazyku SQL.

SQL príkazy:A. Príkazy definície dát – DDL, DDC (Data Definition Commands )

Príkaz, alebo voľba PopisCREATE SCHEMA AUTHORIZATION

Vytvorí databázovú schému

CREATE TABLE Vytvorí novú tabuľku v používateľskej databázovej schéme

- NOT NULL Obmedzenie, ktoré zabezpečuje, že stĺpec nebude mať nulovú hodnotu

- UNIQUE Obmedzenie, ktoré zabezpečuje, že v stĺpci tabuľky nebudú duplicitné hodnoty

- PRIMARY KEY Definuje primárny kľúč tabuľky- FOREIGN KEY Definuje cudzí kľúč- DEFAULT Definuje východziu hodnotu pre stĺpec (t. j. hodnotu v

prípade ak nie je určená)- CHECK Obmedzenie pre overenie dát v tabuľkeCREATE INDEX Vytvorí index pre tabuľkuCREATE VIEW Vytvorí dynamickú podmnožinu riadkov/stĺpcov z

jednej, alebo viacerých tabuliekALTER TABLE Modifikuje definíciu tabuliek (pridáva, aktualizuje a

odstraňuje atribúty alebo obmedzenia)CREATE TABLE AS Vytvorí novú tabuľku na podklade dopytu z

používateľskej databázovej schémyDROP TABLE Permanentne (natrvalo) zruší tabuľku (a teda aj jej

dáta)DROP INDEX Permanentne odstráni indexDROP VIEW Permanentne odstráni pohľad

B, Prikazy na manipuláciu dát - DML, DMC (Data Manipulation Commans).

Príkaz, alebo voľba PopisINSERT Vkladá riadok (riadky) do tabuľkyUPDATE Modifikuje (aktualizuje) hodnoty v jednej, alebo

viacerých riadkoch tabuľkyDELETE Odstraňuje jeden, alebo viacej riadkov z tabuľky

Page 67: Statnice Jadro Aplikovana Informatika

COMMIT Permanetne uschová zmeny dátROLLBACK Obnovuje dáta v ich originálnej hodnoteSELECT - Príkaz na výber dát príkaz:

Príkaz, alebo voľba PopisSELECT Vyberá atribúty z riadkov z jednej, alebo viacerých

tabuliek alebo pohľadov- WHERE Obmedzuje výber riadkov na základe podmienky

výberu- GROUP BY Zoskupuje vybrané riadky na základe jedného, alebo

viacerých atribútov- HAVING Obmedzuje výber zoskupených riadkov na základe

podmienky- ORDER BY Zoraďuje (vytriedi) vybrané riadky

Operátory porovnávania=, <, >, < =, > =, <> Používajú sa v podmienkach výberu

Logické operátoryAND/OR/NOT Používajú sa v podmienkach výberu

Špecialné operátory- BETWEEN Kontroluje, či je hodnota atribútu v stanovených

hraniciach- IS NULL Kontroluje, či je hodnota atribútu prázdna- LIKE Kontroluje či hodnota atribútu zodpovedá určitému

vzoru- IN Kontroluje, či hodnota atribútu zodpovedá niektorej

hodnote v zozname- EXISTS Kontroluje, či poddopyt vráti nejaké riadky, alebo nie- DISTINCT Odstraňuje duplicitné hodnoty

Agregačné funkcieCOUNT Vracia počet riadkov s nenulovou hodnotouMIN Vracia minimálnu hodnotu nájdenú v určených

stĺpcochMAX Vracia maximálnu hodnotu nájdenú v určených

stĺpcochSUM Vracia súčet všetkých hodnôt v určených stĺpcochAVG Vracia priemernú hodnotu všetkých hodnôt v

určených stĺpcoch

Page 68: Statnice Jadro Aplikovana Informatika

Zhrnutie základných konštrukcii jazyka SQL:

Príkazy na definíciu dát - DDL:

CREATE TABLE <meno tabulky> ( <meno stlpca> <typ stlpca> [<špecifikácia atributu>],<meno stlpca> <typ stlpca> [<špecifikácia atributu>][<špecifikácie tabulky>]

DROP TABLE <meno tabulky>

ALTER TABLE <meno tabulky> ADD <meno stlpca> <typ stlpca>

CREATE SCHEMA <názov-schemy> AUTHORIZATION <meno>;

DROP SCHEMA <názov schémy> [CASCADE | RESTRICT ]

CREATE [UNIQUE] INDEX =<nazov indexu>ON <meno tabulky> ((<meno stlpca> [<poradie> , ((<meno stlpca> <poradie>])[CLUSTER]

DROP INDEX <nazov indexu>

CREATE VIEW <nazov pohladu> [(nazov stlpca> , <nazov stlpca>)]AS <vyberovy prikaz>

DROP VIEW <meno pohladu> CASCADE | RESTRICT ]

Príkazy pre manipuláciu s dátami – DML:

SELECTDISTINCT] <zoznam atributov>FROM <meno tabulky> <alias> <spojena tabulka>) , (<meno tabulky> <alias> <spojena tabulka>[WHERE <podmienka][GROUP BY <atributy zoskupenia> [HAVING <podmienky vyberu skupiny> ] ][ORDER BY <meno stĺpca> [<poradie> , <meno stlpca> [<poradie> ] ]

<zoznam atributov>::=(* | (<meno stlpca> | <funkcia> (([DISTINCT] <meno stlpca> | *))) , ( <meno stlpca> | <funkcia> (([DISTINCT] <meno stlpca> | *)))<atributy zoskupenia> ::= <meno stlpca> , <meno stlpca> <poradie>::= (ASC | DESC)

INSERT INTO <meno tabulky> [ (<meno stlpca> , (<meno stlpca> ) ]VALUES (<konštanta>, (<konštanta> ) , (<konštanta> , (<konštanta> ) <prikaz select>)

DELETE FROM <meno tabulky>[WHERE <podmienky vyberu>]

UPDATE <meno tabulky>

Page 69: Statnice Jadro Aplikovana Informatika

SET <meno stlpca>=<hodnotovy vyraz> , <meno stlpca> <hodnotovy vyraz>[WHERE <podmienky vyberu>]

Kvalitný databázový systém musí zabezpečiť:• Oddelenie definície dát a príkazov na manipuláciu s nimi (kontrola objektového

typu a štruktúry počas vykonávania operácií, výber dát z databázy podľa typu objektu, používanie rovnakých operácií pre rôzne množiny objektov)

• Nezávislosť dát (logická - zmena dátového modelu by nemala ovplyvniť zmenu programu, fyzická - zmena uloženia dát nesmie vplývať na zmenu programu)

• Procedurálne (SQL – zabudovaný jazyk) a neprocedurálne rozhranie (programátor musí sám ošetriť rôzne prípady)

• Minimalizáciu redundandancie dát (neopakovanie dát)• Ochranu proti nekonzistencii dát (dáta uložené v databáze musia vyhovovať

definovaným podmienkam, ktoré by sme mohli súhrne nazvať integritné obmedzenia)

• Zdieľanie dát • Bezpečný prístup k dátam• Integritu dát (integrita dát úzko súvisí s konzistenciou dát a hovorí o tom, že

databáza je správna)

Objektovo orientované databázy:V súčasnosti nadobúdajú stále väčší význam neštruktúrované objekty (voľné

texty, obrázky, zvuky ap.). Objektové prístupy sa začali presadzovať prostredníctvom „objektovo orientovaného programovania“ (napr. jazyky Smalltalk, C++), neskôr sa začali presadzovať aj do koncepcii databázových systémov (SRBD) a do objektového navrhovania informačných systémov.

Údaje v objektovo orientovaných databázach nie sú určované len hodnotami zoskupenými do dátových štruktúr, ale sú vzťahované k objektom, ktoré zodpovedajú entitám reálneho sveta. Pojem objekt zahŕňa okrem údajov aj správanie sa objektu, t.j. spojenie údajov s programom (dátové modelovanie spojené s funkčným alebo procesným modelovaním).

Existujú dva prístupy k tvorbe objektovo orientovaných databáz:- rozšírením existujúcich relačných systémov (tzv. objektovo relačná databáza).

Tento systém vychádza z presvedčenia, že je možné nad relačným systémom vytvoriť vrstvu objektových prístupov (tento postup nie je príliš efektívny).

- vytvorením novej databázovej technológie – od začiatku objektové prístupy. Autori tvrdia, že objektovo orientované SRBD si vyžadujú nový spôsob uloženia údajov, novú obsluhu transakcií, novú údržbu verzií objektov a pod.

Čo by mal objektovo orientovaný SRBD spĺňať:- aby zabezpečoval nezávislosť údajov na vonkajších pamätiach, paralelný

prístup pre viacerých používateľov, spoľahlivosť údajov a možnosť kladenia ad-hoc otázok,

- aby bol objektovo orientovaný, t.j. mal by dovoľovať existenciu identity objektov, typov alebo tried, zapuzdrenia (objektov a metód), dedenia, polymorfizmu, možnosť tvorby zložitých objektov, rozšíriteľnosť, úplnosť vyčerpania variantov výpočtov.

Page 70: Statnice Jadro Aplikovana Informatika
Page 71: Statnice Jadro Aplikovana Informatika

[OOP-2] Definície základných pojmov v OOP: trieda, objekt, rozhranie, dedičnosť, polymorfizmus, abstraktné triedy, abstraktné metódy, preťažovanie metód, dynamické viazanie metód, balík, výhody dedenia, jeho cena, rýchlosť, veľkosť a zložitosť programu--Objektovo orientované programovanie (OOP) je metódou na tvorby programov, založenej na abstrakcii.

Abstraktný údajový typ – spojenie údajov a prostriedkov pre manipuláciu s nimi definuje množinu prípustných hodnôt a množinu prípustných operácií s týmito hodnotami. Na reprezentáciu abstraktného údajového typu sa používa štruktúrovaný údajový typ trieda.

Trieda (class) v OOP programovacieho jazyku Java je množina:• premenných , ktoré sa označujú tiež ako členské premenné, dátové zložky alebo atribúty, ktorých je

uložený stav objektu.• podprogramov , ktoré sa označujú ako metódy. Metódy manipulujú s členskými premennými a tým

menia stav objektu. Metódy popisujú vlastnosti (schopnosti) objektu.

Trieda je len šablóna (objektový typ) a sama o sebe nemá pridelenú žiadnu pamäť. Je možné si ju predstaviť ako napr. dátový typ int. Dokiaľ nedeklarujeme premennú typu int, tak nám je daný dátový typ k ničomu. To isté platí o triede. Trieda je vzor, z ktorého sa jednotlivé objekty vytvárajú.

Deklarácia triedy v jazyku JAVA začína kľúčovým slovom class. Základná deklarácia triedy:

class MojaTrieda //deklarácie vlastností, konštruktorov a metód

Detailnejšia deklarácia triedy:

úroveňPrístupu modifikátory class Trieda extends Nadtrieda implements rozhrania

//konštruktory//deklarácie členských premenných (vlastnosti)//deklarácie členských metód (správanie)

Vo všeobecnosti deklarácia triedy môže obsahovať tieto komponenty v takomto poradí:1. Úroveň prístupu ako public, private atď.2. Meno triedy, podľa dohovoru začínajúce veľkým písmenom.3. Meno rodičovskej triedy (nadradenej triedy) – ak existuje, sprevádzané kľúčovým slovom extends.

Trieda môže byť dedičom (podtriedou) iba jedného rodiča.4. Čiarkou oddelený zoznam rozhraní implementovaných triedou – ak existujú, sprevádzané kľúčovým

slovom implements. Trieda môže implementovať viacero rozhraní.5. Telo triedy ohraničené zloženými zátvorkami

Page 72: Statnice Jadro Aplikovana Informatika

Špecifikácia úrovní prístupov tried, metód a premenných:Úroveň prístupu Popis

Trieda<nešpecifikovaná> Prístupná iba v danom balíku.public Prístupná všade.

Členské premenné a metódy<nešpecifikovaná> Prístupná pre daný balík a triedu.public Prístupná všade.protected Prístupná v podtriede (dedí danú triedu) a v danej triede.private Prístupná iba v danej triede.

Modifikátory tried, metód a premenných: Modifikátor Popis

Triedastatic ????final Z triedy nemôže byť vytvorená podtrieda.abstract Z triedy nemôže byť vytvorená inštancia.

Premennástatic Je členom triedy (nie je časťou inštancie triedy).final Hodnota premennej je konečná (nedá sa meniť).transient Premenná nemá byť serializovaná.volatile Premenná nebude optimalizovaná kompilátorom (používa iba niekoľko programátorov).

Metódastatic Je členom triedy (nie je časťou inštancie triedy).abstract Abstraktná metóda - bez implementácie (abstraktné metódy budú popísané neskôr)final Implementácia metódy nemôže byť prepísaná v podtriede.native Metóda používaná z iného programovacieho jazyka (napr. C).synchronized Vykonávanie metódy je synchronizované (nad triedou, alebo objektom) - v jednom čase je

povolený prístup iba z jedného vlákna.

Deklarácia konkrétnej triedy určenej na prácu s obdĺžnikmi by mohla vyzerala asi takto:• trieda obdelnik ma metódy obvod()

a obsah().• označenie public pred názvom metódy

znamená, že jej premenné sú dostupné aj iných tried.

• označenie public pred názvom triedy znamená, že trieda musí byť uložená v samostatnom súbore s názvom Obdelnik.java

Objekt (object) je dátový prvok, ktorý je vytvorený podľa konkrétneho vzoru triedy, teda podľa objektového typu. Podľa jedného vzoru triedy je možné vytvoriť ľubovoľné množstvo objektov, ktoré majú rovnaké vlastnosti (teda metódy) a môžu mať rôzne alebo aj rovnaké stavy (teda obsah premenných). V zmysle OOP je objekt entita, ktorá má:

• Stav – zahŕňa všetky vlastnosti objektu a ich hodnoty• Správanie – ako objekt koná a reaguje v zmysle zmeny stavu a operácií, ktoré poskytuje

Page 73: Statnice Jadro Aplikovana Informatika

• Identitu – jednoznačná identifikácia objektu

Objekty uchovávajú ich stav vo vlastnostiach (v premenných) a sprístupňujú svoje činnosti prostredníctvom metód (cez funkcie). Metódy pracujú nad stavmi objektov a sú používané ako mechanizmus pri komunikácii objektov medzi sebou.

Vytvorenie objektu znamená vykonať dve činnosti:• deklarovať referenčnú premennú typu Obdelnik, táto premenná sa odkazuje na objekt Obdelnik• cez new vytvoriť v pamäti objekt Obdelnik a odkaz na vytvorený objekt priradiť do pripravenej

premennej

Dva príklady deklarácie triedy Obdelnik bez / s využitím konštruktorua) bez konštruktora

• pri vytváraní nového objektu triedy Obdelnik bola využitá deklarácia s inicializáciou objektu• príkazy na vytvorenie nového objektu sú v metóde main, ktorá je súčasťou triedy Obdelnik

b) s konštruktorom

• lepší spôsob deklarácie triedy Obdelnik s konštruktorom. Inicializácia je súčasťou vytvorenia objektu

Page 74: Statnice Jadro Aplikovana Informatika

• konštruktor (constructor) je špeciálna metóda volaná pri vytváraní objektu, ktorá umožňuje inicializovať dátové prvky objektu. Konštruktor má vždy rovnaké meno ako názov triedy.

Encapsulation (zapuzdrenie) – skrývanie dát. Zapuzdrenie v OOP zaručuje, že nikto nemôže priamo pristupovať k vnútru iných objektov. Objekt navonok sprístupňuje len rozhranie, cez ktoré (a nijako inak) je možné s objektom pracovať. So zapuzdrením súvisia prístupové práva. Sú známe 4 prístupové úrovne:

• public – voľne prístupné deklarácie, pre komunikáciu triedy s okolím,• private – súkromné deklarácie - prístup majú len metódy vlastnej triedy,• protected – chránené deklarácie - môžu ich využívať metódy vlastnej triedy alebo jej potomkovia,• static – nemusí existovať žiadna inštancia triedy

Rozhranie (interface) Platí, že interakcia objektov s okolitým svetom sa odohráva prostredníctvom metód. Metódy formujú rozhranie objektu s okolitým svetom. Ako príklad z reálneho sveta možno uviesť tlačidlá na prednom paneli televízie, ktoré tvoria rozhranie medzi používateľom a súčiastkami vo vnútri TV. Stlačením tlačidla "power" televíziu zapneme alebo vypneme.

V programovacom jazyku Java je rozhranie údajová štruktúrou podobnou triede, ktorá môže obsahovať iba konštanty, charaktery metód a vnorené typy. Neobsahujú telá metód. Z rozhraní sa nedajú vytvárať inštancie — môžu byť iba implementované triedou alebo rozšírené iným rozhraním. Ak trieda implementuje rozhranie, znamená to, že verejne poskytne svoje činnosti cez rozhranie.

Definovanie rozhrania je podobné ako vytváranie novej triedy. Deklarácia rozhrania pozostáva z prívlastkov, kľúčového slova interface, mena rozhrania, zoznam rodičovských rozhraní (ak nejaké sú) oddelených čiarkou a tela rozhrania. Napr.:

public interface ZluceneRozhranie extends Rozhranie1,Rozhranie2, rozhranie3 // deklarácia konštánt double E = 2.718282; // základ prirodzeného logaritmu // charaktery metód void robNieco (int i, double x); int robNiecoIne(String s);

Vysvetlenie:• public indikuje, že rozhranie môže použiť ktorákoľvek trieda z akéhokoľvek balíka. Implicitne je

rozhranie private, teda prístupné iba triedam definovaným v rovnakom balíku ako rozhranie.• Rozhranie môže byť rozšírené inými rozhraniami , rovnako ako môže byť rozšírená trieda alebo

podtrieda inej triedy. Triedu môže rozširovať iba jedna iná trieda, rozhranie však môže rozširovať ľubovoľný počet ďalších rozhraní.

• Telo rozhrania obsahuje deklarácie metód zahrnutých v rozhraní. Za deklaráciou každej metódy nasleduje bodkočiarka. Neobsahuje žiadne zložené zátvorky, pretože rozhranie neposkytuje implementáciu metód, ktoré sú v ňom zadeklarované. Všetky metódy zadeklarované v rozhraní sú implicitne public, preto prívlastok public môžeme vynechať.

• Rozhranie môže obsahovať deklarácie konštánt, ktoré doplňujú deklarácie metód. Všetky hodnoty konštánt definované v rozhraní sú implicitne public, static a final.

• Všetky metódy v rozhraní sú implicitne abstraktné, preto sa prívlastok abstract nepíše pred metódy rozhrania (môže sa napísať, ale nie je to potrebné).

Implementácia rozhrania – pre deklaráciu triedy, ktorá implementuje rozhranie, treba dať do deklarácie triedy klauzulu implements. Trieda môže implementovať aj viac ako jedno rozhranie, potom za kľúčové slovo implements píšte zoznam triedou implementovaných rozhraní oddelených čiarkou.

Page 75: Statnice Jadro Aplikovana Informatika

Rozhrania a viacnásobná dedičnosť – jazyk Java nepovoľuje viacnásobné dedenie preto rozhrania poskytujú alternatívu. Platí, že triedy môžu dediť iba od jednej triedy, no môžu implementovať viac ako jedno rozhranie. Vďaka tomu objekty môžu mať viaceré dátové typy: typ svojej vlastnej triedy a typ všetkých rozhraní, ktoré implementujú. Znamená, že ak je premenná zadeklarovaná s typom rozhrania, jej hodnota môže odkazovať na ktorýkoľvek objekt, ktorý je inštanciou triedy, ktorá implementuje rozhranie.

Dedičnosť je v OOP nazývaná schopnosť odvodzovať nové triedy od existujúcich tried. Odvodená trieda od pôvodnej triedy dedí všetky jej členy, vlastnosti a metódy. Trieda, ktorá je odvodená od inej triedy, sa nazýva podtrieda (alebo tiež odvodená trieda, rozšírená trieda, dcérska trieda).

Trieda, z ktorej je podtrieda odvodená sa nazýva nadtrieda (alebo tiež nadradená trieda, základná trieda, rodičovská trieda).

Okrem triedy Object, ktorá nemá nadtriedu, má každá trieda iba jednu priamu rodičovskú triedu (jednoduché dedenie). Pri absencii explicitnej nadtriedy, je každá trieda implicitne podtriedou triedy Object.

Triedy môžu byť odvodené od tried, ktoré sú odvodené od tried, a tak ďalej, až po konečnú najvrchnejšiu triedu Object. Rodokmeň každej triedy vedie teda k rovnakému praprapra... rodičovi — triede Object.

Podstata dedičnosti je v tom, že ak chceme vytvoriť novú triedu a existuje trieda, ktorá obsahuje časť kódu, ktorý potrebujete, môžete novú triedu odvodiť od existujúcej triedy. Takto je možné využiť vlastnosti a metódy z existujúcej triedy bez nutnosti ich znova písať. Podtrieda zdedí členov (vlastnosti, metódy a vnorené triedy) od nadtriedy. Konštruktory nie sú členmi, preto nie sú podtriedami dedené, ale konštruktor nadtriedy môže byť z podtriedy volaný.

Dedičnosť sa realizuje cez kľúčové slovo extends (rozšírenie):

public class odvodena_trieda extends povodna_trieda //tu pokracuje kod tela triedy

Polymorfizmus (mnohotvárnosť) je silný mechanizmus zdieľania metód. Podstata polymorfizmu je v tom, že odvodené triedy (potomkovia) môžu nie len používať metódy predka, ale môže aj meniť ich funkčnosť. To znamená, že je rovnaké meno metódy v rôznych stupňoch hierarchie tried, ale metóda môže byť pre každú triedu definovaná inak.

Inak povedané: polymorfizmus umožňuje, aby každý objekt v stromové hierarchii objektov volal metódu s rovnakým názvom. Pritom môže mať každý objekt tuto metódu inak definovanú. Výsledkom je, že pre každý

Page 76: Statnice Jadro Aplikovana Informatika

objekt v stromové hierarchii bude mať volán metódy inú odozvu, avšak pre každý objekt vždy tu požadovanú.

Prekrývanie – použitie toho istého mena pre rôzne funkcie (výber funkcie podľa aktuálneho typu parametra). Využitie:

• rozšírenie zdedenej funkcie• ohraničenie zdedenej funkcie• optimalizácia zdedenej funkcie

Abstraktné triedy / Abstraktné metódyAbstraktná trieda je trieda, ktorá je deklarovaná pomocou slova abstract — môže, ale aj nemusí obsahovať abstraktné metódy. Z abstraktných tried nemôžu byť vytvorené inštancie, ale môžu byť z nich vytvorené podtriedy.

Abstraktné triedy môžu obsahovať vlastnosti, ktoré nie sú static a final, a tiež môžu obsahovať implementované metódy. Takéto abstraktné triedy sú podobné rozhraniam s tým rozdielom, že poskytujú konkrétne implementácie, ktoré kompletné odovzdávajú svojim podtriedam. Ak by abstraktná trieda obsahovala iba deklarácie abstraktných metód, bolo by vhodnejšie ju radšej zadeklarovať ako rozhranie.

Abstraktné triedy sa najčastejšie používajú na zdieľanie častí implementácie, pre podtriedy. Z jednotlivých abstraktných tried sa vytvárajú podtriedy, ktoré majú veľa spoločného (implementované časti abstraktnej triedy), ale aj niečo odlišné (abstraktné metódy).

Z abstraktných tried sa dajú vytvárať iba podtriedy, nedajú sa z nich vytvárať inštancie. Abstraktná trieda môže obsahovať abstraktné metódy — metódy, ktoré sú zadeklarované, ale nie sú implementované. Implementácie abstraktným metódam poskytnú potom podtriedy.

Abstraktná metóda je metóda, ktorá je deklarovaná bez implementácie (bez zložených zátvoriek, ukončené bodkočiarkou), takto:

abstract void presun(double deltaX, double deltaY);

Ak trieda obsahuje abstraktné metódy, trieda sama musí byť deklarovaná pomocou slova abstract Viď príklad:

public abstract class GrafickyObjekt // deklarácia vlastností

// deklarácia neabstraktných metód

abstract void kresli();

Ak je z abstraktnej triedy vytvorená podtrieda, tak podtrieda zvyčajne poskytuje implementácie pre všetky abstraktné metódy z jej rodičovskej triedy. Avšak ak nie, tak podtrieda musí byť tiež zadeklarovaná pomocou slova abstract.

Príklad abstraktnej triedyV objektovo orientovaných kresliacich aplikáciach, môžete kresliť kruhy, obdĺžniky, čiary, Bezierove krivky a veľa ďalších grafických objektov. Všetky tieto objekty majú vo určité stavy (nap. pozíciu, orientáciu, farbu ohraničenie, výplň) a činnosti (napr. presunDo, otoc, zmenVelkost, kresli). Niektoré z týchto stavov

Page 77: Statnice Jadro Aplikovana Informatika

a činností sú rovnaké pre všetky objekty — napr. pozícia , farbaVyplne, a presunDo. Ostatné vyžadujú rozdielnu implementáciu—napr. zmenVelkost a kresli. Všetky objekty triedy GrafickyObjekt musia vedieť ako sa majú nakresliť alebo ako majú zmeniť svoju veľkosť; odlišujú sa v tom, ako to urobia. To je vhodná situácia na využitie abstraktnej triedy. Dá sa využiť výhodu podobnosti a zadeklarovať všetky grafické objekty tak, aby dedili od abstraktnej rodičovskej triedy—napr. ako to robia podtriedy triedy GrafickyObjekt z obrázku dole.

Triedy Obdlznik, Ciara, Bezier a Kruh dedia od GrafickyObjekt

Najprv zadeklaruj abstraktnú triedu GrafickyObjekt, ktorú vybavíte členskými premennými a metódami, ktoré sú úplne zdieľané všetkými podtriedami, akými sú aktuálna pozícia a metóda presunDo. Trieda GrafickyObjekt tiež deklaruje abstraktné metódy, ktorými sú kresli alebo zmenVelkost, tieto je potrebné implementovať vo všetkých podtriedach, ale v každej musia byť implementované iným spôsobom. Trieda GrafickyObjekt môže vyzerať takto:

abstract class GrafickyObjekt int x, y; ... void presunDo(int noveX, int noveY) ... abstract void kresli(); abstract void zmenVelkost();

Každá neabstraktná podtrieda triedy GrafickyObjekt, čiže Kruh a Obdlznik, musí poskytovať implementácie metódam kresli a zmenVelkost:

class Kruh extends GrafickyObjekt void kresli() ... void zmenVelkost() ... class Obdlznik extends GrafickyObjekt void kresli() ... void zmenVelkost() ...

Preťažovanie metód (overloading) je mechanizmus, ktorý umožňuje definovať niekoľko metód jednej triedy s rovnakým názvom, no s rôznym počtom a typom parametrov. Výhodou preťažovania je možnosť použitia rovnakého názvu metódy pre rovnaký cieľ, ale obsahovo rôzne správanie. Takto môžeme mať metódy s rovnakým menom, ktoré sa vzájomne líšia len počtom a typom vstupných premenných (nie výstupných). Napríklad:

public class Overloading private int citatel = 5; private int menovate = 5;

public int delenie() return citatel/menovatel;

public int delenie(int novyCitatel, int novyMenovatel) return novyCitatel/novyMenovatel;

Page 78: Statnice Jadro Aplikovana Informatika

• prvá metóda využíva na výpočet premenné v definícii triedy, ktoré sú inicializované na dané hodnoty.

• druhá, rovnako pomenovaná metóda, pracuje s dvoma parametrami, ktoré prijíma a následne vracia ich podiel.

Nie je povolené deklarovať viac ako jednu metódu s rovnakým názvom a s rovnaký početom a typom parametrov lebo by ich kompilátor nedokázal rozlíšiť.

Dynamické viazanie metódV OOP rozlišujeme statické a dynamické (virtuálne) metódy. Každá metóda je implicitne statická metóda. Tieto metódy sa neprepisujú odvodenými triedami. Virtuálna metóda je prepisovateľná v odvodených triedach na rozdiel od static metód.

Viazanie (binding) názvov metód vo volaniach s určitým kódom• statické (skoré) — počas kompilácie• dynamické (neskoré) — v čase vykonávania programu

Statické viazanie metód – skorá väzba (early, static binding)• kompilátor vyberá z rovnako pomenovaných funkcií tú, ktorá počtom a typom argumentov

(signatúrou) najviac odpovedá argumentom použitým pri volaní.• rozlíšenie viacerých funkcií s rovnakou signatúrov je možné pomocou:

o operátora rozsahu platnosti ::o operátorov kvalifikácie . ->

• OO interpretácia statickej väzby: typ príjemcu správy sa určuje už pri preklade (compile time).• statické metódy sú veľmi rýchle pri ich vykonávaní a ich kód je veľmi efektívny• Preťaženie metód: statické viazanie

Nevýhoda:• v čase prekladu a spájania je potrebné mať k dispozícii všetky moduly (vo forme zdrojového textu,

relatívnych modulov alebo knižníc) – k preloženému programu nie je možné pridať ďalší kód• tento problém riešia virtuálne metódy

Dynamické viazanie metód – neskorá väzba (late binding), tzv. inkluzívny polymorfizmus.• správna funkcia pre realizáciu volanie sa vyberá až v čase vykonávania programu• OO interpretácia: typ príjemcu správy sa určuje až pri behu programu (run time).• Prekonávanie metód: dynamické viazanie + dedenie

Nevýhoda:• časová neefektívnosť – nutnosť prehľadávania tabuľky metód danej objektovej hierarchie pre

zistenie skutočnej adresy požadovanej metódy• tieto metódy sú pomalšie pri vykonávaní ako metódy statické

Balíčky (packages) je názov pre zoskupenie množiny súvisiacich tried a rozhraní. Koncepčne je balíček podobný priečinkom v počítači. Softvér napísaný v jazyku Java môže pozostávať zo stoviek alebo tisícov samostatných tried, preto je dôležité zorganizovať ich tak, že súvisiace triedy a metódy sú zoskupené do balíčkov.

Page 79: Statnice Jadro Aplikovana Informatika

Aby bolo možné typy ľahšie nájsť a používať, predísť konfliktom medzi ich menami a riadiť prístup ku nim, zoskupujú sa súvisiace typy do balíčkov. Balíček je zoskupenie súvisiacich typov poskytujúce prístupovú ochranu a správu menného priestoru.

Použitie balíčka sa deklaruje kľúčovým slovom import• deklarácia použitia len jednej triedy:

import java.util.ArrayList;

• deklarácia použitia celého balíka:import java.util.*;

• Okrem java.lang ostatné štandardné balíky Javy treba explicitne importovať

Výhody / nevýhody dedenia,• Dedenie je implicitné znovu použitie kódu

o dedený kód je aj v podtriede dostupný bez akejkoľvek vynaloženej námahy (protected/public)

• Vďaka dedeniu je poskytované polymorfné správanie• Dedenie je najpevnejšia zo všetkých väzieb medzi triedami• Dedenie môže narušiť funkčnosť podtriedy• Vzťah dedenia sa nedá zmeniť za behu programu

Dedenie jeho cena, rýchlosť(…)

Veľkosť a zložitosť programu(...)

Page 80: Statnice Jadro Aplikovana Informatika

OBSAH

OBSAH..........................................................................................................................1Triedy, objekty a životný cyklus objektu........................................................................1

konštruktory a deštruktory, .......................................................................................2použitie dedičnosti a skladania objektov.......................................................................2

Dedičnosť...................................................................................................................2Skladanie objektov ...................................................................................................................................3kombinácia metód a rozdiel medzi nimi.....................................................................3

práca s poľom, s reťazcami, .........................................................................................4Reťazce - String.........................................................................................................4Polia...........................................................................................................................4

aplikačné programy.......................................................................................................5

Triedy, objekty a životný cyklus objektuTvorba, využitie a zrušenie objektu,

Objekty skutočného sveta majú dve charakteristiky: všetky majú svoj stav a správanie. Psy majú stav (meno, farbu, rasu, apetít) a správanie (brechanie, vrtenie chvostom).

Objekty uchovávajú ich stav vo vlastnostiach (v iných programovacích jazykoch sa tiež označujú ako premenné) a sprístupňujú svoje činnosti prostredníctvom metód (tiež nazývané funkcie). Metódy pracujú nad stavmi objektov a sú používané ako primárny mechanizmus pri komunikácii objektov medzi sebou. Objekty umožňujú plnú interakciu so svojimi metódami, pričom skrývajú vnútorné stavy. Táto vlastnosť je známa ako zapuzdrenie dát — základný princíp objektovo orientovaného programovania.

Page 81: Statnice Jadro Aplikovana Informatika

konštruktory a deštruktory,

Všetky java funkcie sú stelesnené (obalené) v konštruktoroch a v metódach.

Konštruktor musí mať to isté meno ako príslušná trieda a vracia void ako svoju návratovú hodnotu. Konštruktor pre triedu Date musí mať meno Date(…). Konštruktory sa často používa v spojení s operátorom new pri tvorbe inštancii danej triedy. Príkaz Date today = new Date();

Konštruktory sa bežne preťažujú, t.j. sú overloaded. Daná trieda má bežne viac svojich konštruktorov. Metóda nesmie mať to isté meno ako jej príslušná trieda a môže mať nejakú návratovú hodnotu, alebo vráti void na jej miesto.

Jeden z rozdielov pri konštruktore je, že konštruktor nemôže byť deklarovaný ako static, avšak metóda môže.Konštruktory a metódy je možné parametrizovať. V tom prípade je nutné poskytnuť ich mená a dátové typy.Metódy podobne ako konštruktory je možné preťažovať, avšak musia byť navzájom rozlišiteľné, či už podľa počtu vstupných parametrov, alebo podľa ich dátového typu. Príkladom preťaženia konštruktora môže byť strom. STROM ako objekt môže byť inicializovaný ako vyklíčená rastlina s napr. nulovou výškou – konštruktor bez argumentu STROM(). Ak ale chceme inicializovať napríklad STROM dovezený zo škôlky tak zavoláme konštruktor STROM(int height).

Deštruktory majú hlavný zmysel pri uvoľňovaní zdrojov alokovaných počas životného cyklu objektu. Sú automaticky volané keď sa končí životný cyklus objektu. Všetky odkazy na na príslušný object sú zneplatnené.

použitie dedičnosti a skladania objektov

DedičnosťObjektové jazyky umožňujú konštruovať triedy tak, že od prvej (najvšeobecnejšej) sa môžu odvodzovat ďalšie pridaním alebo prekrytím (predefinovaním) metód (a príp. pridaním premenných). Toto odvozovanie je možné ďalej opakovať a výsledné triedy sú usporiadané do stromovej hierarchie:

Page 82: Statnice Jadro Aplikovana Informatika

Triedy dedia (alebo odvodzujú, angl. inherit) stav a správanie zo svojej základnej triedy (alebo rodičovskej triedy, predka, angl. superclass). Dedením vzniká nová trieda (alebo odvodená trieda, priama podtrieda, priamy potomok, angl. subclass).

Skladanie objektov

Udržovanie odkazov na iné objekty a využívanie ich služieb

Predstavme si sekretárku a riaditeľa ako dva objekty. Sekretárka má rozhranie PísanieNaPočítači, kde je napr. operácia napísaťList, ale riaditeľ ho nemá (nie je to jeho starosť). Ale môže mať operáciu napísatList, pretože môže požiadavku poslať inému objektu - sekretárke. Udržovanie odkazov na iné objekty a využívanie ich služieb je skladanie objektov.

Takto môžeme poskladať napríklad AUTO. Kde AUTO ako objekt udržuje odkazy na metódy objektov PREVODOVKA, MOTOR,...

kombinácia metód a rozdiel medzi nimi

Dedičnosť je prevzatie vlastností rodičovskej triedy. Objekty pod-triedy sa budú chovať rovnako ako objekty nadradenej triedy, ale budú mať pridanú funkcionalitu.

Je to vlastne rozširovanie funkcionality rodičovskej triedy, môže sa využívať preťažovanie metód. Tiež môže rodičovská trieda „donútiť“ podtriedu k vlastnej implementácii niektorých metód, tým že sa zadefinujú ako abstraktné

Skladanie (Agregácia) je skladanie objektov z viacerých objektov využívajúc odkazy na metódy iných objektov.

Agregácia vytvára novú funkcionality vybraním metód viacerých tried a ich kombináciou v novej triede.

Pri dedení podtrieda preberá zvyčajne implementáciu i rozhranie (metódy). Toto prináša aj obmedzenia rodičovskej triedy, ktoré je programátor nútený prijať.

Pri Agregácii si vyberáme iba tie časti triedy, ktoré potrebujeme.

Príkladom dedenia a agregácie môže byť postava v hre – vojak. Máme tri typy vojakov – Sniper, Seal a MariňákKaždý z nich má ruksak a v ňom môže mať rôzne druhy vec.

Dedenie – tri typy vojakov, ich spoločná rodičovská trieda – VOJAK, všeci sú „typy“ vojaka.

Page 83: Statnice Jadro Aplikovana Informatika

Agregácia – V ruksaku môže byť granát, malá strelná zbraň, rôzne nože, lekárnička... Vojak môže mať pridelenú ktorúkoľvek z týchto vecí v ktoromkoľvek momente. A môže mať aj nepriestrelnú vestu – ktorá znižuje úroveň zranenia o nejaké percento

Trieda vojak teda obsahuje aj objekt triedy nepriestrelnaVesta a objekt triedy ruksak, ktorý obsahuje odkazy na iné veci (objekty)

práca s poľom, s reťazcami,

Reťazce - String

Reťazec je jednoducho vzaté pole znakov (char). Avšak v OOP zvyčajne máme štandardnú triedu STRING, ktorej inštancie sú objekty. Teda máme skrytú implementáciu a metódy na manipuláciu s reťazcom (spájanie, vyhľadávanie pod reťazcov...).

Polia

Pole je indexovaný typ premennej. Vytvára sa z nejakej primitívnej / základnej premennej. Označuje sa zvyčajne ako názov[index]. Indexovanie tradične začína od 0...N-1, kde N je počet prvkov.

Môžeme vytvárať aj polia objektov... alebo napríklad vytvoriť triedu, ktorá bude združovať objekty jednej triedy a bude nad nimi implementovať operácie.

Príkladom dynamicky alokovaného poľa je trieda vector v C++ - vnútorná implementácia je skrytá, má metódy na manipuláciu s poľom – pridanie prvku na koniec, vybratie posledného prvku, vymazanie prvku,... zároveň je možné k prvkom pristupovať cez preťažený operátor[], pričom sa správa ako jednoduché pole [index].

Podobným príkladom je aj spomínana trieda STRING, či už v JAVA alebo C++.

Page 84: Statnice Jadro Aplikovana Informatika

aplikačné programy

OOP má mnoho aplikácií. Už v predchádzajúcich častiach sme spomínali:

Herné postavičky

Trieda – VojakPodtriedy – Sniper, Seal a Mariňák

Každý z nich má pridelený objekt triedy ruksak a v ňom môže mať rôzne druhy vec.

Trieda vojak teda obsahuje aj objekt triedy nepriestrelnaVesta a objekt triedy ruksak, ktorý obsahuje odkazy na iné veci (objekty)

V ruksaku môže byť granát, malá strelná zbraň, rôzne nože, lekárnička... Vojak môže mať pridelenú ktorúkoľvek z týchto vecí v ktoromkoľvek momente. A môže mať aj nepriestrelnú vestu – ktorá znižuje úroveň zranenia o nejaké percento

AUTO - TriedaAgreguje funkcie tried Prevodovka, Motor, Riadenie,...

Strom – Trieda

Podtriedy: Ovocné stromy, Okrasné stromy–-Podtriedy (Ovocné): Čerešňa, Marhuľa,...––Podtriedy (Okrasné): Domáce [podtriedy: topoľ, breza, jeľša...], Exotické [palma, fikus,…]

Page 85: Statnice Jadro Aplikovana Informatika

Prirodzená dedukcia. Pravidlá prirodzenej dedukcie pre výrokovú a predikátovú logiku, korektnosť a úplnosť pravidiel.

Systém prirodzenej dedukcie bol navrhnutý nemeckým logikom Gentzenom v 30. rokoch minulého storočia. Systém obsahuje mnoho dedukčných pravidiel a jednu triviálnu axiómutypu φ⇒φ alebo φ∨¬φ.

Cieľ:Odvodzovať formuly z iných pomocou dedukčných pravidiel.Odvodzovanie označujeme nasledovne:φ1, φ2,…φn |− ψ, kdeφ1, φ2,…φn sú premisy a ψ je dôsledok.Dôsledok je pravdivý ak sa dá najsť pomocou pravidiel.

Dedukčné pravidláDedukčné pravidlá majú štruktúru:

Kde v hornej části sú premisy v dolnej dôsledky.

Dopredné a spätné pravidlá• Dedukčné pravidlo sa použije dopredne len ak vieme, že odvodené nové formuly budú

užitočné na odvodenie želaného výsledku (cieľovej formuly)• Dedukčné pravidlo sa použije spätne ak chceme cieľovú formulu v dôkaze nahradiť

inou, ktorá sa ľahšie dokáže alebo ak chceme získať dodatočné premisy , ktoré nam pomôžu cieľovú formulu dokázať.

Vzťah prirodzenej dedukcie a sémantiky• Nech Γ je množina premís φ1, φ2,..., φn a ψ je dôsledok

dokázať, že existuje dôkaz φ1, φ2,..., φn ψ je ľahšie ako dokázať, že dôkaz neexistuje

• Sémantika predikátovej logiky poskytuje opačnú obtiažnosť ako teória dôkazovdokázať že ψ je nie dôsledkom Γ teda, že Γ≅ ψ je jednoduchšie ako dokázať opak,

teda že Γ≅ ψ

n

n

dôsledok

dôsledokpremisa

premisa

................

...............

1

1

Page 86: Statnice Jadro Aplikovana Informatika

Pravidlá prirodzenej dedukcie pre výrokovú logiku

Page 87: Statnice Jadro Aplikovana Informatika

Pravidlá prirodzenej dedukcie pre predikátovú logiku• všetky pravidlá výrokovej logiky +• nové pravidlá súvisiace s kvantifikátormi a symbolom rovnosti:

Pravidlá pre rovnosťIndrodukčné pravidlo pre rovnosť (I=)

_________ (pravidlo je axióma nezávisí od premís) t = tEliminačné pravidlo pre rovnosť (E=)t1 = t2 φ[t1/x]___________________ φ[t2/x] kde t1, t2 musia byť vo φ pre x volné.

Pravidlá pre univerzálny kvantifikátor

• Pravidlá sú zovšeobecnením pravidiel pre konjunkciu.• Kým ∧ sa vzťahuje na dve formuly, ∀ sa vzťahuje na všetky

substitucie premennej termom• Teda ak predpokladáme platnosť formuly pre všetky x potom

platí φ[t/x] pre akýkoľvek term t voľný pre x vo φ.

Eliminačné pravidlo pre univerzálny kvantifikátor (E ∀x) ∀x φ_______________ φ[t/x]

Introdukčné pravidlo pre univerzálny kvantifikátor (I ∀x)premisy pre I ∀x sú φ[x0/x] pre všetky možné hodnoty termu x0

x0 . . . φ[x0/x]_______________ ∀x φ

Page 88: Statnice Jadro Aplikovana Informatika

Pravidlá pre existenčný kvantifikátor• Sú zovšeobecnením pravidiel pre dizjunkciu. • Analógia pravidiel platí aj pre ∨ a ∃

Introdukčné pravidlo pre existenčný kvantifikátor (I ∃x) φ[t/x]___________ ∃x φ

Eliminačné pravidlo pre existenčný kvantifikátor (E ∃x) x0 φ[x0/x] . . ∃x φ χ ______________________ χ

Korektnosť a úplnosť pravidiel

Ako súvisí systém odvodzovania formúl preberaný v prvej častis ich pravdivostnými hodnotami?Z odvodenia φ1, φ2,…φn ψ je nie zrejmé, že sú všetky pravidlákorektné v tom zmysle, že zachovávajú pravdivosť odvodenýchformúl podľa vyhodnocovacích tabuliek.

Veta (korektnosť). Nech φ1, φ2,…φn a ψ sú wff (well formed formula) výrokové formuly. Ak φ1, φ2,…φn ψ potom platí φ1, φ2,…φn ψ

Dôkaz1. Predpokladáme, že platí φ1, φ2,…φn ψ 2. Indukciou cez dĺžku dôkazu pre φ1, φ2,…φn ψ .

Používa sa SMI a dokazuje sa vlastnosť M(k): Pre všetky odvodenia φ1, φ2,…φn ψ (n 0≥), ktoré majú dôkaz dĺžky k platí φ1, φ2,…φn ψ.

Veta (úplnosť). Vždy keď platí φ1, φ2,…φn ψ existuje dôkazprirodzenej dedukcie pre odvodenie φ1, φ2,…φn ψ .

Dôkaz1. Ak φ1, φ2,…φn ψ potom φ1 ⇒(φ2 ⇒ (…(φn ⇒ψ)…))

je tautológia, ak sú všetky φi pravdivé potom je aj ψ2. Ak η potom η

Ak η je tautológia potom je aj teoréma – dôkaz je náročný3. Ak φ1 ⇒(φ2 ⇒ (…(φn ⇒ψ)…)) potom φ1, φ2,…φn ψ

Pre φ1, φ2,…φn ako premisy opakovane aplikujeme pravidlo (E⇒)

Page 89: Statnice Jadro Aplikovana Informatika

• Spojením viet (korektnosť a úplnosť) dostávame φ1, φ2,…φn ψ iff φ1, φ2,…φn ψ .

• Máme dve metódy:• Prvá je hľadanie dôkazu čo je paradigmom logického programovania • Druhá je pomocou pravdepodobnostných tabuliek určiť platnosť pravej a ľavej strany

relácie sémantickej indukcie. Výpočtová zložitosť rastie exponenciálne s počtom elementárnych výrokov.

• Nedá sa povedať, ktorý spôsob je výhodnejší.

• Korektnosť systémuak φ1, φ2,…φn nie sú v relácii sémantickej indukcie s ψ potom odvodenie φ1, φ2,…φn ψ nemá dôkaz.

• Úplnosť systémuobsahuje ešte silnejšie tvrdenie : vždý keď a φ1, φ2,…φn sú v relácii sémantickej indukcie s ψ potom odvodenie φ1, φ2,…φn ψ má syntaktický dôkaz v dokazovacom systéme prirodzenej dedukcie.

Page 90: Statnice Jadro Aplikovana Informatika

CTL:• Je logika s vetviacim sa časom – v každom časovom momente môže nasledovať niekoľkomožných budúcich stavov• Vznikla z dôvodu, že v logike PLTL nemožno vyjadriť niektoré vlastnosti• CTL logika umožňuje vyjadriť vlastnosti na nejakej alebo všetkých cestách začínajúcich vdanom stave s• Pre cesty používa existenčný kvantifikátor E a univerzálny kvantfikátor A • Kvantifikátor A znamená pre všetky cesty• Kvantifikátor E znamená existuje cesta

Path a state formuly:• CTL rozlišuje medzi state a path formulami• State-formula vyjadruje vlastnosť v stave• Path-formula vyjadruje vlastnosť na ceste t.j. postupnosti stavov

Syntax CTL:Nech p je atomický výrok. Formuly CTL sú stavové (state) formuly.State- formuly spĺňajú pravidlá:1. p je state- formula2. Ak Φ je state- formula potom ¬Φ je tiež stateformula3. Ak Φ a ψ sú state- formuly potom aj Φ ∨ ψ sú state- formuly4. Ak ϕ je path-formula potom Eϕ a Aϕ sú stateformulyPath -formuly spĺňajú pravidlá:1. Ak Φ je state-formula potom XΦ je pathformula2. Ak Φ a ψ sú state-formuly potom ΦUψ sú path formuly3. Všetko iné nie je path-formula• Operátory X a U majú rovnaký význam ako v logike PLTL a vyjadrujú vlastnosť na ceste• Podľa bodu 4 definície pre state -formuly musí operátorom X a U predchádzať niektorý z operátorov A alebo E ( aby formula CTL bola state-formula)• Operátory A a E môžeme použiť len na pathform., teda musí za nimi nasledovať X alebo U.

Formuly, ktoré nie sú CTL: E(x=1 ∧ AX(x>3)), EX(trueU(x=1))Prvá nie je preto, lebo x=1 ∧ AX(x>3) je nie path-formula. Druhá preto, lebo trueU(x=1) je path-formula a preto U musí predchádzať A alebo E

Sémantika CTL:Nech p je atomický výrok, K Kripkeho štruktúra,s∈ S,Φ,ψ sú CTL state-formuly a ϕ je pathformula, Path(s) = σ∈ Sω | σ [0] = s.Relácia je definovaná:s p iff p∈ L(s)s ¬Φ iff neplatí s Φs Φ ∨ ψ iff (sΦ) ∨ (sψ)s Φ ∧ ψ iff (sΦ) ∧ (sψ)sEϕ iff ak existuje σ∈ Path(s), že σ ϕsAϕ iff pre všetky σ∈ Path(s) σϕsEX Φ iff ∃ σ∈ Path(s) taká, že σ[1]ΦsAX Φ iff ∀ σ∈ Path(s) taká, že σ[1]ΦsA(Φ U ψ) iff ∀ σ∈ Path(s).( ∃ j≥0.(σ [j]ψ ∧ ( ∀ k 0≤k<j.σ [k] Φ)))sE(Φ U ψ) iff ∃ σ∈ Path(s).( ∃ j≥0.(σ [j] ψ ∧ ( ∀ k 0≤k<j.σ [k] Φ)))

Axiómy: EFΦ≡Φ ∨ EX(EFΦ), AFΦ≡Φ ∨ AX(AFΦ), EGΦ≡Φ ∧ EX(EGΦ), AGΦ≡Φ ∧AX(AGΦ), E(ΦUψ)≡ψ ∨ (Φ ∧ EX E(ΦUψ)), A(ΦUψ)≡ψ ∨ (Φ ∧ AX A(ΦUψ))

Page 91: Statnice Jadro Aplikovana Informatika

• Podobne ako v logike LTL kde platí pre akúkoľvek cestu nasl. ekvivalen.:F(Φ ∨ ψ)≡FΦ ∨ Fψ• V logike CTL platí podobná axióma pre, ktorýkoľvek stav: EF(Φ ∨ ψ) ≡ EFΦ ∨ EFψ• Pozor! Neplatí podobná ekvivalencia pre A: AF(Φ ∨ ψ) ≠ AFΦ ∨ AFψ

Odvodenie AF: Prvé štyri axiómy môžme odvodiť z posledných dvoch. Napríklad AFΦ⇔ (podľa definície AF)A(true UΦ)⇔ (podľa axiómy pre A(Φ U ψ))Φ ∨ (true ∧ AX(A(true UΦ)))⇔ (predikátový kalkul, definícia AF)Φ ∨ AX(AF Φ)

Odvodenie AG:Pomocou predchádzajúceho výsledku odvodíme axiómu pre EGEG Φ⇔ ( podľa definície EG)¬AF ¬ Φ⇔ (použijeme odvodenie pre AF)¬ (¬Φ ∨ AX(AF¬Φ))⇔ (predikátový kalkul)Φ ∧ ¬AX(AF¬Φ)⇔ (definicie AX)Φ ∧ EX(¬(AF¬Φ))⇔ (definície EG)Φ ∧ EX(EG Φ)

• Platí veta: Množina temporálnych operátorov CTL je adekvátna (všetky formuly CTL sa dajú pomocou nej vyjadriť) ak obsahuje aspoň jeden z operátorov AX, EX, aspoň jedenz operátorov EG, AF, AU a EU

Značkovací algoritmus:1. Dekomponovať formulu na podformuly a induktivně označiť uzly grafu takými podformulami, ktoré v danom uzle platia.2. Pre každú takú podformulu analyzovať graf a vyvodiť jej pravdivosť v uzle grafu podľa významu operátorov a pravdivostnych hodnôt jej podformúl.

Úlohy verifikáciea) Daný je model M stav s0 a formula φ.Výsledok model ckeckingu:1. áno ak M,s0 φ2. nie ak M,s0 φb) Daný je model M a CTL formula φ najsť všetky stavy s modelu,v ktorých je formula splnená.Úloha a) automaticky vyplýva z b)- stačí zistiť či s0 patrí dovýstupnej množiny stavov úlohy b).

Algoritmus verifikácie:Vstup: model M a CTL formula , Výstup: množina stavov M splňujúcich .Značkovací algoritmus verifikácie:

Page 92: Statnice Jadro Aplikovana Informatika

Nech ψ je podformula Φ a stavy modelu splňujúce všetky priame podformuly ψ už boli označené. (Priama podformula je formula maximálnej dĺžky). Ktoré stavy modelu označkujeme podformulou ψ ? Ak ψ je:- elementárny výrok p: označíme stav s s p ak p∈ L(s).- ψ1 ∧ ψ2: označíme stav s s ψ1 ∧ ψ2 ak už bol označený s ψ1 a ψ2.- ¬ψ1: označíme stav s s ¬ψ1, ak ešte nebol označený s ψ1

- AF ψ1: ak ktorýkoľvek stav je označený s ψ1, označíme ho s AF ψ1, opakujeme: označíme každý stav s AF ψ1, ak všetky jeho nasledujúce stavy sú označené s AF ψ1

-E[ψ1 U ψ2]: ak ktorýkoľvek stav s je označený s ψ2 označíme ho s E[ψ1 U ψ2]. opakujeme: každý stav označený s ψ1 , ktorý má aspoň jeden nasledujúci stav označený E[ψ1 U ψ2] označíme s E[ψ1 U ψ2]- EX ψ1: každý stav, ktorého nasledujúci stav je označený s ψ1 označíme s EX ψ1

Značkovací algoritmus sa vykoná pre všetky podformuly Φ, včítane Φ samotnej. Výsledkom sú stavy označené s Φ.

Značkovací algoritmus zložitosť: O(k.m.(m+n))k je počet operátorov vo formule, m je počet stavov modelu, n je počet prechodov modelu

Techniky riešenia problému „explózie stavov“Problém „explózie stavov“•Značkovací algoritmus je lineárny vzhľadom k veľkosti modelu•Samotný model môže byť veľmi veľký- počet stavov narastá exponenciálne s počtom komponent modelu (napr. 10 komponent každá s 10 stavmi má za následok model s 1010 stavmi).•Takéto exponenciálne narastanie stavov sa tiež volá „state explosion problem“•V súčasnosti nemá táto úloha všeobecné riešenie

Techniky riešiace problém „explózie stavov“1. Účinné dátové štruktúry - usporiadané binárne rozhodovacie diagramy (reprezentujú množiny stavov nie individuálne stavy).2. Abstrakcie – abstrahujú sa premenné, ktoré sú nie dôležité pre formulu, ktorá sa verifikuje.3. Redukcia čiastočného usporiadania – pre verifikovanú formulu sa tvoria ekvivalentné cesty, redukcia spočíva v tom, že sa verifikuje formula len na jednej takejto ceste.4. Indukcie – technika sa používa v prípade veľkého počtu identických komponent.5. Kompozícia – problém sa rozdelí na čiastočné podúlohy, ktoré sa potom riešia samostatne.

Page 93: Statnice Jadro Aplikovana Informatika

Verifikácia programov. Floydova metóda, Hoarové trojice, dokazovacie pravidlá.

Verifikácia programov na rozdiel od verifikácie modelov pracuje na metódach, ktoré:

− sú založené na dôkazoch – nekontroluje sa každý stav do ktorého sa môže

systém dostať. Namiesto toho sa zostrojí dôkaz, že systém spĺňa podmienku

− sú poloautomatické – na rozdiel od verifikácie modelov, ktorá bola plne

automatická, obsahuje verifikácia programov niektoré kroky, ktoré vyžadujú

inteligenciu a nemôžu byť vykonané počítačom

− ako aj pri verifikácii modelov sa kontrolujú vlastnosti programu namiesto jeho

správania – používajú sa na čiastkové fragmenty kódu

− hovoríme o verifikácii sekvenčných transformačných programov – program

beží na jednom procesore (žiadne súbežne bežiace programy), program má

vstup a po určitom výpočte sa ukončí a generuje výstup.

Prečo špecifikovať a verifikovať kód?

Špecifikácia programu je významnou súčasťou dokumentácie. Píšeme ju v príslušnej logike

a je to základ pre robenie dôkazov. Verifikovanie programov na základe formálnej

špecifikácie môže výrazne skrátiť dobu trvania vývoja softvéru a jeho údržbu elimináciou

chýb vo vývojovej fáze. Softvér sa jednoduchšie znovu využije. Počítačové systémy, na

ktorých bezpečnosť sa kladie veľký dôraz (jadrové elektrárne, lietadlá), vyžadujú aby ich

softvér bol špecifikovaný a verifikovaný tak, aby spĺňal čo najprísnejšie podmienky.

Formálna špecifikácia programov

1. Transformovať informatívny popis D v danej aplikačnej oblasti do formuly Dφ

vyjadrenej v nejakej symbolickej logike

2. Napísať program P, ktorý by mal realizovať Dφ v nejakom programovacom prostredí

3. Dokázať, že P spĺňa formulu Dφ .

Dôležité je špecifikovať program pomocou dohodnutého jazyka. Definujme jazyk v Backus

Naurovom tvare. Všetko čo môže byť naprogramované v jazykoch ako C, C++, Java, môže

byť vyjadrené aj v tomto jazyku, aj keď nie tak efektívne, pretože nemá žiadne objekty,

procedúry, vlákna, ...

Používa len:

Page 94: Statnice Jadro Aplikovana Informatika

1. celočíselné výrazy

E ::= n I x I (-E) I (E + E) I (E - E) I (E * E),kde n je číslo a x je premenná.

2. Booleovské výrazy

B : : = t r u e I false I (!B) I (B&B) I (B||B) I (E<E)3. Príkazy

C ::= x = E I C;C I i f B C else C I while B C

x = E je priradenie, kde E predstavuje celočíselný výraz.

Hoarove trojice

( ) ( )ψφ P ,

kde ψφ , sú formuly predikátovej logiky. Formula φ je podmienka pred vykonaním

programu a formula ψ je podmienka po vykonaní programu P. príklad:

( ) ( )xyyPx <> *0

ak program P vykonáme v stave, keď x>0, potom po vykonaní programu bude určite platiť, že

y*y<x

Sémantika splnenia je rôzna pre čiastočnú a úplnú korektnosť. Čiastočná korektnosť znamená,

že nepožadujeme, aby program skončil, ale pri úplnej korektnosti požadujeme aby program

skončil.

Čiastočná korektnosť teda hovorí, že ak program začal spĺňajúc podmienku φ , tak ak skončí,

bude spĺňať podmienku ψ

.

Úplná korektnosť zaručuje, že ak program začal spĺňajúc podmienku φ , tak určite skončí

a bude spĺňať podmienku ψ .

Často je jednoduchšie najprv dokázať čiastočnú korektnosť a potom dokázať ukončenie

programu.

Ak môžeme dokázať korektnosť pomocou logiky píšeme

alebo

Page 95: Statnice Jadro Aplikovana Informatika

Pre niektoré programy potrebuje zaviesť ďalší typ premennej, tzv. logické premenné. Tento

typ premennej sa vyskytuje len v logických podmienkach, ktoré tvoria podmienky pred a po

vykonaní programu. Nikdy sa nevyskytuje v kóde programu.

Dokazovacie pravidlá (Floyd, Hoare)

Pravidlá vždy znamenajú, že na to, aby sme dokázali čo je pod čiarou, potrebuje dokázať čo je

nad čiarou.

Page 96: Statnice Jadro Aplikovana Informatika
Page 97: Statnice Jadro Aplikovana Informatika
Page 98: Statnice Jadro Aplikovana Informatika
Page 99: Statnice Jadro Aplikovana Informatika