You are on page 1of 1

1. Jakými typickými kroky prochází system pri otevření dosud neotevřeného souboru v rámci volani open()?

Předpokládáme, ze soubor je možné úspěšně otevřít (limity:


cca 5 rozvitych vet) - 5 bodu 2. Jaky je maximální počet čtení bloku z disku pro provedeni operaci
h = open( “/dir/symlink/“, O_RDONLY ); read( h, buf, 10 ); read ( h, buf, 10 ); ?
Reseni Predpokladejte přitom, ze adresáře jsou kratší než 1 blok, dir je adresar,
symlink je symbolicky odkaz na soubor /dir/file , file je klasicky soubor delší než 20B,
Typicke kroky Ilustracni obrazek zadny blok není na počátku ve vyrovnávací paměti, nedochazi k interferenci s dalšími procesy,
prepnuti kontextu, prichodu signálu apod.
1) Typicke kroky operace open() pri 1. otevření souboru
Obsah adresaru se vleze do jednoho bloku

1. Vyhodnoti se cesta , posoudí existence a přistupova práva otevíraného souboru, i-uzel *Dodatecna ilustrace, jak se spluprovazany ty datove struktury*
* v souborovém systému mame na zacatku
butovaci(boot) blok, pak super blok, a pak
od bloku c. 2 zacina tabulka i-uzlu
nacte se jeho i-uzel z disku
Reseni Super block
2. v tabulce v-uzlu se alokuje nova položka, do ni se vloži i-uzel a rozšíří se o některé
dalsi udaje, vcetne poctu odkazu na danu v-uzel(nyní 1) 7 čtení - při použití tzv. rychlého symlinku
3. Alokuje se nova polozka v tabulce otevřených souboru a naplni se odkazem na Cislo i-uzlu “/“
v - uzel a dalšími informacemi, zejmena: pozice v souboru, počet odkazu( na Popis:
zacatku 1) , rezim otevření atd. - Na zacatku mame pouze číslo i-uzlu kořenového adresáře ze super-bloku, které napr. N
Tabulka v-uzlu lze převést na odpovídající blok a ten bude načten - získáme tak obsah i-uzlu
4. Alokuje se nova (první volna) položka v tabulce deskriptoru, naplní se odkazem na v - uzel kořenového adresáře “/“ - 1. čtení
položku tabulky otevřených souboru
- 2. čtení načte obsah kořenového adresáře z bloku, na který je odkaz v *Cislo bloku se zjisti
výpočtem z čísla i-uzlu*
i-uzlu kořenového adresáře “/“ - 2. čtení
5. Vrati index alokovaneho deskriptoru (pripadne -1 pri chybe)
*Nekde na disku* je blok(4KB) i-uzlu obsahující i-uzel “/“
- V datech “/“ se nalezne dvojice ( dir, číslo i-uzlu dir ) a načte se blok s timto i-
Pocet odkazu uzlem ( číslo bloku lze odvodit z čísla i-uzlu ) - 3 čtení
- 4. čtení pak načte obsah adresáře “/dir” z bloku, na který je odkaz v i-uzlu “/dir” - 4. čtení Nekde tady treba bude 1. primy odkaz na data
//typ: adresar

1 - V datech “/dir” nalezneme číslo i-uzlu “/dir/symlink” a načteme blok s


odpovidajicim i-uzlem - 5. čtení i-uzel “/“ Blok číslo M

- Předpokladame-li použití rychlého symlinku, pak primo v i-uzlu “/dir/symlink” “alokvan” D “pristupove casy, prava atd”
je cesta “/dir/file”
- Preklad /dir na odpovídající i-uzel, tento i-uzel i jeho data mame ve vyrovnávací
paměti - není nutno znovu cest

- V datech “/dir/“ se nalezne číslo i-uzlu “/dir/file a je načten blok


s timto i-uzlem -6. čtení
Tabulka deskriptoruuu Odkaz Tabulka otevřených souboru
(ukazatel - Pomoci odkazu z i-uzlu “/dir/file” je načten 1. blok tohoto souboru a z nej se
v paměti) vezme 10 bytu - 7. čtení
- Další prikas read() již nečte z disku - příslušna data jsou ve vyrovnávací paměti
stdin 0
Blok číslo M Blok i-uzluuu obsahující i-uzel 228
stdout 1
stderr 2
1 1. Primy datovy blok
N
Odkaz jmeno číslo i-uzlu
( hledáme první volnou položku. Nemusí
vsak vždy mít číslo 3. nechť proto bude N) “dir” 228 D Blok cislo napr. 1312

//Konkretni blok je
//spocten z cisla i-uzlu

3. Předpokládejte velikost alokacniho bloku 1000B (1kB) a velikost odkazu na blok - 10B. Dalsi blok i-uzlu obsahujici i-uzel 69 Blok c. 1312
Kolik alokacních bloku ( bez i-uzlu ) bude na disku s klasickym unixovym FS zabirat soubor o velikosti 360.5kB.
(Kolik prostoru to zabere (data + metadata) ? ) Zdůvodněte.
V případě, když jde o fast
typ: “symlink” symlink, data se budou nacházet
primo tady
Reseni - 360.5 kB vyzaduj e 361 alokacnich bloku ( protože se alokuje po blocích) cislo i-uzlu
( alokaci blok - skupina pevného poctu sektoru, typicky 2^n, L /dir/file
366 = 361 data + 5 metadata následujících fyzicky i logicky za sebou, která je nejmenší jednotkou diskového prostoru,
symlink 69
kterou OS čte ci zapisuje pro běžných operacich
)
- 10 datovych bloke bude odkazovano primymi odkazy
- dalsich 1000/10 bloku je odkazovano pres nepřímý odkaz 1. úrovně z i-uzlu pres jeden
pomocný adresovací blok
- dale je použit nepřímý odkaz 2. úrovně v i-uzlu, vedoucí na jeden pomocny filename 42
10 datovych bloku
adresovaci blok s neprimymi odkazy 1. úrovně. Takové jsou alokovany 3. Do nich se již
i - uzly podari uložit pozadovanych 251 zbyvajicich odkazu.
- Celkove tedy 5 bloku metadat (ty ruzove)

D
Blok c. 11 Blok i-uzlu obsahujici i-uzel 42

#include <stdio.h>
#include <assert.h>
#include <bool.h>
10 primych int main ()
“Bezny” soubor 1. primy odkaz na data
odkazu na {
bool tru = false;
data assert ( tru && “Tady jsou nase data!!!” ) ;
return 0;
}

- blok číslo 11

D
pomocny adresovaci blok
S primymi odkazy D
Neprimy odkaz 100 = 1000/10
1. urovne

D
Neprimy odkaz pomocny adresovaci blok
2. urovne S neprimymi odkazy 1.
urovne

Zbytek je nevyuzit

51 (potrebujeme pouze 51 datový blok)

You might also like