Pocitani page faultu - algoritmus :)

Úvodní přednáška zahrnující základy architektur počítačů, jejich vývoje, návrhu a implementace a základy teorie, koncepce a implementace operačních systémů.
peci1
Matfyz(ák|ačka) level II
Příspěvky: 86
Registrován: 21. 1. 2009 20:08
Typ studia: Informatika Bc.

Pocitani page faultu - algoritmus :)

Příspěvek od peci1 »

Ahoj, az se divim, ze k takhle ozehavymu tematu tady nikde neni obecnej algoritmus (a nebo mam spatnej svuj vyhledavaci algoritmus :) )

Pokusil jsem se neco sestavit, na nekolika prikladech to fungovalo (jestli teda spravne oznacena reseni byla opravdu spravna =) )

Na druhou stranu jsem ve foru za letosek jeste pocitani max. PF nevidel... Bud to lidi zatajili a nebo letos proste nebudou. Stejne jsem ale rad, ze jsem si to aspon sam pro sebe sesumiroval :)

Je nekolik moznosti zadani. Bud dostanete velikost stranek, strank. tabulek a pocet urovni strankovani explicitne a nebo jen tvar virtualni adresy. Kdyz mate explicitni zadani, je to ok. Pokud ne, musite si velikosti stranek a strankovacich tabulek jednotlivych urovni spocitat. Zadani muze znit napr. tak, ze mame adresu ve tvaru 12 + 12 + 16 bitu. Vezmeme to pekne odzadu. 2^16 je velikost jedne stranky posledni (v tomto pripade 2.) urovne (ta, ve ktere jsou data). 2^12 je pocet polozek strank. tabulky 1. urovne a 2^12 je pocet polozek "rootove" strank. tabulky (directory) (tam vypadky nenastavaji, takze nas nezajima). Tj. takhle zjistime i pocet urovni strankovani (pocet casti adresy - 2). Diky za prispevek dobry_den v nejakem predchozim postu, v podstate jsem jen preformuloval jeho navod :)

Prvni dulezita vec pri pocitani asi bude, co se vlastne v te pameti dela. Jestli z ni jen ctu nebo v ni neco presouvam. V pripade presunu mohou nastat PF jak pri cteni, tak pri zapisu (sice nevim proc je treba nahravat do RAM vec, do ktere jen zapisuju, treba by se to dalo nahravat primo do swapu) (a mam pocit, ze jejich max. pocet je stejny, takze pri presunu pocet PF na data vynasobim dvema).

1) Spocitam PF na instrukci. Je-li instrukce zarovnana, mysli se tim vetsinou, ze zacina na sudem bajtu. Tj. je-li velikost instr. 1-2B, muze nastat v kazde urovni strankovani max. 1 PF (tj. v 3urovnovem max. 3). Pokud neni zarovnana nebo pokud je zarovnana, ale delsi nez 2B, mohou v 1. levelu nastat vetsinou 2 vypadky (nepredpokladam, ze by instr. byla vetsi nez 1 stranka) - to pokud bude 1. bajt na konci jedne a 2. na zacatku druhe stranky. Ve vyssich levelech obdobne. Strankovaci tabulky pro 2 stranky mohou byt zase ve dvou tabulkach vyssi urovne (jedna na konci, druha na zac.). Takze to vidim, ze pri zarovnanych instr <=2B je to 1*(pocet urovni strankovani) a jinak je to 2*(# urovni strankovani).

2)Spocitam PF dat na nejnizsi urovni. Velikost dat vydelim velikosti stranky posledni urovne (samozrejme v nasobcich 1024). To je pocet stranek, ktere v lepsim pripade prenasim. V horsim pripade (a ten nas zajima) musim pricist jeste jednicku pro pripad, ze 1. bajt prenasenych dat neni na zacatku stranky.

3) Spocitam PF ve vyssich urovnich strank. tabulek. Zapremyslime, do kolika stranek vyssi urovne muze zasahnout pocet stranek spocitany v bodu 2). Napr. pri velikosti nadrazenych stranek 1024 polozek pokud jsme spocitali 2049 polozek nizsi urovne, budou to 3 stranky, pokud 2050, muzou to byt az 4 stranky (1. bajt jako posledni v 1. strance, 2. a 3. plna (tj. 2048 str.) a posledni bajt ve 4. strance na zacatku). A tenhle pocet zase prenesu do vyssiho levelu a aplikuju stejny algoritmus (dokud je vyssi level v zadani :) ).

4) Pokud jde o presun dat, vynasobim dvema soucet vysledku 2) a 3).

5) Sectu vysledek 4) a 1)

6) Hotovo.

A jeste priklad:
2 bajtova instrukce, presun 8 MB dat, 4 kB stranka, 3urovnove strankovani, tabulky maji 1024 polozek
(variace by mohla byt napr. mame VA (virt. adresu) ve tvaru 10+10+10+12)

1) 2bajtova nezarovnana instrukce, 3 ur. str. - 2*3 = 6 vypadku
2) 8192/4 = 2048 v lepsim pripade, prictu jednicku (horsi pripad)
3) a) druha uroven - mame 2049 stranek, coz nam vleze do 3 stranek teto urovne. ( 1 + 1024 + 1024 )
b) treti uroven - 3 stranky vlezou do max. 2 stranek 3. urovne.
4) Ano, presouvame, pocitam tedy 2 * (2049 + 3 + 2)
5) Celkovy max. pocet PF je 6 + 2 * (2049 + 3 + 2) = 4114

Pokud nekdo najde vylepseni ci chybu tohoto postupu, budu rad, tak piste a piste :)

Pozn.: Kdesi jsem se docetl (a byla to pro me novinka), ze je rozdil mezi zapisem kB a KiB. Od roku 1998 je pry kB 1000 B, kdezto KiB je 1024 B (http://cs.wikipedia.org/wiki/Byte). Asi by tedy bylo fajn se zeptat, co je pouzitou zkratkou opravdu zamysleno (a pokud neodpovi, brat jako default 1024, at uz je tam kB nebo KiB).
Návštěvník

Re: Pocitani page faultu - algoritmus :)

Příspěvek od Návštěvník »

Mě osobně je teda milejší tenhle lidský přístup, než se učit nazpaměť nějakou rekurzivní funkci. Díky peci1 ;-)
Velyger
Matfyz(ák|ačka) level I
Příspěvky: 27
Registrován: 29. 10. 2008 14:49
Typ studia: Informatika Bc.

Re: Pocitani page faultu - algoritmus :)

Příspěvek od Velyger »

jj, diky moc, konecne poriadny a normalny ludsky postup
(niesom stroj a nehadzem do seba funkcie) :P
Zombie killer
Obrázek
geckon
Matfyz(ák|ačka) level I
Příspěvky: 10
Registrován: 22. 1. 2009 23:05
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Re: Pocitani page faultu - algoritmus :)

Příspěvek od geckon »

Rozhodně díky. Dost mi to pomohlo pochopit celé stránkování obecně, takže to není jen něco, co se naučím a pak tupě zopakuju;)
"Neberte život tak vážně, stejně z něj nevyváznete živí."
Odpovědět

Zpět na „SWI120 Principy počítačů a operačních systémů“