You are on page 1of 39

Virtualna memorija

1 Uvod
U prethodnom poglavlju smo predstavili o razli£ite strategijame upravljanja
memorijom koje se koriste u ra£unarskim sistemima. Sve ove strategije imaju isti
cilj: odrºavati vi²estruke procese u memoriji istovremeno kako bi se omogu¢ilo
multi-programiranje. Mežutim, oni obi£no zahtevaju da £itav proces bude u
memoriji pre nego ²to se moºe izvr²iti.
Virtualna memorija je tehnika koja omogu¢ava izvr²avanje procesa koji nisu
u potpunosti u memoriji. Glavna prednost ove ²eme je da programi mogu biti
£ak i ve¢i od raspoloºive zi£ke memorije. Nadalje, virtualna memorija abstra-
kuju glavnu memoriju u ekstremno veliki, kontinualni niz lokacija, odvajaju¢i
pri tome logi£ku memoriju, onako kako je korisnik vidi, od zi£ke memorije.
Ova tehnika oslobaža programere od brige u vezi sa ograni£eno²¢u memorije.
Virtualna memorija takože omogu¢ava procesima da lako dele datoteke i im-
plementiraju deljenu memoriju. Dodatno, omogu¢ava ekasan mehanizam za
kreiranje procesa. Mežutim, virtualnu memoriju nije lako implementirati i per-
formanse sistema se mogu degradirati vi²estruko ukoliko se to uradi pogre²no.
Algoritmi za upravljanje memorijom navedeni u ranije potrebni su zbog jed-
nog osnovnog zahteva: instrukcije koje se izvr²avaju moraju biti sme²tene u
zi£koj memoriji. Prvi na£in da se ovaj zahtev zadovolji jeste da se celokupni
logi£ki prostor sme²ta u zi£ku memoriju. Dinami£ko u£itavanje moºe pomo¢i
da se ublaºi ovo ograni£enje, ali, generalno, to obi£no zahteva posebne mere
predostroºnosti i dodatni rad programera.
Uslov da instrukcije moraju biti u zi£koj memoriji jeste obavezan i razuman,
ali on takože ograni£ava veli£inu programa koji se izvr²ava na veli£inu zi£ke
memorije. Sa druge strane, istraºivanja sprovedena na u realnom programima
pokazuju da u mnogim slu£ajevima celokupan program nije neophodan, u ovom
smislu. Na primer, uzmite u obzir slede¢e primere:

ˆ Programi £esto imaju deo kod za manipulisanje neobi£nim gre²kama koje


se mogu javiti u sistemu. Po²to se ove gre²ke retko, ako ikada, pojave u
praksi, ovaj se kod gotovo nikada ne izvr²ava;

ˆ Nizovima, listama i tabelama £esto je dodeljeno vi²e memorije nego ²to


im je zapravo potrebno: niz se moºe deklarisati tako da sadrºi od 10000
elemenata, iako se retko zaista koristi vi²e od od 100 elemenata;

ˆ Odrežene opcije i funkcije programa mogu se izuzetno retko koristiti.

ƒak i u onim slu£ajevima kada je potreban ceo program, moºda svi delovi
programa ne¢e biti potrebni istovremeno. Mogu¢nost izvr²avanja programa koji
je samo delimi£no u memoriji pruºila bi mnoge prednosti:

ˆ Program vi²e ne¢e biti ograni£en koli£inom dostupne zi£ke memorije.


Korisnici bi mogli pisati programe smatraju¢i da im je dostupan izuzetno
veliki (virtualni) adresni prostor, ²to znatno pojednostavljuje zadatak pro-
gramiranja;
2

Slika 1: Virtualna memorija omogu¢ava izvr²avanje programa ve¢ih od dostupne


zi£ke memorije

ˆ Budu¢i da bi svaki korisni£ki program mogao da zauzme manje zi£ke


memorije, vi²e programa se moºe istovremeno pokrenuti, ²to ¢e rezulto-
vati odgovaraju¢im pove¢anjem iskori²¢enosti procesora kao i propusnost
(broj procesa koji se kompletiraju u jedinici vremena), ali bez pove¢anja
vremena odziva ili ukupnog vremena izvr²avanja;

ˆ Bilo bi potrebno manje U/I operacija za u£itavanje ili zamenu korisni£kih


programa u memoriju, tako da bi svaki korisni£ki program radio brºe.

Na taj na£in, pokretanje programa koji nije u potpunosti u memoriji koristilo bi


kako sistemu, tako i korisniku. Kao ²to smo rekli, koncept virtualne memorija
podrazumeva razdvajanje logi£ke memorije (onakve kakvu je korisnik vidi) od
zi£ke memorije. Ovo razdvajanje omogu¢ava programerima ekstremno veliku
virtualnu memoriju, £ak i u slu£ajevima kada je na raspolaganju znatno manja
zi£ka memorija (slika 1).
Virtualna memorija znatno olak²ava zadatak programiranja, jer programer
vi²e ne mora da brine o koli£ini dostupne zi£ke memorije - umesto toga moºe
da se koncentri²e na problem koji ¢e re²avati.
Virtualni adresni prostor procesa odnosi se na logi£ki (ili virtualni) prikaz
na£ina na koji se proces £uva u memoriji. Tipi£no ovo podrazumeva da pro-
ces po£inje na odreženoj logi£koj adresi, recimo adresi 0, i zauzima kontinualne
memorijske lokacije, kao ²to je prikazano na slici 2. Mežutim, kao ²to smo di-
skutovali ranije, zi£ka memorija se u stvarnosti moºe organizovati u okvire na
na£in da zi£ki okviri dodeljeni nekom procesu uop²te nisu povezani (kontinu-
alni). Uloga jedinice za upravljanje memorijom (MMU) jeste da mapira logi£ke
stranice u zi£ke okvire u memoriji.
Primetite na slici 2 da dozvoljavamo heap memoriji da se ²iri jer se ona koristi
za dinami£ku dodelu memorije. Sli£no tome, dopu²tamo steku da se pove¢ava
u memoriji, na primer putem sukcesivnih poziva funkcija. Veliki prazan prostor
(ili ²upljina) izmežu heap memorije i steka je deo virtualnog adresnog prostora,
3

Slika 2: Virtualni adresni prostor

ali ¢e trebati stvarne zi£ke okvire samo ukoliko se heap ili stek budu ²irili. Vir-
tualni adresni prostori koji podrazumevano uklju£uju u sebe ²upljine poznati su
kao proreženi adresni prostori (eng. sparse address spaces ). Kori²tenje proreže-
nog adresnog prostora je korisno jer se ²upljine mogu smanjivati kako segmenti
heap memorije ili steka rastu ili u slu£ajevima kada ºelimo dinami£ki povezivati
biblioteke (ili moºda druge deljene objekte) tokom izvr²avanja programa.
Dakle, pored razdvajanja logi£ke memorije od zi£ke memorije, virtualna
memorija omogu¢ava deljenje datoteka i memorije izmežu dva ili vi²e procesa
putem deljenja stranica. To dovodi do slede¢ih prednosti:

ˆ Sistemske biblioteke mogu se deliti od strane nekoliko procesa mapiranjem


deljenog objekta u virtualni adresni prostor. Iako svaki proces smatra da
su biblioteke deo njegovog virtualnog adresnog prostora, stvarni okviri u
kojima su biblioteke sme²tene u zi£koj memoriji dele izmežu svih procesa
(slika 3). Tipi£no se biblioteka mapira tako da je mogu¢e samo njeno
£itanje (read-only mode ) u adresnom prostoru svakog procesa koji je sa
njom povezan

Slika 3: Deljene biblioteke kori²¢enjem virtualne memorije


4

Slika 4: Transfer stranica memorije u sekundarnu memoriju i nazad

ˆ Sli£no tome, procesi mogu da dele memoriju. Ve¢ smo pri£ali ranije da dva
ili vi²e procesa mogu komunicirati kori²¢enjem deljene memorije. Virtu-
alna memorija omogu¢ava jednom procesu da stvori region memorije koji
moºe da deli sa drugim procesom. Procesi koji dele ovaj region smatraju
ga delom svog virtualnog adresnog prostora, ali se stvarni zi£ki okviri
memorije dele, sli£no kao ²to je prikazano na slici 3

ˆ Stranice se mogu deliti tokom kreiranja procesa sistemskim pozivom fork (),
£ime se ubrzava kreiranje procesa.

U nastavku detaljnije istraºujemo ove i druge prednosti virtuelne memorije.


Najpre ¢emo, mežutim, predstaviti primenu virtualne memorije kroz stranice
na zahtev (eng. demand paging ).

2 Stranice na zahtev (Demand Paging)


Razmislite o tome na koji na£in se izvr²ni program moºe u£itati sa diska
u memoriju. Jedna od opcija je u£itavanje celog programa u zi£ku memoriju
u vreme izvr²avanja programa. Mežutim, problem sa ovim pristupom je ²to
nam u po£etku moºda ne¢e biti potreban £itav program u memoriji. Pretposta-
vimo da program po£inje listom dostupnih opcija od kojih ¢e korisnik izabrati
jednu. U£itavanje celog programa u memoriju rezultuje u£itavanjem izvr²nog
koda za sve opcije, bez obzira da li je data opcija na kraju uop²te odabrana od
strane korisnika. Alternativna strategija je u£itavanje stranica samo onda kada
su potrebne. Ova tehnika je poznata kao stranice na zahtev i obi£no se koristi
u sistemima virtualne memorije. Sa virtualnom memorijom koja koristi stra-
nice na zahtev, stranice se u£itavaju samo kada se zahtevaju tokom izvr²avanja
programa. Stranice kojima se nikada ne pristupa nikada se ne¢e ni u£itavati u
zi£ku memoriju.
5

Slika 5: Tabela stranica kada nisu sve strance u osnovnoj memoriji

Sistem sa stranicama na zahtev sli£an je sistemu strani£enja sa zamenjiva-


njem (slika 4), gde se procesi nalaze u sekundarnoj memoriji (obi£no na disku).
Kada ºelimo da izvr²imo neki proces, zamenimo ga u memoriju. Mežutim, ume-
sto da izvr²imo zamenu £itavog procesa u memoriju, sada koristimo delimi£nu
zamenu (eng. lazy swap ). Delimi£na zamena nikada ne prebacuje stranicu u
memoriju osim ako ¢e ta stranica biti potrebna.

2.1 Osnovni koncept


Kada treba u£itati proces u memoriju, sistem za zamenu pretpostavlja koje
¢e se stranice procesa koristiti pre nego se proces ponovo zameni nazad u se-
kundarnu memoriju. Umesto da u£ita £itav proces, sistem za zamenu u£itava
samo te stranice u memoriju. Na taj na£in se izbegava u£itavanje memorijskim
stranicama koje se ionako ne¢e koristiti, smanjuje se vreme zamene i koli£ina
potrebne zi£ke memorije.
Uz pomo¢ ove ²eme, potreban nam je neki oblik hardverske podr²ke da bismo
razlikovali stranice koje se nalaze u memoriji i stranice koje se nalaze na disku.
Bit validnosti opisan u prethodnoj lekciji moºe se koristiti u tu svrhu. Ovog
puta, mežutim, kada je ovaj bit postavljen na validno, pridruºena stranica
je i validna i rezidentna u memoriji. Ako je bit postavljen na "ne-validno",
stranica ili nije validna (tj. nije u logi£kom adresnom prostoru procesa) ili je
validna, ali se trenutno nalazi na disku. Unos u tabeli stranica za stranicu koja
se u£itana u memoriju je postavljen kao i obi£no, ali unos u tabeli stranica
za stranicu koja trenutno nije u memoriji ili je jednostavno postavljen na ne-
validni ili sadrºi adresu te stranice na disku. Da bi se ovakav pristup koristio,
potrebno je odrºavati posebnu internu tabelu u kojoj se nalaze sve stranice koje
6

Slika 6: Obrada izuzetka gre²ke stranice

su dodeljene datom procesu, kako bi se u slu£aju da je bit validnosti postavljen


na vrednost ne-validna, moglo utvrditi koji je razlog za to. Ova situacija je
prikazana na slici 5.
Treba primetiti da ozna£avanje stranice kao ne-validne ne¢e imati nikakvog
efekta u slu£aju da proces nikada ne poku²a pristupiti toj stranici. Dakle, ako
inicijalna pretpostavka bude ispravna i u£itamo samo stranice koje su zapravo
potrebne, proces ¢e se izvr²avati na isti na£in kako bi se izvr²avao i da smo
u£itali sve stranice. Sve dok se proces izvr²ava i pristupa stranicama koje su
rezidentne u memorije, izvr²avanje se odvija normalno.
Ali ²ta se de²ava ako proces poku²a da pristupi stranici koja nije u£itana u
memoriju? Pristup stranici ozna£enoj kao ne-validna uzrokuje gre²ku stranice
(eng. page fault ). Hardver za strani£enje, prilikom transliranja adrese kori-
²¢enjem tabele stranica, primeti¢e da je postavljen bit validnosti postavljen na
vrednost ne-validan, ²to ¢e dovesti do izuzetka u operativnom sistemu. Ovaj
izuzetak je posledica toga ²to ºeljena stranica nije u£itana u memoriju. Rutina
za obradu ovog izuzetka gre²ke stranice je jednostavna (slika 6):

