Beruflich Dokumente
Kultur Dokumente
memorijom
UPRAVLJANJE MEMORIJOM
Sistemi za upravljanje memorijom mogu biti podijeljeni u dvije grupe: oni koji
vrte proces napred nazad između glavne memorije i diska tokom izvršavanja –
prebacivanje (swaping*) i straničenje (paging*), i oni koji to ne čine. Ovi drugi su
jednostavniji, pa ćemo njih prve razmatrati. U drugom dijelu ovog poglavlja
razmotriti ćemo i sisteme sa prebacivanjem i straničenjem. Tokom ovog poglavlja
treba imati na umu da su prebacivanje i straničenje postupci koji se koriste samo
zbog nedovoljne veličine glavne memorije, koja nije u stanju da opslužuje sve
programe u isto vrijeme. Ako glavna memorija ikad postane dovoljno velika,
*
paging – Paging fajl je fajl koji se koristi kao virtualna memorija na hard disku koja je načešće 1,5 puta
veličine glavne memorije
*
swaping – je proces stvaranja paging fajla tj. njegovog punjenja i pražnjenja podacima.
1
Moderni operativni sistemi Upravljanje
memorijom
argumenti koji idu u korist jednog ili drugog načina upravljanja memorijom postaju
nebitni.
Sa druge strane, kako je gore navedeno, softver brže “raste” od memorije,
stoga će vjerovatno uvijek biti potrebno pronalaziti najefikasniji način upravljanja
memorijom. U 1980-tim, mnogi univerziteti su imali sisteme sa vremenskom
raspodjelom – 4 MB VAX i na desetine više-manje zadovoljnih korisnika. Sada
Microsoft preporučuje najmanje 64 MB za korisnike Windows 2000 operativnog
sistema. Trend ka multimediji stvara još veće zahtjeve što se memorije tiče, pa će
dobro upravljanje memorijom biti neophodno još najmanje idućih deset godina.
Slika 4-1 Tri jednostavne šeme organizacije memorije kod operativnog sistema
i jednog korisničkog procesa. Postoje i druge šeme.
Kada je sistem organizovan na ovaj način, samo jedan proces može da radi u
datom trenutku. Kada korisnik otkuca komandu, operativni sistem kopira zahtjevani
program sa diska u memoriju i izvrši ga. Kada se proces završi, operativni sistem
prikaže prompt znak* i čeka na novu komandu. Kada dobije komandu, on učita novi
program u memoriju i to tako što ga prepiše preko prvog.
*
Prompt znak – znak koji se pojavljuje na ekranu monitora kada je računar spreman da primi podatke sa ulaza,
npr. sa tastature.
2
Moderni operativni sistemi Upravljanje
memorijom
Mrežni serveri moraju da izvršavaju nekoliko procesa (za različite korisnike) u isto
vrijeme, a danas i obični kućni računari imaju takvu sposobnost.
Najjednostavniji način postizanja multiprogramiranja je jednostavna podjela
memorije na n dijelova. Ovakva podjela, na primjer, može se ručno napraviti kada se
sistem pokrene.
Kada pristigne zadatak, on može biti postavljen u niz na ulaz najmanjeg dijela
memorije koji je dovoljno velik da ga primi. Pošto su particije kod ove šeme fiksne,
svaki dio (particija) memorije koji se ne koristi za izvršavanje zadatka, je
neiskorišten. Na slici 4-2 (a) vidimo kako izgledaju sisitemi sa fiksnim particijama i
odvojenim ulaznim nizovima.
Nedostatak postavljanja novih zadataka u posebne nizove postaje vidljiv kada
ulazni niz za veliku particiju memorije ostane prazan, a niz za malu particiju pun, kao
što je to slučaj za particije 1 i 3 na slici 4-2(a). Vidimo da mali zadaci moraju čekati
na memoriju, iako je veliki dio memorije neiskorišten. Drugačija organizacija je kada
se održava jedan niz, kako je pokazano na slici 4-2(b). Kada god je particija
slobodna, prvi zadatak u nizu koji može stati na tu particiju se može učitati i
izvršavati. Pošto nije poželjno trošiti velike particije memorije za male zadatke,
primjenjuje se strategija pretraživanja cijelog ulaznog niza kada god particija postane
slobodna, pri čemu se odabire najveći zadatak koji može da stane u particiju.
Slika 4-2 (a) Fiksne particije memorije sa izdvojenim posebnim ulaznim nizovima
za svaku particiju. (b) Fiksne particije memorije sa jednim ulaznim nizom.
3
Moderni operativni sistemi Upravljanje
memorijom
izvršava sve dok ne završi. Danas, samo neki operativni sistemi podržavaju ovaj
model.
iskorištenje procesora = 1 – p n
Slika 4-3 prikazuje iskorištenje procesora u funkciji od n - stepen
multiprogramiranja.
Sa slike se jasno vidi da ako proces potroši 80% svog vremena za čekanje na
ulaz/izlaz, najmanje 10 procesa moraju biti istovremeno u memoriji da bi
neiskorištenje procesora palo ispod 10 %. Kada pogledamo da je jedan interaktivan
proces koji čeka korisnika da otkuca nešto na terminalu u stanju čekanja na
ulaz/izlaz, postaje jasno da vrijeme čekanja od 80% i više, nije neuobičajeno. Čak i u
batch sistemima, procesi koji često čitaju i upisuju na hard disk imati će takav ili veći
procenat čekanja.
Da bi bili precizni, treba istaći da je prethodno opisan probablistički model
samo aproksimacija. On implicitno pretpostavlja da su svih n procesa nezavisni, što
znači da je potpuno prihvatljivo da sistem sa 5 procesa u memoriji trenutno izvršava
3 procesa, a da 2 čekaju. Međutim jedan procesor ne može u isto vrijeme izvršavati
sva tri procesa, pa procesi koji su spremni za dalje izvršavanje treba da čekaju sve
dok je procesor zauzet. Prema tome vidimo da procesi nisu nezavisni. Precizniji
model se može konstruisati pomoću teorije nizova, međutim ovdje ćemo samo istaći
da – multiprogramiranje koje omogućava procesima korištenje procesora kada se on
inače ne bi koristio – važi iako tačne krive sa slike 4-3 izgledaju malo drugačije.
Iako je model sa slike 4-3 jednostavan, može nam poslužiti za pravljenje
određenih, doduše aproksimativnih, predikcija performansi procesora. Pretpostavimo
4
Moderni operativni sistemi Upravljanje
memorijom
npr., da računar ima 32 MB memorije, pri čemu operativni sistem oduzima 16 MB, a
svaki korisnički program po 4 MB. S obzirom na date veličine, moguća su
istovremeno 4 korisnička programa u memoriji. Ako je prosječno vrijeme čekanja
80%, iskorištenje procesora je 0.84 ili oko 60%. Dodavanjem novih 16 MB memorije,
sistem nije više 4-multiprogramski, nego 8-multiprogramski, a iskorištenje procesora
je poraslo na 83%. Drugim riječima dodatnih 16 MB memorije povećava iskorištenje
za 38%.
Međutim, dodavanjem novih 16 MB dobija se iskorištenje procesora od 93%,
odnosno povećava se samo 12%. Kada se koristi ovaj model korisnik sistema bi
mogao da zaključi da se prvo ulaganje u novih 16 MB memorije isplatilo, a da već
drugo nije.
Model koji smo prethodno diskutovali može se, takođe iskoristiti za analizu
batch sistema. Psmatrajmo, npr. Računski centar kod kojeg je 80% vremena vrijeme
čekanja na ulaz/izlaz. Određenog jutra, poslata su 4 zadatka, kako je pokazano na
slici 4-4 (a). Prvi zadatak koji je stigao u 10:00 sati, zahtjeva 4 minute procesorskog
vremena. Pošto je vrijeme čekanja na ulaz/izlaz 80%, samo se 12 sekundi
procesorskog vremena daje tom zadatku (koji se drži u memoriji) svake minute, iako
ne postoji trenutno ni jedan drugi zadatak koji bi konkurisao za procesorsko vrijeme.
Pošto se na ulaz/izlaz čeka 48 sekundi svake minute, biti će potrebno 20 minuta
zadatku bez konkurencije da obavi svoj posao od 4 minute procesorskog vremena, i
za svo to vrijeme će zauzimati memoriju.
Od 10:00 sati do 10:10 sati zadatak 1 je sam u memoriji i za to vrijeme
odrađuje 2 minute svog posla. Kada u 10:10 sati stigne zadatak 2, efikasnost
procesora poraste sa 0.2 na 0.36, zbog većeg stepena multiprogramiranja (slika 4-3).
Međutim sa odgovarajućim rasporedom poslova svaki zadatak dobije 0.18 minuta
procesorskog vremena svake minute koju provedu u memoriji. Zapazimo da se
dodatkom drugog zadatka gubi samo 10% od performansi prvog zadatka. Odnosno
umjesto 0.2 minute procesorskog vremena u minuti realnog vremena, dobija sada
0.18 minuta procesorskog vremena u minuti realnog vremena.
U 10:15 sati stiže treći zadatak. Do tada zadatak 1 je dobio ukupno 2.9 minuta
procesorskog vremena, a zadatak 2 ukupno 0.9 minuta procesorskog vremena. Sa
trostrukim multiprogramiranjem svaki zadatak dobija 0.16 minuta procesorskog
vremena u minuti realnog vremena, kako je prikazano na slici 4-4 (b). Od 10:15 sati
do 10:20 sati sva tri zadatka dobijaju 0.8 minuta procesorskog vremena. U 10:20 sati
stiže četvrti zadatak. Slika 4-4 (c) prikazuje kompletnu sekvencu događaja.
5
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-4 (a) Pristizanje i zahtjevi 4 zadatka. (b) Iskorištenje procesora za 1-4 zadataka sa 80%
vremena čekanja na ulaz/izlaz. (c)sekvenca događaja kako zadaci pristižu i završavaju se. Brojevi
iznad horizontalne linije pokazuju koliko procesorskog vremena u minutama svaki zadatak dobija u
svakom intervalu.
6
Moderni operativni sistemi Upravljanje
memorijom
7
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-5 Realokacija memorije se mijenja kako procesi dolaze u memoriju i napuštaju je.
Osjenčena područja predstavljaju neiskorištenu memoriju.
Ako proces može imati dva rastuća segmenta, na primjer segment podataka
se koristi kao skup za promjenjive koje se dinamički dodjeljuju i oslobađaju i stack
segment za normalne lokalne promjenjive i povratne adrese, nameće se alternativna
8
Moderni operativni sistemi Upravljanje
memorijom
konfiguracija memorije data na slici 4-6 (b). Na ovoj slici vidimo da svaki proces ima
stack segment (koji raste nadolje) na vrhu memorije koja mu je dodijeljena i
segment podataka (koji raste nagore) odmah iznad tijela programa. Memorija
između njih se može koristiti za potrebe oba segmenta. Ako ona postane premala,
proces će se morati ili prebaciti u memorijsku rupu sa dovoljno prostora ili biti
prebačen na disk dok se taj prostor ne oslobodi ili biti ubijen.
Slika 4-7 (a) Dio memorije sa pet procesa i tri memorijske rupe. Podioci označavaju
memorijske jedinice za dodjeljivanje. Osjenčana područja (0 u bitmapi) su slobodna.
(b) Odgovarajuća bitmapa. (c) Ista informacija kao lista.
9
Moderni operativni sistemi Upravljanje
memorijom
predstavljena kao povezana lista. Svaki unos u listi specificira memorijsku rupu (H) ili
proces (P), adrese kojim počinju, dužinu i pokazivač na idući unos.
U ovom primjeru, lista segmenata se sortira po adresama. Ovakvo sortiranje
ima tu prednost što kada proces završi ili bude prebačen na disk, ažuriranje je
pravolinijsko. Proces koji završava ima normalno dva susjeda, osim kada se radi o
procesu na samom vrhu i na samom dnu koji imaju po jednog susjeda. Oni mogu biti
ili procesi ili memorijske rupe, što daje 4 kombinacije date na slici 4-8. Na slici 4-8 (a)
ažuriranje liste zahtjeva zamjenu P sa H. Na slici 4-8 (b) i 4-8 (c), dva unosa su
spojeni u jedan, pa lista postaje za jedan unos kraća. Na slici 4-8 (d), tri unosa su
sjedinjena i dvije stavke se miču sa liste. Pošto slot u tabeli procesa za proces koji
završava pokazuje na listu unosa za sam proces, možda je zgodnije imati dvostruko
povezanu listu, nego običnu listu sa slike 4-7 (c). Ovakva struktura olakšava
pronalaženje prethodnog unosa i razmatranje da li je spajanje moguće.
10
Moderni operativni sistemi Upravljanje
memorijom
malih memorijskih rupa koje se ne mogu iskoristiti. Prvi pogodan pravi prosječno
veće memorijske rupe.
Da bi zaokružili problem dijeljenja memorije na proces i na manju memorijsku
rupu, spomenimo i algoritam najgori pogodan. Ovaj algoritam uvijek uzima
najveću moguću memorijsku rupu u koju smješta proces, da bi, kada se ona podijeli
nastala veća memorijska rupa koju bi mogao iskoristiti neki drugi proces. Simulacije
su pokazale da ni ovaj algoritam nije dobar.
Sva četiri algoritma se mogu ubrzati ako se vode odvojene liste za procese i
memorijske rupe. Na ovaj način, svi oni svu svoju energiju mogu da ulože u
pretraživanje samo rupa (ne i procesa). Neizbježna cijena koja se plaća za ovo
ubrzanje dodjeljivanja memorije je dodatna komleksnost i usporavanje pri ponovnom
dodjeljivanju memorije, pošto je oslobođeni segment morao biti uklonjen sa liste
procesa i ubačen u listu memorijskih rupa.
Ako se prave odvojene liste za procese i memorijske rupe, lista memorijskih
rupa se može držati sortirana po veličini, tako da je sada najbolji pogodan algoritam
brži. Kada najbolji pogodan algoritam pretražuje listu memorijskih rupa, čim naiđe na
dovoljno veliku rupu, zna da je to ujedno i najmanja odgovarajuća. Tako da dalje
pretraživanje nije potrebno (za razliku od slučaja kada imamo jednu listu). Dakle,
kada su memorijske rupe poredane po veličini prvi odgovarajući i najbolji
odgovarajući algoritmi su jednako brzi, dok je slijedeći odgovatrajući algoritam
besmislen.
Kada se posebno vode liste memorijskih rupa moguća je određena
optimizacija. Umjesto da imamo odvojen set strukture podataka za održavanje čitave
liste, kao što je urađeno na slici 4-7 (c), za to mogu biti iskorištene same memorijske
rupe. Prva riječ svake memorijske rupe može biti njena veličina, a druga riječ
pokazivač na idući unos. Čvorovi liste sa slike 4-7 (c), koji zahtjevaju tri riječi i jedan
bit (P/H – proces/rupa) sada više nisu potrebni.
Postoji još jedan algoritam za dodjeljivanje, to je brzi odgovarajući, koji
održava odvojene liste za nekoliko uobičajenih velična memorije koje se traže. Na
primjer, može da ima tabelu sa n unosa, gdje je prvi unos pokazivač na zaglavlje liste
4KB-ih memorijskih rupa, drugi unos je pokazivač na zaglavlje liste 8KB-ih
memorijskih rupa, treći unos je pokazivač na zaglavlje liste 12 KB-nih memorijskih
rupa, itd.. Rupe od recimo 21 KB, mogu biti smještene ili na 20 KB listu ili na
specijalnu listu netipičnih veličina rupa. Sa brzim odgovarajućim algoritmom,
pronalaženje rupe odgovarajuće veličine je veoma brzo, ali ima neke svoje
nedostatke kao i sve šeme koje sortiraju rupe po veličini. Naime, kada proces završi
ili biva prebačen na disk, traženje susjeda u cilju sjedinjavanja je skupo. Ako se
sjedinjavanje ne dogodi, memorija će se brzo fragmentisati na velik broj malih rupa u
koje ne može stati ni jedan proces.
Prije mnogo godina ljudi su prvo bili suočeni sa programima koji su bili
preveliki da bi stali u memoriju. Riješenje koje je najčešće primjenjivano bila je
podjela programa na dijelove, zvane dopune (overlays). Dopuna 0 bi prva počinjala
rad. Kada ona završi, pozove drugu dopunu. Neki sistemi dopune su vrlo kompleksni,
11
Moderni operativni sistemi Upravljanje
memorijom
radi kopiranja sadržine memorijske adrese 1000 u REG (ili obratno što zavisi od
računara). Adrese se mogu generisati pomoću indeksiranja, baznih registara, i na
druge načine.
Slika 4-9 Pozicija i funkcija MMU. MMU je prikazan kao dio procesorskog čipa, jer je danas tako
uobičajeno. Međutim logički to može biti poseban čip kao što je godinama to i bio.
MOV REG, 0
virtualna adtresa 0 se šalje u MMU. Tada MMU vidi da virtualna adresa pada na
stranicu 0 (0 do 4095), što, s obzirom na mapiranje, odgovara okviru stranice 2
(8192 do 12287).
Slično instrukcija
se efikasno transformiše u
jer je virtualna adresa 8192 na virtualnoj stranici 2 koja je mapirana na fizički okvir
stranice 6 (fizičke adrese 24576 do 28671). Kao treći primjer, virtualna adresa 20500
je za 20 bajtova udaljena od početka virtualne stranice 5 (virtualne adrese 20480 do
24575) i mapira se na fizičku adresu 12288+20=12308.
Ova sposobnost mapiranja 16 virtualnih stranica u neki od 8 okvira stranica
podešavanjem mape MMU-a, sama po sebi ne riješava pitanje većeg virtualnog
adresnog prostora u odnosu na fizičku memoriju. Pošto imamo samo 8 okvira
stranica, samo 8 virtualnih stranica sa slike 4-10 se mapiraju u fizičku memoriju.
Ostale, na slici prikazane sa krstićem unutar pravougaonika, se ne mapiraju. Hardver
ima jedan bit koji se naziva prisutan/odsutan bit (present/absent bit) koji sadrži
informaciju o tome koje su stranice fizički prisutne u memoriji.
13
Moderni operativni sistemi Upravljanje
memorijom
14
Moderni operativni sistemi Upravljanje
memorijom
milion stranica u virtualnom adresnom prostoru, tabela stranica mora imati 1 milion
unosa. Podsjetimo da svaki proces zahtjeva posebnu tabelu stranica jer svaki proces
ima sopstveni virtualni adresni prostor.
Drugo pitanje je posljedica činjenice da se mapiranje iz virtualne u fizičku
adresu mora izvršavati za svako obraćanje memoriji. Tipična instrukcija sadrži
instrukcionu riječ, a često i memorijski operand. Često je neophodno 1,2 ili nekada i
više obraćanja tabeli stranica po jednoj instrukciji. Ako je trajanje instrukcije, recimo
4ns, pregled tabele stranica mora da se izvrši za 1ns da bi se izbjeglo pravljenje
uskog grla.
Potreba za velikim, brzim mapiranjem stranica je značajna prepreka kod
proizvodnje računara. Ovo je ozbiljan problem kod vrhunskih mašina, mađutim
takođe predstavlja problem i kod slabijih mašina gdje je odnos performanse/cijena
kritičan. U ovom poglavlju kao i u slijedećim razmatrati ćemo detaljno model tabele
stranica i pokazati nekoliko hardverskih rješenja koja su se koristila kod izrade
računara.
Najjednostavniji model je kada postoji samo jedna tabela stranica koja sadrži
niz brzih hardverskih registara, sa jednim unosom za svaku virtualnu stranicu
indeksiranu pomoću broja virtualne stranice, kako je prikazano na slici 4-11. Kada je
proces pokrenut, operativni sistem upiše u registre tabelu stranica tog procesa, koja
je uzeta iz kopije u glavnoj memoriji. Tokom izvršavanja procesa nije potrebno dalje
obraćanje glavnoj memoriji za tabelu stranica. Prednosti ovog metoda su to što je
pravolinijski i ne obraća se memoriji tokom mapiranja. Nedostatak je njegova
potencijalna visoka cijena (ako je tabela stranica velika). Takođe učitavanje čitave
tabele stranica, za svaku promjenu sadržaja, narušava performanse.
Druga ekstremna situacija je kada je čitava tabela stranica u glavnoj memoriji.
Sav hardver koji je dodatno potreban je sada samo jedan registar koji pokazuje na
početak tabele stranica. Ovaj model omogućava promjenu mapirane memorije
prilikom promjene sadržaja učitavanjem samo jednog registra. Naravno nedostaci
ovog modela su potreba za jednim ili više obraćanja memoriji za čitanje unosa tabele
stranica tokom izvršavanja svake instrukcije. Zbog ovog, ovaj pristup se rijetko koristi
u njegovoj najčistijoj formi, ali ispod ćemo razmatrati njegove varijante koje daju
mnogo bolje performanse.
Višenivoovske tabele stranica
16
Moderni operativni sistemi Upravljanje
memorijom
17
Moderni operativni sistemi Upravljanje
memorijom
Interesantno je na slici 4-12 napomenuti da, iako adresni prostor sadrži preko
milion stranica, jedino su 4 tabele stranica stvarno potrebne: tabela najvišeg nivoa i
drugo-nivoovske tabele od 0 do 4M i od 4M do 8M, i gornjih 4M. Prisutan/odsutan
bitovi u unosima 1021 tabele najvišeg nivoa postavljeni su na 0 izazivajući tako
stvaranje greške stranice ako ikada dođe do pristupa njima. Ako se ovo desi
operativni sistem će uvidjeti da proces pokušava pristupiti memoriji kojoj ne bi trebao
i postupiti će na odgovarajući način, kao što je, na primjer, slanje signala procesu ili
ubijanje procesa. U ovom primjeru izabrali smo okrugle brojeve za razne veličine i
odredili smo da su PT1 i PT2 istih veličina, ali oni mogu biti različitih veličina.
Dvo-nivoovski sistem tabele stranica sa slike 4-12 može se proširiti na 3, 4 ili
više nivoa. Dodatni nivoi daju fleksibilnost, ali je pitanje da li je dodatna
kompleksnost isplativa ako postoji više od tri nivoa.
19
Moderni operativni sistemi Upravljanje
memorijom
Jedan primjer koji može generisati TLB sa slike 4-14 je proces u petlji koji vrti
virtualne stranice 19, 20 i 21. Taj TLB ima zaštitni kod za čitanje i izvršavanje. Glavni
podaci koji se trenutno koriste se nalaze na stranicama 129 i 130. Stranica 140 sadrži
popis korišten u proračunu niza. Konačno, stack je na stranicama 860 i 861.
Pogledajmo sada kako TLB radi. Kada je virtualna adresa prezentovana MMU
radi prevođenja, hardver prvo provjerava da li je u TLB-u prisutan broj virtualne
stranice tako što ga upoređuje simultano sa svim unosima (paralelno). Ako je
pronađen odgovarajući par, a pristup dozvoljen (bitovi zaštite), okvir stranice se
direktno uzima iz TLB-a, bez prolaženja kroz tabelu stranica. Ako je broj virtualne
stranice prisutan u TLB-u, a instrukcija pokušava da upiše podatke u stranicu kojoj je
dozvoljeno samo čitanje, generiše se greška zaštite, isto kao što bi se generisala iz
same tabele stranica.
Interesantan slučaj je kada u TLB-u nema broja virtualne stranice. MMU
detektuje promašaj i odrađuje običan pregled tabele stranica. Zatim, izbacuje jedan
od unosa u TLB i zamjenjuje ga sa unosom iz tabele stranica koji je upravo našao.
Ako se ta stranica bude opet ubrzo koristila, rezultat detekcije će biti pogodak a ne
promašaj. Kada se unos sa TLB-a izbriše, bit promijene se kopira nazad u unos
tabele stranica u memoriji. Ostale vrijednosti su već tamo. Kada se TLB učitava iz
tabele stranica, sva polja se preuzimaju iz memorije.
21
Moderni operativni sistemi Upravljanje
memorijom
stranica da bi našao unos (n,p). Dalje, ovo pretraživanje se mora odraditi za svako
obraćanje memoriji, a ne samo kada dođe do greške stranice. Pretraživanje 64 K
tabelu na svaku memorijsku raferencu nije način na koji se može napraviti brza
mašina.
Izlaz iz ove dileme je u korištenju TLB-a. Ako TLB može da sadrži sve često
korištene stranice, prebacivanje se može odvijati istom brzinom kao i kod običnih
tabela stranica. Međutim, kada dođe do promašaja TLB-a, invertovana tabela
stranica se mora softverski pretraživati. Jedna od mogućih izvedbi ovakvog načina
pretraživanja je pomoću sjeckanih (hash) tabela podijeljenih po virtualnim adresama.
Sve virtualne stranice koje su trenutno u memoriji i imaju istu hash vrijednost bivaju
povezane zajedno, kako je pokazano na slici 4-15. Ako sjeckana tabela ima onoliko
polja koliko mašina ima fizičkih stranica, prosječna veza će biti veličine samo jednog
unosa, što će dosta ubrzati mapiranje. Kada bude pronađen broj okvira stranice, nov
(virtualni, fizički) par se unosi u TLB.
Kada se desi greška stranice, operativni sistem mora da izabere stranicu koju
će izbaciti iz memorije da bi napravio dovoljno prostora za stranicu koju treba ubaciti.
Ako je stranica koja treba da se izbaci mijenjana dok je bila u memoriji, mora se
ponovo ispisati na disk da bi se kopija na disku ažurirala. Ako, međutim, stranica nije
mijenjana (npr sadrži program), kopija na disku je vjerna, pa nije potrebno njeno
ponovno prepisivanje na disk. Stranica za koju se oslobađa mjesto biva samo upisana
preko stranice koja je izbačena.
Umjesto da se izabire slučajna stranica koja će biti izbačena kada se desi
greška stranice, mnogo bolje performanse se dobijaju ako se tada izabire stranica
koja se ne upotrebljava često. Ako se izbaci često korištena stranica, ona će
vjerovatno ubrzo biti vraćena nazad, što izaziva dodatno opterećenje i gubitak
22
Moderni operativni sistemi Upravljanje
memorijom
23
Moderni operativni sistemi Upravljanje
memorijom
stoga određen za taj jedan program sa tim ulaznim podacima. Iako je ovaj metod
koristan za ocjenjivanje algoritama za zamjenu stranica, ne koristi se u realnim
sistemima. Ispod ćemo razmatrati algoritme koji se koriste u realnim sistemima.
4.4.2 NRU (Not Recently Used) algoritam za zamjenu stranica
Iako stranica klase 1, na prvi pogled, izgleda nemoguća, ipak se dešava kada je kod
klase 3 bit R obrisan ciklusnim interaptom. Ciklusni interapti ne brišu bit M jer je ta
informacija neophodna da bi se znalo da li stranica treba da se ponovno ispiše na
disk ili ne. Brisanje bita R, ali ne i bita M dovodi do stvaranja stranice klase1.
NRU algoritam izbacuje stranicu slučajno počevši od najniže neprazne klase.
Implikacija ovog algoritma je da je bolje izbaciti mijenjanu stranicu koja nije bila
referencirana svakog ciklusa (tipično 20 milisekundi), nego brisati stranicu koja se
često koristi. Najveća prednost NRU algoritma je što je lako razumljiv, srednje
efikasan za primjenu i daje performanse koje su, iako ne optimalne, ipak adekvatne.
24
Moderni operativni sistemi Upravljanje
memorijom
dana, neka kompanija počne proizvoditi novu hranu koja se brzo sprema, zamrznuta,
neki organski jogurt koji se reintegriše u mikrotalasnoj pećnici. Taj proizvod ima
zagarantovan uspjeh u prodaji, stoga naš supermarket mora da se otarasi jednog
starog proizvoda da bi na police postavio ovaj novi.
Jedna mogućnost je da se pronađe proizvod koji je na policama bio najduže
(nešto što se počelo prodavati prije mnogo godina), pa da se izbaci pod
pretpostavkom da za njega niko nije više zainteresovan. Supermarket održava
povezanu listu svih proizvoda koje trenutno prodaje i to po redosljedu po kojem su
dolazili. Novi proizvod ide na kraj liste, a onaj na početku liste ispada.
Ova ista ideja je primjenjiva i na algoritam za zamjenu stranica. Operativni
sistem održava listu svih stranica koje se trenutno drže u memoriji, pri čemu je prva
stranica najstarija, a posljednja najnovija. Kada se desi greška stranice, prva stranica
se izbacuje, a nova se stavlja na kraj liste. Kada se primjeni na prodavnice FIFO
može da ukloni gel za brijanje, ali isto tako i brašno, šećer, sol ili margarin. Kada se
primjeni na računare dešava se isti problem. Zbog toga se FIFO u svojoj čistoj formi
rijetko i koristi.
Slika 4-16 Operacije algoritma drugi pokušaj. (a) Stranice sortirane po FIFO poretku.
(b) Lista stranica kada se desi greška stranice u vremenu 20 i A ima R bit setovan.
Brojevi iznad stranica su njihova vremena učitavanja.
pokušaj se degeneriše u čisti FIFO algoritam. Specijalno, neka sve stranice sa slike 4-
16(a) imaju R bitove setovane. Operativni sistem premješta jednu po jednu stranicu
na kraj liste i briše R bitove. Naposlijetku, opet naiđe na stranicu A, koja sada ima R
bit obrisan. Sada se stranica A izbacuje i algoritam završava.
Kada se desi greška stranice istražuje se stranica na koju pokazuje ruka. Ako
je R bit 0, stranica se izbacuje, a nova stranica se stavlja na njeno mjesto u satu, a
ruka se pomjera za jedno mjesto. Ako je R bit 1, on se briše, a ruka se pomjera za
jedno mjesto i pokazuje na slijedeću stranicu. Proces se ponavlja sve dok se ne
pronađe stranica kojoj je R bit 0. Ovaj algoritam se naziva sat. Razlikuje se od
algoritma drugi pokušaj samo u implementaciji.
26
Moderni operativni sistemi Upravljanje
memorijom
prolaze mogu uvijek imati manji brojač nego stranice koje sudjeluju u prolazu 1.
Posljedica ovoga je da će operativni sistem izbaciti stranice koje se koriste umjesto
stranica koje se više ne koriste.
Srećom, male modifikacije NFU algoritma omogućavaju sasvim dobru
simulaciju LRU algoritma. Izmjene sadrže dva dijela. Prvo, svaki brojač se pomjera u
desno za 1 bit prije nego mu se doda R bit. Drugo, R bit se dodaje sasvim lijevom
bitu, a ne sasvim desnom.
Slika 4-19 pokazuje kako radi modifikovani algoritam, nazvan stareći (aging).
Pretpostavimo da nakon prvog vremenskog takta R bitovi za stranice 0-5 imaju
vrijednost 1, 0, 1, 0, 1 i 1, respektivno. Drugim riječima, između takta 0 i takta 1,
stranice 0, 2, 4 i 5 su referencirane, čime je postavljen njihov R bit na 1, dok su
ostali R bitovi ostali 0. Nakon što se 6 odgovarajućih brojača pomjere i R bit se doda
na lijevu stranu, oni imaju vrijednosti date na slici 4-19 (a). Četiri preostale kolone
prikazuju 6 brojača poslije iduća 4 vremenska takta.
Slika 4-19 Stareći algoritam softverski simulira LRU.Prikazane su 6 stranica za 5 vremenskih taktova.
Pet vremenskih taktova predstavljeni su slikama (a) - (e).
9 taktova, a može biti i stranica koja je referencirana prije 1000 taktova. Nema
načina da to vidimo. U praksi, međutim, je 8 bita sasvim dovoljno ako je takt oko 20
msec. Ako stranica nije bila referencirana 160 msec, vjerovatno i nije toliko bitna.
Najčistija forma straničenja je ona kod koje proces počinje bez i jedne stranice
u memoriji. Kada procesor pokuša da uzme prvu instrukciju, dobija grešku stranice,
na što operativni sistem donosi stranicu koja sadrži prvu instrukciju. Druge greške
stranica za globalne varijable i stack obično slijede ubrzo. Poslije nekog vremena,
proces ima većinu stranica koje treba i dalje nastavlja rad sa relativno malo grešaka
stranica. Ovakav način se naziva straničenje po zahtjevu jer se stranice učitavaju
samo po zahtjevu, a ne unaprijed.
Naravno, lako je napisati test program koji sistematski učitava sve stranice u
veliki adresni prostor, izazivajući toliko grešaka stranica da nema dovoljno memorije
da ih sve držala. Na sreću, većina procesa ne radi na ovaj način. Oni razmatraju
lokalnost reference, odnosno tokom svake faze izvršavanja, proces referencira
samo relativno mali dio stranica. Svaki prolaz više-prolaznog kompajlera, na primjer,
referencira samo dio od stranica i pri tom različiti.
Set stranica koje proces trenutno koristi se naziva radni set tog procesa
(Denning, 1968a; Denning, 1980). Ako se čitav radni set nalazi u memoriji, proces će
raditi bez izazivanja mnogo grešaka sve dok ne uđe u drugu izvršnu fazu (tj. novi
prolaz kompajlera). Ako je slobodna memorija premala da drži čitav radni set,
proces će izazvati mnogo grešaka stranica i raditi sporo jer izvršavanje instrukcije
traje nekoliko nanosekundi, učitavanje stranice sa diska obično traje 10 milisekundi.
Pri brzini od 1-2 instrukcije po 10 milisekundi trebati će čitava vječnost da bi proces
završio. Za program koji izaziva greške stranica svakih par instrukcija kaže se da je
pun smeća (thrashing) (Denning, 1968b).
U multiprogramskom sistemu, procesi se često prebacuju na disk (sve njihove
stranice se izbacuju iz memorije) da bi drugi procesi mogli koristiti resurse procesora.
Postavlja se pitanje šta raditi kada se proces ponovo vrati. Tehnički ništa ne treba
činiti. Proces će samo izazivati greške stranica sve dok se njegov radni set ne učita.
Problem je kada imamo 20, 100 ili čak 1000 grešaka stranica svaki put kada se
proces učitava, što jako usporava rad i odnosi znašajno procesorsko vrijeme, pošto
operativnom sistemu treba nekoliko milisekundi procesorskog vremena za svaku
grešku stranice.
Zato mnogi sistemi za straničenje evidentiraju radni set svakog procesa i
osiguravaju da bude u memoriji prije nego se sam proces pokrene. Ovaj pristup se
naziva model radnog seta (Denning, 1970). Dizajniran je tako da uveliko smanji
pojavljivanje grešaka stranica. Učitavanje procesa prije njegovog izvršavanja se
naziva predstraničenje (prepaging). Treba napomenuti da se radni set mijenja u
vremenu.
Odavno je poznato da većina programa ne referencira uniformno svoj adresni
prostor, nego se reference nalaze na malom broju stranica. Memorijska referenca
29
Moderni operativni sistemi Upravljanje
memorijom
može da uzme instrukciju ili podatak ili da skladišti podatke. U bilo kom trenutku t,
postoji set svih stranica korištenih od strane k najkorištenijih memorijskih referenci.
Taj set w(k,t), je radni set. Pošto su najskorije reference, za k=1, koristile sve
stranice koje su koristile najskorije reference za k1, a moguće i druge w(k,t) je
monotono ne rastuća funkcija od k. Granica w(k,t) je konačna, kako k raste, jer
program ne može referencirati više stranica nego što njegov adresni prostor ima
mjesta, a nekoliko programa će koristiti svaku stranicu. Slika 4-20 prikazuje veličinu
radnog seta u funkciji od k.
Slika 4-20 Radni set je set stranica korišten od strane najskorijih memorijskih refereci.
Funkcija w(k,t) je veličina radnog seta u vremenu t.
oslobođeno mjesto (desno) ubacuje broj posljednje referencirane stranice. Set svih k
brojeva stranica u pomjeračkom registru predstavlja radni set. Teoretski, kada se
desi greška stranice, sadržaj pomjeračkog registra može se čitati i sortirati. Duplirane
stranice se, zatim, mogu izbaciti. Kao rezultat ovoga dobija se radni set. Međutim,
održavanje pomjeračkog registra i njegova obrada prilikom greške stranice je
izuzetno skupa, pa se ovo nikada i nije koristilo u praksi.
31
Moderni operativni sistemi Upravljanje
memorijom
Osnovni radni set algoritam je isuviše glomazan, jer skenira čitavu tabelu
stranica prilikom svake greške stranice. Poboljšani algoritam je baziran na sat
algoritmu ali koristi i informacije radnog seta, pa se naziva RS Sat algoritam (WS
Clock, Carr and Hennessey,1981). Zbog svoje jednostavnosti primjene i dobrih
performansi dosta se koristi u praksi.
Struktura podataka koja je potrebna je kružna lista okvira stranica, kao u sat
algoritmu, a prikazana je na slici 4-22(a). Inicijalno, lista je prazna. Kada se učita
prva stranica, doda se na listu. Kako se stranice učitavaju, tako se i dodaju na listu i
formiraju krug. Svaki unos sadrži polje vrijeme posljednjeg korištenja iz osnovnog
radnog seta algoritma, kao i R bit (prikazan) i M bit (ne prikazan).
32
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-22 Operacije RS Sat algoritma (a) i (b) daju primjer što se dešava
kada je R =1. (c) i (d) daju primjer za R=0.
Kao i kod sat algoritma, za svaku grešku stranice prvo biva pregledana
stranica na koju je usmjeren pokazivač. Ako je R bit 1, stranica je korištena u toku
ovog takta pa nije dobar kandidat za izbacivanje. Tada se R bit postavlja na 0,
pomjera se pokazivač na iduću stranicu i ponavlja se algoritam. Stanje nakon ove
sekvence događaja prikazano je na slilci 4-22(b).
Razmotrimo sada što se dešava ako pokazivač pokazuje na stranicu kod koje
je R bit 0, kako je pokazano na slici 4-22(c). Ako je starost veća od i stranica je
“čista”, nije u radnom setu i njena ažurirana kopija nalazi se na disku. Sada se
jednostavno uzima okvir te stranice i stavlja nova stranica u njega, kako je pokazano
na slici 4-22 (d). Sa druge strane, ako je stranica “prljava”, ne može se odmah
izbaciti jer njena kopija na disku nije ažurirana. Da bi se izbjegao proces
prebacivanja, zakaže se zapis na disk, a pokazivač se prebacuje za jedno mjesto
dalje i algoritam nastavlja sa idućom stranicom. Jer u nizu može postojati neka
stranica koja je stara i “čista” i koja se odmah može upotrijebiti.
U principu, svim stranicama može biti zakazano upisivanje na disk ili čitanje sa
diska u jednom krugu. Da bi se smanjio saobraćaj sa diska, postavlja se limit, koji
dozvoljava maksimalan broj od n stranica koje se mogu nazad upisati. Jednom kada
se dostigne taj limit, na zakazuju se novi upisi.
Što se dešava kada pokazivač prođe čitav krug i vrati se na početnu poziciju?
Možemo razlikovati dva slučaja:
1. Zakazano je barem jedno upisivanje
2. Ni jedno upisivanje nije zakazano.
33
Moderni operativni sistemi Upravljanje
memorijom
Intuitivno, može se reći da, što više okvira memorija ima, to će program imati
manje grešaka stranica. Ipak, to nije uvijek tako. Belady et al. (1969) otkrio je
izuzetak u kom FIFO izaziva više grešaka stranica sa 4 okvira nego sa 3. Ovaj
izuzetak nazvan je Beladijeva anomalija. Prikazana je na slici 4-23 za program sa
5 virtualnih stranica, označenih sa brojevima od 0-4. Stranice se referenciraju po
redosljedu
012301401234
Na slici 4-23(b) imamo 10 grešaka stranice sa 4 okvira.
Slika 4-23 Beladijeva anomalija. (a) FIFO sa 3 okvira (b) FIFO sa 4 okvira.
P pokazuje na to koja je referenca stranice izazvala grešku stranice.
jednim procesom, pa svaka mašina ima jedan, određeni referencni string (da imamo
više procesa morali bi u obzir uzeti i preklapanje referencnih stringova ).
Slika 4-25 Stanje memorijskog niza M, nakon što je svaka stavka iz referencnog stringa obrađena.
String udaljenosti će biti razmatran u idućem poglavlju.
36
Moderni operativni sistemi Upravljanje
memorijom
Iako ovaj primjer koristi LRU, model radi jednako dobro i sa drugim
algoritmima. Posebno, postoji jedna klasa algoritama koja je naročito interesantna:
algoritmi sa svojstvom
M(m,r) M(m+1,r)
gdje se m mijenja sa okvirima stranica, a r je indeks u referencnom stringu. Ovo u
stvari znači da je set stranica, koji je uključen u gornji dio M za memoriju sa m
okvira stranica, takođe uključen u gornji dio M poslije r referenci za memoriju sa
m+1 okvira stranica. Drugim riječima, ako povećamo veličinu memorije za jedan
okvir stranice i ponovo pokrenemo proces, u svakom trenutku tokom izvršavanja, sve
stranice koje su bile prisutne prilikom prvog izvršavanja prisutne su i sada zajedno sa
dodatnom stranicom.
Razmatranja slike 4-25 i načina rada LRU, postaje jasno da ovaj algoritam ima
to svojstvo. Neki drugi algoritmi (optimalni) takođe imaju to svojstvo, a neki ne
(FIFO). Algoritmi sa ovakvim svojstvom se nazivaju stack algoritmi. Oni ne pate od
Beladijeve anomalije i teoretičari virtualne memorije ih više vole.
37
Moderni operativni sistemi Upravljanje
memorijom
38
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-27 Proračun broja grešaka stranica iz stringa udaljenosti. (a) Vektor C. (b) Vektor F.
vrijeme (LRU stranicu) između 6 stranica koje su trenutno dodijeljene procesu A, ili
treba da uzme u obzir sve stranice koje su trenutno u memoriji? Ako uzima u obzir
samo stranice od A, stranica sa najmanjom vrijednošću starosti je A5, te dobijamo
situaciju sa slike 4-28(b).
Sa druge strane, ako se izbaci stranica sa najmanjom vrijednošću starosti bez
obzira kom procesu ona pripada, biti će izabrana stranica B3 i dobiti ćemo situaciju
sa slike 4-28(c). Algoritam sa slike 4-28(b) se naziva lokalni algoritam za zamjenu
stranica, dok se algoritam sa slike 4-28(c) naziva globalni algoritmom za zamjenu
stranica. Lokalni algoritmi efektivno odgovaraju alokaciji fiksnog dijela memorije
svakom procesu. Globalni algoritmi dinamički vrše alokaciju okvira stranica između
izvršnih procesa. Tako, broj dodijeljenih okvira stranica, za svaki proces, varira u
vremenu.
Uopšteno, globalni algoritmi bolje rade, posebno kada se veličina radnog seta
mijenja kako se proces izvršava. Ako se koristi lokalni algoritam, a radni set raste,
rezultat će biti proces pun smeća (trashing), čak iako ima dovoljno slobodnih okvira
stranica. Ako se radni set smanjuje, lokalni algoritmi nepotrebno troše resurse
memorije. Ako se koristi globalni algoritam, sistem stalno mora da odlučuje koliko
okvira stranica da dodijeli svako procesu. Jedan način je praćenje veličine radnog
seta, označene pomoću bitova starenja, ali ovaj pristup ne mora da spreči pravljenje
smeća. Veličina radnog seta može da se mijenja u mikrosekundama, pa su bitovi
starenja veoma gruba mjera kroz nekoliko vremenskih taktova.
40
Moderni operativni sistemi Upravljanje
memorijom
stranica jer instrukcija sama po sebi, izvorni operand i krajnji operand mogu svaki
preći granice jedne stranice. Kada bi mu se dodijelilo samo 5 stranica, program sa
takvom instrukcijom ne bi mogao da radi.
Ako se koristi globalni algoritam, moguće je započeti svaki proces sa
određenim brojem stranica koji je proporcionalan veličini procesa, ali alokacija
stranica treba dinamično da se ažurira kako se procesi izvršavaju. Jedan od načina
da se odradi alokacija je korištenje algoritma frekvencije greške stranice – PFF (Page
Fault Frequency). On govori kada povećati ili smanjiti broj alociranih stranica jednom
procesu, ali ne govori ništa o tome koje stranice treba da se izbace kada se desi
greška stranice. On samo kontroliše veličinu seta za alokaciju.
Za velike klase algoritama za zamjenu stranica, uključujući LRU, poznato je da
se broj grešaka stranica smanjuje porastom broja dodijeljenih stranica, kako smo
prije raspravili. Ova pretpostavka stoji u osnovi PFF algoritma. Ovo svojstvo dato je
na slici 4-29.
Slika 4-29 Brzina dešavanja grešaka stranice je funkcija broja dodijeljenih okvira stranica.
41
Moderni operativni sistemi Upravljanje
memorijom
42
Moderni operativni sistemi Upravljanje
memorijom
Većina računara ima jedan adresni prostor koji sadrži i programe i popdatke,
kako je prikazano na slici 4-30 (a). Ako je adresni prostor dovoljno velik, sve lijepo
radi. Međutim, on je često premali, što tera programere da mukotrpno rade na
smještanju svega u datisni prostor.
43
Moderni operativni sistemi Upravljanje
memorijom
44
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-31 Dva procesa koja dijele isti program i njegovu tabelu stranica
Kada dva ili više procesa dijele neki kod, javlja se problem sa dijeljenim
stranicama. Pretpostavimo da procesi A i B oba koriste editor i dijele njegove
stranice. Ako raspoređivač (scheduler) odluči izbaciti A iz memorije, izbacivanjem svih
njegovih stranica i popunjavanjem praznih okvira stranica nekim drugim programom,
izazvati će mnogo grešaka stranica koje će generisati proces B, u cilju vraćanja tih
stranice ponovo vratio u memoriju.
Slično, kada A završi posao, važno je da se otkrije da se stranice još uvijek
koriste, da se njihov prostor na disku ne bi slučajno oslobodio. Pretraživanje svih
tabela stranica da bi se vidjelo da li se stranica dijeli je obično preskupo, pa su
potrebne specijalne strukture podataka da bi se vodila evidencija o dijeljenim
stranicama, posebno ako je jedinica dijeljenja individualna stranica (ili nekoliko
stranica), a ne čitava tabela stranica.
Dijeljenje podataka je komplikovanije nego dijeljenje koda, ali nije nemoguće.
Posebno, u UNIX-u, poslije fork sistemskog poziva, roditelj i dijete treba da dijele i
programski tekst i podatke. U ustraničenom sistemu, često se radi slijedeće: svakom
od tih procesa se daje posebna tabela stranica i njihovi pokazivači se namjeste da
pokazuju na isti set stranica. Tako, nema nikakvog pravljenja kopija stranica tokom
fork vremena. Međutim, sve stranice podataka se mapiraju u oba procesa kao SAMO
ZA ČITANJE.
Sve dok oba procesa samo čitaju svoje podatke, bez mijenjanja, ova situacija
se može nastavljati. Čim proces ažurira memorijsku riječ, prekršaj zaštite samo za
čitanje (read only) izaziva prekid (trap) rada operativnog sistema. Tada se pravi
kopija stranice tako da svaki proces ima svoju kopiju. Obe kopije su sada postavljene
na ČITANJE-PISANJE tako da se poslije upisuje u svaku kopiju bez novih prekida
operativnog sistema. Ova strategija znači da one stranice (uključujući i sve
programske stranice) u koje se nikada ne upisuje ne treba da imaju kopiju. Ovaj
pristup, nazvan kopiraj za upis (copy on write), poboljšava performanse
smanjivanjem kopija.
Straničenje najbolje radi kada ima dovoljno slobodnih okvira stranica koje se
mogu dobiti kada se desi greška stranice. Ako je svaki okvir stranice pun, i mijenjan,
prije nego se mogla nova stranica staviti u njega, stara stranica se prvo mora ispisati
na disk. Da bi se osiguralo dovoljno snabdijevanje slobodnim okvirima stranica,
mnogi sistemi straničenja imaju pozadinske procese, nazvane serverski program
za straničenje, koji miruje većinu vremena ali biva periodično buđen da bi provjerio
stanje memorije. Ako postoji premalo slobodnih okvira stranica, serverski program za
straničenje počinje selekciju stranica koje će izbaciti iz memorije korištenjem
algoritma za izbacivanje. Ako su te stranice bile mijenjane otkad su učitane u
memoriju, upisuju se na disk.
U svakom slučaju, prethodni sadržaj stranice se pamti. U slučaju da je jedna
od izbačenih stranica ponovo potrebna, prije nego što njen okvir bude prepisan
drugim, može se ponovo tražiti i dobiti, njegovim izbacivanjem iz niza slobodnih
okvira stranica. Držanje zalihe slobodnih okvira stranica vodi ka boljim
performanasama od onih koje se dobijaju korištenjem cijele memorije i traženjem
okvira stranice u momentu kada je on neophodan. Na kraju, serverski program za
straničenje osigurava da su svi oslobođeni okviri stranica “čisti”, tako da ne moraju
biti upisivani na disk u velikoj brzini kada budu potrebni.
Jedan od načina implementacije ove politike čišćenja je pomoću sata sa dva
pokazivača. Prednji pokazivač (front hand) se kontroliše preko serverskog programa
za straničenje. Kada pokaže na prljavu stranicu, ona se upiše nazad na disk, a
pokazivač se pomjeri za mjesto. Kada pokaže na “čistu” stranicu, samo se pomjeri za
još jedno mjesto naprijed. Drugi pokazivač (back hand) se koristi za zamjenu
stranica, kao u standardnom sat algoritmu. Samo što je sada, vjerovatnoća da će
drugi pokazivač pokazati na “čistu” stranicu povećana zbog rada serverskog
programa za straničenje.
46
Moderni operativni sistemi Upravljanje
memorijom
poruku opet mapira. Umjesto svih podataka, ovdje se moraju kopirati samo imena
stranica.
Opet, postoji još jedna poboljšana tehnika upravljanja memorijom, koja se
zove raspodijeljena dijeljena memorija (distributed shared memory) (Feely et
al., 1995.; Li, 1986; Li i Hudak, 1989; Zekauskas et al., 1994). ).Ideja je da se
dozvole višestrukim procesima preko mreže da dijele set stranica, moguće ali ne i
neophodno, kao jedan dijeljeni linearni adresni prostor. Kada proces referencira
stranicu koja trenutno nije mapirana, dobija grešku stranice. Upravljač greškama
stranica, koji može biti u jezgru (kernel) ili u korisnikovom prostoru, tada locira
mašinu koja drži stranicu i šalje joj poruku kojom tržida demapira stranicu i pošalje
preko mreže. Kada stranica stigne, ona se mapira i restartuje instrukcija koja je
izazvala grešku stranice. Kasnije, u poglavlju 8 ćemo detaljnije razmotriti
raspodijeljenu dijeljenu memoriju.
47
Moderni operativni sistemi Upravljanje
memorijom
6. Kada je okvir stranice “čist” (odmah ili nakon što je upisan na disk)
operativni sistem pretražuje adrese na disku da bi pronašao stranicu
koja mu treba, i zakazuje njeno učitavanje sa diska u memoriju. Kada
48
Moderni operativni sistemi Upravljanje
memorijom
10. Ova rutina ponovno učita registre i druge informacije o stanju i vraća
korisniku prostor za nastavljanje izvršavanja, kao da se greška nije ni
desila.
Na slici 4-32 prikazana je instrukcija, koja počinjena adresi 1000 i pravi tri
memorijske reference: sama instrukciona riječ i dva ofseta za operande. Zavisno od
toga koja od tri memorijske reference pravi grešku stranice, programski brojač može
biti 1000, 1002 ili 1004 u vrijeme kada se desi greška. Često je nemoguće da
operativni sistem nedvosmisleno odredi gdje je instrukcija počela. Ako je programski
brojač 1002 u vrijeme dešavanja greške. Operativni sistem nema načina da zna da li
je riječ na 1002 memorijska adresa povezana sa instrukcijom na 1000 (npr. lokacija
operanda) ili kod instrukcije.
Ovaj problem je loš, ali mogao je biti još gori. Neki 680x0 adresni modeli
koriste auto-inkrementiranje, što znači da nuspojava izvršavanja instrukcije je
49
Moderni operativni sistemi Upravljanje
memorijom
50
Moderni operativni sistemi Upravljanje
memorijom
informacije o svom porijeklu i veličini. Kada se pokrene prvi proces, dio prostora za
prebacivanje veličine procesa se rezerviše, a preostali dio se umanji za iznos
rezervisanog dijela. Kako se pokreću novi procesi, dodjeljuju im se dijelovi prostora
za prebacivanje koji su veličine njihovog jezgra. Kada oni završe, prostor na disku
koji su zauzimali oslobađa se. Prostorom za prebacivanje se upravlja kao sa listom
praznih dijelova.
Sa svakim procesom povezana je adresa prostora za prebacivanje na disku,
koja se drži u tabeli procesa. Proračunavanje adresa na koje se stranica upisuje
postaje jednostavno: samo treba da se doda ofset stranice u virtualnom adresnom
prostoru na početak prostora za prebacivanje. Međutim, prije nego što proces može
da počne, mora se inicijalizovati područje za prebacivanje. Jedan način je da se
kopira čitava slika procesa u područje za prebacivanje, da bi se mogla pozvati kada
zatreba. Drugi način je da se čitav proces učita u memoriju i pusti da se izbaci
(stranice) kada to bude potrebno.
Međutim, jednostavan model ima problem: proces može da poveća svoju
veličinu nakon početka izvršavanja. Iako je programski tekst obično fiksne veličine,
područje sa podacima može nekada da raste, a i stack može uvijek da raste. Kao
posljedica toga, može biti bolje rješenje da se sačuva prostor za prebacivanje za
tekst, podatke i stack, i dozvoli svakom od tih prostora da sadrže više od jednog
dijela na disku.
Drugi, ekstreman, slučaj je da se u naprijed ništa ne alocira, nego da se
prostor na disku alocira za svaku stranicu onda kada se ona izbaci iz memorije i
ponovo oslobodi kada se ona prebaci nazad u memoriju. Na ovaj način, procesi u
memoriji ne vežu prostor za prebacivanje. Loša strana ovoga je što je potrebno da se
u memoriji drži adresa na disku da bi se mogla pronaći svaka stranica koja je
neophodna, a koja se nalazi na disku. Drugim riječima, mora postojati tabela za svaki
proces koja će sadržati informacije o tome gdje se svaka stranica nalazi na disku. Te
dvije alternative prikazane su na slici 4-33.
51
Moderni operativni sistemi Upravljanje
memorijom
4.8 SEGMENTACIJA
Svaka od prve 4 tabele stalno raste kako kompajliranje napreduje. Posljednja raste i
smanjuje se, tokom kopajliranja, na nepredvidiv način. U jednodimenzionoj memoriji,
ovih 5 tabela treba da budu alocirane kao niz dijelova u virtualnom adresnom
prostoru, kao na slici 4-35.
Razmotrimo šta se dešava ako program ima izuzetno velik broj promjenjivih, a jedan
normalan broj svega ostalog. Dio adresnog prostora alociran za tabelu simbola se
može napuniti, a da bude još dosta mjesta u ostalim tabelama. Kompajler može da,
jednostavno pošalje poruku da kopajliranje ne može da se nastavi zbog prevelikog
53
Moderni operativni sistemi Upravljanje
memorijom
broja promjenjivih, ali to uopće ne izgleda dobro jer je ostalo dosta slobodnog
prostora u drugim tabelama.
54
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-36 Segmentirana memorija dozvoljava svakoj tabeli da raste ili da se smanjuje
nezavisno od ostalih tabela.
segmentu. Normalno, segment neće sadržati proceduru i stack, već jedno ili drugo.
Pošto svaki segment sadrži samo jedan tip objekata, on može imati i zaštitu koja je
odgovarajuća za taj tip. Segmentacija i straničenje upoređeni su na slici 4-37.
56
Moderni operativni sistemi Upravljanje
memorijom
Ako su segmenti veliki, može biti nezgodno, ili čak nemoguće, držati ih u
glavnoj memoriji u cijelosti. Ovo upućuje na ideju da bi se mogli straničiti, tako da
samo one stranice koje su zaista potrebne budu u memoriji. Nekoliko značajnih
sistema podržavaju straničenje segmenata. U ovom poglavlju opisati ćemo prvi:
MULTICS. U idućem razmatrati ćemo noviji sistem: Intel Pentium.
MULTICS je radio na Honeywell 600 mašinama i njegovim potomcima i
obezbjeđivao je svaki program sa virtualnom memorijom koja je imala do 2 18
segmenata (više od 25,000), od kojih je svaki mogao imati do 65,536 (36 bita) riječi.
Da bi ovo implementirao, MULTICS-ovi dizajneri su odabrali da tretiraju svaki
segment kao virtualnu memoriju i da je ustraniče, kombinovanjem prednosti
straničenja (uniformna veličina stranica i mogućnost ne držanja čitavog segmenta u
memoriji ako se samo njegov dio koristi) sa prednostima segmentacije (lakoća
programiranja,modularnost, zaštita i dijeljenje).
Svaki MULTICS-ov programima tabelu segmenata, sa jednim deskriptorom po
segmentu. Pošto postoji potencijalno više od četvrtine miliona unosa u tabelu, sama
tabela segmenata je sama segment i takođe se straniči. Deskriptor segmentasadrži
indikator da li je segment u glavnoj memoriji ili nije. Ako je bilo koji dio segmenta u
memoriji, za segment se smatra da je u memoriji, pa će i njegova tabela stranica biti
u memoriji. Ako je segment u memoriji, njegov deskriptor sadrži 18-bitni pokazivač
na njegovu tabelu stranica (pogledati sliku 4-39(a)).Zbog toga što su fizičke adrese
24-bitne, a stranice su složene po 64-bajtnim granicama (upućuje na to da su 6 bita
adrese stranica, koji su nižeg reda, 000 000), samo 18 bitova je potrebno deskriptoru
da pohrani adresu tabele stranica. Deskriptor takođe sadrži veličinu segmenta, bitove
zaštite i nekoliko drugih stavki. Slika 4-39(b) prikazuje MULTICS-ov deskriptor
segmenta. Adresa segmenta u sekundarnoj memoriji ne nalazi se u deskriptoru
segmenta, već u drugoj tabeli koju koristi upravljač greškama tog segmenta.
57
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-39 MULTICS-ova virtualna memorija. (a) deskriptor segment pokazuje na tabele stranica.
(b) deskriptor segmenta. Brojevi označavaju dužinu polja.
Svaki segmant je običan virtualni adresni prostor i straniči se na isti način kao i
nesegmentirana straničena memorijakoja je opisana ranije. Normalna veličina
stranice je 1024 riječi (iako nekoliko malih segmenata korišteni od samog MULTICS-a
nisu straničeni ili su straničeni u jedinicama od 64 riječi da bi uštedili fizičku
memoriju).
Adresa u MULTICS-u se sastoji od dva dijela: segment i adresa u segmentu.
Adresa u segmentu se dalje dijeli na broj stranice i riječ u stranici, kako je pokazano
na slici 4-40. Kada se desi memorijska referenca, dešava se slijedeći algoritam.
1. Koristi se broj segmenta za nalaženje deskriptora segmenta.
2. Vrši se provjera da bi se ustanovilo da li je tabela stranica segmenta u
memoriji. Ako nije, dešava se greška segmenta. Ako postoji prekršaj
zaštite, dešava se prekid (trap).
3. Proučava se unos u tabelu stranica za zatraženu virtualnu stranicu. Ako
stranica nije u memoriji, dešava se greška stranice. Ako jeste u memoriji,
adresa glavne memorije na početku stranice se izvlači iz unosa u tabelu
stranica.
4. Dodaje se ofset na stranicu da bi dobili adresu u glavnoj memoriji na kojoj
je riječ locirana.
5. Napokon se čita ili smješta.
58
Moderni operativni sistemi Upravljanje
memorijom
Kao što ste do sada bez sumnje pretpostavili, da se algoritam zaista izvršava
od strane operativnog sistema za svaku instrukciju, programi ne bi bili baš brzi. U
stvarnosti, MULTICS-ov hardver sadrži 16 riječivelik, veoma brz TLB koji može
pretraživati sve unose, paralelno, za dati ključ. On je prikazan na slici 4-42. Kada se
adresa predstavi računaru, hardver za adresiranje prvo provjeri da li je virtualna
adresa u TLB-u. Ako jeste, odmah dobija broj okvira stranice od TLB-a i formira
stvarnu adresu referencirane riječi bez pregleda segmenta deskriptora ili tabele
stranica.
59
Moderni operativni sistemi Upravljanje
memorijom
60
Moderni operativni sistemi Upravljanje
memorijom
Slika 4-44 Pentiumov deskriptor kod segmenta. Segmenti podataka se malo razlikuju.
Na slici 4-46 (a) vidimo linearnu adresu podijeljenu na tri polja, Dir, Page
(stranica) i Offset (ofset). Dir polje se koristi kao indeks u direktoriju stranica da bi se
pronašao pokazivač na odgovarajuću tabelu stranica. Page polje se koristi kao indeks
u tabeli stranica da bi se pronašla fizička adresa okvira stranice. Konačno, Offset se
dodaje na adrese okvira stranice da bi se dobila fizička adresa bajta ili riječi koja je
potrebna.
Unosi u tabelu stranica su 32-bitni, 20 bitova sadrđi broj okvira stranice.
Preostali bitovi sadrže pristupne (access) i “prljave” bitove, koje postavlja hardver, a
koje koristi operativni sistem, bitove zaštite i druge korisne bitove.
Svaka tabela stranica ima unose za 1024 4-KB okvira stranica, pa jedna tabela
stranica koristi 4 megabajta memorije. Segment koji je manji od 4M imati će
direktorij stranica sa samo jednim unosom, pokazivač na njegovu jednu jedinu tabelu
stranica. Na ovaj način, za male segmente biti će dodatne samo dvije stranice,
umjesto milion stranica koje bi bile potrebne u jedno-nivoovskoj tabeli stranica.
Da bi se izbjeglo ponavljanje memorijskih referenci, Pentium, kao i MULTICS,
ima mali TLB koji direktno mapira većinu nedavno korištenih Dir-Page kombinacija u
fizičke adrese okvira stranica. Samo kada trenutna kombinacija nije prisutna u TLB-u,
odvija se mehanizam prikazan na slici 4-46, a TLB se ažurira. Sve dok su promašaji
TLB-a rijetki, performanse su dobre.
62
Moderni operativni sistemi Upravljanje
memorijom
4.10 ZAKLJUČAK
64
Moderni operativni sistemi Upravljanje
memorijom
65