1. Proveravamo internu tabelu (koja se obi£no £uva sa kontrolnim blokom


procesa) da bismo utvrdili da li referencirana memorija uop²te pripada
tom procesu ili je u pitanju ilegalan pristup memoriji drugog procesa

2. Ako je referenca ilegalna, prekinemo proces. Ako nije, ali jo² traºena
stranica nije u£itana u memoriju, u£itaj je

3. Pronalazimo slobodan okvir u osnovnoj memoriji (na primer, uzimanjem


jednog iz liste slobodnih okvira)
7

4. Zakazujemo operaciju pristupa disku kako bismo u£itali ºeljenu stranicu


u novo-dodeljeni okvir

5. Kada je £itanje sa diska zavr²eno, aºuriramo internu tabelu i tabelu stra-


nica kako bi ozna£ili da je stranica sada u memoriji

6. Ponovo pokre¢emo instrukciju koja je i generisala izuzetak. Proces sada


moºe da pristupi stranici kao da je ona sve vreme bila u memoriji.

U ekstremnom slu£aju, moºemo da zapo£nemo izvr²avanje procesa bez ijedne


stranice u memoriji. Kada operativni sistem postavi programski broja£ na prvu
instrukciju procesa, koja se nalazi u okviru nerezidentne memorijske stranice
(okriva), to odmah rezultuje gre²kom stranice. Nakon ²to se ova stranica u£ita
u memoriju, proces se nastavlja izvr²avati, po potrebi generi²u¢i nove gre²ke
stranica sve dok svaka stranica koja mu je zaista potrebna ne bude rezidentna
u memoriji. Od tog trenutka, proces se moºe izvr²avati bez narednih gre²aka
stranica. Ova ²ema se naziva stranice isklju£ivo na zahtev (eng. pure demand
paging ) - nikad ne u£itavaj stranicu u memoriju dok ona nije neophodna.
Hardver za podr²ku stranicama na zahtev je isti kao i hardver za strani£enje
i zamenu:

ˆ Tabela stranica - Ova tabela ima mogu¢nost da ozna£i unos nelegalnim


putem bita validnosti ili eventualno specijalnih vrednosti za²titnih bita;

ˆ Sekundarna memorija - sadrºi one stranice koje nisu u glavnoj memoriji.


Sekundarna memorija je obi£no disk velike brzine. Poznat je kao urežaj
zamene (eng. swap device ), a deo diska koji se koristi u tu svrhu poznat
je kao prostor za zamenu (eng. swap space ).

Klju£ni uslov kod implementacije stranica na zahtev jeste mogu¢nost da se po-


novo izvr²i bilo koja instrukcija nakon izuzetka gre²ke stranice. Budu¢i da sa£u-
vamo stanje (registre, programski broja£,..) prekinutih procesa kada se dogodi
gre²ka stranice, moramo biti u mogu¢nosti da ponovo pokrenemo proces na pot-
puno istom mestu i pri identi£nom stanju, osim ²to je sada ºeljena stranica u
memoriji i dostupna je. U ve¢ini slu£ajeva ovaj zahtev je lako ispuniti. Gre²ka
stranice moºe se pojaviti prilikom pristupa bilo kojoj memorijskoj lokaciji. Ako
se gre²ka stranice dogodi pri prihvatu instrukcije, moºemo je ponovo izvr²iti po-
novnim prihvatom instrukcije. Ako se gre²ka stranice dogodi prilikom prihvata
operanda, moramo ponovo prihvatiti i dekodirati instrukciju, a zatim preuzeti
operand.

2.2 Performanse stranica na zahtev


Kori²¢enje stranica na zahtev moºe zna£ajno uticati na performanse ra£u-
narskog sistema. Da bismo videli za²to, izra£unajmo efektivno vreme pristupa
memoriji u slu£aju sistema koji koristi stranice na zahtev. Za ve¢inu ra£unar-
skih sistema vreme pristupa memoriji, ozna£eno ma, kre¢e se od 10 do 200
nanosekundi. Sve dok nemamo gre²ke stranice, efektivno vreme pristupa je
8

jednako vremenu pristupa memoriji. Ako se, mežutim, dogodi gre²ka stranice,
prvo moramo pro£itati odgovaraju¢u stranicu s diska, a zatim pristupiti ºeljenoj
memorijskoj re£i.
Neka je p verovatno¢a gre²ke stranice (0 ≤ p ≤ 1). Za o£ekivano je da
¢e p biti blisko nuli, tj. da imamo znatno manje gre²aka stranice u odnosu
na situacije kada su stranice ve¢ dostupne prilikom referenciranja memorije.
Efektivno vreme pristupa je tada

efektivno vreme pristupa = (1 - p ) Ö ma + p Ö vreme gre²ke stranice

Da bismo izra£unali efektivno vreme pristupa, moramo znati koliko je vre-


mena potrebno da se re²i gre²ka stranice. Gre²ka stranice uzrokuje slede¢i niz
koraka:

1. Izuzetak operativnog sistema;

2. Sa£uvati korisni£ke registre i stanje procesa;

3. Utvrditi da je uzrok izuzetka bio gre²ka stranice;

4. Proveriti da li je referenca stranice legalna i utvrditi lokaciju stranice na


disku;

5. Zahtevati u£itavanje sa diska u slobodni okvir

(a) Sa£ekati u redu £ekanja za ovaj urežaj dok se zahtev za £itanje ne


servisira

(b) Sa£ekati vreme potrebno da urežaj pronaže ºeljene podatke

(c) Zapo£eti prenos stranice u slobodni okvir

6. Dok se £eka, dodeliti CPU nekom drugom korisniku (rasporeživanje CPU-


a, opciono);

7. Primiti prekid od strane U/I podsistema diska (U/I operacija je zavr²ena);

8. Sa£uvati registre i stanje procesa drugog korisnika (ako je izvr²en korak


6);

9. Utvrditi da je izvor prekida prekid U/I podsistem diska;

10. Aºurirati tabelu stranica i internu tabelu kako bi se jasno objavilo da je


ºeljena stranica sada u memoriji;

11. Sa£ekati da se procesor ponovo dodeli ovom procesu;

12. Vratiti korisni£ke registre, stanje procesa i novu tabelu stranica, a zatim
nastaviti sa izvr²avanjem prekinute instrukcije.
9

Nisu svi ovi koraci neophodni u svakom slu£aju. Na primer, pretpostavljamo


da je u koraku 6 CPU dodeljen drugom procesu dok se izvr²ava U/I operacija.
Ovaj aranºman omogu¢ava multi-programiranje kako bi se odrºala iskori²¢enost
CPU-a, ali zahteva dodatno vreme da se nastavi rutina servisiranja gre²ake
stranice kada U/I transfer bude zavr²en.
U svakom slu£aju, suo£eni smo sa tri glavne komponente vremena servisira-
nja gre²ke stranice:

1. Servisirati izuzetak gre²ke stranice;

2. U£itati stranicu;

3. Ponovo pokrenuti proces.

Prvi i tre¢i zadatak mogu se, paºljivim kodiranjem, svesti na nekoliko stotina
instrukcija. Svaki od ova dva zadatka moºe trajati od 1 do 100 mikrosekundi.
Mežutim, vreme u£itavanja stranice verovatno ¢e trajati blizu 8 milisekundi.
Tipi£ni hard-disk ima prose£no ka²njenje rotacije (obrtanje glave diska) od 3
milisekunde, vreme traºenja podataka 5 milisekundi (pomeranje ruke diska do
ºeljenog cilindra) i vreme prenosa 0,05 milisekundi. Dakle, ukupno vreme u£i-
tavanja stranice je oko 8 milisekundi, uklju£uju¢i vreme hardvera i softvera. Pri
tome, obratite paºnju da smo gledali samo vreme rada urežaja. Ako proces
£eka u redu £ekanja za dati urežaj, moramo ura£unati i vreme £ekanja na ure-
žaj tj. vreme dok £ekamo da sekundarna memorija bude slobodna da servisira
na² zahtev, ²to dodatno pove¢ava vreme zamene.
Za prose£no vreme servisiranja gre²ke stranice 8 milisekundi i vreme pristupa
memoriji od 200 nanosekundi, efektivno vreme pristupa u nanosekundama je

efektivno vreme pristupa = (1 - p ) Ö (200ns) + p x (8 ms) = (1 - p ) Ö 200 +


p Ö 8.000.000 = 200 + 7,999,800 Ö p

Vidimo da je efektivno vreme pristupa direktno proporcionalno verovatno¢i


gre²ke stranice. Ako jedan pristup od 1.000 izazove gre²ku stranice, efektivno
vreme pristupa je 8,2 mikrosekunde. Ra£unar ¢e, u tom slu£aju, biti usporen
faktorom 40 zbog stranica na zahtev! Ako ºelimo da degradacija performansi
bude manja od 10 procenata, verovatno¢u gre²ke stranice moramo drºati na
nivou:
220 > 200 + 7,999,800 Ö p,
220 > 7,999,800 Ö p,
p < 0,0000025
To jest, da bi se degradacija performanski u smislu brzine usled strani£e-
nja odrºala na razumnom nivou, moramo dozvoliti manje od jednog pristupa
memoriji sa gre²kom na stranici na 399 990 pristupa memoriji. Sve u svemu,
o£igledno je vaºno zadrºati nisku stopu gre²aka stranica u sistemu sa strani-
cama na zahtev. U suprotnom, efektivno vreme pristupa pove¢ava se rapidno,
dramati£no usporavaju¢i izvr²avanje procesa.
Dodatni aspekt stranica na zahtev je manipulisanje i, uop²te, upotreba pro-
stora za zamenu. Disk U/I namenjen kao prostor za zamenu obi£no je znatno
10

brºi od onog u kojem se drºi fajl-sistem. Razlog za to je £injenica da je u ovom


prostoru memorija dodeljena u mnogo ve¢im blokovima, a pretraºivanje dato-
teka i metode indirektne alokacije (pri£a¢emo o njima na narednom predavanju)
se ne koriste. Sistem moºe, kao rezultat, obezbediti bolji propusni opseg prili-
kom rada sa stranicama, tako ²to kopira celokupnu izvr²nu datoteku u prostor
za zamenu pri pokretanju procesa, a zatim usluºuje zahteve za stanicama ko-
ri²¢enjem prostora za zamenu. Druga opcija je da se zahtevaju stranice iz fajl
sistema na po£etku, ali da se stranice upisuju u prostor za zamenu (swap space )
kada bude do²lo do zamene. Ovaj pristup ¢e omogu¢iti da se iz fajl sistema £i-
taju samo potrebne stranice, ali da se sva naredna upisivanja stranica izvr²avaju
iz prostora za zamenu.
Neki sistemi poku²avaju ograni£iti koli£inu kori²¢enog prostora za zamenu
kori²¢enjem speci£ne implementacije stranica na zahtev u slu£aju binarnih (iz-
vr²nih) datoteka. Stranice za takve datoteke u£itavaju se direktno iz fajl si-
stema. Mežutim, kada se zahteva zamena stranice, odgovaraju¢i okviri se mogu
jednostavno prebrisati (jer se nikada ne menjaju obzirom da je u pitanju izvr²ni
kod), a stranice se po potrebi ponovo mogu u£itati iz fajl sistema. Koriste¢i ovaj
pristup, fajl sistem sam po sebi sluºi kao skladi²teni prostor. Mežutim, prostor
za zamenu (swap ) mora se i dalje koristiti u slu£aju stranica koje nisu povezane
sa saomo datotekom (memorija poznata kao anonimna memorija ). Ove stranice
uklju£uju stek i heap memoriju za dati proces. ƒini se da je ova metoda dobar
kompromis i koristi se na nekolicini sistema, uklju£uju¢i Solaris i BSD Unix.
Mobilni operativni sistemi obi£no ne podrºavaju zamenu. Umesto toga, ovi
sistemi zahtevaju stranicu od fajl sistema i oduzimaju aplikacijama stranice
koje se mogu samo £itati (kao ²to je kod), ako koli£ina dostupne memorija bude
kriti£na. Takvi stranice mogu se opet zahtevati od strane fajl sistema ako budu
potrebne kasnije. U slu£aju iOS-a stranice anonimne memorije nikada se ne
oduzimaju od aplikacije, osim ako se aplikacija terminira ili sama eksplicitno ne
oslobodi memoriju.

3 Kopiranje pri upisu (Copy-on-write)


Ranije smo ilustrovali kako proces moºe brzo da zapo£ne izvr²avanje stra-
nicom na zahtev za stranicu koja sadrºi prvu instrukciju. Mežutim, kreiranje
procesa pomo¢u sistemskog poziva fork () moºe inicijalno izbe¢i potrebu za stra-
nicama na zahtev koriste¢i tehniku sli£nu deljenju stranica. Ova tehnika omo-
gu¢ava brzo kreiranje procesa i minimizira broj novih stranica koje moraju biti
dodeljene novostvorenom procesu.
Podsetimo se da sistemski poziv fork () stvara dete proces koji je duplikat
svog roditelja. Tradicionalno, fork () je radio tako ²to je kreirao kopiju adre-
snog prostora roditelja za dete, dupliraju¢i stranice koje pripadaju roditelju.
Mežutim, obzirom na to da mnogi dete procesi pozivaju sistemski poziv exec ()
odmah po kreiranju, kopiranje adresnog prostora roditelja moºe biti nepotrebno.
Umesto toga, moºemo koristiti tehniku poznatu kao kopiranje pri upisu, koja
funkcioni²e tako ²to dozvoljava roditelj procesima i dete procesima da u po£etku
11

Slika 7: Sadrºaj memorije pre nego ²to proces 1 modikuje stranicu C

dele iste stranice. Ove zajedni£ke stranice ozna£ene su kao stranice za kopiranje
pri upisu (copy-on-write ), ²to zna£i da ako bilo koji proces izvr²i upis u tu stra-
nicu, stvori¢e se kopija te zajedni£ke stranice. Kopiranje pri upisu ilustrovano je
na slikama 7 i 8, koje prikazuju sadrºaj zi£ke memorije pre i nakon ²to proces
1 modikuje stranicu C.
Na primer, pretpostavimo da dete proces poku²a da modikuje stranicu
koja sadrºi delove steka, pri £emu je stranica ozna£ena za kopirati pri upisu.
Operativni sistem ¢e kreirati kopiju ove stranice, preslikavaju¢i je u adresni
prostor dete procesa. Tada ¢e dete proces modikovati kopiranu stranicu, a ne
stranicu koja pripada roditelj procesu. O£ito, kada se koristi tehnika kopiranja
pri upisu, kopiraju se samo stranice koje su modikovane od strane bilo kojeg
procesa - sve neizmenjene stranice mogu se i dalje deliti izmežu roditeljskog i
dete procesa. Takože, o£igledno je da samo stranice koje se mogu modikovati
moraju biti tada ozna£ene za kopiranje pri upisu. Stranice koje ne mogu da
se menjaju (npr stranice koje sadrºe izvr²ni kod) mogu bezbedno da se dele
izmežu roditelja i deteta. Kopiranje pri upisu je uobi£ajena tehnika koju koristi
nekoliko operativnih sistema, uklju£uju¢i Windovs XP, Linux i Solaris.
Kada se utvrdi da ¢e se stranica kopirati koriste¢i kopiranje pri upisu, vaºno
je zabeleºiti lokaciju sa koje ¢e slobodne stranice biti dodeljene. Mnogi opera-

Slika 8: Sadrºaj memorije nakon ²to proces 1 modikuje stranicu C


12

tivni sistemi pruºaju domen (eng. pool ) slobodnih stranica za takve zahteve.
Ove slobodne stranice se obi£no dodeljuju kada se stek ili heap datog procesa
mora pro²irivati ili kada postoje stranice ozna£ene za kopiranje pri upisu. Ope-
rativni sistemi obi£no alociraju ove stranice uz popunjavanje nulama pri zahtevu,
²to zna£i da su u te stranice upisane nule pre nego ²to su stranice dodeljene,
£ime se bri²e njihov prethodni sadrºaj.
Nekoliko verzija Unix OS (uklju£uju¢i Solaris i Linux) obezbežuju varijaciju
sistemskog poziva fork () poznatu kao vfork () (fork za virtualne memorije). Ovaj
sistemski poziv deluje druga£ije od fork () u slu£aju kopiranja pri upisu. Kori-
²¢enjem vfork () roditeljski proces se suspenduje, a dete proces koristi adresni
prostor roditelja. Budu¢i da vfork () ne koristi kopiranje pri upisu, ako dete pro-
ces promeni bilo koju stranicu adresnog prostora roditelja, izmenjene stranice
¢e biti vidljive roditelju nakon ²to se nastavi njegovo izvr²avanje. Po²to se ne
vr²i kopiranje stranica, vfork () je izuzetno ekasna metoda kreiranja procesa.

4 Zamena stranica (Page replacement)


U ranijoj analizi procenta postoje¢ih gre²aka stranica prilikom referencira-
nja memorije, pretpostavili smo da svaka referenciranje svake stranica dovodi
do gre²ke stranice najvi²e jednom, i to u trenutku kada se ona prvi put referen-
cira. Mežutim, ovakav zaklju£ak nije nuºno ta£an. Ako proces koji sadrºi deset
stranica zapravo koristi samo polovinu njih, mehanizam stranica na zahtev ²tedi
U/I operacije potrebne za u£itavanje dodatnih pet stranica koje se nikada ne
koriste. Kao rezultat, mogli bismo da pove¢amo stepen multi-programiranja,
izvr²avanjem dvostruko vi²e procesa. Dakle, da imamo £etrdeset okvira, mogli
bismo da pokrenemo osam procesa, umesto £etiri koji bi se maksimalno mo-
gli pokrenuti ako svaki od njih zahteva deset okvira (od kojih pet nikada nije
kori²¢eno).
Ako pove¢amo stepen multi-programiranja, prekomerno alociramo memo-
riju. Ako pokrenemo ²est procesa, od kojih je svaki veli£ine deset stranica, ali
zapravo koristi samo pet stranica, imamo ve¢u CPU iskori²¢enost i propusnost
procesora, uz deset okvira koji se mogu iskoristiti. Mogu¢e je, mežutim, da ¢e
svaki od ovih procesa u datoj situaciji moºda odjednom poku²ati da koristi svih
deset svojih stranica, ²to ¢e rezultirati potrebom za ²ezdeset okvira memorije
kad je na raspolaganju samo £etrdeset njih.
Dodatno, uzmite u obzir da se sistemska memorija ne koristi samo za sme-
²tanje stranica korisni£kih programa. U/I baferi takože tro²e znatnu koli£inu
memorije, koji mogu znatno zakomplikovati rad algoritama za raspodelu me-
morije. Odlu£iti koliko memorije dodeliti U/I, a koliko stranicama korisni£kih
programa zna£ajan je izazov. Neki sistemi dodeljuju ksni procenat memorije
za U/I bafere, dok drugi omogu¢avaju da se i korisni£ki procesi i U/I podsistem
ravnopravno nadme¢u za sistemsku memoriju.
Prekomerna alokacija memorije se manifestuje na slede¢i na£in. Dok se ko-
risni£ki proces izvr²ava, dolazi do gre²ke stranice. Operativni sistem odrežuje
gde se na disku nalazi ºeljena stranica, ali tada utvržuje da u listi slobodnih
13

Slika 9: Potreba za zamenom stranice

okvira nema slobodnih okvira jer je £itava memorija je u upotrebi (slika 9).
Operativni sistem u ovom trenutku ima nekoliko opcija. Mogao bi da termi-
nira korisni£ki proces. Mežutim, upotreba stranica na zahtev je poku²aj opera-
tivnog sistema da pobolj²a iskori²¢enost i propusni opseg ra£unarskog sistema.
Korisnici ne bi trebali biti svesni da se njihovi procesi izvr²avaju u kontekstu
stranica, a stranica bi trebala biti logi£no transparentna za korisnika. Dakle,
ova opcija nije najbolji izbor.
Operativni sistem bi umesto toga mogao da proces zameni iz memorije
(swap out ), oslobažaju¢i sve njegove okvire i na taj na£in smanji stepen multi-
programiranja. Ova opcija je dobra u odreženim okolnostima i razmatra¢emo
je kasnije, a ovde ¢emo posmatrati naj£e²¢e re²enje: zamena stranice.

4.1 Osnovna zamena stranice


Ako nijedan okvir memorije nije slobodan, pronalazimo onaj koji se trenutno
ne koristi i oslobažamo ga. Okvir moºemo osloboditi tako da prepi²emo njegov
sadrºaj u prostor za zamenu (swap space ) i aºuriramo tabelu stranica (i sve
ostale tabele) da ozna£imo kako ta stranica vi²e nije u memoriji (slika 10).
Sada moºemo da koristimo osloboženi okvir da smestimo stranicu £ije refe-
renciranje je dovelo do gre²ke stranice datog procesa. Rutinu za obradu gre²ke
stranice ¢emo promeniti tako da ona uklju£uje ovakvu zamenu stranice:

1. Pronaži lokaciju ºeljene stranice na disku;

2. Pronaži slobodni okvir:

(a) Ako postoji slobodni okvir, koristi ga.

(b) Ako nema slobodnog okvira, koristi algoritam zamene stranice kako
bi odabrao takav okvir (okvir ºrtvu - eng. victim frame )
14

Slika 10: Zamena stranice

(c) Upi²i okvir ºrtve na disk, a u skladu sa tim promeni tabelu stranica
i okvira

3. U£itaj ºeljenu stranicu u novo-osloboženi okvir, a promeni tabelu stranica


i okvira;

4. Nastavi korisni£ki proces sa mesta gde se dogodila gre²ka stranice.

Imajte na umu da su, ukoliko nijedan okvir nije slobodan, potrebna dva prenosa
stranica (jedan iz memorije i jedan u memoriju). Ova situacija efektivno udvo-
stru£uje vreme servisiranja gre²ke stranice i u skladu s tim pove¢ava efektivno
vreme pristupa.
Moºemo smanjiti ove dodatne tro²kove kori²¢enjem bita modikacije (zove se
i dirty bit ). Kada se koristi ova ²ema, svaka stranica ili okvir ima bit modikacije
dodeljen njoj u hardveru. Bit modikacije date stranice hardver postavlja na 1
svaki put kad se upi²e bilo koji bajt na toj stranici, ²to ukazuje da je stranica
modikovana. Kada odaberemo stranicu za zamenu, ispitujemo njen bit modi-
kacije. Ako je bit postavljen, znamo da je stranica modikovana od momenta
kada je u£itana sa diska. U ovom slu£aju moramo upisati stranicu na disk.
Mežutim, ako bit za modikaciju nije postavljen, stranica nije modikovana od
kada je u£itana u memoriju. U ovom slu£aju ne moramo da upi²emo stranicu
na disk jer je ona ve¢ tamo. Ova tehnika se takože odnosi i na stranice koje
mogu samo da se £itaju (na primer, stranice koje sadrºe izvr²ni kod). Takve
stranice se ne mogu menjati, pa se njihov sadrºaj moºe samo prepisati novim po
potrebi. Ova ²ema moºe zna£ajno da smanji vreme potrebno za obradu gre²ke
stranice, jer smanjuje U/I vreme za pola, ako stranica nije izmenjena.
Zamena stranice je osnovni koncept kod stranica za zahtev. On zapravo vr²i
kona£no razdvajanje izmežu logi£ke memorije i zi£ke memorije. Ovim meha-
nizmom moºe se obezbediti ogromna virtualna memorija za programere, dok u
15

sistemu ima znatno manje zi£ke memorije. Bez stranica na zahtev, korisni£ke
adrese su mapirane u zi£ke adrese, a ova dva skupa adresa mogu biti razli£iti.
Mežutim, sve stranice procesa moraju se nalaziti u zi£koj memoriji. Kod stra-
nica na zahtev, veli£ina logi£kog adresnog prostora vi²e nije ograni£ena zi£kom
memorijom. Ako imamo korisni£ki proces od dvadeset stranica, moºemo ga iz-
vr²avati u sistemu sa deset okvira jednostavno kori²¢enjem stranica na zahtev i
algoritma zamene stranica kako bismo pronala²li slobodan okvira kad god je to
potrebno. Ako se stranica koja je modikovana treba zameniti, njen se sadrºaj
kopira na disk. Kasnije referenciranje na tu stranicu dove²¢e do gre²ke stranice.
Tada ¢e se stranica vratiti u memoriju, a moºda usput zameniti neku drugu
stranicu datog procesa.
Dakle, da bismo implementirali stranice na zahtev, moramo re²iti dva osnovna
problema: moramo razviti algoritam za rasporeživanje okvira i algoritam za-
mene stranica. To jest, ako imamo vi²e procesa u memoriji, moramo odlu£iti
koliko okvira dodeliti svakom procesu (algoritam za rasporeživanje okvira), a
kada je potrebna zamena stranice, moramo odabrati okvire koje treba zame-
niti (algoritam zamene stranica). Dizajn odgovaraju¢ih algoritama za re²avanje
ovih problema je vaºan zadatak jer su U/I operacije sa diskom izuzetno skupe u
pogledu vremena. ƒak i mala pobolj²anja ovih algoritama donose velike dobitke
u performansama sistema.
Postoji mnogo razli£itih algoritama zamene stranica. Svaki operativni si-
stem uglavnom koristi svoju ²emu zamene. Kako odabrati najbolji algoritam
zamene? Generalno, ºelimo da imamo onaj algoritam koji obezbežuje najniºu
stopu gre²aka stranica.
Algoritam procenjujemo tako da ga izvr²avamo na odreženom nizu referenci
memorije i izra£unavamo broj gre²aka stranica. Niz referenci u memoriji naziva
se referentnim nizom. Moºemo da generi²emo referentne nizove ve²ta£ki (na
primer, kori²¢enjem generatora slu£ajnih brojeva) ili moºemo da pronažemo
odreženi sistem i zabeleºimo adresu svake reference memorije.
Druga metoda proizvodi veliki broj podataka (~1 milion adresa u sekundi),
a da bismo smanjili broj podataka sa kojima radimo, koristimo dve £injenice.
Prvo, za odreženu veli£inu stranice (a veli£ina stranice obi£no je odrežena i
ksirana bilo hardverom ili od strane sistema), uzimamo u obzir samo broj
stranice, a ne celu adresu. Drugo, ako imamo referencu na stranicu p, tada
svaka referenca na stranicu p koja sledi odmah nakon nje ne¢e uzrokovati gre²ku
stranice. Stranica p ¢e biti u memoriji nakon prve reference, tako da sukcesivne
reference na nju ne¢e dovesti do gre²ke stranice.
Na primer, ako pratimo odreženi proces, moºemo snimiti slede¢u sekvencu
adresa:
0100, 0432, 0101, 0612, 0102, 0103, 0104, 0101, 0611, 0102, 0103, 0104, 0101,
0610, 0102, 0103, 0104, 0101, 0609, 0102, 0105
Za 100 bajtova po stranici, ovaj niz se svodi na slede¢i referentni niz:
1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1
Da bismo odredili broj gre²aka stranica za odreženi referentni niz i algori-
tam zamene stranice, takože moramo znati i broj dostupnih (slobodnih) okvira
stranica. Naravno, kako se pove¢ava broj dostupnih okvira, smanjuje se i broj
16

Slika 11: Zavisnost gre²aka stranica od broja okvira memorije u sistemu

gre²aka na stranici. Na primer, za prethodno razmatrani referentni niz, ukoliko


bismo imali tri ili vi²e okvira, imali bismo samo tri gre²ke stranice (po jednu gre-
²ku za prvo referenciranje na svaku stranicu). Nasuprot tome, sa samo jednim
okvirom na raspolaganju, imali bismo zamenu sa svakom referencom, ²to rezul-
tuje sa jedanaest gre²aka stranica. Uop²te, o£ekujemo krivu zavisnosti gre²aka
stranica od broja dostupnih okvira poput one prikazane na slici 11.
Kako se broj okvira pove¢ava, broj gre²aka stranica opada na neki minimalan
nivo. Naravno, pro²irenjem zi£ke memorije pove¢ava se broj dostupnih okvira.
U nastavku analizira¢emo nekoliko algoritama za zamenu stranica. Pri tome
koristimo referentni niz
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
i memoriju sa sa tri okvira.

4.2 FIFO algoritam zamene stranica


Najjednostavniji algoritam za zamenu stranica je FIFO algoritam. FIFO al-
goritam za zamenu dodeljuje svakoj stranicom vreme kada je ta stranica u£itana
u memoriju. Kada se stranica mora zameniti, bira se najstarija u£itana stra-
nica. Pri tome, nije neophodno beleºiti vreme kada je stranica u£itana. Moºemo
koristiti FIFO red (otuda naziv za algoritam) u kojem ¢e se sme²tati brojevi
svih stranica u£itanih u memoriju. Kada se vr²i zamena uzimamo stranicu sa
po£etka reda, a kada se stranica u£itava u memoriju, ubacujemo je na kraj reda.
Za na² referentni niz, tri okvira su u po£etku prazna. Prve tri reference (7,
0, 1) uzrokuju gre²ke stranica, nakon £ega se stranice 7, 0 i 1 u£itavaju u ove
prazne okvire. Slede¢a referenca (2) zamenjuje stranicu 7, jer je stranica 7 prva
u£itana. Po²to je 0 slede¢a referenca i 0 je ve¢ u memoriji, za ovu referencu
nemamo gre²ku stranice. Prva referenca na 3 rezultuje zamenom stranice 0, jer
je ona sada prva na redu za zamenu. Zbog ove zamene, slede¢a referenca na 0
¢e dovesti do gre²ke stranice. Stranica 1 se tada zamenjuje stranom 0, a ovaj
postupak se nastavlja kao ²to je prikazano na slici 12. Svaki put kada dože do
17

Slika 12: FIFO algoritam zamene stranica

gre²ke stranice, prikazano je koje su stranice sme²tene u tri dostupna okvira


memorije. Ukupno ¢e biti petnaest gre²aka stranica za dati referentni niz.
FIFO algoritam zamene stranica lak je za kako za razumevanje tako i za im-
plementaciju. Mežutim, njegove performanse nisu uvek dobre. S jedne strane,
zamenjena stranica moºe biti modul za inicijalizaciju koji je kori²¢en pri po-
dizanju sistema i vi²e nije potreban. S druge strane, mogao bi sadrºati £esto
kori²¢enu promenljivu koja se inicijalizovala rano i u stalnoj je upotrebi.
Vaºno je primetiti da, £ak i ako odaberemo za zamenu stranicu koja je u ak-
tivnoj upotrebi, sve i dalje ispravno radi. Nakon ²to aktivnu stranicu zamenimo
novom, gotovo odmah dolazi do gre²ke prilikom referenciranja aktivne stranice.
Neka druga stranica mora biti zamenjena kako bi se aktivna stranica vratila u
memoriju. Stoga, lo² izbor zamene pove¢ava broj gre²aka stranica i usporava
izvr²avanje procesa, ali ne rezultuje pogre²nim izvr²avanjem sistema generalno.
Da bismo ilustrovali probleme koji su mogu¢i sa FIFO algoritmom zamene
stranice, posmatramo slede¢i referentni niz:
1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
Na slici 13 prikazana je kriva gre²aka stranica za dati referentni niz u zavi-
snosti od broj dostupnih okvira. Primetite da je broj gre²aka stranica za £etiri
okvira (deset) ve¢i od broja gre²aka stranica za tri okvira (devet)! Ovaj najne-
o£ekivaniji rezultat poznat je kao Beladijeva anomalija (eng. Belady anomaly ).
Za odrežene algoritme zamene stranice stopa gre²aka stranica moºe se pove¢ati
kako se broj dostupnih okvira pove¢ava. O£ekivali bismo da ¢e dodeljivanje vi²e
memorije nekom procesu pobolj²ati njegove performanse, ali o£igledno je da ta
pretpostavka nije uvek ta£na.

4.3 Optimalna zamena stranica


Jedan rezultat otkri¢a Beladijeve anomalije bila je potraga za optimalnim al-
goritmom zamene stranice. Takav algoritam obezbedio bi najniºu stopu gre²aka
stranica od svih algoritama i ni za redan referentni niz ne¢e pokazati Beladijevu
anomaliju. Takav algoritam postoji i nazvan je OPT (ili MIN). OPT algoritam
je jednostavan i kaºe:
Zameni stranicu koja se ne¢e koristiti najduºe vremena
Upotreba ovog algoritma zamene stranica garantuje najmanju mogu¢u stopu
gre²ke stranica za ksni broj okvira. Na primer, u slu£aju na²eg referentnog
18

Slika 13: Beladijeva anomalija

Slika 14: Optimalna zamena stranica

referenci, optimalni algoritam zamene stranica dao bi devet gre²aka stranica,


kao ²to je prikazano na slici 14.
Prve tri reference uzrokuju gre²kama i kao rezultat u£ita¢e se u tri prazna
okvira. Referenca na stranicu 2 zamenjuje stranicu 7, jer se stranica 7 ne¢e
koristiti sve do reference 18, dok ¢e stranica 0 biti upotrebljena u referenci 5, a
stranica 1 u referenci 14. Referenca na stranicu 3 zamenjuje stranicu 1, jer ¢e
stranica 1 biti poslednja od tri stranice mežu okvirima koja ¢e biti ponovo re-
ferencirana. Sa samo devet gre²aka stranica, optimalna zamena je mnogo bolja
od algoritma FIFO, koji na istom nizu daje petnaest gre²aka. (Ako zanemarimo
prve tri, koja su neminovne kod svakog algoritma, optimalna zamena je dvo-
struko bolja od FIFO zamene). Nijedan algoritam zamene ne moºe da prože
kroz ovaj referentni niz sa tri dostupna okvira sa manje od devet gre²aka.
Naºalost, optimalni algoritam zamene stranica je te²ko implementirati, jer
zahteva poznavanje budu¢eg referentnog niza. Nailazili smo na sli£nu situaciju
kod SJF algoritma za rasporežibanje procesora. Kao rezultat toga, optimalni
algoritam koristi se uglavnom kao referentni. Na primer, bilo bi korisno znati
da, iako dati algoritam nije optimalan, u najgorem slu£aju je lo²iji 12,3 procenta
od optimalnog, a u proseku 4,7 procenata.
19

Slika 15: LRU zamena stranica

4.4 LRU zamena stranica


Ako optimalni algoritam nije mogu¢e implementirati, postavlja se pitanje da
li postoji aproksimacija optimalnog algoritma? Klju£na razlika izmežu FIFO
i OPT algoritama (osim toga ²to jedan gleda unazad a drugi u napred u po-
gledu vremena) je da FIFO algoritam koristi vreme u£itavanja stranice u memo-
riju, dok OPT algoritam koristi vreme kada se stranica koristi. Ako koristimo
nedavnu pro²lost kao aproksimaciju bliske budu¢nosti, tada moºemo zameniti
stranicu koja se nije koristila najduºe vremena. Ovaj pristup je poznat kao algo-
ritam najduºe nekori²¢ene stranice (Least Recently Used - LRU). LRU zamena
dodeljuje svakoj stranici vreme poslednje upotrebe te stranice. Kada se stranica
mora zameniti, LRU bira stranicu koja se najduºe ne koristi. O ovoj strategiji
moºemo razmi²ljati kao o optimalnom algoritmu zamene stranice koji gleda una-
R
trag, a ne prema napred, u pogledu vremena. Interesantno je da, za S koji je
invertovani niz od referentnog niza S, stopa gre²ke stranice za OPT algoritam
R
na S jednaka je stopi gre²ke stranice za OPT algoritam na S . Sli£no tome,
stopa gre²ke stranica za LRU algoritam na S jednaka je stopi gre²ke stranica za
R
LRU algoritam na S .
Rezultat zamene kori²¢enjem LRU na na²em primeru referentnog niza prika-
zan je na slici 15. LRU algoritam generi²e dvanaest gre²aka stranica. Pri tome,
prvih pet gre²aka su iste kao u slu£aju algoritma za optimalnu zamenu. Kada
se, ipak, dogodi referenca na stranicu 4, LRU algoritam vidi da je od tri okvira
u memoriji stranica 2 najduºe kori²¢ena. Stoga LRU algoritam zamenjuje stra-
nicu 2, ne znaju¢i da ¢e se stranica 2 koristiti odmah nakon toga. Kad potom
dože do gre²ke za stranicu 2, algoritam LRU zamenjuje stranicu 3, jer je sada
ona najmanje nedavno kori²¢ena od tri stranice u memoriji. Uprkos o£iglednim
problemima, zamena kori²¢enjem LRU algoritma sa dvanaest gre²aka mnogo je
bolja nego zamena kori²¢enjem FIFO algoritma sa petnaest.
LRU algoritam se £esto koristi kao algoritam za zamenu stranica i smatra se
dobrim. Glavni problem je kako implementirati zamenu na LRU na£in. Algori-
tam zamene stranice u maniru LRU moºe zahtevati zna£ajnu pomo¢ hardvera,
jer se problem svodi na to kako odrediti redosled za okvire u skladu sa trenutkom
poslednje upotrebe. Dve implementacije su mogu¢e:

1. Broja£i. U najjednostavnijem slu£aju, svakom unosu u tabelu stranica pri-


druºujemo polje vreme kori²¢enja, dok CPU-u dodeljujemo logi£ki broja£
20

Slika 16: LRU implementacija kori²¢enjem steka

koji se uve¢ava kod svakog referenciranja memorije. Kad god se referen-


cira na neku stranicu, sadrºaj broja£a se kopira u polje vreme kori²¢enja
kod unosa u tabeli stranica za datu stranicu. Na ovaj na£in uvek imamo
vreme poslednje reference na svaku stranicu, a zamenjujemo stranicu
sa najmanjom vredno²¢u vremena. Ova ²ema zahteva pretragu tabele
stranica radi pronalaºenja takve LRU stranice i upis u memoriju (u polje
vreme kori²¢enja u tabeli stranica) za svaki pristup memoriji. Vremena ko-
ri²¢enja se, takože, moraju £uvati prilikom zamene tabele stranica (zbog
zamene konteksta i rasporeživanja CPU-a). Dodatno, mora se uzeti u
obzir i eventualno prekora£enje broja£a.

2. Stek. Drugi pristup zamene LRU stranice svodi se na odrºavanje steka


na koji se upisuju brojevi stranica. Kad god se stranica referencira, ona
se uklanja iz steka i stavlja se na njegov vrh. Na ovaj na£in, najskorije
referencirana stranica je uvek na vrhu steka, a najduºe nekori²¢ena stra-
nica uvek je na dnu (slika 16). Budu¢i da unosi moraju biti uklanjani iz
sredine steka, najbolje je implementirati ovaj pristup pomo¢u dvostruko
povezane liste s pokaziva£ima na po£etak i kraj liste. Uklanjanje stranice
i stavljanje na vrh steka zahteva promenu ²est pokaziva£a u najgorem slu-
£aju. Svako aºuriranje u smislu promene elemenata steka je malo skuplje,
ali se svakako ne mora traºiti stranica za zamenu kada bude trebalo, jer
pokaziva£ na kraj steka uvek pokazuje na LRU stranicu. Ovaj pristup
je posebno pogodan za softversku implementaciju ili implementaciju LRU
algoritma u okviru mikrokoda.

Kao i optimalna zamena, zamena kori²¢enjem LRU ne pokazuje probleme u


vezi sa Beladijevom anomalijom. Oba algoritma pripadaju speci£noj klasi al-
goritama za zamenu stranica, koja se naziva stek algoritmi. Ne postoji referentni
niz koji ¢e dovesti da stek algoritmi pokaºu Beladijevu anomaliju. Algoritam
steka je algoritam za koji se moºe pokazati da je skup stranica u memoriji za
n okvira uvek podskup skupa stranica koji bi bio u memoriji sa n +1 okvira.
Kod LRU algoritma, skup stranica koje su u memoriji uvek ¢e biti n stranica sa
21

najskorijim referencama. Ako se broj dostupnih okvira pove¢a, ovih n stranica


¢e i dalje biti najskorije referencirane, tako da ¢e ostati u memoriji.
Ipak, treba imati na umu da je svaka gore opisana implementacija LRU
algoritma, iako mogu¢a, izuzetno skupa u pogledu vremena i resursa. Aºuriranja
polja vreme kori²¢enja ili steka moraju se izvr²iti kod svake reference memorije.
Ako bismo koristili prekid za svaku referencu, kako bismo softveru omogu¢ili
da aºurira takve strukture podataka, svaka referenca memorije bi se usporila
faktorom od najmanje deset, a samim tim bi se pribliºno usporio i korisni£ki
svaki. Malo je sistema koji bi mogli tolerisati takvu implementaciju sistema za
upravljanje memorijom.

4.5 Aproksimacije LRU algoritma zamene stranica


Malo ra£unarskih sistema pruºa dovoljno hardverske podr²ke neophodne za
implementaciju zamene stranice kori²¢enjem LRU. Ipak, mnogi sistemi pruºaju
odreženu pomo¢ u obliku bita reference (eng. reference bit ). Bit referenci za
datu stranicu postavlja hardver kada god se ta stranica referencira (bilo da je u
pitanju £itanje ili upis, bilo kojeg bajta u sklopu stranice). Bitovi referenci do-
deljeni su svakom unosu u tabeli stranica. U po£etku se svi bitovi bri²u (posta-
vljaju na 0) od strane operativnog sistema. Kako se korisni£ki proces izvr²ava,
hardver postavlja bit referenci (povezan sa svakom referenciranom stranicom)
na 1. Nakon nekog vremena, moºemo utvrditi koje su stranice kori²¢ene, a koje
nisu kori²¢ene ispitivanjem bitova referenci, iako ne znamo ta£an redosled re-
ferenciranja stranica. Ove informacije su osnova za mnoge algoritme zamene
stranica koji aproksimiraju LRU zamenu.

4.5.1 Algoritam vi²estrukih bita reference

Dodatne informacije o redosledu referenciranja dobijamo tako ²to provera-


vamo bite referenci u regularnim vremenskim intervalima i beleºimo njihove
vrednosti. Kao primer, koristimo 8-bitni podatak asociran svakoj stranici i pre-
kide koji se de²avaju, na primer, svakih 100ms. Svaki put kada se desi prekid,
kontrola se prepu²ta operativnom sistemu a operativni sistem upisuje na pozi-
ciju najvi²eg bita u 8-bitnoj re£i bit reference, nakon ²to prethodni sadrºaj re£i
pomeri u desno za jedno mesto, pri £emu se sadrºaj na najniºem bitu odbacuje.
Tada, ove 8-bitne re£i sadrºe istoriju kori²¢enja stranice na koju se odnose, to-
kom osam poslednjih vremenskih intervala. Na primer, ako za datu stranicu ova
re£ ima vrednost 00000000, znamo da ona nije referencirana u osam prethodnih
intervala. Sa druge strane, stranica koja je barem jednom referencirana tokom
svakog vremenskog intervala ima¢e vrednost 11111111. Stranica sa istorijom
11000100 je kori²¢ena skorije od stranice sa istorijom 01110111. Ako tretiramo
ove vrednosti kao neozna£ene cele brojeve, stranica sa najmanjom vrednosti ¢e
biti LRU stranica i moºe se koristiti za zamenu. Naravno, vrednosti ne moraju
biti jedinstvene, a u slu£aju da imamo vi²e stranica sa identi£nim istorijatom
bita reference, moºemo zameniti svaku od njih ili jednostavno odabrati mežu
njima u FIFO maniru.
22

Slika 17: Algoritam zamene stranica sa dvostrukom ²ansom

Broj bita koji se koristi za pra¢enje istorije bita reference, naravno, moºe da
se menja. Odabiramo ga, u skladu sa dostupnim hardverom, tako da aºuriranje
vi²estrukih bita reference moºe najbrºe da se sprovede. U jednom ekstremnom
slu£aju, broj moºe biti sveden na 0, ²to rezultuje pra¢enjem samo bita reference.
Ovaj algoritam naziva se algoritam zamene stranica sa dvostrukom ²ansom (eng.
second-chance page-replacement algorithm ).

4.5.2 Algoritam zamene stranica sa dvostrukom ²ansom

Osnova algoritma sa dvostrukim prolazom je FIFO algoritam zamene. Me-


žutim, kada je data stranica odabrana, proverava se njen bit reference. Ako
je vrednost bita reference 0, nastavljamo sa zamenom te stranice. Ali ako je
bit reference postavljen na 1, dajemo toj stranici priliku da opstane i nasta-
vljamo do slede¢e stranice u FIFO redu. Kada se data stranica presko£i, njen
bit reference je postavljen na 0, a vreme pristizanja za tu stranicu je postavljeno
na trenutno vreme. Kao rezultat, stranica kojoj je data druga ²ansa, ne¢e biti
zamenjena sve dok se sve ostale stranice ne zamene (ili je svim ostalima data
druga ²ansa, takože). Dodatno, ako se stranica koristi dovoljno £esto tako da
njen bit reference bude uvek postavljen na 1, stranica nikad ne¢e biti zamenjena.
Jedan na£in da se implementira ovaj algoritam zamene stranica sa dvostru-
kom ²ansom jeste kori²¢enjem cirkularnog reda. Pokaziva£ pokazuje na stranicu
koja ¢e slede¢a biti zamenjena. U momentu kada je potreban dostupan okvir,
pokaziva£ se kre¢e sve dok ne pronaže stranicu kod koje je bit reference jednak
0. Dok prolazi kroz red, usput postavlja sve bite referenci na 0, a kada se pro-
naže okvir ºrtva, nova stranica se ume¢e na njeno mesto. U najgorem slu£aju,
23

kada su svi biti reference setovani, pointer prolazi kroz ceo red, daju¢i drugu
²ansu svakom elementu reda. Obzirom na to da £isti bite reference pre nego
²to odabira stranicu koja ¢e se zameniti, bi¢e odabrana stranica sa najstarijim
vremenom pristizanja. U ovom scenariju (kada su svi biti referenci postavljeni
na 1), zamena stranica sa dvostrukom ²ansom degenerisana je u FIFO zamenu.

4.5.3 Pobolj²an algoritam zamene stranica sa dvostrukom ²ansom

Moºemo pobolj²ati prethodni algoritam pra¢enjem bita modikacije zajedno


sa bitom reference. Ovaj ureženi par (bit reference, bit modikacija) deni²e
slede¢e klase stranica

1. (0, 0) stanica koja nije skoro ni referencirana ni modikovana - idealna za


zamenu

2. (0, 1) nije skoro kori²¢ena (referencirana) ali jeste modikovana - nije


idealan kandidat za zamenu, obzirom na to da ¢e morati biti upisana na
disk ukoliko je ona odabrana za zamenu

3. (1, 0) skoro kori²¢ena ali nije modikovana - vrlo verovatno ¢e biti kori-
²¢ena uskoro

4. (1, 1) skoro kori²¢ena i modikovana - verovatno ¢e biti kori²¢ena ponovo


uskoro, a mora¢e biti kopirana na disk pre nego ²to bude zamenjena

Svaka stranica se nalazi u jednoj od klasa od gore. Kada je potrebno vr²iti


zamenu, koristimo isti mehanizam kao kod prethodno opisanog algoritma, ali
umesto da proveravamo da li je bit reference postavljen na 1, proveravamo kojoj
klasi stranica pripada ova stranica. Tada ¢emo:

1. pro¢i kroz cirkularni red u potrazi za stranicom iz klase (0,0). Ako je


nažemo, nju odabiramo za zamenu;

2. ako je prvi prolaz kroz petlju neuspe²an, prolazimo drugi put kroz petlju
u potrazi za stranicom iz klase (0,1). U ovom prolasku, svim stranicama
koje obižemo stavljamo bit referenci na 0;

3. ako je i drugi prolaz neuspe²an, vra¢amo se na korak 1 (eventualno 2 posle


njega), znaju¢i da ¢e sada jedan od ta dva biti uspe²an.

U najgorem slu£aju £etiri puta ¢emo obi¢i red u potrazi za najboljom stranicom
za zamenu. Osnovna prednost ovog algoritma u odnosu na jednostavniju verziju
algoritma jeste ta da se ovde prioritetno biraju za zamenu stranice koje nisu
modikovane, kako bismo smanjili broj dugotrajnih U/I operacija.

4.6 Algoritmi za baferovanje stranica


Dodatne procedure se koriste zajedno sa algoritmima za zamenu stranica.
Na primer, u odreženim slu£ajevima, sistemi odrºavaju skup slobodnih okvira.
24

Kada dože do gre²ke stranice, okvir ºrtva se nalazi kao i ina£e. Mežutim,
ºeljena stranica se u£itava u okvir iz skupa slobodnih okvira pre nego ²to se
okvir ºrtva prepi²e na disk. Ova procedura omogu¢ava procesu da se ponovo
pokrene ²to je pre mogu¢e, bez £ekanja da se oslobodi okvir u koji se moºe
upisati potrebna stranica. Kada se, vremenom, sadrºaj okvira ºrtve prepi²e u
sekundarnu memoriju, taj okvir se dodaje skupu slobodnih okvira.
Pro²irenje ove ideje svodi se na odrºavanje liste modikovanih stranica. Svaki
put kada je hardver za strani£enje besposlen, modikovane stranice se odabiraju
i upisuju na disk. Dodatno, bit modikacije je aºuriran i postavljen na 0. Ovaj
metod pove¢ava verovatno¢u da ¢e stranica mo¢i samo da sa prepi²e novim
sadrºajem kada bude odabrana za zamenu, bez dodatnog prepisivanja sadrºaja
stranice na disk.
Jo² jedna modikacija se odnosi na odrºavanje skupa slobodnih okvira, uz
dodatak da se pamti koja stranica je bila upisana u kom okviru. Obzirom
na to da se sadrºaj okvira ne¢e menjati nakon ²to je okvir upisan na disk,
stara stranica moºe biti direktno iskori²¢ena iz skupa slobodnih okvira, kada je
potrebno, pod uslovom da okvir nije menjan u mežuvremenu. Ovakav pristup
elimini²e potrebu za dodatnom U/I operacijom na disku: kada dože do gre²ke
stranice, prvo proveravamo da li se traºena stranica nalazi u skupu slobodnih
okvira. Ako nije moramo odabrati okvir za zamenu i u njega u£itati stranicu sa
diska.

5 Alokacija memorijskih okvira


Kako alocirati ksan broj dostupnih memorijskih okvira izmežu vi²estrukih
procesa kojima su oni potrebni? Ako imamo 93 okvira i dva procesa, koliko
treba alocirati prvom, a koliko drugom? Najjednostavniji slu£aj je sistem sa
jednim korisnikom. Razmatramo ovakav sistem sa 128 kB memorije i strani-
cama od 1kB (128 okvira). Operativni sistem moºe zauzeti 35kB, ²to ostavlja
93 okvira korisni£kom procesu. Kod stranica isklju£ivo na zahtev, sva 93 okvira
¢e inicijalno biti stavljeni u listu slobodnih okvira. Kada proces krene sa izvr²a-
vanjem, generisa¢e sekvencu gre²aka stranica. Prve 93 gre²ke stranice ¢e dobiti
raspoloºive okvire iz liste slobodnih okvira, a kada se oni svi iskoriste, algoritam
za zamenu stranica ¢e biti kori²¢en kako bi se odredilo koji okvir od njih 93
da bude zamenjen 94-tim i tako dalje. Kada se proces terminira, 93 okvira se
opet vra¢aju u listu slobodnih okvira. Postoje brojne varijacije ove jednostavne
strategije.

5.1 Minimalan broj okvira


Osim ²to ne moºemo alocirati vi²e memorijskih okvira od ukupnog broja
postoje¢ih u sistemu, postoji i minimalan broj okvira koji se moraju alocirati
za dati proces. Jedan razlog za postojanje minimalnog broja okvira je u vezi sa
performansama. O£igledno, kako se broj okvira dodeljenih procesu smanjuje,
stopa gre²aka stranica se uve¢ava, ²to usporava izvr²avanje procesa. Dodatno,
25

kada se gre²ka stranice desi pre nego ²to se zavr²i instrukcija koja se izvr²ava,
instrukcija se mora izvr²avati ponovo od po£etka. Kao posledica, moramo imati
dovoljno okvira kako bismo skladi²tili sve stranice koje bilo koja pojedina£na
instrukcija referencira. Ovaj minimalan broj okvira je, samim tim, odrežen
i denisan arhitekturom procesora. Suprotno ovome, maksimalan broj okvira
je odrežen koli£inom dostupne zi£ke memorije. Izmežu ove dve vrednosti,
alokacija okvira ostavlja brojne izbore.

5.2 Algoritmi za alokaciju okvira


Najjednostavniji na£in da se m okvira rasporedi na n procesa jeste da se
svakom procesu dodeli jednak broj, m /n okvira (ako ignori²emo okvire koji se
koriste od strane operativnog sistema). Na primer, ako postoji 93 okvira i pet
procesa, svaki proces ¢e dobiti 18 okvira. Tri preostala okvira mogu da se koriste
u kao deo skupa slobodnih okvira. Ovakva shema je poznata kao ravnopravna
alokacija.
Alternativa ovom pristupu jeste da se prepozna kako razli£iti procesi mogu
imati druga£ije zahteve za memorijom. Za sistem sa stranicama veli£ine 1kB,
ako mali proces zahteva samo 10kB, a zahtevni 127kB i ta dva su jedini u
sistemu sa 62 slobodna okvira, nema mnogo smisla dati svakom od njih po 31
okvir. Kako bi se re²io ovaj problem, koristi se proporcionalna alokacija, kod
kojie se alocira dostupna memorija procesima u skladu sa njihovim potrebama.
Ako je veli£ina virtualne memorije za proces pi jednaka si i deni²emo

X
S= si

Tada, ako je ukupan broj dostupnih okvira m, alocira¢emo ai okvira procesu


pi , gde je ai :

ai = si /S · m

Naravno, moramo podesiti svaki ai da bude ceo broj, koji je ve¢i od mini-
malnog broja okvira zahtevanog od strane datog skupa instrukcija, sa ukupnom
sumom koja ne prelazi m.
Proporcionalnom alokacijom, 62 okvira iz primera od malopre bismo pode-
lili tako ²to alociramo 4 okvira jednom i 57 okvira drugom procesu. Na ovaj
na£in, oba procesa dele dostupne okvire u skladu sa svojim potrebama, umesto
ravnopravne alokacije.
Kako kod ravnopravne, tako i kod proporcionalne alokacije, naravno, sama
alokacija se moºe menjati u skladu sa stepenom multi-programiranja. Ako je
stepen multi-programiranja pove¢an, svaki proces ¢e izgubiti neke od okvira koje
je koristio, kako bi se obezbedila potrebna memorija za novi proces. Suprotno,
ako se stepen multi-programiranja smanji, okviri kori²¢eni od strane procesa
koji se vi²e ne izvr²ava bi¢e rasporeženi mežu trenutno izvr²avanim procesima.
Takože, obe alokacije predstavljene iznad ravnomerno tretiraju procese viso-
kog i niskog prioriteta. Mežutim, u skladu sa denicijom, mogu¢e je da ºelimo
26

vi²e memorije alocirati procesu vi²eg prioriteta kako bismo ubrzali njegovo iz-
vr²avanje, nau²trb procesa niskog prioriteta. Jedno re²enje bi bilo da se koristi
proporcionalna alokacija gde se kod prora£una alocirane memorije okvira ne ko-
risti relativna veli£ina procesa, nego prioritet procesa ili kombinacija veli£ine i
prioriteta.

5.3 Globalna i lokalna alokacija


Drugi vaºan faktor u na£inu na koji se okviri dodeljuju razli£itim procesima
je zamena stranica. Ukoliko imamo vi²e procesa koji se takmi£e ravnopravno za
okvire memorije, algoritme zamene stranica moºemo klasikovati u dve katego-
rije: globalna zamena i lokalna zamena. Globalna zamena omogu¢ava procesu
da odabere okvir za zamenu iz skupa svih okvira memorije, £ak i ako je taj okvir
trenutno dodeljen nekom drugom procesu, to jest, jedan proces moºe preuzeti
okvir od drugog procesa. Lokalna zamena zahteva da svaki proces odabira samo
iz skupa sopstvenih dodeljenih okvira.
Na primer, razmotrite ²emu alokacije okvira u kojoj dopu²tamo procesima
visokog prioriteta da uzimaju okvire za zamenu od procesa sa niskim priorite-
tom. Proces moºe odabrati okvir za zamenu iz sopstvenih okvira ili okvira bilo
kojeg procesa niºeg prioriteta. Ovaj pristup omogu¢ava procesu visokog priori-
teta da uve¢a svoj skup dodeljenih okvira na ²tetu procesa sa niºim prioritetom.
Sa strategijom lokalne zamene, broj okvira dodeljenih nekom procesu se
ne menja. Kod globalne zamene, moºe se dogoditi da proces odabira samo
okvire dodeljene drugim procesima, pove¢avaju¢i na taj na£in broj sebi dode-
ljenih okvira (uz pretpostavku da drugi procesi ne odabiraju za zamenu njegove
okvire).
Jedan problem u vezi sa algoritmom globalne alokacije je ²to proces ne moºe
kontrolisati sopstvenu stopu gre²aka stranice. Skup stranica u memoriji za pro-
ces zavisi ne samo od na£ina zamene stranica tog procesa, ve¢ i od na£ina na koji
drugi procesi to rade. Zbog toga se isti proces moºe izvr²avati sasvim druga£ije
isklju£ivo usled spoljnih faktora (na primer, jedno za izvr²avanje je potrebno
0,5 sekundi, a 10,3 sekundi za slede¢e izvr²avanje). To nije slu£aj kod algoritma
lokalne alokacije. Kod lokalne zamene, na skup stranica u memoriji procesa
uti£e isklju£ivo zamena stranica tog procesa. Mežutim, lokalna zamena moºe
da ometa izvr²avanje procesa tako ²to mu ne daje na raspolaganje dodatne, ne-
kori²¢ene stranice memorije iz sistema. Stoga, globalna zamena generalno vodi
ka ve¢oj propusnosti sistema i zbog toga je ona naj£e²¢e kori²¢ena metoda.

5.4 Ne-uniforman pristup memoriji


Do sada smo pretpostavljali da je kompletna osnovna memorija homogena,
ili barem da se njoj pristupa jednako. Na mnogim ra£unarskim sistemima to
nije slu£aj. ƒesto, u sistemima sa vi²e CPU-a, odreženi CPU moºe pristupiti
nekim delovima glavne memorije brºe nego drugima. Ove razlike u performan-
sama uzrokovane su na£inom na koji su CPU i memorija mežusobno povezani
27

u sistemu. Takav sistem se £esto sastoji od nekoliko sistemskih plo£a od ko-


jih svaka sadrºi vi²e procesora i deo memorije. Sistemske plo£e mežusobno su
povezane na razli£ite na£ine (od sistemskih magistrala do mreºnih veza velike
brzine). Kao ²to se moºe o£ekivati, procesori na odreženoj plo£i mogu pristupiti
memoriji na toj plo£i sa manjim ka²njenjem nego ²to mogu pristupiti memoriji
na drugim plo£ama u sistemu. Sistemi u kojima se vremena pristupa memoriji
zna£ajno razlikuju, poznati su kao sistemi sa ne-uniformnim pristupom memo-
riji (eng. Non-Uniform Memory Access, NUMA) i bez izuzetka su sporiji od
sistema u kojima se memorija i CPU nalaze na istoj mati£noj plo£i.
Odluke koji se okviri stranica £uvaju na kojim memorijskim lokacijama mogu
zna£ajno uticati na performanse u NUMA sistemima. Ako u takvom sistemu
tretiramo memoriju kao homogenu, CPU moºe da £eka znatno duºe prilikom
pristupa memoriji nego u slu£aju kada bismo NUMA arhitekturu uzeli u obzir
kod algoritama za dodelu memorije. Sli£ne izmene moraju se vr²iti i u sistemu
rasporeživanja procesora u NUMA okruºenju. Cilj ovih modikacija jeste da
memorijski okviri budu dodeljeni ²to je bliºe mogu¢e procesoru na kome se
izvr²ava proces. Denicija blizine u ovom smislu odnosi se na minimalno ka-
²njenje, ²to obi£no zna£i na istoj sistemskoj plo£i kao i CPU.
Algoritamske promene odnose se na to da planer prati poslednji CPU na ko-
jem se izvr²avao svaki proces. Ako planer poku²ava da rasporedi svaki proces na
prethodno kori²¢enom procesoru, a sistem za upravljanje memorijom da dodeli
procesu okvire memorije koji se nalaze u blizini procesora na kojem je raspo-
režen proces, tada ¢e do¢i do pobolj²anja ke² pogodaka i smanjenog vremena
pristupa memoriji.

6 Preoptere¢enost virtualnog adresnog prostora


(eng. Thrashing
)
Ako broj okvira dodeljenih procesu niskog prioriteta padne ispod minimalnog
broja koji zahteva arhitektura ra£unara, moramo obustaviti njegovo izvr²avanje.
Nakon toga, neophodno je kopirati stranice kori²¢ene od strane procesa na disk i
nakon toga osloboditi sve njemu dodeljene okvire. Na ovaj na£in se vr²i zamena
iz memorije, odnosno zamena u memoriju od strane srednjero£nog planera, o
£emu smo ve¢ pri£ali tokom predavanju o procesima.
Da bismo razumeli potencijalni problem sa kojim se sre¢emo, posmatrajmo
bilo koji proces koji nema dovoljno okvira na raspolaganju. Ako proces nema
dovoljno okvira kako bi se obezbedila podr²ka stranicama koje se aktivno kori-
ste (na primer nova stranica referencirana od strane koda iz aktivne stranice),
veoma brzo ¢e do¢i do izuzetka gre²ke stranice. U ovom trenutku moramo za-
meniti neku stranicu. Mežutim, po²to su sve stranice tog procesa u aktivnoj
upotrebi, mora odmah biti zamenjena stranica koja ¢e procesu biti potrebna
veoma uskoro. Kao rezultat, brzo ponovo dolazi do izuzetka gre²ke stranice, i
ponovo, i ponovo, zamenjuju¢i pri tome stranice koje se moraju odmah vratiti
u memoriju.
28

Slika 18: Preoptere¢enost

Ovakva aktivnost kod koje se generi²u gre²ke stranica i vr²i prekomerna


zamena stranica naziva se preoptere¢enost. Proces je preoptere¢en ako tro²i vi²e
vremena na strani£enje nego ²to ga tro²i na izvr²avanje.

6.1 Uzrok preoptere¢enosti


Preoptere¢enost rezultira ozbiljnim problemima u vezi sa performansama
sistema. Razmotrite slede¢i scenario, koji se zasniva na stvarnom pona²anju
prvobitnih sistema strani£enja.
Operativni sistem nadgleda iskori²¢enost procesora. Ako je iskori²¢enost pro-
cesora previ²e niska, pove¢avamo stepen multi-programiranja uvoženjem novog
procesa u sistem. Koristi se globalni algoritam zamene stranica i zamenjuje
se stranica bez obzira kojem procesu pripada. Pretpostavimo sada da proces
prelazi u slede¢u fazu izvr²avanja u kojoj mu treba vi²e okvira memorije. Kao
rezultat, proces po£inje da generi²e gre²ke stranica i uzima okvire od drugih pro-
cesa. Ovi procesi, mežutim, trebaju te stranice, pa tako i oni generi²u gre²ke
stranica, preuzimaju¢i okvire od ostalih procesa. Procesi koji generi²u gre²ke
stranica moraju koristiti hardver za strani£enje kako bi zamenili stranice iz me-
morije i u memoriju. Dok £ekaju u redu za urežaj koji ¢e izvr²iti zamene,
red spremnih procesa se prazni. Kao rezultat, dok procesi £ekaju na kori²¢enje
urežaja za strani£enje, iskori²¢enost CPU-a opada.
CPU planer prime¢uje ovu smanjenu upotrebu procesora i kao rezultat po-
ve¢ava dodatno stepen multi-programiranja. Novi proces poku²ava zapo£eti
izvr²avanje preuzimanjem okvira od ve¢ pokrenutih procesa, uzrokuju¢i jo² vi²e
gre²aka stranica i jo² duºi red £ekanja za urežaj strani£enja. Kao rezultat toga,
iskori²¢enost procesora jo² vi²e opada, a CPU planer poku²ava jo² vi²e da po-
ve¢a stepen multi-programiranja. Do²lo je do preoptere¢enosti, a propustnost
sistema se zna£ajno smanjila. Stopa gre²aka stranica se strahovito uve¢ala. Kao
rezultat, efektivno vreme pristupa memoriji se pove¢ava. Koristen posao se ne
izvr²ava, jer procesi tro²e svo vreme na zamene iz i u memoriju.
Ovaj fenomen je ilustrovan na slici 18, na kojoj je prikazana zavisnost is-
kori²¢enosti procesora od stepenu multi-programiranja. Kako se stepen multi-
29

Slika 19: Lokaliteti u ²ablonima pristupa memoriji

programiranja pove¢ava, pove¢ava se i upotreba CPU-a, iako sporije, dok se ne


dostigne maksimum. Ako se stepen multi-programiranja jo² dodatno pove¢a,
dolazi do preoptere¢enosti i iskori²¢enost procesora naglo opada. U ovom tre-
nutku, da bismo pove¢ali iskori²¢enost procesora i zaustavili preoptere¢enost,
moramo smanjiti stepen multi-programiranja.
Efekat preoptere¢enosti moºemo ograni£iti kori²¢enjem algoritma lokalne za-
mene. Sa lokalnom zamenom, ako se jedan proces izvr²ava, on ne moºe preuzeti
okvire od drugog procesa i prouzrokovati preoptere¢enost istog. Mežutim, pro-
blem nije u potpunosti re²en na ovaj na£in. Ako su procesi preoptere¢eni, oni
¢e ve¢inu vremena provoditi u redu za urežaj koji obavlja strani£enje. Prose£no
vreme obrade izuzetka gre²ke stranice ¢e se pove¢ati zbog duºeg prose£nog £e-
kanja u redu urežaja za strani£enje. Na taj na£in, efektivno vreme pristupa
memoriji ¢e se pove¢ati £ak i za proces koji nije preoptere¢en.
Da bismo spre£ili preoptere¢enost, moramo dodeliti procesu onoliko okvira
koliko mu treba.
Ali kako znati koliko okvira je njemu potrebno? Postoji nekoliko tehnika.
Strategija radnog skupa prati koliko okvira se zapravo koristi u sistemu. Ovaj
pristup deni²e lokalitetni model izvr²avanja procesa. Lokalitetni model odre-
žuje da, kako se proces izvr²ava, on prelazi sa lokaliteta na lokalitet. Lokalitet
je, pri tome, skup stranica koje se aktivno koriste zajedno (slika 19).
Program se obi£no sastoji od vi²e razli£itih lokaliteta, koji se mogu prekla-
pati. Na primer, kada se funkcija pozove, ona deni²e nov lokalitet. U ovom
lokalitetu, memorijske reference se odnose na instrukcije u sklopu funkcije, njene
lokalne promenljive i podskup globalnih promenljivih. Kada napustimo funk-
ciju, proces napu²ta ovaj lokalitet, jer lokalne promenljive i instrukcije date
funkcije vi²e nisu u aktivnoj upotrebi. Na ovaj lokalitet ¢emo se moºda vratiti
30

Slika 20: Primer kori²¢enja modela radnog skupa

kasnije, ali trenutno nam vi²e nije interesantan.


Dakle, vidimo da su lokaliteti denisani programskom strukturom i kori²¢e-
nim strukturama podataka. Lokalitetni model tvrdi da ¢e svi programi iskazati
istu ili sli£nu strukturu u pogledu referenciranja memorije. Naravno, sam mo-
del lokaliteta je generalni princip. On je fundamentalni model za ke²iranje - da
su pristupi bilo kojoj vrsti podataka slu£ajni, tj. da ne vaºi princip lokalnosti,
ke²iranje bi bilo potpuno beskorisno.
Pretpostavimo da smo dodelili dovoljno okvira procesu tako da moºe da se
zadovolji njegov trenutni lokalitet. Gre²ke stranica ¢e se tada de²avati sve dok
te stranice ne budu u memoriji, ali nakon toga ne¢e dolaziti do novih gre²aka
stranica sve dok se ne promeni lokalitet. Ako ne dodelimo dovoljno okvira koji
bi odgovarali veli£ini trenutnog lokaliteta, proces ¢e vremenom postati preopte-
re¢en, jer ne moºe zadrºati u memoriji sve stranice koje aktivno koristi.

6.2 Model radnog skupa (Working-Set Model )


Kao ²to je pomenuto, model radnog skupa zasnovan je na pretpostavci lo-
kalnosti. Ovaj model koristi parametar ∆, za denisanje prozora radnog skupa.
Ideja je da se prate reference stranica u okviru prozora radnog skupa. Stranice
koje se nalaze mežu referencama stranica u okviru poslednjih ∆ memorijskih
referenci £ine radni skup (slika 20).
Ako je stranica u aktivnoj upotrebi, ona ¢e biti u radnom skupu. Ako se
vi²e ne koristi, bi¢e uklonjena iz radnog skupa nakon ∆ memorijskih referenci
koje ne uklju£uju nju. Dakle, samim tim, radni skup je aproksimacija lokaliteta
datog programa.
Na primer, obzirom na redosled memorijskih referenci prikazan na slici 20,
ako je ∆ = 10 memorijskih referenci, tada je radni skup u trenutku t1 {1, 2, 5,
6, 7}. U trenutku t2 , radni skup se promenio u {3, 4}.
Ta£nost aproksimacije radnog skupa zavisi od izbora ∆. Ako je ∆ premali,
ne¢e obuhvatiti celokupni lokalitet. Ako je, opet, ∆ prevelik, moºe dovesti do
preklapanja nekoliko lokaliteta. U ekstremnom slu£aju, ako je ∆ beskona£an,
radni skup £ini skup stranica koje se pose¢ene tokom izvr²avanja procesa.
Samim tim, najvaºnija osobina radnog skupa je njegova veli£ina. Ako je
izra£unata veli£inu radnog skupa, WSSi , za svaki proces u sistemu, tada moºemo
posmatrati

X
D= W SSi
31

gde D onda predstavlja ukupnu potraºnju za okvirima, od strane svih pro-


cesa. Svaki proces aktivno koristi stranice u svom radnom skupu. Dakle, za
proces i treba WSSi okvira. Ako je ukupna potraºnja za okvirima ve¢a od
ukupnog broja raspoloºivih okvira (D > m ), do¢i ¢e do preotere¢enosti u si-
stemu, jer neki procesi ne¢e imati dovoljno raspoloºivih okvira. Kada je odre-
žen i postavljen parametar ∆, upotreba modela radnog skupa je jednostavna.
Operativni sistem nadgleda radni skup svakog procesa i dodeljuje tom radnom
skupu dovoljno okvira u skladu sa veli£inom radnog skupa. Ako, nakon toga, ima
u sistemu dovoljno raspoloºivih slobodnih okvira, moºe se pokrenuti jo² jedan
proces. Ako se zbir veli£ina radnih skupova pove¢ava, prelaze¢i preko ukup-
nog broja dostupnih okvira, operativni sistem bira proces koji ¢e suspendovati.
Stranice tog procesa se zamenjuju iz memorije, a njegovi okviri se dodeljuju
drugim procesima. Suspendovani proces moºe se ponovo pokrenuti kasnije.
Ova strategija kori²¢enja radnog skupa spre£ava preoptere¢enost, uz zadrºa-
vanje stepena multi-programiranja najvi²im mogu¢im. Na taj na£in se optimi-
zuje iskori²¢enost procesora.
Problem sa modelom radnog skupa odnosi se na pra¢enje i aºuriranje radnog
skupa. Prozor radnog skupa je pokretni prozor, kao ²to smo videli. Kod svake
memorijske reference, na jednom kraju prozora se pojavljuje nova referenca, a
najstarija referenca ispada iz skupa na drugom kraju prozora. Stranica se nalazi
u radnom skupu ako se referenca na nju nalazi bilo gde u prozoru radnog skupa.
Model radnog skupa moºemo pribliºiti pomo¢u prekida tajmera sa ksnim
intervalom i bita reference. Na primer, pretpostavimo da je ∆ jednako 10 000
referenci i da moºemo izazvati prekid tajmera na svakih 5000 referenci. Kad
dože do prekida tajmera, kopiramo i bri²emo bit reference za svaku stranicu.
Prema tome, ako dože do gre²ke stranice, moºemo ispitati trenutni bit reference
i dva bita u memoriji kako bismo utvrdili da li je stranica kori²¢ena u prethodnih
10 000 do 15 000 referenci. Ako je bila kori²¢ena, barem jedan od ovih bita ¢e
biti postavljen na 1. Ako nije, biti ¢e biti postavljeni na 0. Stranice sa barem
jednim bitom postavljenim na 1 smatra¢e se elementima radnog skupa.
Treba imati na umu da ovaj mehanizam nije u potpunosti precizan, jer ne
moºemo re¢i kada se ta£no, u intervalu od 5.000, dogodila referenca. Ovu ne-
sigurnost moºemo smanjiti pove¢anjem broja bita koji prate istoriju promena
bita referenci ili skra¢enjem perioda vremena i prekida tajmera (na primer, 10
bita i prekid na svakih 1.000 referenci). Mežutim, u ovom slu£aju cena obrade
ovih dodatnih prekida bi¢e znatno ve¢a i moºda neprihvatljiva za dati sistem.

6.3 U£estalost gre²aka stranica


Model radnog skupa je uspe²an i funkcionalan, ali deluje kao nepotrebno
komplikovan mehanizam za kontrolu preoptere¢enosti. Strategija koja koristi
u£estalost gre²aka stranica (eng. Page-Fault Frequency, PFF) ima direktniji
pristup.
Speci£ni problem koji poku²avamo da re²imo jeste kako spre£iti preoptere-
¢enost. Preoptere¢enost se manifestuje visokom stopom gre²aka stranica. Stoga,
ºelimo da kontroli²emo u£estalost gre²aka stranica. Kad je ona previsoka, znamo
32

Slika 21: U£estalost gre²ke stranica

da procesu treba vi²e okvira. Suprotno tome, ako je stopa gre²aka stranica pre-
niska, tada proces moºda ima previ²e okvira. Kao rezultat, moºemo uspostaviti
gornju i donju granicu na ºeljenoj stopi gre²ke stranice (slika 21).
Ako stvarna stopa gre²aka stranica prelazi gornju granicu, dodeljujemo pro-
cesu jo² jedan okvir. Ako stopa gre²ke stranice padne ispod donje granice,
procesu oduzimamo okvir. Na taj na£in moºemo direktno meriti i kontrolisati
broj gre²aka stranica kako bismo spre£ili preoptere¢enost.
Kao i kod strategije radnog skupa, u datom trenutku ¢emo moºda morati
suspendovati proces i zameniti ga iz memorije (swap out ). Naime, ukoliko
se stopa gre²aka stranica uve¢ava, a slobodni okviri nisu dostupni, moramo
odabrati neki proces, kopirati njegove stranice na disk, a njega suspendovati.
Osloboženi okviri se tada distribuiraju procesima sa visokom stopom gre²aka
stranica.

7 Memorijski mapirane datoteke


Razmatramo sekvencijalno £itanje datoteke na disku koriste¢i standardne
sistemske pozive open (), read () write (). Svaki pristup datotekama zahteva si-
stemski poziv i pristup disku. Alternativno, moºemo koristiti dosada²nje tehnike
virtuelne memorije da bismo tretirali U/I na datotekama kao rutinske pristupe
memoriji. Ovaj pristup, poznat kao memorijsko mapiranje datoteka, omogu¢ava
da se deo virtualnog adresnog prostora logi£ki poveºe sa datotekom. Kao ²to
¢emo videti, to moºe dovesti do zna£ajnog pobolj²anja performansi.

7.1 Osnovni mehanizam


Memorijsko mapiranje datoteka vr²i se preslikavanjem bloka diska na stra-
nicu (ili stranice) u memoriji. Inicijalni pristup datoteci vr²i se kao kod stranica
na zahtev, ²to dovodi do gre²ke stranice. Mežutim, deo datoteke veli£ine stra-
nice se £ita iz fajl sistema u zi£ki okvir. Naknadna £itanja i upisivanja u
33

datoteku tretiraju se kao rutinski pristupi memoriji. Manipulisanje datotekama


kroz memorijski podsistem, umesto kori²¢enja sistemskih poziva read () i write ()
pojednostavljuje i ubrzava pristup i upotrebu datoteke.
Pri tome, upisivanje u memorijski mapiranu datoteku ne zahteva nuºno is-
tovremeno (sinhrono) upisivanje u datoteku na disku. Neki sistemi aºuriraju
zi£ku datoteku u momentu kada operativni sistem periodi£no proverava da li
je stranica u memoriji izmenjena. Svakako kada se datoteka zatvara, svi po-
daci mapirani u memoriju se zapisuju na disk i uklanjaju iz virtualne memorije
procesa.
Neki operativni sistemi omogu¢avaju mapiranje memorije datoteka kori²¢e-
njem speci£nih sistemskih poziva (mmap ), a koriste standardne sistemske po-
zive za vr²enje svih ostalih U/I operacija na datotekama. Mežutim, neki sistemi
vr²e memorijsko mapiranje datoteke bez obzira da li je datoteka predvižena za
mapiranje u memoriji. Uzmimo Solaris kao primer. Ako je datoteka predvižena
za memorijsko mapiranje (koriste¢i sistemski poziv mmap ()), Solaris mapira da-
toteku u adresni prostor procesa. Mežutim, ako se datoteka otvara i pristupa
joj se pomo¢u osnovnih sistemskih poziva, kao ²to su open (), read () i write (),
Solaris i dalje memorijski mapira datoteku, mežutim, datoteka se mapira u
adresni prostor kernela. Bez obzira na to kako se datoteka otvori, Solaris tretira
sve U/I operacije na datoteci kao memorijski mapirane, omogu¢avaju¢i pristup
datotekama putem ekasnog memorijskog podsistema.
Takože, mogu¢e je dozvoliti da vi²e procesa istovremeno mapiraju istu da-
toteku, u cilju deljenja podataka. Upis u datoteku od strane bilo kojeg procesa
modikuje podatke u virtualnoj memoriji i te izmene se mogu vidjeti od strane
svih ostalih procesa koji su mapirali isti deo datoteke u svoj adresni prostor. Ob-
zirom na prethodne diskusije o virtualnoj memoriji, trebalo bi biti jasno kako se
deljenje memorijski mapiranih delova segmenata memorije implementira: mapa
virtualne memorije svakog procesa koji pristupa toj memoriji pokazuje na je-
dinstvenu stranicu zi£ke memorije, odnosno stranicu koja sadrºi kopiju bloka
sa diska. Ovo deljenje memorije prikazano je na slici 22.
Sistemski pozivi za memorijsko mapiranje mogu takože podrºavati funkciju
kopiranja pri upisu, omogu¢uju¢i procesima da dele datoteku u reºimu £itanja,
ali da imaju sopstvene kopije podataka koje modikuju. Da bi pristup deljenim
podacima bio sinhronizovan, procesi koji dele podatke mogu koristiti neki od
mehanizama za postizanje uzajamne isklju£ivosti opisanih ranije.
Deljena memorija se £esto, zapravo, implementira kori²¢enjem memorijski
mapiranih datoteka. U ovom scenariju, procesi mogu komunicirati koriste¢i
deljenu memoriju tako ²to ¢e memorijski mapirati istu datoteku u svoje virtualne
adresne prostore.

7.2 Memorijski mapiran U/I


U slu£aju U/I periferija, svaki U/I kontroler sadrºi registre za sme²tanje
naredbi i podataka koji se prenose ka urežaju. Obi£no posebne U/I instrukcije
omogu¢avaju prenos podataka izmežu tih registra i sistemske memorije. Da bi se
omogu¢io pogodniji pristup U/I urežajima, mnoge ra£unarske arhitekture obez-
34

Slika 22: Memorijski mapirane datoteke

bežuju memorijski mapiran U/I. U ovom slu£aju se opseg memorijskih adresa


rezervi²e i preslikavaju se u registre urežaja (kontrolera). ƒitanje i upisivanje
ovog memorijskog opsega rezultuje preno²enjem podataka do registara urežaja
ili iz njih. Ova metoda je pogodna za urežaje koji imaju kratko vreme odziva,
kao ²to su video kontroleri.
Memorijski mapirani U/I pogodni su i za druge urežaje, kao ²to su serijski i
paralelni portovi koji se koriste za povezivanje raznih periferija na ra£unar. CPU
prenosi podatke putem ovih urežaja £itanjem i upisom nekolicine registara, koji
se nazivaju U/I port. Da bi poslao niz bajtova putem memorijski mapiranog
serijskog porta, CPU upisuje jedan bajt podataka u registar podataka i postavlja
odgovaraju¢i bit u okviru kontrolnog registra da signalizira da je bajt za prenos
dostupan. Urežaj preuzima bajt podataka, a zatim bri²e bit u kontrolnom
registru kako bi signalizirao da je spreman za slede¢i bajt. Ako CPU koristi
prozivanje (eng. polling ) kako bi pratio vrednost bita u kontrolnom registru,
izvr²avaju¢i se u petlji kako bi proveravao da li je urežaj spreman, ta metoda
naziva se programirani U/I (eng. programmed I/O - PIO). Ako CPU ne vr²i
prozivanje bita u kontrolnom registru, ve¢ umesto toga dobija putem prekida
informaciju kada je urežaj spreman za slede¢i bajt, kaºe se da je prenos podataka
kontrolisan prekidom (eng. interrupt driven ).

8 Alokacija kernel memorije


Kada proces koji se izvr²ava u korisni£kom reºimu zahteva dodatnu memo-
riju, stranice se dodeljuju sa liste slobodnih okvira stranica koje odrºava kernel.
Ova lista se obi£no aºurira od strane algoritma za zamenu stranice, a uglavnom
35

Slika 23: Alokacija polovljenjem

sadrºi slobodne stranice razbacane po zi£koj memoriji. Takože, ako korisni£ki


proces zahteva jedan bajt memorije, do¢i ¢e do interne fragmentacije, jer ¢e
proces dobiti ceo okvir memorije na raspolaganje.
Kernel memorija, sa druge strane, se £esto dodeljuje iz domena slobodne
memorije koja se razlikuje od liste koja se koristi da bi se zadovoljili uobi£ajeni
procesi u korisni£kom reºimu. Postoje dva osnovna razloga za to:

1. Kernel zahteva memoriju za strukture podataka razli£itih veli£ina, od ko-


jih su neke manje od stranice. Kao rezultat toga, kernel mora da koristi
memoriju na konzervativni na£in i poku²ava da minimizira neiskori²¢enu
memoriju nastalu usled fragmentacije. Ovo je posebno vaºno jer ve¢ina
operativnih sistema ne koristi strani£enje u slu£aju kernel koda ili kernel
podataka;

2. Stranice dodeljene procesima u korisni£kom reºimu ne moraju nuºno da


budu u kontinualnoj zi£koj memoriji. Mežutim, odreženi hardverski ure-
žaji direktno komuniciraju sa zi£kom memorijom, bez interakcije virtual-
nog memorijskog interfejsa. Shodno tome, za takvu komunikaciju moºda
¢e biti neophodna memorija alocirana na zi£ki susednim lokacijama.

U nastavku analiziramo dve strategije za upravljanje slobodnom memorijom


koja je dodeljena kernel procesima: alokacija polovljenjem i alokacija objekata.

8.1 Alokacija polovljenjem (Buddy allocation )


Ovaj metod alokacije dodeljuje memoriju iz segmenata ksne veli£ine koji se
sastoje od zi£ki kontinualne memorije. Memorija se dodeljuje alokacijama blo-
kova veli£ine stepena 2 (4KB, 8KB, 16KB itd). Zahtev za memorijom druga£ije
veli£ine zaokruºuje se na slede¢i dovoljno velik segment. Na primer, zahtev za
11KB dove²¢e do alokacije segmenta od 16KB.
36

Razmotrimo jednostavan primer. Pretpostavimo da je veli£ina memorijskog


segmenta u po£etku 256KB, a kernel zahteva 21KB memorije. Segment je u
po£etku podeljen na dva jednaka segmenta - koje ¢emo nazvati AL i AR veli£ine
128 KB. Jedan od ovih segmenata dalje je podeljen na dva pod segmenta od 64
KB - BL i BR . Mežutim, slede¢i segment veli£ine stepena 2 ve¢i od 21KB iznosi
32KB, tako da je ili BL ili BR ponovo podeljen na dva 32KB segmenta, CL i
CR . Jedan od ovih segmenata veli£ine 32KB koristi se za ispunjavanje zahteva
za memorijom veli£ine 21 KB. Ova ²ema je prikazana na slici 23, gde je CL
segment dodeljen kao rezultat zahteva za 21KB. Prednost alokacije polovljenjem
je u tome ²to se brzo mogu kombinovati susedni segmenti kako bi se formirali
ve¢i segmenti kori²¢enjem tehnike poznate kao spajanje (eng. coalescing ). Na
slici 23, na primer, kada kernel oslobaža CL segment koji mu je dodeljen, sistem
moºe spojiti CL i CR u segment od 64KB. Ovaj segment, BL , moºe, opet, da
se spoji sa svojim susednim segmentom BR i formira segment od 128 KB. Na
kraju, moºemo zavr²iti sa originalnim segmentom od 256KB, na sli£an na£in.
O£igledan nedostatak ove metode alokacije leºi u £injenici da ¢e zaokruºi-
vanje na segmente veli£ine slede¢eg stepena broja 2 naj£e²¢e dovesti do interne
fragmentacije unutar dodeljenih segmenata. Na primer, zahtev za memorijom
veli£ine 33 KB moºe se zadovoljiti samo segmentom od 64 KB. Zapravo, ne mo-
ºemo nikako garantovati da ¢e manje od 50 procenata dodeljenog segmenta biti
izgubljeno usled interne fragmentacije. U slede¢em odeljku istraºujemo ²emu
raspodele memorije kod koje se ne gubi memorijski prostor kao posledica frag-
mentacije.

8.2 Alokacija objekata (Slab allocation )


Druga strategija za alociranje kernel memorije je poznata kao alokacija obje-
kata. Objekti se sme²taju u tzv plo£e (eng. slab ) sa£injene od jedne ili vi²e -
zi£ki povezanih stranica (kontinualna memorija). Ke² se sastoji od jedne ili vi²e
plo£a, pri £emu postoji zaseban ke² za svaku jedinstvenu kernel strukturu. Na
primer, ke² koji se koristi za £uvanje podataka o procesima, ke² koji se koristi
za datoteke, ke² za semafore i tako dalje. Svaki ke² je popunjen objektima koji
su instance kernel struktura podataka asociranih sa datim ke²om. Odnos ke²a,
plo£a i objekata prikazan je na slici 24. Slika prikazuje dva kernel objekta veli-
£ine 3kB i tri objekta veli£ine 7kB, ke²iranih i sme²tenih u zasebnim plo£ama.
Algoritam alokacije objekata koristi ke² kako bi sme²tao kernel objekte.
Kada se ke² kreira, odreženi broj objekata, inicijalno ozna£enih kao slobodni,
alocira se za dati ke². Broj objekata u okviru ke²a zavisi od veli£ine plo£e aso-
cirane sa datim ke²om. Na primer plo£a veli£ine 12kB (sa£injena od 3 susedne
4kB stranice), moºe da skladi²ti 6 objekata veli£ine 2kB. Inicijalno, svi objekti
u okviru ke²a ozna£eni su kao slobodni, a kada je potreban novi objekat za odre-
ženu kernel strukturu, alokator dodeljuje jedan od slobodnih objekata iz ke²a
kako bi ispunio zahtev. Taj objekat se tada ozna£ava kao kori²¢en.
Razmatramo scenario u kojem kernel zahteva memoriju kako bi skladi²tio
objekat koji predstavlja desktiptor procesa. U Linux operativnom sistemu, on
je predstavljen strukturom task_struct, koja zauzima otprilike 1.7kB memo-
37

Slika 24: Alokacija objekata

rije. Kada Linux kernel kreira novi proces, on zahteva od odgovaraju¢eg ke²a
memoriju kako bi smestio task_struct objekat. Zahtev ¢e biti ispunjen kori²¢e-
njem prethodno alociranih objekata strukture task_struct koji su ozna£eni kao
slobodni u odgovaraju¢oj plo£i. U Linux-u, plo£a moºe biti u jednom od tri
stanja:

1. Popunjena. Svi objekti u okviru plo£e su ozna£eni kao kori²¢eni;

2. Prazna. Svi objekti u okrivu plo£e su ozna£eni kao slobodni;

3. Delimi£no popunjena. Plo£e sadrºi kako slobodne tako i kori²¢ene objekte.

Alokator plo£e najpre poku²ava da odgovori na zahtev kori²¢enjem slobodnih


objekata iz delimi£no popunjene plo£e. Ako takav ne postoji, slobodan objekat
se dodeljuje iz prazne plo£e. Ako, ipak, prazna plo£e ne postoji, nova plo£e je
alocirana iz zi£ki kontinualne memorije i dodeljena ke²u, a memorija za objekat
¢e se alocirati iz te plo£e.
Alokacija na ovaj na£in ima dva beneta:

1. Memorija se ne gubi nepotrebno usled fragmentacije. Fragmentacija nije


problem jer svaki jedinstveni kernel objekat ima sebi asocirani ke², a svaki
ke² se sastoji od jedne ili vi²e plo£a podeljenih u blokove memorije veli£ine
objekta za koji su namenjene. Stoga, kada kernel zahteva memoriju za
dati objekat, alokator objekata vra¢a upravo zahtevanu koli£inu memorije,
potrebne da se skladi²ti dati objekat.

2. Zahtevi za memorijom mogu biti ispunjeni brzo. Shema opisana iznad


je posebno ekasna za upravljanje memorijom u sistemu gde se objekti
u£estalo alociraju i dealociraju, ²to je upravo slu£aj sa kernelom. Ova
alokacija i dealokacija moºe biti skupa u pogledu vremena, ali obzirom da
su u ovom slu£aju objekti kreirani ranije, oni mogu brzo biti dodeljeni iz
odgovaraju¢eg ke²a. Dodatno, kada kernel zavr²i sa kori²¢enjem odreženog
38

objekta i oslobodi ga, on ¢e biti ozna£en kao slobodan i vra¢en u ke², nakon
£ega ¢e momentalno biti dostupan narednim zahtevima od strane kernela.

Linux je originalno koristio alokaciju polovljenjem kao mehanizam alokacije ker-


nel memorije, ali po£ev²i od verzije kernela 2.2, Linux koristi alokaciju objekata
za upravljanje kernel memorijom.

You might also like