Sie sind auf Seite 1von 65

Moderni operativni sistemi Upravljanje

memorijom

UPRAVLJANJE MEMORIJOM

Memorija je važan resurs kojim se pažljivo mora upravljati. Današnji prosječni


kućni računari imaju oko hiljadu puta više memorije nego IBM7094 (najveći računar
toga doba na svijetu napravljen početkom 1960-tih), a programi postaju sve veći i
zahtjevniji, pa je i to malo. Da parafraziramo Parkinsonov zakon “Programi se šire da
bi popunili memoriju koja im je na raspolaganju”. U ovom poglavlju razmatrati ćemo
kako operativni sistemi upravljaju memorijom.
Ono što bi svaki programer volio imati na raspolaganju je upravo beskonačno
velika, beskonačno brza memorija koja ne gubi svoju sadržinu kada joj se uskrati
napajanje. Dok smo kod ovog pitanja zašto ne tražiti da je i veoma jeftina? Međutim,
na našu nesreću tehnologija nam ne može pružiti takvu memoriju. Zbog toga
računari imaju podijeljenu memoriju po hijerarhiji i to: malu količinu vrlo brze,
skupe keš memorije, magabajte srednje brze, srednje skupe glavne memorije (RAM)
i gigabajte spore, jeftine memorije koja ne gubi svoju sadržinu kada se ukine
napajanje (hard disk). Posao operativnog sistema je da koordinira upotrebu ovih
memorija.
Dio operativnog sistema koji upravlja memorijom zove se upravljač
memorije. Njegov posao je da pamti koji dio memorije se koristi, a koji ne, da
dodijeli memoriju procesu i da je oslobodi kada proces završi svoj posao, da omogući
komunikaciju između glavne memorije i hard diska kada je glavna memorija puna.
U ovom poglavlju razmatrati ćemo različite šeme upravljanja memorijom, od
onih najjednostavnijih do onih veoma složenih. Početi ćemo od početka i sagledati
prvo najjednostavniji sistem upravljanja memorijom, a zatim i sve složenije sisteme.
Kako smo istakli u poglavlju 1. u svijetu računara istorija se ponavlja. Dok se
najjednostavnije šeme memorijskih sistema više i ne koriste kod desktop računara,
kod palmtop i smartcard sistema još imaju svoju primjenu. Zbog toga ih vrijedi i
proučavati.

4.1 OSNOVE UPRAVLJANJA 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.

4.1.1 Monoprogramiranje bez prebacivanja i straničenja

Najjednostavnija šema upravljanja memorijom je kada se izvršava samo jedan


program u datom vremenskom periodu, pri čemu se memorija dijeli između tog
programa i operativnog sistema. Na slici 4-1 pokazane su tri varijacije ovakve šeme.
Operativni sistem može biti na dnu RAM (Random Access Memory) memorije, kako je
pokazano na slici 4-1(a), ili može biti u ROM (Read Only Memory) memoriji na vrhu
memorije, kao na slici 4-1(b), ili pak drajveri uređaja mogu biti na vrhu memorije u
ROM-u a ostatak sistema u RAM-u na dnu memorije, kako je pokazano na slici 4-1
(c). Prvi model se koristio kod servera i miniračunara, a danas se skoro i ne koristi.
Drugi model se koristi kod nekih palmtop računara i kompaktnih (embeded) sistema.
Treći model se počeo koristiti kod starih PC-a koji su radili pod MS-DOS-om, kod njih
se dio ROM memorije zove BIOS (Basic Input Output System).

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.

4.1.2 Multiprogramiranje sa fiksnim particijama

Osim kod nekih jednostavnih kompaktnih sistema, monoprogramiranje se više


i ne koristi. Moderni sistemi dozvoljavaju rad više procesa u isto vrijeme. Rad više
procesa u isto vrijeme znači da, dok jedan proces čeka na ulaz/izlaz, drugi proces
može koristiti procesor. Ovakvo multiprogramiranje povećava iskorištenje procesora.

*
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.

Posljednji algoritam nipodaštava male zadatke ne dajući im čitavu particiju na


raspolaganje, a poželjno je upravo dati prednost malim zadacima i obezbijediti im
najbolji servis, a ne najgori.
Jedan način da se ovo prevaziđe je da se napravi najmanje jedna mala
particija koja će omogućiti da se izvršavaju mali zadaci. Ovim se izbjegava
dodjeljivanje velikih particija malim zadacima.
Drugačiji pristup je da se izvršavanje zadataka odvija prema pravilu koje kaže
da se zadatak koji je podesan za izvršavanje ne može preskočiti više od k puta. Svaki
put kada se preskoči uveća mu se brojač za jedan. Kada brojač bude izbrojao k puta
zadatak se ne može ponovo preskočiti bez izvršavanja.
Sistem sa fiksnim particijama, koje određuje operator ujutro i ne mijenja
poslije, je koristio OS/360 na velikim IBM računarima, jedno duže vrijeme. Taj sistem
se zvao MFT (Multiprogramming with a Fixed number of Tasks or OS/MFT). Lako je
shvatiti i jednostavno primjeniti pravilo: dolazeći zadaci se skupljaju u niz sve dok
odgovarajuća particija ne bude slobodna, kada se zadatak smješta u tu particiju i

3
Moderni operativni sistemi Upravljanje
memorijom

izvršava sve dok ne završi. Danas, samo neki operativni sistemi podržavaju ovaj
model.

4.1.3 Modelovanje multiprogramiranja

Iskorištenje procesora može se poboljšati korištenjem multiprogramiranja.


Prosto rečeno, ako prosječan proces vrši proračun samo 20% od vremena za koje se
nalazi u memoriji, znači da je procesor stalno zauzet ako imamo istovremeno 5
procesa u memoriji. Ovaj model je nerealno optimistički, pošto pretpostavlja da svih
5 procesa neće nikada čekati na ulaz/izlaz u isto vrijeme.
Bolji model je da na iskorištenje procesora gledamo sa probablističke tačke
gledišta. Pretpostavimo da proces troši dio p svog vremena za čekanje na ulaz/izlaz.
Sa n procesa u memoriji u isto vrijeme, vjerovatnoća da svih n procesa čekaju na
ulaz/izlaz je p n. Iskorištenje procesora je dato tada formulom:

iskorištenje procesora = 1 – p n
Slika 4-3 prikazuje iskorištenje procesora u funkciji od n - stepen
multiprogramiranja.

Slika 4-3 iskorištenje procesora u funkciji od broja procesa u memoriji

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.

4.1.4 Analiza performansi sistema kod multiprogramiranja

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.

4.1.5 Realokacija i zaštita

Multiprogramiranje donosi i dva osnovna problema koja se moraju riješiti:


realokacija i zaštita. Pogledajmo sliku 4-2. Sa slike se jasno vidi da će se različiti
poslovi izvršavati na različitim adresama. Kada se program povezuje (linking) (npr.,
glavni program, procedure koje je korisnik napravio, i procedure biblioteka se
kombinuju u jednu adresu), program za povezivanje mora da zna na kojoj adresi u
memoriji program počinje.
Na primjer, pretpostavimo da je prva instrukcija binarnog fajla, kojeg je
napravio povezivač programa (linker), poziv procedure na apsolutnoj adresi 100. Ako
je ovaj program učitan u particiju 1 (na adresi 100K), ova instrukcija će skočiti na
apsolutnu adresu 100, koja je unutar operativnog sistema. U stvari potrebno je
pozvati proceduru na 100K+100. Ako je program učitan u particiju 2, on se izvršava
pozivom na 200K+100, itd. Ovaj problem je poznat kao problem realokacije.
Jedan od mogućih riješenja ovog problema je stvarna promjena instrukcija
kada se program učita u memoriju. Programi učitani u particiju 1 dodaju svakoj
adresi 100K, a programi učitani u particiju 2 dodaju svakoj adresi 200K, itd. Da bi se
odradila ovakva realokacija prilikom učitavanja, povezivač mora u binarni program
dodati i listu ili bitmapu koja će dati informacije o tome koje programske riječi
predstavljaju adrese koje se moraju realocirati, a koje su konstante ili druge stavke
koje se ne moraju realocirati. OS/MFT radi na ovaj način.
Realokacija tokom učitavanja ne riješava problem zaštite. Maliciozni programi
mogu uvijek stvoriti novu instrukciju i doći na nju. Pošto programi u ovim sistemima
koriste apsolutne memorijske adrese, radije nego adrese relativne u odnosu na
registre, nema načina da se spriječi program koji stvara instrukciju koja čita ili
upisuje neku riječ u memoriju. U višekorisničkim sistemima, nikako nije preporučljivo
pustiti proces da čita i upisuje u memoriju koja pripada drugom korisniku.
Riješenje koje je IBM izabrao da zaštiti 360 je podjela memorije u blokove od
2 KB i dodjeljivanje svakom bloku 4-bitnog zaštitnog koda. PSW (Program Status
Word) sadržala je 4-bitni ključ. 360 je hvatao svaki pokušaj izvršavanja procesa u
memoriji čiji se zaštitni kod razlikovao od PSW ključa. Pošto samo operativni sistem
može promijeniti zaštitni kod i ključ, korisnički procesi su spriječeni od miješanja sa
drugim procesima i samim operativnim sistemom.

6
Moderni operativni sistemi Upravljanje
memorijom

Drugo riješenje problema realokacije i zaštite je u opremanju mašina sa dva


specijalna hardverska registra, koji se nazivaju bazni i limit registri. Kada se proces
pokreće, u bazni registar se upiše adresa početka particije, a u limit registar se upiše
veličina particije. Svakoj memorijskoj adresi koja se stvara automatski se dodaje
sadržaj baznog registra prije nego se pošalje u memoriju. Znači, ako bazni registar
sadrži vrijednost 100K, instrukcija CALL 100 (pozovi 100) se efektivno pretvara u
instrukciju CALL 100K+100 bez stvarne njene promjene. Adrese se takođe
provjeravaju u odnosu na limit registar da bi se osiguralo da se memorija ne adresira
izvan particije koja se koristi. Hardver štiti bazne i limit registre od korisnika
programa da ih on ne bi mogao modifikovati.
Manjkavost ove šeme je potreba izvođenja dodatnih upoređivanja za svaku
memorijsku referencu. Poređenja se mogu brzo odraditi, ali dodavanja (adresa) su
spora osim ako se koriste posebna kola za to.
CDC6600 – prvi svjetski superračunar je koristio ovu šemu. Intel 8088
procesor koji se koristi za originalni IBM PC koristio je slabiju verziju ove šeme : imao
je bazne registre ali ne i limit registre.
4.2 PREBACIVANJE (SWAPPING)

Kod batch sistema organizovanje memorije u fiksne particije je lako i efikasno.


Svaki zadatak koji postane prvi u nizu učita se u particiju memorije i ostaje tamo sve
dok ne zavši posao. U memoriji zadaci mogu biti onoliko dugo koliko je potrebno
držeći tako procesor stalno u radu, nema razloga da se koristi nešto još
komplikovanije od toga.
Kod sistema sa vremenskom raspodjelom ili PC koji imaju velike zahtjeve za
radom sa grafikom, situacija je drugačija. Nekada glavna memorija nije dovoljno
velika da drži sve trenutno aktivne procese, stoga se neki moraju držati na disku
odakle se dovlače u memoriju kada je potrebno.
Postoje dva uopštena pristupa kod upravljanja memorijom koji dijelom zavise
od toga koji je hardver na raspolaganju. Najjednostavnija strategija zove se
prebacivanje, a radi se o tome da se svaki proces u cijelosti neko vrijeme izvršava,
a zatim vraća na disk. Druga strategija zove se virtualna memorija koja dozvoljava
da se proces izvršava i ako je samo dijelom u glavnoj memoriji. Prvo ćemo razmotriti
prebacivanje, a zatim i virtualnu memoriju u idućem poglavlju.
Operacije koje radi sistem za prebacivanje prikazane su na slici 4-5. Prvo je
samo proces A u glavnoj memoriji. Tada se formiraju u memoriji procesi B i C ili su
prebačeni sa diska. Na slici 4-5 (d) proces A se prebacuje na disk. Tada proces D
biva prebačen u memoriju, a proces B se prebacuje na disk. Konačno proces A opet
dolazi u memoriju i to na drugačiju poziciju nego prethodni put. Sada se njegove
adrese moraju realocirati ili softverski kada se ubacuje u memoriju ili, što je
vjerovatnije, hardverski tokom izvršavanja programa.

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.

Glavna razlika između fiksnih particija sa slike 4-2 i promjenjivih particija sa


slike 4-5 je da je broj particija, lokacija i veličina particije dinamički promjenjiva s
obzirom na proces koji se upisuje ili izlazi dok su kod prethodnih one bile fiksne. Ovo
upravo doprinosi boljem iskorištenju memorije jer ne postoji tačno određen broj
particija niti je njihova veličina određena tako da ne mogu biti ni premale ni
prevelike. Međutim ovo kopmplikuje alokaciju i realokaciju memorije i praćenje svega
toga.
Kada se prebacivanjem načini određeni broj rupa u memoriji, moguće ih je
spojiti u jednu particiju pomjeranjem svih procesa što je moguće niže. Ovo je
poznato kao zbijanje memorije (memory compaction). Ovaj se proces ipak ne radi
često jer zahtjeva mnogo procesorskog vremena. Na primjer, na mašini sa 256 MB
memorije koja može kopirati 4 bajta u 40 nanosekundi, proces zbijanja čitave
memorije će trajati 2.7 sekunde.
Ostaje još pitanje koliko memorije se treba alocirati procesu kada se kreira ili
dolazi sa diska u memoriju. Ako proces ne mijenja veličinu alokacija je jednostavna :
operativni sistem alocira tačno onoliko memorije koliko je potrebno, ni više ni manje.
Ako, međutim, proces može da mijenja svoju veličinu, dinamičkom alokacijom
memorije sa hrpe, kao u mnogim programskim jezicima, dolazi do problema kada
proces pokuša da poraste. Ako rupa u memoriji graniči sa procesom ona će poslužiti
za proširivanje procesa i biće dodijeljena procesu. Sa druge strane, ako proces u
memoriji graniči sa drugim procesom, tada će rastući proces morati da se prebaci u
dio memorije koji je dovoljno velik ili će jedan ili više drugih procesa morati izaći iz
memorije i preći na disk da bi stvorili dovoljno velik prostor za rastući proces. Ako
proces ne može da raste u memoriji, a prostor za prebacivanje na disku je pun,
proces će morati da čeka ili biti ubijen.
Počto je očekivano da će većina procesa rasti tokom izvršavanja, verovatno je
dobra ideja da ostaviti malo dodatne memorije procesu kada god biva prebačen u
memoriju ili pomjeren. Međutim kada se proces premješta na disk, ne treba da se
premješta taj prazn dio memorije već samo onaj koji se koristi. Slika 4-6(a) prikazuje
konfiguraciju memorije kod koje je za dva procesa dodijeljena dodatna memorija za
njihov rast.

Slika 4-6 (a) Dodjeljivanje segmenta memorije za rast procesa


(b) Dodijeljeni prostor za rastući stack i rastući segment procesa.

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.

4.2.1 Upravljanje memorijom sa bitmapama

Kada se memorija dodjeljuje dinamički, operativni sistem mora upravljati


njome. Uopšteno govoreći, postoje dva načina evidentiranja upotrebe memorije:
bitmape i slobodne liste. U ovom dijelu i slijedećem razmatrati ćemo naizmjenično
ova dva metoda.
Sa bitmapama, memorija je podijeljena u jedinice za dodijeljivanje, možda
veličine od nekoliko riječi do nekoliko kilobajta. Svakoj jedinici za dodijeljivanje
odgovara jedan bit u bitmapi, koji ima vrijednost 0 ako je jedinica slobodna, odnosno
vrijednost 1 ako je zauzeta (ili obratno). Slika 4-7 prikazuje dio memorije i
odgovarajuću bitmapu.

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.

Veličina memorijske jedinice za dodjeljivanje je veoma bitna za projektovanje.


Što je manja jedinica, veća je bitmapa. Međutim, čak i sa jedinicom veličine samo 4
bajta, 32 bita memorije će zahtjevati samo jedan bit u bitmapi. Memorija sa 32xn
bita će koristiti n bita u bitmapi, pa će bitmapa zauzeti samo 1/33 memorije. Ako je
jedinica velika, bitmapa će biti manja, ali će značajna količina memorije biti
neiskorištena u posljednjoj jedinici procesa ako veličina procesa nije jednaka cijelom
umošku veličine jedinice.
Bitmapa daje jednostavan način vođenja evidencije memorijskih riječi kod
fiksne veličine memorije jer veličina bitmape zavisi samo od veličine memorije i
veličine memorijske jedinice. Glavni problem je kada treba dovesti proces od k
memorijskih jedinica u memoriju, upravljač memorijom mora pretražiti bitmapu i
pronaći k uzastopnih 0 bita u mapi. Pretraživanje memorije radi pronalaženja niza
određene dužine je spora operacija, što i predstavlja argument protiv bitmapa.

4.2.2 Upravljanje memorijom pomoću povezanih listi

Drugi način evidentiranja memorije je održavanje povezanih lista dodijeljenih i


slobodnih memorijskih segmenata, gdje je segment ili proces ili memorijska rupa
između dva procesa. Memorija prikazana na slici 4-7 (a) je na slici 4-7 (c)

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.

Slika 4-8 Četiri susjedne kombinacije za proces x koji završava.

Kada se procesi i memorijske rupe drže na listi poredani po adresama, može


se upotrebiti nekoliko algoritama za dodjeljivanje memorije novo nastalom procesu
(odnosno procesu koji je prebačen sa diska). Pretpostavimo da upravljač memorijom
zna koliko memorije treba dodijeliti. Najjednostavniji algoritam je prvi pogodan.
Upravljač memorijom skenira listu segmenata sve dok ne nađe memorijsku rupu koja
je dovoljno velika. Rupa se sada dijeli na dva dijela, jedan dio zauzima proces, a
drugi dio je neiskorištena memorija (osim u statistički malo vjerovatnim slučajevima
kada su proces i rupa iste veličine). Prvi pogodan je brz algoritam jer pretražuje što
je moguće manje.
Manja varijanta prethodnog algoritma je slijedeći pogodan. Radi na isti
način kao i prvi pogodan, osim što vodi evidenciju o tome gdje nalazi odgovarajuću
rupu. Kada se pozove da nađe rupu, slijedeći pogodan počne da pretražuje listu od
onog mjesta na kome je stao prošli put, umjesto da uvijek ide od početka kao što to
radi prvi pogodan. Bays-ove simulacije (1977) pokazuju da slijedeći pogodan daje
nešto lošije rezultate nego prvi pogodan.
Još jedan veoma poznat algoritam je najbolji pogodan. Najbolji pogodan
pretražuje čitavu listu i uzima najmanje rupe koje su odgovarajuće. U cilju štednje
velikih rupa koje je šteta razbijati na manje dijelove jer mogu trebati kasnije, najbolji
pogodan pokušava pronaći rupu koja je najpribližnija stvarnoj veličini memorije koja
je potrebna.
Kao primjer prvog i najbolje pogodnog algoritma, razmotrimo ponovo
algoritam 4-7. Ako je potreban blok veličine 2, prvi pogodan će dodijeliti memorijsku
rupu 5, dok će najbolji pogodan dodijeliti memorijsku rupu 18.
Najbolji pogodan je sporiji algoritam od prvog pogodnog jer pretražuje čitavu
listu svaki put kada se pozove. Unatoč tome upravo do manjeg iskorištenja memorije
dolazi kada se koristi najbolji pogodan algoritam jer on cjepka memoriju u mnoštvo

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.

4.3 VIRTUALNA MEMORIJA

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

jer dopuštaju istovremeno nekoliko dopuna u memoriji. Dopune su držane na disku i


njih je operativni sistem po potrebi prebacivao u memoriju i obratno.
Iako je prebacivanje dopuna izvršavao sistem, podjelu programa na dijelove
morao je raditi programer. Podjela programa na male dijelove (module) je dosadna i
oduzima mnogo vremena. Nije prošlo mnogo vremena dok netko nije smislio način
da čitav posao obavlja računar.
Metod koji je izmišljen (Forteringham, 1961) je postao poznat kao virtualna
memorija. Osnovna ideja koja stoji iza pojma virtualne memorije je da veličina
programa, podataka i staka može prevazići veličinu fizičke memorije koja stoji na
raspolaganju. Operativni sistem drži u glavnoj memoriji dijelove programa koji se
trenutno koriste, a ostatak na disku. Na primjer, 16 MB program može da radi na 4
MB mašini pažljivim odabirom kojih 4 MB programa će biti u memoriji u svakom
trenutku, prilikom čega se dijelovi programa, po potrebi, prebacuju sa diska u
memoriju i obratno.
Virtualna memorija može da radi i na multiprogramskim sistemima, kod kojih
u memoriji ima mnogo dijelova različitih programa, istovremeno. Kada program čeka
da jedan njegov dio bude prebačen u memoriju, on čeka na ulaz/izlaz i tada ne može
da se izvršava, pa se tada procesorsko vrijeme dodijeljuje drugom procesu, na isti
način kao i kod multiprogramskih sistema.
4.3.1 Straničenje (Paging)

Većina sistema sa virtualnom memorijom koristi tehniku zvanu straničenje,


koju ćemo sada opisati. Na svakom računaru postoji grupa memorijskih adresa koje
program može da proizvede. Kada program koristi instrukciju kao što je

MOV REG, 1000

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.

Ove programski generisane adrese zovu se virtualne adrese i one formiraju


virtualni adresni prostor. Na računarima bez virtualne memorije, virtualne adrese
se stavljaju direktno na memorijsku magistralu usljed čega dolazi do upisivanja ili
iščitavanja fizičke memorijske riječi na toj adresi. Kada se koristi virtualna memorija,
virtualne adrese ne idu direktno na memorijsku magistralu, već idu na MMU (Memory
12
Moderni operativni sistemi Upravljanje
memorijom

Management Unit) koja mapira (pretvara) virtualne adrese u fizičke, kako je


pokazano na slici 4-9.
Veoma jednostavan primjer pretvaranja adresa prikazan je na slici 4-10. U
ovom primjeru imamo računar koji generiše 16 bitne adrese od 0 do 64K. Ovo su
virtualne adrese. Računar, međutim ima samo 32 KB fizičke memorije, pa iako se
mogu izvršavati 64 KB programi, oni se ne mogu učitati u potpunosti u memoriju i
izvršiti. Kompletna kopija slike programskog jezgra, do 64 KB, mora postojati na
disku, da bi se svi njegovi dijelovi mogli prebacivati, po potrebi, u memoriju.
Virtualni adresni prostor je podijeljen u jedinice – stranice (pages).
Odgovarajuće jedinice u fizičkoj memoriji nazivaju se okviri stranica (page frames).
Oni su uvijek istih veličina. U ovom primjeru oni su veličine 4 KB, ali u realnim
sistemima veličina stranice ide od 512 bajta do 64 KB. Sa 64 KB virtualnog adresnog
prostora i 32 KB fizičke memorije, dobijamo 16 virtualnih stranica i 8 okvira stranica.
Prenos između RAM i diska se odvija uvijek u jedinicama - stranica.
Kada program pokuša da priđe adresi 0, na primjer, koristeći instrukciju

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

MOV REG, 8192

se efikasno transformiše u

MOV REG, 24576

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

Slika 4-10 Relacije između virtualnih adresa i fizičkih memorijskih adresa


date su tabelom stranica.

Šta se dešava ako program pokušava da koristi nemapiranu stranicu, npr


koristeći instrukciju

MOV REG, 32780

koja predstavlja bajt 12 u virtualnoj stranici 8 (startuje sa 32768)?


MMU detektuje da stranica nije mapirana i kaže procesoru da zaustavi (trap)
operatrivni sistem. Ovo se naziva pogrešna strana (page fault). Operativni sistem
uzima malo korišten okvir stranice i upisuje njegovu sadržinu nazad na disk. Zatim
uzima stranicu koja je trenutno referencirana i stavlja je u upravo oslobođen okvir
stranice, mijenja mapu i restartuje zaustavljenu instrukciju.
Na primjer, ako operativni sistem namjerava da izbaci okvir stranice 1, on će upisati
virtualnu stranicu 8 na fizičku adresu 4K i napraviti dvije izmjene u mapi MMU-a. Prvo
će zabilježiti unos virtualne stranice 1 kao nemapiran, da bi onemogućio svaki
mogući pristup virtualnim adresama između 4K i 8K. Tada će zamijeniti krstić u
unosu virtualne strane 8 sa sadržajem iz 1, tako da kada se zaustavljena instrukcija
restartuje, virtualna adresa 32780 se mapira u fizičku adresu 4108.
Pogledajmo sada unutar MMU-a da bi vidjeli kako radi i zašto smo izabrali da je
veličina stranice stepen 2 (2n). Na slici 4-11 prikazan je primjer virtualne adrese,
8196(binarno 0010000000000100), koja se mapira pomoću mape MMU sa slike 4-10.
Dolazeća 16 bitna virtualna adresa se dijeli na 4-bitni broj stranice i na 12-bitni
ofset. Sa 4 bita za broj stranica možemo imati 16 stranica i sa 12 bita za ofset
možemo adresirati svih 4096 bajtova u stranici.
Broj stranice se koristi kao indeks u tabeli stranica, što znači da su brojevi
okvira stranica u vezi sa virtualnom stranicom. Ako je prisutan/odsutan bit 0, doći će
do zaustavljanja (trap) operativnog sistema. Ako je bit 1, znači da je broj okvira
stranice, koji je pronađen u tabeli stranica, kopiran u visoko prioritetni izlazni 3-bitni
registar zajedno sa 12-bitnim ofsetom koji se kopira neizmijenjen sa dolazeće
virtualne adrese. Zajedno oni formiraju 15-bitnu adresu fizičke memorije.

4.3.2 Tabele stranica (Page Tables)

14
Moderni operativni sistemi Upravljanje
memorijom

Mapiranje virtualnih adresa u fizičke je u najjednostavnijem slučaju onako


kako smo ga opisali. Virtualna adresa se dijeli na broj virtualne strane (bitovi ve će
vrijednosti) i na ofset (bitovi manje vrijednosti). Na primjer, sa 16-bitnom adresom i
4KB veličinom stranice, prva 4-bita (bitovi veće vrijednosti) mogu specificirati jednu
od 16 virtualnih adesa, a preostalih 12 bitova bi tada specificirali ofset (0 do 4095) u
odabranoj stranici. Međutim, takođe je moguć dio sa 3, 5 ili nekim drugim brojem
bita stranice. Različite veličine dijelova dovode do različitih veličina stranica.

Slika 4-11 Unutrašnje operacije MMU-a sa 16 4-KB stranica


Broj virtualne stranice se koristi kao indeks u tabeli stranica i služi za nalaženje
unosa za tu virtualnu stranicu. Iz unosa u tabelu stranica nalazi se broj okvira
stranice (ako postoji). Broj okvira stranice je nadodat na kraj bitova veće težine kod
ofseta, odnosno dolazi na mjesto gdje je prethodno bio broj virtualne stranice da bi
tako oformio fizičku adresu koja se može poslati u memoriju.
Svrha tabele stranica je mapiranje virtualnih stranica u okvire stranica.
Matematički govoreći tabela stranica je funkcija sa brojem virtualne stranice kao
argumentom i fizičkim brojem okvira kao rezultatom. Korištenjem rezultata ove
funkcije, polje virtualne stranice u virtualnoj adresi može se zamijeniti sa poljem za
okvir stranice i na taj način dobiti fizičku adresu u memoriji.
Unatoč ovom jednostavnom opisu, mora se obratiti pažnja na dva glavna
pitanja:
1. Tabela stranica može biti veoma velika.
2. Mapiranje mora biti brzo.
Prvo pitanje proizlazi iz činjenice da moderni računari koriste virtualne adrese sa
najmanje 32 bita. Sa, recimo, veličinom stranice od 4 KB, 32-bitni adresni prostor
ima 1 milion stranica, a 64-bitni adresni prostor ima i mnogo više stranica. Sa 1
15
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

Da bi prevazišli problem koji nastaje stalnim stavljanjem velikih tabela stranica


u memoriju, mnogi računari koriste višenivoovske tabele stranica. Jednostavan
primjer prikazan je na slici 4-12. Na slici 4-12 (a) prikazana je 32-bitna virtualna
adresa koja je podijeljena na 10-bitno PT1 polje i 12-bitno ofset polje. Pošto je ofset
12-bitni stranice su 4KB, a ima ih ukupno 220.

16
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-12 (a) 32-bitna adresa sa dva polja za tabelu stranica.


(b) Dvo-nivoovske tabele stranica

Tajna metode višenovoovskih tabela stranica je izbjegavanje držanja svih


tabela stranica u memoriji, svo vrijeme. One tabele koje nisu neophodne ne treba ni
da se drže u memoriji. Pretpostavimo, na primjer, da proces zahtjeva 12MB memorije
i to posljednjih 4 MB za program, idućih 4 MB za podatke i gornja 4 MB za stack.
Između vrha podataka i dna stacka je velika memorijska rupa koja se ne koristi.
Na slici 4-12 (b) vidimo kako radi dvo-nivoovska tabela stranica za ovaj
primjer. Na lijevoj strani prikazana je tabela stranica najvišeg nivoa stranica, sa 1024
unosa, koji odgovaraju 10-bitnom PT1 polju. Kada je virtualna adresa prezentovana
MMU-u, ona prvo izvuče PT1 polje i iskoristi njegovu vrijednost kao indeks u vršnoj
tabeli stranica. Svaki od ovih 1024 unosa predstavljaju 4MB, jer se ukupan 4 GB
virtualni adresni prostor dijeli na 1024 bajtne dijelove.
Unos lociran pomoću indeksa iz vršne tabele stranica daje adresu ili broj
okvira stranice drugo-nivoovske tabele stranica. Unos 0 vršne tabele stranica
pokazuje na tabelu stranica za program, unos 1 pokazuje na tabelu za podatke i unos
1023 pokazuje na tabelu stranica za stack. Ostali, osjenčani unosi se ne koriste. PT2
polje se koristi kao indeks za odabranu drugo-nivoovsku tabelu stranica kako bi
pronašli broj okvira stranice za samu stranicu.
Kao primjer, posmatrajmo 32-bitnu virtualnu adresu 0x00403004 (4,206,596
dekadno) koja ima 12,292 bajtova podataka. Virtualnoj adresi odgovara PT1 = 1,
PT2 = 2, ofset = 4. MMU prvo koristi PT1 da indeksira vršnu tabelu stranica i izvrši
unos 1, što odgovara adresama od 4M do 8M. Zatim koristi PT2 da indeksira drugo-
nivoovsku tabelu stranica da bi pronašao i izdvojio unos 3, koji odgovara adresama
12288 do 16383 u sklopu njegovog 4M dijela (apsolutne adrese od 4,206,592 do
4,210,687). Ovaj unos sadrži broj okvira stranice one stranice koja ima virtualnu
adresu 0x00403004. Ako ta stranica nije u memoriji, prisutan/odsutan bit u unosu
tabele stranica je postavljen na 0, čime dolazi do stvaranja greške stranice. Ako je
stranica u memoriji, kombinuje se broj okvira stranice koji je uzet iz drugo-nivoovske
tabele stranica sa ofsetom (4), da bi se konstuisala fizička adresa. Ova adresa se
stavlja na magistralu i šalje u memoriju.

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.

Struktura unosa u tabele stranica

Do sada smo razmatrali strukturu tabela stranica uopšteno, pogledajmo sada


detaljno strukturu unosa jedne tabele stranica. Tačan izgled unosa je veoma zavistan
od same mašine, ali tip informacije koju on nosi je približno isti od mašine do mašine.
Na slici 4-13 dali smo primjer unosa u tabelu stranica. Veličina varira od računara do
računara, ali uobičajena veličina je 32 bita. Najvažnije polje je broj okvira stranice.
Naposlijetku, cilj mapiranja stranica je lociranje ove vrijednosti. Ako je taj bit 1, unos
je validan i može se upotrijebiti. Ako je on 0, virtualna stranica kojoj pripada unos
nije trenutno u memoriji. Pristup unosu tabele stranica sa 0 na mjestu tog bita
izaziva stvaranje greške stranice.

Slika 4-13 Tipičan unos u tabelu stranica.


Bitovi zaštite (Protection bits) govore kakvi pristupi su dozvoljeni. U
nejjednostavnijem slučaju, ovo polje sadrži jedan bit, koji kada je 0 dozvoljava i
čitanje i upis (read/write), a kada je 1 samo čitanje (read only). Složeniji slučaj je sa
tri bita, kada svaki posebno daje dozvolu ili zabranu za čitanje, pisanje i izvršavanje
stranice.
Bitovi promijenjeni (Modified) i referencirani (Referenced) vode računa o
korištenju stranice. Kada se upisuje u stranicu, hardver setuje promijenjeni bit. Ovaj
bit je značajan kada operativni sistem ponovo zatraži okvir stranice. Ako je stranica u
njemu promijenjena (“prljava”), mora se vratiti na disk. Ako nije mijenjana (“čista”),
može se napustiti jer je kopija na disku još uvijek ažurna. Bit se ponekad naziva i
prljavi bit jer odražava stanje stranice.
Referencirani bit je setovan kada god je stranici pristupljeno radi čitanja ili
upisivanja. Njegova vrijednost pomaže operativnom sistemu da izabere stranicu koju
može izbaciti kada se pojavi greška stranice. Stranice koje se ne koriste bolji su
kandidati za izbacivanje, pri čemu važnu ulogu igra ovaj bit u nekoliko algoritama za
zamjenu stranica koje ćemo kasnije razmotriti.
18
Moderni operativni sistemi Upravljanje
memorijom

Na kraju, posljednji bit onemogućeno keširanje služi radi onemogućavanja


keširanja stranice. Ovo svojstvo je važno za stranice koje se mapiraju u registre
uređaja, radije nego u memoriju. Ako operativni sistem u petlji čeka na odziv nekog
ulaznog/izlaznog uređaja na komandu koju mu je uputio, esencijalno je da hardver
hvata riječ sa uređaja, a ne da koristi staru keširanu kopiju. Sa ovim bitom, keširanje
se može isključiti. Mašine, koje nemaju odvojen ulazni/izlazni prostor i ne koriste
mamorijski mapirane ulaze/izlaze, nemaju potrebu za ovim bitom.
Zabilježimo da adresa diska koja se koristi za držanje stranice kada ona nije u
memoriji nije dio tabele stranica. Razlog tome je jednostavan. Tabela stranica sadrži
samo one informacije koje su potrebne hardveru da virtualnu adresu prevede u
fizičku. Informacija koja je potrebna operativnom sistemu za rukovođenje greškama
stranica se drži u softverskim tabelama unutar operativnmog sistema. Hardver nema
potrebe za njom.

4.3.3 TLBs –Translation Lookaside Buffers

Kod većine šema za straničenje, tabele stranica se drže u memoriji, unatoč


njihovoj veličini. Potencijalno, ovo može imati velike posljedice po performanse.
Razmotrimo, na primjer, instrukciju koja kopira jedan registar u drugi. U nedostatku
straničenja ova instrukcija pravi samo jednu memorijsku referencu za uzimanje
instrukcije. Sa straničenjem, biće potrebne dodatne memorijske reference radi
pristupa tabeli stranica. Pošto je brzina izvršavanja ograničena, procesor može uzeti
instrukcije i podatke iz memorije, tako da se dva puta mora obratiti tabeli stranica po
jednom obraćanju memoriji čime se smanjuju performanse za 2/3. Pod ovim
uslovima niko ne bi ovo koristio.
Proizvođači računara znali su za ovaj problem godinama i došli do riješenja.
Riješenje se zasniva na opažanju da većina programa teži da napravi veliki broj
referenci ka malom broju stranica, a ne obratno. Međutim, samo mali dio unosa u
tabele stranica se često čita, dok se ostatak čak rijetko i koristi.
Riješenje koje je proizašlo iz toga je opremanje računara sa malim
hardverskim uređajem za mapiranje virtualnih adresa u fizičke bez prolaska kroz
tabelu stranica. Uređaj je nazvan TLB ili ponekad pridodata memorija (associative
memory), prikazana na slici 4-14. Obično se nalazi unutar MMU-a i sastoji se od
malog broja unosa, u ovom slučaju osam, a rijetko ima više od 64 unosa. Svaki unos
sadrži informaciju o jednoj stranici, broj virtualne stranice, bit koji se setuje kada se
stranica promijeni, kod zaštite (dozvole čitaj/piši/izvrši) i fizički okvir stranice na
kojem je stranica locirana. Ova polja odgovaraju jedan-na-jedan poljima u tabeli
stranica. Još jedan bit pokazuje da li je unos pravilan (tj. u upotrebi) ili ne.

19
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-14 TLB radi ubrzavanja straničenja

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.

Softversko upravljanje TLB-om

Do sada smo pretpostavljali da svaka mašina sa virtualnom memorijom


organizovanom u stranice ima tabele stranica, koje hardver prepoznaje, i TLB. U
ovom modelu upravljanje TLB-om i greškama TLB-a se u potpunosti izvršava preko
MMU hardvera. Zaustavljanje operativnog sistema se dešava jedino kada stranica
nije u memoriji.
U prošlosti, ova pretpostavka je bila tačna. Međutim, mnoge moderne RISC
mašine, uključujući i SPARC, MIPS, Alpha i HP PA odrađuju skoro svo upravljanje
stranicama softverski. Na takvim mašinama, TLB unosi se eksplicitno učitavaju od
strane operativnog sistema. Kada se desi TLB promašaj, umjesto da samo MMU
pregleda tabele stranica, nađe i uzme potrebnu stranicu on generiše TLB grešku i
odbacuje problem u krilo operativnog sistema. Sistem mora pronaći stranicu,
odstraniti unos iz TLB-a, unijeti novi i restartovat instrukciju koja je izazvala grešku.
Naravno, sve ovo mora da se izvede kada je prisutno veoma mnogo instrukcija jer se
promašaji TLB-a dešavaju mnogo češće nego greške stranica.
20
Moderni operativni sistemi Upravljanje
memorijom

Ako je TLB razumno velik (recimo 64 unosa), da bi se smanjio broj promašaja,


softversko upravljanje TLB-om ispada prihvatljivo efikasno. Najveća prednost ovoga
je mnogo jednostavniji MMU, koji oslobađa značajan prostor na procesorskom čipu
za keš i druge karakteristike koje mogu poboljšati performanse. Softversko
upravljanje TLB-om diskutovao je Uhligh et al. (1994.)
Razvile su se razne strategije radi poboljšanja performansi mašina koje koriste
softversko upravljanje TLB-om. Jedan od pristupa pokušava smanjiti i promašaje i
posljedice promašaja TLB-a kada se oni dese (Bela et al., 1994.). Da bi smanjio
promašaje TLB-a, ponekad operativni sistem može da se posluži svojom intuicijom da
predvidi za koje stranice je vjerojatnije da će biti korištene iduće i da učita unose za
njih u TLB. Na primjer, kada klijentski proces šalje poruke serverskom procesu na
istoj mašini, vrlo je moguće da će server uskoro morati da radi. Znajući to, dok se
procesuira zastoj (trap) radi slanja poruke, sistem može takođe provjeriti gdje se
nalaze serverske kodne stranice, stranice sa podacima i stack stranice i mapirati ih
prije nego izazovu TLB greške.
Normalan način procesiranja promašaja TLB-a, bilo hardverskih ili softverskih,
je da se na tabeli stranica izvede proces indeksiranja da bi se locirala referencirana
stranica. Problem softvera u vezi obavljanja ove pretrage je u tome što stranice koje
su u tabeli stranica ne moraju da budu u TLB-u, što izaziva dodatne greške TLB-a
tokom izvršavanja. Ove greške mogu da se redukuju održavanjem velikog (4 KB)
softverskog keša TLB unosa na fiksnoj lokaciji čija se stranica uvijek drži u TLB-u.
Operativni sistem može znatno smanjiti TLB promašaje ako prvo provjerava
softverski keš.

4.3.4 Invertovane tabele stranica

Prethodno opisane tabele stranica zahtjevaju samo jedan unos po virtualnoj


stranici, pošto su indeksirane brojem virtualne stranice. Ako adresni prostor ima 2 32
bajtova, sa 4096 bajtova po stranici, tada je potrebno preko 1 milion unosa u tabelu
stranice. Minimalna veličina tabele stranica će biti tada najmanje 4 megabajta. Na
većim sistemima, ova veličina je moguća.
Međutim, kako se 64-bitni računari polako počinju koristiti, situacija se znatno
mijenja. Ako je adresni prostor 264 bajtova, sa 4-KB stranicama, potrebna nam je
tabela stranice sa 252 unosa. Ako svaki unos ima 8 bajtova, tabela sadrži tada preko
30 miliona gigabajta. Dodjeljivanje 30 miliona gigabajta samo za tabelu stranica nije
moguće, ni sada ni za mnogo godina u budućnosti (ako i uopšte bude ikad moguće).
Posljedica ovoga je potreba za novim rješenjem za 64-bitne virtualne adresne
prostore.
Jedno takvo rješenje invertovana tabela stranice. Ovaj model ima samo
jedan unos po okviru stranice u realnoj memoriji, umjesto jednog unosa po stranici
virtualnog adresnog prostora. Na primjer, sa 64-bitnim virtualnim adresama, 4KB-
nom stranicom i 256 MB RAM-a, invertovana tabela stranice zahtjeva samo 65,536
unosa. Unos pamti što (proces, virtualna stranica) je locirano u okviru stranice.
Invertovane tabele stranica štede mnogo prostora, međutim kada je virtualni
adresni prostor mnogo veći od fizičke memorije vidi se njihov ozbiljan nedostatak:
prebacivanje iz virtualne u fizičku memoriju postaje mnogo teže. Kada se proces n
obrati virtualnoj stranici p, hardver ne može više naći fizičku stranicu koristeći p kao
indeks za tu tabelu stranica. Umjesto toga, mora pretražiti cijelu invertovanu tabelu

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.

Slika 4-15 poređenje tradicionalne i invertovane tabele stranica

Invertovane tabele stranica se danas koriste kod nekih IBM i HP radnih


stanica, a biće sve češće kada se rašire 64-bitne mašine. Drugi pristupi upravljanja
velikom virtualnom memorijom se mogu naći u radovima Huck and Hays, 1993.,
Talluri and Hill, 1994. i Talluri et al., 1995.

4.4 ALGORITMI ZA ZAMJENU STRANICA

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

vremena. Mnogo je rada uloženo na temu algoritama za zamjenu stranica, teoretski i


eksperimentalno. Ispod ćemo opisati neke od najvažnijih algoritama.
Ništa nam ne znači to što se problem zamjene stranica javlja i u drugim
sferama modelovanja računara. Na primjer, većina računara ima jednu ili više keš
memorija koje sadrže nedavno korištene 32-bitne ili 64-bitne memorijske blokove.
Kada je keš pun, neki od blokova se moraju izabrati za izbacivanje. Ovaj problem je
isti kao i zamjena stranica samo što se odvija mnogo brže (mora se izvršiti za
nekoliko nanosekundi, a ne za nekoliko milisekundi kao kod zamjene stranica). Za to
je potreban kraći vremenski period jer se promašaji keš blokova saniraju direktno iz
glavne memorije, pa nema trošenja vremena na pretraživanje i zamjenu.
Drugi primjer je web server. Server može da drži u svojoj keš memoriji
određeni broj često korištenih web stranica. Međutim kada se keš napuni, a nova
stranica biva referencirana, mora se izabrati web stranica koja će biti izbačena.
Razmatranja su slična onim za zamjenu stranica virtualne memorije, osim činjenice
da se web stranice nikada ne mijenjaju u keš memoriji, pa uvijek postoji vjerna
kopija web stranica na disku. U sistemu virtualne memorije, stranice u glavnoj
memoriji mogu biti ili ”prljave” ili ”čiste”.

4.4.1 Optimalni algoritam za zamjenu stranica

Lako opisati najbolji mogući algoritam za zamjenu je ali ga je nemoguće


primjeniti. On ide otprilike ovako. U trenutku kada se desi greška stranice, u memoriji
se nalazi neki set stranica. Jedna od njih će biti referencirana već u idućoj instrukciji
(stranica koja sadrži tu instrukciju). Druge stranice možda neće biti referencirane ni
za idućih 10, 100 ili možda 1000 instrukcija. Svaka stranica se može označiti sa
brojem instrukcija koje će se izvršiti prije nego ta stranica bude prvi put
referencirana.
Optimalni algoritam za zamjenu stranica jednostavno kaže da stranica sa
najvećom brojnom oznakom treba da se izbaci. Ako se neka stranica neće koristiti u
idućih 8 miliona instrukcija, a druga u idućih 6 miliona, izbacuje se prva stranica i
time se greška stranice (koja će ju ponovo uzeti nazad) pomjera što je kasnije
moguće. Računari, kao i ljudi, pokušavaju da neugodne događaje odlože što je
moguće dalje.
Jedini problem ovog algoritma je to što je neostvariv. U trenutku kada se desi
greška stranice operativni sistem nama načina da sazna koja stranica će iduća biti
referencirana (Sličnu situaciju imali smo ranije kada smo razmatrali algoritam koji je
prvo izvršavao najkraći zadatak – kako sistem može da zna koji je zadatak najkraći?).
Ipak, izvršavanjem programa na simulatoru i pamćenjem svih referenciranih stranica,
moguće je primjeniti optimalni algoritam zamjene stranica prilikom drugog
izvršavanja programa, koristeći pri tome informacije o referencama koje su
sakupljene prilikom prvog izvršavanja.
Na ovaj način moguće je uporediti performanse ostvarivih algoritama sa
najboljim mogućim. Ako operativni sistem postigne performanse, recimo samo 1
posto lošije od optimalnog algoritma, trud koji je uložen u traženju boljeg algoritma
će dovesti do poboljšanja od najviše 1 posto.
Da bi se izbjegla svaka moguća konfuzija, treba razjasniti da se taj zapis
referenciranih stranica odnosi samo na program koji je upravo mjeren, i koji ima
jedan tačno određen ulaz. Algoritam zamjene stranica koji je izveden iz njega je

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

Da bi operativni sistem mogao da sakupi korisnu statistiku oko toga koje


stranice se koriste a koje ne, većina računara sa virtualnom memorijom imaju dva
status bita povezana sa svakom stranicom. R je setovan kada god je stranica
referencirana (čitana, upisivano u nju). M se setuje kada je u stranicu upisivano
(kada je mijanjana). Bitovi se nalaze u svakom unosu u tabelu stranice, kako je
pokazano na slici 4-13. Važno je shvatiti da se ti bitovi moraju ažurirati prilikom
svake memorijske reference, pa je neophodno se oni setuju hardverski. Kada se bit
postavi na 1, on ostaje 1 sve dok ga operativni sistem softverski ne resetuje na 0.
Ako hardver nema te bitove, oni se mogu simulirati na slijedeći način. Kada se
proces pokrene, svi njegovi unosi u tabelu stranice se markiraju da nisu u memoriji.
Čim se neka stranica referencira, desiti će se greška stranice. Operativni sistem tada
postavlja bit R na 1 (u svojim internim tabelama), mijenja unos u tabelu stranice
tako što ispravi stranicu postavivši je u mod: SAMO ČITANJE (Read Only) i restartuje
instrukciju. Ako se u stranicu nakon ovoga opet upisuje, javiti će se nova greška
stranice, usljed koje operativni sistem postavlja bit M na 1 i mijenja mod stranice na
ČITAJ/UPIŠI (Read/Write).
R i M bitovi se mogu iskoristiti za pravljenje jednostavnog algoritma za
straničenje, kako slijedi. Kada se proces pokrene, operativni sistem postavlja oba bita
stranice, za sve stranice, na 0. Periodično (na svaki ciklusni interapt – clock
interrupt), bit R se briše, da bi se razdvojile stranice koje nisu bile skoro
referencirane od onih koje jesu.
Kada se desi greška stranice, operativni sistem provjerava sve stranice i dijeli
ih u 4 kategorije na osnovu trenutnih vrijednosti njihovih R i M bitova:

Klasa0: ne referencirana, ne mijenjana


Klasa1: ne referencirana, mijenjana
Klasa2: referencirana, ne mijenjana
Klasa4: referencirana, mijenjana

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.

4.4.3 FIFO (First In - First Out) algoritam za zamjenu stranica

Drugi algoritam je FIFO algoritam. Da bi ilustrovali kako radi zamislimo


supermarket sa tačno k polica koje su predviđene za k različitih proizvoda. Jednog

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.

4.4.4 Drugi pokušaj (Second Chance) algoritam za zamjenu stranica

Jednostavna modifikacija FIFO algoritma koja sprečava izbacivanje često


korištene stranice je razmatranje R bita najstarije stranice. Ako je R bit 0, stranica je
i stara i nekorištena, pa se odmah izbacuje. Ako je R bit 1, bit se briše, stranica se
smješta na kraj liste stranica i njeno vrijeme učitavanja se ažurira kao da je upravo
došla iz memorije. Tada se pretraga nastavlja.
Operacija ovog algoritma, nazvana drugi pokušaj (second chance),
prikazana je na slici 4-16. Na slici 4-16 (a) vidimo stranice A – H koje se drže na
povezanim listama i poređane su vremenima pristizanja u listu.

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.

Pretpostavimo da se greška stranice desi za vrijeme 20. Najstarija stranica je


A, koja je stigla za vrijeme 0, kada je proces počeo. Ako A ima obrisan bit R, ona se
izbacuje iz memorije i biva ili upisana na disk (“ako je prljava” tj. ako je mijenjana) ili
samo izbačena (ako je “čista” tj. nije mijenjana). Sa druge strane, ako je bit R
setovan stranica A se stavlja na kraj liste i njeno “vrijeme učitavanja” se resetuje na
sadašnje (20). R bit se briše. Pretraga za odgovarajućom stranicom za izbacivanje se
nastavlja sa stranicom B.
Algoritam traži staru stranicu koja nije bila referencirana u prethodnom
vremenskom intervalu. Ako su sve stranice bile referencirane, algoritam drugi
25
Moderni operativni sistemi Upravljanje
memorijom

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.

4.4.5 Sat (Clock) algoritam za zamjenu stranica

Iako je drugi pokušaj algoritam moguć, on je nepotrebno neefikasan jer stalno


pomjera stranice po listi. Bolji pristup je držanje svih okvira stranica u cirkularnoj listi
u obliku sata, kako je prikazano na slici 4-17. Ruka pokazuje na najstariju stranicu.

Slika 4-17 Sat algoritam za zamjenu stranica

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.

4.4.6 LRU (Leased Recently Used) algoritam za zamjenu stranica

Dobra aproksimacija optimalnog algoritma je bazirana na činjenici da će


stranice koje su često korištene u zadnjih nekoliko instrukcija biti vrlo vjerovatno
ponovo korištene i u idućih nekoliko instrukcija. Obratno, stranice koje nisu korištene
odavno, vjerovatno će ostati nekorištene i dalje neko duže vrijeme. Ova ideja daje
osnove za novi ostvarivi algoritam: kada se desi greška stranice, izbacuje se stranica
koja nije bila korištena najduže. Ovaj način se zove LRU algoritam straničenja.
Iako je LRU teoretski ostvariv algoritam, on nije jeftin. Da bi se u potpunosti
primjenio LRU algoritam neophodno je održavati povezanu listu svih stranica u
memoriji, sa najkorišćenijim stranicama na početku i sa najmanje korištenim
stranicama na kraju liste. Problem je u tome što lista mora biti ažurirana za svaku
memorijsku referencu. Pronalaženje stranice u listi, njeno brisanje i pomjeranje na
početak je vrlo zahtjevna operacija, čak i na hardverskom nivou (ako pretpostavimo
da se takav hardver može napraviti).
Međutim, postoje i drugi načini za ostvarivanje LRU algoritma. Razmotrimo
prvo najjednostavniji način. Ovaj metod zahtjeva opremanje hardvera sa 64-bitnim

26
Moderni operativni sistemi Upravljanje
memorijom

brojačem C, koji se automatski inkrementira nakon svake instrukcije. Nadalje, svaki


unos u tabelu stranice takođe mora imati dovoljno veliko polje koje će sadržati taj
brojač. Nakon svake memorijske reference, trenutna vrijednost C se skladišti u unos
tabele stranica za upravo referenciranu stranicu. Kada se desi greška stranice,
operativni sistem pregledava sve brojače u tabeli stranica da bi pronašao najmanji.
Ta stranica je najmanje korištena u posljednje vrijeme ( LRU stranica).
Razmotrimo sada drugi hardverski LRU algoritam. Za mašinu sa okvirima
stranica, LRU hardver može da održava matricu od nxn bita, koji svi imaju početnu
vrijednost 0. Kada god je okvir stranice k referenciran, hardver prvo postavlja sve
bitove k-tog reda na 1, zatim postavlja sve sve bitove k-te kolone na 0. U bilo kom
trenutku, red čija je binarna vrijednost najmanja je najmanje korišten, red čija je
vrijednost iduća najmanja je idući najmanje korišten, itd. Rad ovog algoritma dat je
na slici 4-18, za 4 okvira stranice i sa referenciranjem stranica po slijedećem redu:
0123210323
Poslije referenciranja stranice 0, imamo situaciju na slici 4-18(a). Nakon
referenciranja stranice 1, imamo situaciju prikazanu na slici 4-18 (b), itd.

Slika 4-18 LRU koristi matricu kada se referenciraju stranice


po redosljedu: 0, 1, 2, 3, 2, 1, 0, 3, 2, 3.

4.4.7 Softverska simulacija LRU

Iako su oba prethodna algoritma principski ostvariva, malo (ako ih i ima)


mašina ima takav hardver, pa su od male koristi dizajnerima operativnog sistema koji
prave sistem za mašine koje nemaju takav hardver. Umjesto toga, potrebno je
softverski primjenjivo rješenje. Jedna mogućnost je NFU (Not Frequently Used)
algoritam. On zahtjeva da je softverski brojač, koji je povezan sa svakom stranicom,
ima početnu vrijednost 0. Za svaki vremenski interapt, operativni sistem skenira sve
stranice u memoriji. Za svaku stranicu R bit (koji je 0 ili 1) se dodaje brojaču. U
stvari, brojač služi za to da se vodi evidencija o tome koliko se koja stranica često
referencira. Kada se desi greška stranice, stranica sa najmanjim brojačem se
izbacuje.
Glavni problem NFU algoritma je što on nikada ništa ne zaboravlja. Na primjer,
kod višeprolaznog kompajlera se stranice koje se više koriste tokom prolaza 1 mogu
imati još uvijek visok brojač u drugim prolazima. U stvari, ako se desi da prolaz 1 ima
najduže vrijeme izvršavanja od svih ostalih prolaza, stranice koje sadrže kod za druge
27
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).

Kada se desi greška stranice, izbacuje se stranica sa najmanjim brojačem.


Jasno je da će stranica, koja nije bila referencirana, recimo 4 vremenska takta, imati
prve 4 nule u brojaču i tako imati manji brojač u odnosu na stranicu koja nije bila
referencirana 3 vremenska takta.
Ovaj algoritam se razlikuje u odnosu na LRU na dva načina. Razmotrimo
stranice 3 i 5 na slici 4-19 (e). Ni jedna nije bila referencirana za drugi vremenski
takt; obe su bile referencirane za prethodni takt. U skladu sa LRU algoritmom, ako se
stranica mora izbaciti, treba izabrati jednu od te dvije. Problem je što neznamo koja
od te dvije je posljednja referencirana u intervalu između takta 1 i 2. Praćenjem
jednog bita po vremenskom intervalu izgubljena je sposobnost razlikovanja referenci
koje su se desile na početku intervala i onih kasnijih tokom tog intervala. Sve što se
može uraditi jeste izbaciti stranicu 3, jer je stranica 5 bila referencirana i dva takta
ranije, a stranica 3 nije.
Druga razlika između LRU i starećeg algoritmaje što u starećem algoritmu
brojači imaju konačan broj bita, u ovom primjeru 8 bita. Pretpostavimo te dvije
stranice imaju vrijednost brojača 0. Sve što se može uraditi je da se jedna od te dvije
izabere slučajno. U stvarnosti, ona može biti i stranica koja je bila referencirana prije
28
Moderni operativni sistemi Upravljanje
memorijom

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.

4.4.8 Radni set algoritam za zamjenu stranica

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 k1, 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.

Činjenica da većina programa naizmjenično pristupa manjem broju stranica,


pri čemu se taj set mijenja sporo, objašnjava brz porast krive na samom početku, a
zatim spori porast za veliko k. Na primjer, program koji izvršava petlju i zauzima dvije
stranice upotrebom podataka sa četiri stranice, može da referencira svih šest stranica
na svakih 1000 instrukcija, ali referenca na neku drugu stranicu koja je najskorašnja
može biti milion instrukcija ranija u fazi inicijalizacije. Usljed ovog asimptotskog
ponašanja, sadržaj radnog seta nije osjetljiv na vrijednost izabranog k. Drugačije
rečeno, postoji širok opseg vrijednosti k za koje radni opseg ostaje nepromijenjen.
Pošto se radni set sporo mijenja u vremenu, moguće je pretpostaviti, na osnovu
njegovog radnog seta, koje stranice će biti potrebne kada se program restartuje.
Predstraničenje se sastoji od učitavanja tih stranica prije nego je dozvoljeno procesu
da ponovo nastavi sa izvršavanjem.
Da bi se primjenio model radnog seta, neophodno je da operativni sistem vodi
evidenciju stranica koje su u radnom setu. Posjedovanje ove informacije automatski
omogućava algoritam za zamjenu stranica: kada se desi greška stranice, pronaći
stranicu koja nije u radnom setu i izbaciti je. Da bi se ovakav algoritam
implementirao, potreban je tačan način određivanja stranica koje pripadaju radnom
setu, odnosno određivanje stranica koje ni u jednom vremenskom trenutku ne
pripadaju radnom setu.
Kako smo spomenuli gore, radni set je set stranica korištenih u k najskorašnjih
memorijskih referenci. Da bi se primjenio radni set algoritam, neke vrijednosti za k se
moraju unaprijed birati. Kada se izabere neka vrijednost, poslije svake memorijske
reference, set stranica koji se koristio od strane prethodnih k memorijskih referenci
je jedinstveno određen.
No, iako imamo definisan način rada radnog seta to ne znači da ga, na
efikasan način, možemo pratiti u realnom vremenu tokom njegovog izvršavanja.
Zamislimo da imamo pomjerački registar dužine k, kod kojeg se prilikom svake
memorijske reference njegov sadržaj pomjera za jedno mjesto u lijevo i na
30
Moderni operativni sistemi Upravljanje
memorijom

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.

Umjesto toga koriste se razne aproksimacije. Jedna od najčešće korištenih


aproksimacija je odbacivanje ideje ponovnog prebrojavanja k memorijskih referenci
umjesto čega se koristi vrijeme izvršavanja. Na primjer, umjesto da se definiše radni
set stranica koje su korištene u posljednjih 10 miliona memorijskih referenci, koristi
se, naprimjer, definicija radnog seta stranica korištenih u proteklih 100 milisekundi
vremena izvršavanja. U praksi ovakva definicija je dobra i mnogo lakša za korištenje.
Treba zabilježiti da je za svaki proces važno samo vlastito vrijeme izvršavanja. Tako,
ako proces počne sa izvršavanjem u vrijeme T i ima 40 milisekundi procesorskog
vremena, što u realnom vremenu ispada T+100 msec, što se radnog seta tiče
njegovo vrijeme izvršavanja je 40 msec. Količina procesorskog vremena koje je
proces stvarno koristio naziva se trenutno virtualno vrijeme (current virtual
time). Sa ovakvom aproksimacijom, radni set procesa je set stranica koje su
referencirane tokom proteklih  sekundi virtualnog vremena.
Razmotrimo sada algoritam za zamjenu stranica baziran na radnom setu.
Osnovna ideja je pronaći stranicu koja ne pripada radnom setu i izbaciti je. Na slici 4-
21 vidimo dio tabele stranica neke mašine. Pošto su samo stranice koje su u
memoriji kandidati za izbacivanje, stranice koje se ne nalaze u memoriji se ignorišu.
Svaki unos sadrži (najmanje) dve informacije: aproksimativno vrijeme kada je
stranica zadnji put korištena i R bit. Prazan, bijeli pravougaonik simbolizira neka polja
koja nisu potrebna za ovaj algoritam (broj okvira stranice, bitovi zaštite i M bit).
Algoritam radi na slijedeći način. Pretpostavimo da su R i M bitovi postavljeni
hardverski, kako smo i ranije rekli. Slično, periodični vremenski interapt izaziva rad
softvera koji briše R bit za svaki vremenski takt. Za svaku grešku stranice, tabela
stranica se skenira da bi se pronašla odgovarajuća stranica koja će biti izbačena.
Kako se obrađuje svaki unos, ispituje se i R bit. Ako je 1, trenutno virtualno
vrijeme se upisuje u polje vrijeme posljednjeg korištenja (Time of last use) u tabeli
stranica, čime se evidentira da je stranica korištena u vrijeme kada je nastala greška
stranice. Pošto je stranica referencirana u toku tekućeg vremenskog takta, jasno je
da se nalazi u radnom setu i da nije kandidat za izbacivanje (pretpostavlja se da 
obuhvata nekoliko vremenskih taktova).

31
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-21 Radni Set Algoritam

Ako je R 0, stranica nije bila referencirana tokom posljednjeg vremenskog


takta i može biti kandidat za izbacivanje. Da bi vidjeli da li ona treba ili ne treba biti
izbačena, njena starost, koja se dobija oduzimanjem vremena posljednjeg korištenja
od trenutnog virtualnog vremena, se upoređuje sa . Ako je starost veća od 
stranica više nije u radnom setu. Stranica se vraća i nova se ubacuje na njeno
mjesto. Dalje se skenira i ažurira ostatak unosa.
Ako je R 0, ali ako je starost manja ili jednaka , stranica je još uvijek u
radnom setu. Ta stranica se trenutno ne izbacuje, ali se bilježi stranica koja je
najstarija (najmanje vrijeme posljednjeg korištenja). Ako se skenira čitava tabela a
ne nađe se kandidat za izbacivanje, to znači da su sve stranice u radnom setu. U tom
slučaju, ako je pronađena jedna ili više stranica sa R =0, izbacuje se ona koja ima
najveće vrijeme starosti. U najgorem slučaju, sve stranice su bile referencirane
tokom prošlog vremenskog takta (sve imaju R=1), izbacuje se jedna slučajnim
izborom, poželjno “čista” stranica, ako takva postoji.

4.4.9 RS Sat (WSClock) algoritam za zamjenu stranica

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

U prvom slučaju, pokazivač se samo pomjera taražeći čistu stranicu. Pošto su


zakazana dva ili više upisivanja, eventualno će jedno upisivanje da se privede kraju
pa će ta stranica da bude markirana kao “čista”. Prva “čista” stranica na koju
pokazivač naiđe biva izbačena. Ova stranica ne mora biti prva koja je zakazana jer
drajver diska može da rasporedi upiše po redu koji optimizira performanse diska.
U drugom slučaju, sve stranice su u radnom setu jer bi u suprotnom
posljednja bila zakazana za upis. U nedostatku dodatnih informacija, najjednostavnija
stvar koju treba uraditi je tražiti i uzeti bilo koju “čistu” stranicu. Evidencija gdje se
nalazi “čista” stranica se može uraditi u toku čišćenja. Ako nema “čistih” stranica,
izabire se trenutna stranica i upisuje se na disk.

4.4.10 Sažetak algoritama za zamjenu stranica

Razmotrili smo razne vrste algoritama za zamjenu stranica. Ukratko ćemo ih


sada pregledati. Lista algoritama koje smo razmatrali data je na slici 4-23.
Optimalni algoritam zamjenjuje zadnju referenciranu stranicu između trenutnih
stranica. Nažalost, ne postoji način određivanja koja stranica će biti posljednja, pa se
u praksi ovaj algoritam ne može koristiti. Koristi se za poređenje rezultata drugih
algoritama.
NRU algoritam dijeli stranice u 4 klase u zavisnosti od stanja R i M bita.
Izabire se slučajna stranica iz najniže označene klase. Ovaj algoritam je lako
primjeniti, ali je grub, postoje i bolji algoritmi.

Slika 4-23 Algoritmi za zamjenu stranica koji su razmatrani u tekstu.

FIFO vodi evidenciju o rasporedu stranica po kojem su učitavane u memoriju i


koristi njihove povezane liste. Izbacivanje najstarije stranice postaje prost zadatak,
ali se ta stranica može upravo koristiti, pa je FIFO loš izbor.
Drugi pokušaj je modifikacija FIFO algoritma koja provjerava prvo da li se
stranica koristi, a zatim ju izbacuje. Ako se koristi, stranica biva ostavljena. Ova
modifikacija uveliko poboljšava performanse. Sat je samo drugačija primjena drugog
pokušaja. Ima iste perfrmanse, jedino mu je potrebno kraće vrijeme za izvršavanje.
LRU je odličan algoritam, ali se ne može primjeniti bez posebnog hardvera.
NFU je grub pokušaj aproksimacije LRU algoritma. Veoma je dobar. Međutim,
starenje je puno bolja aproksimacija LRU-a i može se efikasno primjeniti. Dobar je
izbor.
Posljednja dva algoritma koriste radni set. Radni set algoritam je razumnih
performansi, ali malo skuplji za primjenu. RS Sat je varijanta koja ne samo da daje
dobre performanse nego je i efikasan za primjenu.
34
Moderni operativni sistemi Upravljanje
memorijom

Sve u svemu, dva najbolja algoritma su starenje i RS Sat. Baziraju se na LRU i


radnom setu, respektivno. Oba daju dobre performanse straničenja i lako se mogu
primjeniti. Postoje još neki algoritmi, ali su ova dva vjerovatno najvažnija u praksi.

4.5 MODELOVANJE ALGORITAMA ZA ZAMJENU STRANICA

Tokom godina, određeni rad je izvršen na modelovanju algoritma za zamjenu


stranica sa teoretskog stanovišta. U ovom poglavlju razmotrit ćemo neke načina
modelovanja algoritama za zamjenu stranica.

4.5.1 Beladijeva anomalija

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.

4.5.2 Stack algoritmi

Mnogi istraživači na polju računarskih nauka su bili zbunjeni Beladijevom


anomalijom i pošeli je izučavati. Taj rad doveo je do razvoja čitave teorije algoritama
za straničenje i njihovih svojstava. Pošto je većina ovog rada izvan interesovanja
knjige, samo ćemo se ukratko upoznati sa njima. Detaljnije informacije na temu
nalaze se u (Maekawa et al., 1987).
Načelno, pristup memoriji jednog procesa karakteriše (uređena) lista brojeva
stranica. Lista se naziva referencni string i igra centralnu ulogu u teoriji. Radi
jednostavnosti, do kraja ovog poglavlja smatrati ćemo da se radi o mašini sa samo
35
Moderni operativni sistemi Upravljanje
memorijom

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 ).

Sistem straničenja se može okarakterisati pomoću tri stavke:

1. Referencni string procesa koji se izvršava.


2. Algoritam za zamjenu stranics.
3. Broj okvira dostupnih u memoriji, m.

Načelno, možemo da zamislimo interpreter koji radi na slijedeći način. Održava


unutrašnji niz M, koji vodi evidenciju o stanju memorije. On ima onoliko članova
koliko proces ima virtualnih stranica n. Niz M je podijeljen na dva dijela. Gornji dio,
sa m unosa, sadrži sve stranice koje su trenutno u memoriji. Donji dio, sa n - m
stranica, sadrži sve stranice koje su bile jednom referencirane ali nisu bile straničene
i nisu u memoriji. Na početku, M je prazan set, pošto nijedna stranica nije bila
referencirana i nema stranica u memoriji.
Kada počne izvršavanje, proces počne emitovanje stranica u referencni string,
jednu po jednu. Kako stranica nailazi, interpreter provjerava da li je u memoriji
(gornji dio M). Ako nije, dešava se greška stranice. Ako postoji prazan slot u memoriji
(gornji dio M sadrži manje od m unosa), stranica se učitava i unosi u gornji dio m.
Ova situacija dešava se samou početku izvršavanja. Ako je memorija puna (gornji dio
M sadrži m unosa), inicira se algoritam za zamjenu stranica da bi izbacio stranicu iz
memorije. Dešava se, u stvari, da se jedna stranica prebacuje sa gornjeg dijela M u
donji dio, a potrebna stranica se ubacuje u gornji dio. Inače, gornji i donji dio M se
mogu odvojeno preurediti.
Da bi nam operacije interpretera bile jasnije, pogledajmo konkretan primjer u
kojem se koristi LRU algoritam. Virtualni adresni prostor ima 8 stranica, a fizička
memorija ima 4 okvira stranica. Na vrhu slike 4-25 prikazan je referencni string koji
sadrži 24 stranice:
021354637473355311172341
Ispod referencnog stringa, imamo 25 kolona od po 8 stavki. Prva kolona, koja je
prazna, odražava stanje M prije početka izvršavanja. Svaka iduća kolona pokazuje M
poslije jedne emitovane stranice po refrenci i njene obrade pomoću algoritma
straničenja. Zadebljani okvir označava vrh M, odnosno prvih 4 slotova, koji
odgovaraju okvirima stranica u memoriji. Stranice unutar zadebljanog okvira se
nalaze u memoriji, a stranice ispod su one koje su izbačene iz memorije i vraćene na
disk.

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

Prva stranica u referencnom stringu je 0, pa se unosi na vrh memorije, kako je


pokazano u drugoj koloni. Druga stranica je 2, pa se unosi na vrh 3 kolone. Ova
radnja izaziva pomjeranje 0 na dolje. U ovom primjeru, novo učitana stranica se
uvijek unosi na vrh, dok se sve ostalo spušta dolje po potrebi.
Svaka od prvih 8 stranica u refrencnom stringu izaziva grešku stranice. Prve 4
se mogu izmanipulisati bez izbacivanja stranice, ali referenciranje 5 stranice, odnosno
za unos nove stranice neophodno je izbaciti jednu staru.
Druga refernca na stranicu 3 ne izaziva grešku stranice, jer se 3 već nalazi u
memoriji. Međutim, interpreter je pomjera sa mjesta na kojem je bila i stavlja je na
vrh, kako je prikazano. Proces se nastavlja dalje sve dok se stranica 5 ne referencira.
Ova stranica je premještena sa donjeg dijela M u gornji dio M (učitana je u
memoriju sa diska). Kada god je referencirana stranica koja nije unutar zadebljanog
okvira, desi se greška stranice, što je i naznačeno slovom P ispod matrice.
Sumirajmo ukratko neke osobine ovog modela. Prvo, kada se stranica
referencira, uvijek se pomjera na vrh unosa M. Drugo, ako je referencirana stranica
već u M, sve stranice iznad nje se pomjeraju na dolje za jedno mjesto. Prenos iz
zadebljanog okvira u drugi dio odgovara stranici koja biva izbačena iz memorije.
Treće, stranice koje su ispod referencirane stranice se ne pomjeraju. U tom smislu,
sadržaj M tačno predstavlja sadržaj LRU algoritma.

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.

4.5.3 String udaljenosti

Za stack algoritme, često je prikladno predstaviti referencni string na


apstraktniji način nego što je to slučaj sa stvarnim brojevima stranica. Referenca na
stranicu će ubuduće biti označena udaljenošću od vrha stacka do mjesta gdje je se
referencirana stranica nalazila. Na primjer, referenca na stranicu 1 u posljednjoj
koloni na slici 4-25 je referenca na stranicu na udaljenosti 3 od vrha stacka (jer je
stranica 1 bila na 3 mjestu prije referenciranja). Za stranice koje još uvijek nisu bile
referencirane, i koje samim tim nisu u stacku (nisu još uvijek u M) se kaže da imaju
udaljenost . String udaljenosti za sliku 4-25 je dat na dnu slike.

37
Moderni operativni sistemi Upravljanje
memorijom

Treba zabilježiti da string udaljenosti ima velik uticaj na perforomanse


algoritma. Na slici 4-26 (a) vidimo funkciju gustine vjerovatnoće za unose u (fiktivni)
string udaljenosti d. Većina unosa u string su između 1 i k. Sa memorijom od k okvira
stranica, ne dešava se mnogo greški stranica.

Slika 4-26 Funkcije gustine vjerovatnoće za dva hipotetička stringa udaljenosti.

Za razliku od prethodnog slučaja, na slici 4-26 (b) reference su raširene tako


da je davanje programu onoliko okvira stranica koliko ima virtualnih stranica jedini
način da se izbjegne velik broj greški stranica. Imati ovakav program jednostavno je
loša sreća.

4.5.4 Predikcija broja greški stranica

Jedno od lijepih svojstava stringa udaljenosti je to što se može koristiti za


predikciju broja grešaka stranica koje će se desiti kod memorija različitih veličina.
Demonstrirati ćemo kako se ovaj proračun može izvesti na primjeru sa slike 4-25. Cilj
je jednim prelazom preko stringa udaljenosti sakupiti informacije koje će biti dovoljne
za predikciju broja grešaka stranica koje će proces izazvati u memoriji sa 1,2,3,...,n
okvira stranica, gdje je n broj virtualnih stranica u adresnom prostoru procesa.
Algoritam započinje skeniranjem stringa udaljenosti, stranicu po stranicu. Vodi
evidenciju o broju pojavljivanja 1, 2, itd. Neka je C i broj pojavljivanja i. Za string
udaljenosti sa slike 4-25, C vektor je prikazan na slici 27(a). U ovom primjeru, desilo
se 4 puta, da je referencirana stranica već na vrhu stacka. Tri puta referencirana je
druga po redu stranica, itd. Neka je C broj pojavljivanja  u stringu udaljenosti.

38
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-27 Proračun broja grešaka stranica iz stringa udaljenosti. (a) Vektor C. (b) Vektor F.

Sada se vektor F izračunava po formuli:


n
Fm  C
k  m 1
k  C

Vrijednost Fm je broj grešaka stranica koje će se desiti sa datim stringom udaljenosti i


m okvira stranica. Za string udaljenosti sa slike 4-25, slika 4-27 (a) daje vektor F. Na
primjer, F1 je 20, što znači da sa memorijom koja ima samo jedan okvir stranice, od
24 reference u stringu, sve će izazvati grešku stranice osim 4 koje su istekao i
prethodne reference stranica.
Da bi vidjeli zašto ova formula radi, vratimo se na zadebljani okvir sa skike 4-
25. Naka je m broj okvira stzranica u gornjem dijelu M. Greške stranica se dešavaju
svaki put kada je elemenat stringa udaljenosti m+1 ili više. Suma u prethodnoj
formuli sabira slučajeve u kojima se takvi elementi pojavljuju. Ovaj model se može
koristiti i za druge predikcije (Maekawa et al., 19879).

4.6 PITANJE DIZAJNA ZA PAGING SISTEME

U prethodnim poglavljima objasnili smo kako radi straničenje, razmotrili smo


nekoliko osnovnih algoritama za zamjenu stranica i pokazali kako ih modelovati.
Međutim, svjesni smo toga da čista mehanika nije dovoljna. Da bi se dizajnirao
sistem, morate znati mnogo više da bi ga natjerali da dobro radi. To je nešto kao
razlika između onoga tko zna kako se pokreću figure u šahu i onoga koji dobro zna
igru. U idućim poglavljima, razmotrit ćemo druga pitanja koja dizajneri moraju
pažljivo da razmotre u cilju dobijanja dobrih performansi sistema straničenja.

4.6.1 Lokalna protiv globalne politike alokacije

U idućim poglavljima razmotriti ćemo nekoliko algoritama za izbor stranice za


zamjenu kada se desi greška. Glavno pitanje, vezano za ovaj izbor (koji smo pažljivo
zapostavljali), je kako memorija treba biti alocirana između konkurentnih izvršnih
procesa.
Pogledajmo sliku 4-28 (a). Na slici su, tri procesa, A, B i C formirali set izvršnih
procesa. Pretpostavimo da se kod A desi greška stranice. Da li bi algoritam za
zamjenu stranice trebao pokušati pronaći najmanje korištenu stranicu u posljednje
39
Moderni operativni sistemi Upravljanje
memorijom

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.

Slika 4-28 Lokalni nasuprot globalnom algoritmu za zamjenu stranica.


(a) Originalna konfiguracija. (b) Lokalna zamjena stranica. (c) Globalna zamjena stranica.
Drugi pristup je da postoji jedan algoritam za dodjelu okvira stranica procesu.
Jedan način je da se periodično određuje broj tekućih procesa i svakom dodjeljuje
ista količina. Tako, sa slobodnih 12,416 okvira stranica i 10 procesa, svaki proces
dobija 1241 okvira. Preostalih 6 idu na pooling i koriste se kada dođe do greške
stranice.
Iako se ovaj metod čini fer, nema mnogo smisla davati isti dio memorije 10KB
i 300KB procesu. Umjesto toga memorija može biti dodijeljena proporcionalno
ukupnoj veličini svakog procesa, pri čemu će 300KB proces dobiti 30 puta više
memorije od 10 KB procesa. Vjerovatno je mudro svakom procesu dodijeliti neki
minimum memorije s kojim bi mogao da radi bez obzira na to koliko je mali. Kod
nekih mašina, na primjer, jedna instrukcija sa 2 operanda može zahtjevati i 6

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.

Mjerenje je pokazalo da je broj greški stranice pravolinijski: samo se izbroji


koliko ima grešaka u sekundi i uzima se srednja vrijednost u prošlih nekoliko sekundi.
Jedan lak način da se ovo uradi je da se doda druga po redu vrijednost tekućoj
srednjoj vrijednosti i podijeli sa 2. Iscrtkana linija označena sa A odgovara broju
grešaka stranica u sekundi koji je neprihvatljivo velik, pa je procesu koji izaziva
greške dato više okvira stranica da bi smanjio broj grešaka u sekundi. Iscrtkana linija
označena sa B odgovara odgovara broju grešaka stranica koji je tako mali da se
može zaključiti da proces ima previše memorije na raspolaganju. U ovom slučaju
okviri stranice se mogu oduzeti od procesa. Tako, PFF pokušava da održi brzinu
straničenja za svaki proces u prihvatljivim granicama.
Važno je napomenuti da neki algoritmi za zamjenu stranica mogu raditi ili sa
lokalnim ili sa globalnim algoritmima. Na primjer, FIFO može zamijeniti najstariju
stranicu od svih procesa u memoriji (globalni algoritam) ili najmanje korištenu
stranicu u posljednje vrijeme koja pripada trenutnom procesu (lokalni algoritam).
Izbor između globalnog i lokalnog je nekada nezavistan od samog algotritma.
Sa druge strane, za druge algoritme za zamjenu stranica, samo lokalna
strategija ima smisla. Posebno, radni set i RS Sat algoritmi se odnose na neke
posebne procese i u tom kontekstu se moraju i koristiti. U stvari, ne postoji radni set
za mašinu kao cjelinu, a pokušavanje korištenja unije svih radnih setova dovodi do
gubitka svojstva lokalnosti i to ne radi dobro.

41
Moderni operativni sistemi Upravljanje
memorijom

4.6.2 Kontrola učitavanja

I sa najboljim algoritmima za zamjenu stranica i optimalnom globalnom


alokacijom okvira stranica procesima, može se desiti da sistem “pravi smeće”. U
stvari, kad god kombinovani radni setovi svih procesa prekorače kapacitet memorije,
može se očekivati pojavljivanje smeća. Jedan od simptoma ove situacije je
pokazivanje PFF algoritma da neki procesi trebaju više memorije, a ni jedan ne treba
manje nego mu je dodijeljeno. U tom slučaju ne postoji način da se da memorija
onim procesima koji je trebaju, bez ugrožavanja drugih procesa. Jedino realno
riješenje je odbacivanje nekih procesa.
Način smanjivanja broja procesa, koji konkurišu za dio memorije, je
prebacivanje nekih od njih nazad na disk i oslobađanje svih stranica koje su oni
držali. Na primjer, jedan proces može biti prebačen nazad na disk, a njegovi okviri
stranica podijeljeni između ostalih procesa koji prave smeće. Ako se pravljenje smeća
zaustavio, sistem može neko vrijeme ovako da radi. Ako se ne zaustavi, drugi proces
mora biti prebačen na disk, itd., sve dok pravljenje smeća ne prestane. Tako, čak i sa
straničenjem, prebacivanje je još uvijek potrebno, jedino što se sada koristi za
smanjivanje potencijalne potražnje meemorije.
Prebacivanje procesa iz memorije na disk da bi se oslobodila memorija
podsjeća na na dvo-nivoovsko raspoređivanje, gdje se neki procesi vraćaju na disk, a
kratko-ročni raspoređivač se koristi za raspoređivanje preostalih procesa. Jasno, dvije
ideje se mogu kombinovati, tako da se prebaci taman toliko procesa nazad na disk
da bi broj grešaka stranica u sekundi bio prihvatliv. Periodično se neki procesi vraćaju
sa diska nazad u memoriju, dok se drugi prebacuju iz memorije na disk.
Međutim, treba razmotriti drugi faktor, a to je stepen multiprogramiranja. Kao
što smo vidjeli na slici 4-4, kada je broj procesa u memoriji premali, procesor može
da miruje znatan period vremena. Ova razmatranja idu u prilog razmatranja ne samo
veličine procesa i brzine straničenja kada se odlučuje koji proces treba da se prebaci
nazad na disk, nego takođe i njegove karakteristike, kao što su da li je procesorski
vezan ili je vezan za izlaz/ulaz i kakve karakteristike će imati preostali procesi.

4.6.3 Veličina stranice

Veličina stranice je često parametar koji se može izabrati od strane


operativnog sistema.Iako je hardver bio dizajniran, na primjer, za 512-bajtne okvire
stranica, operativni sistem može lako posmatrati stranice 0 i 1, 2 i 3, 4 i 5, itd kao
1KB stranice tako što će im uvijek dodijeljivati dva uzastopna 512-bajtna okvira
stranica.
Određivanje najbolje veličine stranice zahtjeva balansiranje nekoliko faktora.
Kao rezultat, ne postoji cjelokupan optimum. Počnimo sa dva faktora koji se takmiče
za malu veličinu stranice. Proizvoljno izabran tekst, podatak, ili stack segment neće
popuniti u potpunosti stranice. U prosjeku, pola finalne stranice će biti prazno. Višak
prostora na stranici je uzalud potrošen. Ovakvo neiskorištenje prostora naziva se
unutrašnja fragmentacija. Sa n segmenata u memoriji i veličini stranice od p
bajtova, np/2 bajtova biti će bačeno na unutrašnju fragmentaciju. Ovakvo
rezonovanje zahtjeva malu veličinu stranice.
Drugi argument za malu veličinu stranice postaje očigledan ako zamislimo
program koji se sastoji od 8 dijelova u nizu od po 4KB svaki. Sa 32 KB stranicom,

42
Moderni operativni sistemi Upravljanje
memorijom

program mora alocirati 32 KB stalno. Sa 16 KB veličinom stranice, on treba samo 16


KB. Sa stranicom veličine 4 KB ili manjom, zahtjeva samo 4 KB u svakom trenutku.
Uopšteno, velika stranica će izazvati više neiskorištenog programa u memoriji od
male stranice.
Sa druge strane, male stranice znače da će program trebati više stranica,
veliku tabelu stranica. 3KB program treba samo četiri 8KB stranice, ali šezdesetčetiri
512 Bajtne stranice. Prebacivanja na disk i sa diska ide jednovremeno jedna stranica,
sa većinom vremena potrošenom na pretraživanje i rotaciono kašnjenje, pa je
prebacivanje male stranice skoro jednako dugo kao i prebacivanje velike. Može
oduzeti 64x10msec za učitavanje šezdesetčetiri 512-bajtne stranice, a samo
4x12msec za učitavanje četiri 8KB stranice.
Na nekim mašinama, tabela stranica se mora učitati u hardverske registre
svaki put kada se procesor prebaci sa jednog procesa na drugi. Na ovim mašinama
male veličine stranica znače da je vrijeme potrebno za učitavanje registara stranice
duže kako veličina stranice postaje sve manja. Nadalje, prostor zauzet tabelom
stranica se povećava kako se veličina stranice smanjuje.
Posljednja tvrdnja bi se mogla matematički analizirati. Neka prosječna veličina
procesa bude s bajtova, a veličina stranice p bajtova. Nadalje, pretpostavimo da
svaki unos u stranicu zahtjeva e bajta. Aproksimativni broj stranica koji je potreban
po jednom procesu je tada s/p, zauzimajuću se/p bajtova prostora tabele stranica.
Neiskorištena memorija posljednje stranice procesa zbog unutrašnje fragmentacije je
p/2. Tako, konačni višak usljed tabele stranica i unutrašnje fragmentacije je dat
sumom ta dva termina
višak = se/p+ p/2
Prva promjenjiva sa desne strane (veličina tabele stranica - s) je velika kada je
veličina stranica mala. Druga promjenjiva (unutrašnja fragmentacija) je mala velika
kada je veličina stranice velika. Optimum se nalazi negdje između. Izjednačavanjem
prvog izvoda po p sa nulom, dobijamo jednačinu:
-se/p2 + 1/2 = 0
Iz ove jednačinemožemo izvesti formulu koja daje optimalnu veličinu stranice (ako se
razmatra samo memorija koja je potrošena na fragmentaciju i veličina tabele
stranica). Rezultat koji se dobija je:
p 2 se
Za s = 1MB i e = 8 bajtova po unosu u tabelu stranica, optimalna veličina stranice je
4 KB. Komercijalni računari korise veličine stranica od 512 bajtova do 64 KB. Tipična
vrijednost koja se je koristila je 1 KB, ali danas sve su mnogo češ.e veličine stranuica
od 4 KB ili 8 KB. Kako memorija raste, raste i veličina stranice (ali ne linearno).
Četvorostruka veličina memorije jedva poduplava veličinu stranice.

4.6.4 Odvojene instrukcije i prostor za podatke

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

Slika 4-30 (a) Jedan adresni prostor. (b) Ovojeni I i D prostori.

Jedno od riješenja (isprobano na 16-bitnom PDP-11) je formiranje posebnih


adresnih prostora za instrukcije (program) i za podatke (data). Oni se nazivaju I -
prostor i D – prostor, respektivno. Svaki adresni prostor ide od 0 do nekog
maksimuma, obično 216 – 232 – 1. Na slici 4-30(b) prikazana su oba. Linker mora da
zna kada se koriste odvojeni I i D prostori, jer se tada podaci ponovno dodjeljuju
virtualnoj adresi 0 umjesto da prate program.
kod računara sa ovakvim uređenjem mogu se straničiti oba adresna prostora
obostrano nezavisno. Svaki ima svoju tabelu stranica, svoje mapiranje virtualih
stranica u fizičke okvire stranica. Kada hardver treba da uzme neku instrukciju, zna
da mora koristiti I prostor i tabelu stranica I prostora. Slično, reference ka podacima
moraju da idu kroz tabelu stranica D prostora. Osim ovoga, posebni I i D prostori ne
uvode nikakve posebne kompliklacije i ne poduplavaju dostupan adresni prostor.

4.6.5 Dijeljene stranice

Još jedno pitanje koje je važno za dizajniranje sistema straničenja je


dijeljenje. Kod velikih multiprogramskih sistema, uobičajeno je da nekoliko korisnika
koristi isti program u isto vrijeme. Jasno, mnogo efikasnije je da se koristi dijeljenje
stranica među korisnicima, da bi se izbjeglo istovremeno pojavljivanje dvije kopije
jedne stranice u memoriji. Jedan od problema je u tome što sve stranice nisu
djeljive. Stranice koje su samo za čitanje, kao što je tekst programa, se mogu dijeliti,
ali stranice sa podacima ne mogu.
Ako su podržani posebno I i D prostori, dijeljenje programa je relativno
prevolinijsko, kada imamo dva ili više procesa koji koriste istu tabelu stranica za
njihov I prostor, ali različite tabele stranica za njihov D prostor. Tipično za
implementaciju, koja podržava dijeljenje na ovaj način, je da su tabele stranica takve
strukture podataka koje su nezavisne od tabele procesa. Svaki proces tada ima dva
pokazivača na njegovu tabelu procesa: jedan na tabelu stranica I prostora i jedan na
tabelu stranica D prostora, kako je prikazano na slici 4-31. Kada raspoređivač
(scheduler) izabere proces za izvršavanje, on koristi pokazivače da bi locirao
odgovarajuču tabelu stranica i postavio MMU pomoću njih. Čak i bez odvojenih I i D
prostora, proces može da dijeli programe (nekad i biblioteke), ali je mehanizam
komlikovaniji.

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.

4.6.6 Politika čišćenja


45
Moderni operativni sistemi Upravljanje
memorijom

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.

4.6.7 Interfejs virtualne memorije

Sve do sada, u našoj čitavoj diskusiji, pretpostavili smo da je virtualna


memorija transparentna za procese i programere, odnosno, da sve što oni vide je
jedan veliki virtualni adresni prostor na računaru sa malom (manjom) fizičkom
memorijom. Kod mnogih sistema, ovo je tačno, ali kod nekih naprednijih sistema,
programeri imaju neku kontrolu nad mapiranjem memorije i mogu je koristiti na
netradicionalan način da bi poboljšali ponašanje programa. U ovom poglavlju,
ukratko ćemo razmotriti neke od njih.
Jedan od razloga za davanje kontrole programerima nad njihovom
memorijskom mapom je da bi se dozvolilo da dva ili više procesa dijele istu
memoriju. Ako programeri mogu dati ime regionima njihove memorije, moguće je da
jedan proces daje drugom ime regiona tako da ga i on može mapirati. Sa dva (ili
više) procesa koji dijele iste stranice, postaje moguće širokopojasno dijeljenje –
jedan proces upisuje u dijeljenu memoriju, a drugi čita iz nje.
Dijeljenje stranica se takođe može iskoristiti za implementaciju visoko-
performansnih sistema za prenos poruka. Normalno, kada se poruka preda, podaci se
kopiraju iz jednog adresnog prostora u drugi, po značajnu cijenu. Ako procesi mogu
da kontrolišu mapu njihovih stranica, poruka se može predati tako što proces koji
šalje poruku demapira stranicu (stranice) koja sadrži poruku, dok je proces koji prima

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.

4.7 PITANJE PRIMJENE

Implementatori sistema virtualne memorije moraju da naprave izbor između


velikih teoretskih algoritama, kao što su druga šansa ili starenje, lokalna ili globalna
alokacija stranica, straničenje na zahtjev ili predstraničenje. Ali oni, takođe moraju
biti svjesni brojnih pitanja kod praktične primjene. U ovom poglavlju razmotriti ćemo
nekoliko najuobičajenijih problema i neka rješenja.

4.7.1 Uloga operativnog sistema u straničenju

Postoje 4 vremena u kojima operativni sistem mora da radi oko straničenja:


vrijeme kreiranja procesa, vrijeme izvršavanja procesa, vrijeme greške stranice,
vrijeme završetka procesa. Sada ćemo ukratko razmotriti svaki od njih da bi vidjeli
šta treba da se uradi.
Kada se kreira novi proces u sistemu straničenja, operativni sistem mora da
odredi koliko će biti velik program i podaci (inicijalno) i mora kreirati tabelu stranica
za njega. Treba da se odredi prostor u memoriji koji će biti dodijeljen tabeli stranica i
treba da se inicijalizuje. Tabela stranica ne treba da bude stalno u memoriji kada se
proces prebaci na disk, ali treba da bude u memoriji kada se proces izvršava.
Dodatno, treba da se odredi prostorna disku za swap fajl, tako da kada se stranica
izbaci iz memorije ima mjesto na disku gdje može da se upiše. Prostor za
prebacivanje se takođe mora inicijalizovati sa tekstom programa i podacima, tako da,
kada se novom procesu počinju dešavati greške stranica, se stranice mogu vratiti u
memoriju sa diska. Neki sistemi straniče programski tekst direktno iz izvršnog fajla,
tako štedeći prostor na disku i vrijeme inicijalizacije. Na kraju, informacije o tabeli
stranica i prostoru za prebacivanje na disku se moraju snimiti u tabelu procesa.
Kada je proces na redu za izvršavanje, MMU se mora resetovati, a TLB
isprazniti da bi se odstranile svi tragovi prethodnog procesa koji se izvršavao. Tabela
stranica novog procesa se mora napraviti tako da bude trenutno važeća, obično tako
što se kopira ili postave pokazivači ka njoj u nekim hardverskim registrima. Opciono,
neke ili sve stranice procesa se mogu upisati u memoriju da bi se smanjio broj
početnih grešaka stranica.

47
Moderni operativni sistemi Upravljanje
memorijom

Kada se desi greška stranice, operativni sistem mora da pročita sadržaj


hardverskih registara da bi odredio koja virtualna adresa je izazvala grešku. Iz ove
informacije, on mora proračunati koja od stranica je potrebna i pronaći tu stranicu na
disku. Mora tada naći slobodan okvir stranice da bi u njega stavio novu stranicu,
nakon što izbaci staru, ako je to neophodno. Tada mora učitati potrebnu stranicu u
okvir stranice. Konačno, mora bekapovati programski brojač da bi on pokazivao na
instrukciju koja je dovela do greške stranice i ponovo pokrenuti izvršavanje iste
instrukcije.
Kada proces završi, operativni sistem mora osloboditi njegovu tabelu stranica,
njegove stranice, i prostor na disku koji zauzimaju stranice kada su na disku. Ako su
neke od stranica dijeljene sa drugim procesima, stranice u memoriji i na disku mogu
jedino biti oslobođene kada završi rad proces koji ih zadnji koristi.

4.7.2 Manipulisanje greškama stranica

Napokon smo u poziciji da opišemo što se dešava sa greškama stranica


detaljno. Niz događaja koji se tom prilikom dešavaju je slijedeći:
1. Hardver zaustavlja rad operativnog sistema (upada u jezgro), snima
programski brojač u stacku. Na većini mašina, neke informacije o stanju
trenutne instrukcije se snima u posebne CPU registre.

2. Rutina u asembleru se počinje izvršavati radi snimanja opštih registara i


drugih informacija koje bi se inače izgubile, odnosno operativni sistem
bi ih uništio. Ove rutine pozivaju operativni sistem kao procedure.

3. Operativni sistem otkriva da sesila greška stranice i pokušava otkriti


koja je virtualna stranica potrebna. Često jedan od hardverskih
registara sadrži ovu informaciju. Ako ne, operativni sistem mora uzeti
programski brojač, uzeti instrukciju i raščlaniti je softverski da bi shvatio
šta radila u trenutku nastanka greške.

4. Sada kada je poznata virtualna adresa koja je izazvala grešku, sistem


provjerava da li je ta adresa ispravna i u skladu sa zaštitom od pristupa.
Ako nije, procesu se šalje signal ili se ubija. Ako je adresa ispravna i ne
javlja se greška zaštite, sistem provjerava da li je okvir stranice
slobodan. Ako ne postoji ni jedan slobodan, pokrene se algoritam za
zamjenu stranica da bi izabrao žrtvu za izbacivanje.

5. Ako je okvir stranice, koji je izabran, prljav, stranica se raspoređuje za


upis na disk, context switch suspenduje proces greške i omogućava
drugom procesu da da radi dok se ne završi prebacivanje na disk. U
svakom slučaju, okvir se markira kao zauzet da bi se spriječilo njegovo
korištenje u druge svrhe.

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

se stranica učita, proces koji je izazvao grešku još uvijek je


suspendovan i neki drugi proces može da se izvršava, ako ga ima.

7. Kada se desi interapt diska, što znači da je stranica stigla, tabele


stranica se ažuriraju, a okvir se markira kao da je u normalnom stanju.

8. Instrukcija koja je izazvala grešku se vraća u stanje koje je imala prije


kada je počela da se izvršava, a programski brojač se resetuje na
vrijednost koju je imao kada se izvršavala ta instrukcija.

9. Proces koji je izazvao grešku se rasporedi, a operativni se sistem vraća


na asemblersku rutinu koja ga je pozvala.

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.

4.7.3 Bekap instrukcija

Kada program referencira stranicu koja nije u memoriji, instrukcija koja


izazove grešku stranice se zaustavlja na pola puta jer izazove prekid rada
operativnog sistema. Kada je operativni sistem uzeo stranicu koja je potrebna, mora
da restartuje instrukciju koja izaziva prekid. Ovo je lakše reći nego učiniti.
Da bi pronikli u prirodu problema, razmotrimo CPU koji ima instrukcije sa dvije
adrese, kao što je Motorola 680x0, koja se mnogo koristi kod kompaktnih sistema.
Instrukcija
MOV.L #6(A1),2(A0)
je 6-bajtna, na primjer (slika 4-32). Da bi restartovao instrukciju, operativni
sistemmora odrediti gdje se nalazi prvi bajt instrukcije. Vrijednost programskog
brojača, kada se desi prekid, zavisi od toga koji operand izaziva grešku i kako se
primjenjuje mikrokod CPU-a.

Slika 4-32 Instrukcija koja izaziva grešku stranice.

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

inkrementiranje jednog ili više registara. Instrukcije koje koriste auto-inkrementiranje


takođe mogu da naprave grešku. U zavisnosti od detalja mikrokoda , inkrementacija
se može desiti prije memorijske reference, u kom slučaju operativni sistem mora
dekrementirati registar sotverski prije restartovanja instrukcije. Ili, auto-
inkrementacija se može desiti nakon memorijske reference, u kom slučaju se to neće
desiti u vrijeme prekida operativnog sistema, pa se ne smije vratiti od strane
operativnog sistema. Auto-dekrement mod takođe postoji i izaziva sličan problem.
Tačni detalji da li su auto-inkrement i auto-dekrement izvršeni ili nisu prije
odgovarajuće memorijske reference mogu se razlikovati od instrukcije do instrukcije i
od procesora do procesora.
Srećom, na nekim mašinama CPU dizajneri daju rješenje, obično u formi
skrivenih unutrašnjih registara u koje se kopira programski brojač prije izvršenja
svake instrukcije. Ove mašine takođe mogu imatidrugi registar koji daje podatak o
tome koji registri su već auto-inkrementirani ili auto-dekrementirani i koliko puta.
Kada je operativnom sistemu data ta informacija, on može nedvosmisleno da povrati
sve efekte instrukcije koja je izazvala grešku stranice, tako da se ona može pokrenuti
ispočetka. Ako ova informacija nije dostupnaoperativni sistem mora da skače kroz
petlje da bi doznao šta se desilo i kako da to popravi. To je zato što dizajneri
hardvera nisu mogli da riješe ovaj problem, pa se sa tim moraju nositi ljudi koji pišu
operativne sisteme.

4.7.4 Zaključavanje stranica u memoriju

Iako nismo diskutovali mnogo o ulazu/izlazu u ovom poglavlju, činjenica da


računar ima virtualnu memoriju ne znači da nema ulaz/izlaz. Virtualna memorija i
ulaz/izlaz intereaguju na fin način. Razmotrimo proces koji je upravo napravio
sistemski poziv za čitanje iz nekih fajlova ili uređaja i upisivanje u bafer sa svojim
adresnim prostorom. Dok se čeka da ulaz/izlaz završi, proces se suspenduje i drugi
proces počinje da radi. Ovaj drugi proces dobija grešku stranice.
Ako je algoritam za straničenje globalni, postoji mala, ali različita od 0, šansa
da se izabere stranica koja sadrži ulaz/izlaz bafer za izbacivanje iz memorije. Ako je
neki ulazno/izlazni uređaj trenutno u procesu izvršavanja DMA prenosa na tu
stranicu, njeno izbacivanje će izazvati upisivanje dijela podataka u bafer gdje i
spadaju, a dio će bioti upisan u novoučitanu stranicu. Jedno riješenje toga je da se
zaključaju stranice koje su uključene u rad sa neki ulazom/izlazom u memoriji tako
da neće biti odstranjene. Zaključavanje stranice se često naziva pribadanje u
memoriju (pinning). Drugo rješenje je da se svi ulazi/izlazi kopiraju u bafere jezgra i
zatim kopiranje podataka na korisničke stranice kasnije.

4.7.5 Smještanje izbačenih stranica

Prilikom razmatranja algoritama za zamjenu stranica, vidjeli smo kako se


izabire stranica za izbacivanje. Međutim, nismo govorili mnogo o tome na koje
mjesto na disku se izbačena stranica upisuje. Opišimo sada neka pitanja vezana za
upravljanje diskom.
Najjednostavniji algoritam sa alokaciju prostora za stranicu na disku je onaj
koji koristi specijalan prostor na disku odvojen samo za prebacivanje. Kada se sistem
podiže ovaj prostor je prazan i predstavljen memoriji kao jedan unos koji daje

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.

Slika 4-33 (a) straničenje sa statičnim prostorom za prebacivanje.


(b) Dinamičko smještanje stranica.

Na slici 4-33(a), prikazana je tabela stranica sa 8 stranica. Stranice 0, 3, 4 i 6


se nalaze u glavnoj memoriji. Stranice 1, 2, 5 i 7 su na disku. Prostor za prebacivanje
na disku je velik kao virtualni adresni prostor procesa (osam stranica), pri čemu
svaka stranica ima fiksnu lokaciju na koju će bitri upisana kada se izbaci iz glavne
memorije. Proračun ovih adresa zahtjeva samo poznavanje gdje počinje prostor za
straničenje tog procesa, pošto su stranice poredane u nizu po brojevima njihovih
virtualnih stranica. Stranice koje su u memoriji uvijek imaju svoju kopiju na disku, ali

51
Moderni operativni sistemi Upravljanje
memorijom

ta kopija može da bude neažurirana ako se stranica modifikuje poslije učitavanja u


memoriju.

Na slici 4-33(b), stranice nemaju fiksne adrese na disku. Kada se stranica


izbaci, izabere se u letu prazna stranica na disku, a mapa diska (koja ima mjesta za
jednu adresu na disku po virtualnoj stranici) se ažurira shodno tome. Stranice koje su
memoriji nemaju svoju kopiju na disku. Njihovi unosi u mapi diska sadrže pogrešne
adrese ili su označeni kao da nisu u upotrebi.

4.7.6 Razdvajanje politike i mehanizma

Važan alat za rukovođenje kompleksnošću svakog sistema je razdvajanje


politike od mehanizma. Ovaj princip se može primjeniti na upravljanje memorijom
dajući upravljaču memorije da uglavnom radi kao proces korisničkog nivoa. Takvo
odvajanje prvi put je urađeno u Mach-u (Young et al., 1987) i u MINIX-u
(Tanenbaum, 1987). Diskusija koja slijedi je uglavnom bazirana na Mach-u.
Jednostavan primjer kako politika i mehanizam mogu da se odvoje je prikazan
na slici 4-34. Ovdje je sistem za upravljanje memorijom podijeljen na tri dijela:
1. Upravljač MMU-a niskog nivoa
2. Upravljač greškama stranica koji je dio jezgra (kernel)
3. Spoljašnji upravljač straničenjem koji radi u korisničkom prostoru.
Svi detalji o tome kako radi MMU su sadržani u upravljaču MMU-a, koji je u stvari kod
zavistan od mašine i mora biti prepisan za svaku novu platformu na koju je operativni
sistem postavljen. Upravljač greškama stranicaje kod koji je nezavistan od mašine i
sadrži većinu mehanizama za straničenje. Politika je uglavnom određena spoljašnjim
upravljačem straničenja, koji radi kao korisnički proces.

Slika 4-34 Upravljanje greškom stranice pomoću spoljašnjeg upravljača straničenjem.

Kada se proces pokrene, spoljašnji upravljač straničenjem je obavješten o tom


da bi postavio mapu stranica tog procesa i alocirao mjesto na disku za smještanje,
ako je to neophodno. Kako proces radi, može da mapira nove objekte u svoj adresni
prostor, pa je ponovno o tome obavješten spoljašnji upravljač straničenjem.
Kada proces počne da radi, može se desiti greška stranice. Upravljač
greškama zaključuje koja je virtualna stranica potrebna i šalje poruku spoljašnjem
upravljaču straničenja, u kojoj definiše problem. Spoljašnji upravljač straničenjem
tada učita potrebnu stranicu sa diska i kopira je na dio svog adresnog prostora. Tada
52
Moderni operativni sistemi Upravljanje
memorijom

poruči upravljaču greškama gdje se nalazi stranica. Upravljač greškama tada


demapira stranicu iz adresnog prostora spoljašnjeg upravljača straničenjem i traži od
upravljača MMU-a da je stavi u korisnički adresni prostor na pravo mjesto. Tada se
korisnički proces može restartovati.

Ovakva implementacija ostaje otvorena tamo gdje je korišten algoritam za


zamjenu stranica. Najčišće bi bilo da postoji spoljašnji upravljač straničenjem, ali sa
ovim pristupom postoje neki problemi. Princip je da spoljašnji upravljač straničenjem
nema pristup R i M bitovima svih stranica. Ovi bitovi imaju važnu ulogu kod većine
algoritama za zamjenu stranica. Tako, ili je potreban neki mehanizam za dodavanje
tih informacija spoljašnjem upravljaču straničenja, ili algoritam za zamjenu stranica
mora da ide u jezgro. U drugom slučaju, upravljač greškama govori spoljašnjem
upravljaču straničenja koja stranica treba da se izabere za izbacivanje i obezbijeđuje
podatke, ili njihovim mapiranjem u adresni prostor spoljašnjeg upravljača
straničenjem ili njihovim uključivanjem u poruku. U svakom slučaju, spoljašnji
upravljač straničenjem upisuje podatke na disk.
Glavna prednost ove implementacije je kod koji je više modularan i više
fleksibilan. Glavni nedostatak je preveliko prelaženje granica korisničkog jezgra i
opterećenje zbog raznih poruka koje se šalju između dijelova sistema. Sada se čini
da je ova tema sporna, ali kako računari postaju sve brži i brži, a softver sve
kompleksniji, gledajući malo dalje, razumno žrtvovanje performansi na račun dobitka
pouzdanijeg softvera će za mnoge korisnike biti vjerovatno prihvatljivo.

4.8 SEGMENTACIJA

Virtualna memorija koju smo do sada razmatrali bila je jednodimenziona, jer


su joj adrese išle od 0 do neke maksimalne adrese, jedna za drugom. Zbog mnogih
problema bolje je imati odvojene virtualne adresene prostore umjesto samo jednog.
Na primjer, kompajler ima mnogo tabela koje se grade kako kompajliranje
napreduje, a moguće i slijedeće

1. Izvorni tekst se snima za listu koja se štampa (na batch sistemima).


2. Tabela simbola, sadrži imena i atribute promjenjivih.
3. Tabela koja sadrži konstante koje se koriste cjelobrojnog (integer) tipa i sa
pomičnim zarezom (floating point).
4. Organizaciono drvo, koje sadrži sintaksu i analizu programa.
5. Stack koji se koristi za procedure poziva u sklopu kompajlera.

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.

Slika 4-35 U jedno-dimenzionom adresnom prostoru sa rastućim tabelama,


jedna tabela može da se sudari sa drugom.

Druga mogućnost je da se oduzme prostor od tabela koje ga imaju previše i


doda tabelama sa malo prostora. Ovo se može uraditi, ali to je kao i kod riješavanja
sopstvenih preopterećenja – neugodnost u najboljem i velik, dosadan, nenagrađen
rad u najgorem slučaju.
Ono što je stvarno neophodno je postojanje načina na koji se može osloboditi
programer od upravljanja proširenjem i smanjenjem tabela na isti način na koji
virtualna memorija rješava pitanja oko organizovanja programa u dopune (overlays).
Pravolinijsko i izuzetno uopšteno rješenje je da se obezbijedi mašina sa mnogo
sasvim nezavisnih adresnih prostora, nazvanih segmenti. Svaki segment se sastoji
od linearne sekvence adresa, od 0 do neke maksimalne. Dužina svakog segmenta
može biti svaka između 0 i maksimalno dozvoljene. Različiti segmenti mogu imati, i
obično imaju, različite dužine. Štoviše, dužina segmenta može da se mijenja tokom
izvršavanja. Dužina stack segmenta može da se poveća kad god se nešto stavi u
stack, a može da se i smanji kad god se nešto uzme iz stacka.
Zbog toga što svaki segment sadrži različit adresni prostor, različiti segmenti
mogu nezavisno rasti ili se smanjivati bez toga da utiču jedni na druge. Ako stack u
određenom segmentu treba više adresnog prostora da bi rastao, može ga dobiti, jer
nema ničeg drugog u adresnom prostoru što bi ga moglo ograničiti. Naravno,
segment može da se ispuni, ali segmenti su obično veoma veliki, pa je to veoma
rijetko. Da bi specificirali adresu u segmentiranoj ili dvo-dimenzionoj memoriji,
program mora da podržava dvo-djelnu adresu, broj segmenata i adresu unutar
segmenta. Slika 4-36 prikazuje segmentiranu memoriju koja se koristi za tabele
kompajlera, ranije razmatrane. Prikazano je pet nezavisnih segmanata.

54
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-36 Segmentirana memorija dozvoljava svakoj tabeli da raste ili da se smanjuje
nezavisno od ostalih tabela.

Naglašavamo da je segment logički entitet, kojeg je programer svjestan, pa ga


i koristi kao logički entitet. Segment može da seadrži proceduru, niz, stack, ili skup
skalarnih promjenjivih, ali obično ne koristi miks različitih tipova.
Segmentirana memorija ima druge prednosti osim pojednstavljenog rukovanja
sa strukturama podataka koje rastu ili se smanjuju. Ako svaka procedura zauzme
poseban segment, sa adresom 0 kao početnom, povezivanje procedura posebno
kompajliranih je u mnogome olakšano. Nakon što se sve procedure koje čine
program kompajliraju i povežu, procedura poziva procedure iz segmenta n će koristiti
dvo-djelnu adresu (n,0) da bi adresirala riječ 0 (tačka ulaza).
Ako se procedura u segmentu n stalno mijenja i rekompajlira, ni jedna druga
procedura ne mora da se mijenja (jer se ni jedna početna adresa ne mijenja), čak i
ako je nova verzija veća od prethodne. Sa jedno-dimenzionom memorijom,
procedure se pakuju tijesno jedna uz drugu, bez slobodnog adresnog prostora
između. Posljedica toga je da, kada se mijanja veličina jedne procedure, utiče se na
početnu adresu druge, nepovezane procedure. Ovo, naizmjence zahtjeva mijenjanje
svih procedura koje pozivaju neku od pomjerenih procedura, da bi ažurirale njihove
nove početne adrese. Ako program sadrži stotine procedura, ovaj proces može puno
da košta.
Segmentacija takođe omogućava dijeljenje procedura ili podataka između
nekoliko procesa. Uobičajen primjer je dijeljena biblioteka (shared library).
Moderne radne stanice imaju napredne windows sisteme koji imaju izuzetno velike
grafičke biblioteke kompajlirane u skoro svakom programu. U segmentiranom
sistemu, grafičke biblioteke se mogu staviti u segment i biti dijeljene od strane niza
procesa, eliminišemo tako potrebu da da ih imamo u adresnom prostoru svakog
procesa. Takođe je moguće da imamo dijeljene biblioteke kod čistih sistema za
straničenje ali je to mnogo komplikovanije. Takvi sistemi to rade simulirajući
segmentaciju.
Pošto svaki segment formira logički entitet kojeg je programer svjestan, kao
što je procedura, niz, ili stack, različiti segmenti mogu imati različite vrste zaštite.
Segment procedure može biti specificiran kao samo izvršni (execute only),
zabranjujući tako pokušaje čitanja iz njega ili mogućnost smještanja unutar njega.
Niz sa pomičnim zarezom se može specificirati kao čitaj/upiši ali ne izvrši, pa će
skokovi na njega biti uhvaćeni. Takva zaštita je od pomoći prilikom hvatanja
programskih grešaka.
Treba da shvatimo zašto zaštita ima smisla u segmentiranioj memoriji, a nema
u jedno-dimenzionoj. U segmentiranoj memoriji korisnik je svjestan šta je u svakom
55
Moderni operativni sistemi Upravljanje
memorijom

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.

Slika 4-37 Poređenje straničenja i segmentacije.


Sadržaj stranice je slučajan. Programer nije svjestan ni činjenice da se
straničenje dešava. Iako bi stavljanje nekoliko bita u svaki unos u tabelu stranica bilo
moguće, da bi programer to upotrebio on mora voditi evidenciju o tome gdje se u
adresnom prostoru nalaze granice neke stranice. To je upravo ona administracija
zbog koje, da bi se izbjegla, je uvedeno straničenje. Zbog toga što korisnik
segmentirane memorije ima viđenje da su svi segmenti u glavnoj memoriji čitavo
vrijeme, odnosno može im se uvijek obratiti na način kao da su u glavnoj memoriji,
on može zaštititi svaki segment posebno, bez brige oko administriranja.

4.8.1 Implementacija čiste segmentacije

Implementacija segmentacija se razlikuje od straničenja na suštinski način:


stranice su fiksnih veličina a segmenti nisu. Slika 4-38(a) prikazuje primjer fizičke
memorije koja inicijalno ima 5 segmenata. Razmotrimo sada šta se dešava ako se
segment 1 izbaci, a segment 7, koji je manji, stavi na njegovo mjesto. Dolazimo do
konfiguracije memorije prikazane na slici 4-38(b). Između segmenta 7 i segmenta 2
postoji neiskorišten prostor, odnosno rupa. Tada se segment 4 zamijeni sa
segmentom 4, kako je prikazano na slici 4-38(c), pa se segment 3 zamjeni
segmentom 6 kao na slici 4-38(d). Nakon nekog vremena, kako je sistem radio
memorija biva podijeljena u brojne dijelove, od kojih neki sadrže segmente, a neki
rupe. Ovaj fenomen, nazvan eksterna fragmentacija (checkboarding ili external
fragmentation), troši memoriju na rupe. Sa tim se možemo nositi pomoću
kompakcije, kako je prikazano na slici 4-38(e).

56
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-38 (a) – (d) Razvoj eksternog fragmentiranja.


(e) Odstranjivanje eksternog fragmetiranja pomoću kompakcije.

4.8.2 Segmentacija sa straničenjem: MULTICS

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.

Slika 4-40 34-bitna MULTICS-ova virtualna adresa.

Proces je prikazan na slici 4-41. Radi jednostavnosti, činjenica da je deskriptor


segmenta je i sam straničen se ne uzima u obzir. Šta se stvarno dešava je da se
registar (bazni registar deskriptora), koristi za lociranje deskriptorskih segmenata
tabele stranica, koje naizmjenično pokazuju na stranice segmenta deskriptora.

58
Moderni operativni sistemi Upravljanje
memorijom

Jednom kada je pronađen deskriptor potrebnog segmenta, nastavlja se adresiranje


kao na slici 4-41.

Slika 4-41 Konverzija dvo-djelne MULTICS-ove adrese u adrese glavne memorije.

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.

Slika 4-42 Pojednostavljena verzija MULTICS-TLB.


Postojanje dvije veličine stranice usložnjava TLB.
Adrese 16 posljednih referenciranih stranica se drže u TLB-u. Kod programa
čiji je radni set manji od veličine TLB-a, doći će do izjednačavanja sa adresama
čitavog radnog seta u TLB-u i zbog toga raditi efikasnije.Ako stranica nije u TLB-u,
deskriptor i tabele stranica se referenciraju da bi pronašli adresu okvira stranice, i
TLB se ažuriratako da uključi tu stranicu, LRU stranica se izbacuje. Polje starosti vodi
evidenciju o tome koji je unos posljednji najmanje korišten. Razlog zbog kojeg se
koristi TLB je paralelna uporedba segmenata i brojeva stranica svih unosa.

59
Moderni operativni sistemi Upravljanje
memorijom

4.8.3 Segmentacija sa straničenjem: Intel Pentium

U mnogome, virtualna memorija Pentiuma liči na MULTICS, uključujući i


straničenje i segmentiranje. Dok MULTICS ima 256K nezavisnih segmenata, svaki do
64K 36-bitne riječi, Pentium ima 16K nezavisnih segmenata, svaki do 1 bilion 32-
bitnih riječi. Dakle, ima manje segmenata, ali je veličina segmenta mnogo važnija,
pošto samo nekoliko programa zahtjeva više od 1000 segmenata, a mnogi programi
zahtjevaju velike egmente.
Srce Pentiumove virtualne memorije sadrži se od dvije tabele, LDT (Local
Descriptor Table) i GDT (Global Descriptor Table). Svaki program ima svoju vlastitu
LDT, doj postoji samo jedna GDT, koja se dijeli između svih programa na računaru.
LDT opisuje segmente koji su lokalni svakom programu, uključujući njegov kod,
podatke, stack, itd., dok GDT opisuje sistemske segmente, uključujući sam operativni
sistem.
Da bi pristupio segmentu, Pentiumov program prvo učita selektor za taj
segment u jedan od 6 registara segmenata mašine. Tokom izvršavanja, CS registar
drži selektor za kod segment, a DS registar drži selektor za segment podataka. Ostali
registri segmenata su manje važni. Svaki selektor je 16-bitni broj, kako je prikazano
na slici 4-43.

Slika 4-43 Pentium-ov selektor

Jedan od bita u selektoru govori da li je segment lokalni ili globalni (tj., da li je


u LDT ili u GDT). Ostalih 13 bita specificiraju unosni broj LDT-a ili GDT-a, pa su te
tabele ograničene na držanje 8K deskriptora segmenta. Preostala 2 bita odlaze na
zaštitu i njih ćemo kasnije opisati. Deskriptor 0 je zabranjen. On se može upisati u
registar segmenata da bi pokazao da registar segmenata trenutno nije dostupan. On
izaziva prekid (trap) ako biva korišćen.
U to vrijeme, selektor se učita u registre segmenata, odgovarajući deskriptor
se uzima iz LDT ili GDT i pohranjuje u registre mikroprograma, da bimu se brzo
moglo pristupiti. Deskriptor se sastoji od 8 bajtova, uključujući baznu adresu
segmenta, veličinu i druge informacije, prikazane na slici 4-44.

60
Moderni operativni sistemi Upravljanje
memorijom

Slika 4-44 Pentiumov deskriptor kod segmenta. Segmenti podataka se malo razlikuju.

Format selektora je pametno odabran da bi se olakšalo pronalaženje


deskriptora. Prvo se odabire ili LDT ili GDT, na osnovu bita 2 selektora. Tada se
selektor kopira u interni scratch registar, i najniža 3 bita se postave na 0. Konačno,
adresa ili LDT ili GDT tabele se doda na to, da bi dala direktni pokazivač na
deskriptor. Na primjer, selektor 72 upućuje na unos 9 u GDT, koji je lociran na adresi
GDT+72.
Ispratimo sada korake po kojima (selektor, ofset) se par konvertuje u fizičku
adresu. Čim mikroprogram koji se registri segmenata koriste, on može pronaći čitav
deskriptor koji odgovara tom selektoru u njegovim internim registrima. Ako segment
ne postoji (selektor 0), ili je trenutno izbačen, dešava se prekid (trap).
On tada provjerava da li je ofset izvan kraja segmenta, u kom slučaju takođe
dolazi do prekida (trap). Logično, trebalo bi jednostavno, postojati 32-bitno polje u
deskriptoru koje bi davalo veličinu segmenta, ali dostupno je samo 20 bita, pa se
koristi drugačija šema. Ako je polje G-bita (Granularity) 0, Limit polje daje tačnu
veličinu segmenta , koja ide do 1MB. Ako je 1, Limit poljedaje veličinu segmenata
izraženu u stranicama umjesto u bajtovima. Veličina stranice kod Pentiuma je fiksna i
iznosi 4KB, pa su 20 dovoljni za segmente do 232 bajtova.
Pretpostavimo da je segment u memoriji i da je ofset u okviru njega, Pentium
tada dodaje 32-bitno Base polje u deskriptor ofseta da bi oformio ono što se zove
linearna adresa, kako je prikazano na slici 4-45. Base polje se dijeli na tri dijela i
širi po deskriptoru radi kompatibilnosti sa 286, u kom slučaju je Base samo 24 bita.
Odnosno, Base polje omogućava svakom segmentu da počne od proizvoljnog mjesta
u okviru 32-bitnog linearnog adresnog prostora.

Slika 4-45 Konverzija para (selektor, ofset) u linearnu adresu.

Ako je straničenje onemogućeno (globalnim registrom kontrole), linearna


adresa se interpretira kao fizička i šalje u memoriju za čitanje ili upis. Prema tome,
ako je straničenje onemogućeno imamo čistu segmentacionu šemu, gdje je svaka
61
Moderni operativni sistemi Upravljanje
memorijom

bazna adresa segmentadata u njegovom deskriptoru. Segmentima je dozvoljeno da


se preklapaju, slučajno, vjerovatno zbog toga što bi trebalo previše vremena i muke
da se provjeri da su svi odvojeni jedan od drugog.
Sa druge strane, ako je straničenje omogućeno, linearna adresa se interpretira
kao virtualna i mapira u fizičku adresu korištenjem tabela stranica, skoro kao i u
prethodnim primjerima. Jedina prava poteškoća je to što sa 32-bitnom virtualnom
adresom i 4-KB stranicom, segment može da sadrži 1 milion stranica, pa se koristi
dvo-nivoovsko mapiranje, radi smanjenja veličine tabele stranica za male segmente.
Svaki program koji se izvršava ima direktorij stranica (page directory) koji
ima 1024 32-bitna unosa. Lociran je u adresi, a na njega pokazuje globalni registar.
Svaki unos u ovaj direktorij pokazuje na tabelu stranica koja takođe ima 1024 32-
bitna unosa. Unosi u tabelu stranica pokazuju na okvire stranica. Ova šema prikazana
je na slici 4-46.

Slika 4-46 Mapiranje linearne adrese u fizičku adresu.

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

Vrijedno je spomenuti da nekim aplikacijama nije potrebno segmentiranje,


nego je njihov sadržaj unutar jednog, straničenog adresnog prostora, a takav model
je moguć. Svi registri segmenata se mogu postaviti istim selektorom, čiji deskriptor
ima Base = 0 i Limit postavljen na maksimum. Ofset instrukcije će tada biti linearna
adresa, sa samo jednim korištenim adresnim prostorom – u stvari to je normalno
straničenje. Svi operativni sistemio za Pentium rade na ovaj način. OS/2 je bio jedini
koji je koristio čitavu snagu MMU arhitekture.
Sve u svemu, treba se odati priznanje dizajnerima Pentiuma. Ako znamo da su
ciljevi bili u konfliktu: implementacija čistog straničenja, čiste segmentacije i
straničenih segmenata, u isto vrijeme kompatibilnost sa 286, i efikasnost svega
ovoga, rezultujući dizajn je iznenađujuće jednostavan i čist.
Iako smo pokrili cjelokupnu arhitekturu Pentiumove virtualne memorije, ipak
ukratko, vrijedno je reći nekoliko riječi o zaštiti, jer je ta tema baš vezana za
virtualnu memoriju. Baš kao što je šema virtualne memorije detaljno modelovana na
MULTICS-u, tako je i modelovan sistem zaštite.Pentium podržava 4 nivoa zaštite,
gdje je nivo 0 najprivilegovanjiji, a nivo 3 najmanje priovilegovan. Ovo je prikazano
na slici 4-47. U svakom trenutku, program koji se izvršava nalazi se na određenom
niovu, koji je označen 2-bitnim poljem u PSW-u. Svaki segment u sistemu takođe ima
nivo.

Slika 4-47 Zaštita Pentium-a

Sve dok se sam program ograničava na korištenje segmenata sa svog nivoa,


sve radi sasvim fino. Pokušaji pristupa podacima sa višeg nivoa su dozvoljeni.
Pokušaji pristupa podacima sa nižeg nivoa nisu dozvoljeni i izazivaju prekide (trap).
Pokušaji poziva procedura sa različitih nivoa (viših/nižih) su dozvoljeni, ali na pažljivo
kontrolisan način. Da bi se napravio poziv između nivoa, instrukcija poziva CALL mora
sadržati selektor umjesto adrese. Taj selektor označava deskriptora koji je nazvan
pozivna kapija (call gate), koji daje adresu procedure koja je pozvana. Tako, nije
moguće uskočiti u sred proizvoljnog kod segmenta na različitim nivoima. Mogu se
koristiti samo zvanična polja za unos. Koncepti nivoa zaštite i pozivnih kapija prvo su
se pojavili kod MULTICS-a, gdje su se zvali prstenovi zaštite (protection rings).
Tipična upotreba ovog mehanizma data je na slici 4-47. Na nivou 0, nalazi se
jezgro (kernel) operativnog sistema, koje upravlja ulazom/izlazom, memorijom i
drugim kritičnim stvarima. Na nivou 1 , nalazi se upravljač sistemskih poziva.
Korisnički programi ovdje mogu da zovu procedure, da izvrše sistemske pozive ali
samo se može pozivati određena zaštićena lista procedura. Nivo 2 sadrži procedure
63
Moderni operativni sistemi Upravljanje
memorijom

biblioteka, koje se dijele između mnogih izvršnih programa.Korisnički program može


zvati ove procedure i čitati njihove podatke, ali ih ne može modifikovati. Konačno,
korisnički programi rade na nivou 3, koji imaju najmanju zaštitu.
Prekidi (trap) i interapti koriste mehanizam sličan pozivnim kapijama. Oni,
takođe, referenciraju deskriptore, a ne apsolutne adrese, a ti deskriptori pokazuju na
odgovarajuće procedure koje treba da se izvrše. Polje Type (tip) na slici 4-44
razlikuje segmente koda, podataka i razne vrste kapija.

4.9 ISTRAŽIVANJA O UPRAVLJANJU MEMORIJOM

Upravljanje memorijom, posebno algoritmi straničenja, je nekada bila


pogodna materija za istraživanje, ali izgleda da je većina prekinuta, barem za sisteme
opšte upotrebe. Većina realnih sistema koristi varijacije sata, jer ga je lako
implementirati i relativno je efektivan. Jedanizuzetak tome, koji se desio nedavno, je
redizajn 4.4 BSD sistema virtualne memorije (Cranor i Parulkar, 1999).
Još uvijek se radi na istraživanju koje se tiče straničenja za specijalne namjene
i novih vrsta sistema. Neki od ovih radova se odnose na omogućavanje korisničkim
procesima da skladište svoje greške stranica i upravljaju memorijom, na specifičan
način (Engler et al., 1995). Jedno područje, gdje aplikacije mogu da izvrše sopstveno
straničenje na posebne načine je multimedija, pa se neki istraživači bave time (Hand,
1999.). Drugo područje koje ima neke posebne potrebe su ručni komunikatori
(Abutaleb i Li, 1907; i Wan i Lin, 1997). Konačno, područje sistema sa 64-bitnim
adresnim prostorom kojeg dijeli mnogo procesa (Talluri, 1995).

4.10 ZAKLJUČAK

U ovom poglavlju istražili smo upravljanje memorijom. Vidjeli smo da


najjednostavniji sistemi uopšte ne prebacuju i ne straniče. Jednom kada je program
učitan u memoriju, tamo i ostaje dok ne završi. Neki operativni siotemi dozvoljavaju
istovremeno samo jedan proces u memoriji, dok drugi sistemi podržavaju
multiprogramiranje.
Idući korak je prebacivanje. Kada se koristi prebacivanje, sistem može da
upravlja sa više procesa nego što ima memorije za njihovo smještanje. Procesi za
koje nema mjesta u memoriji se prebacuju na disk. Slobodan prostor u memoriji i na
disku se evidentira pomoći bit mape ili liste rupa.
Moderni računari često imaju neku vrstu virtualne memorije. U
najjednostavnijoj formi, adresni prostor svakog procesa se dijeli u blokove jednake
veličine nazvane stranice, koje mogu da se smjeste u bilo koji slobodan okvir stranice

64
Moderni operativni sistemi Upravljanje
memorijom

u memoriji. Postoje mnogi algoritmi za zamjenu stranica; dva bolja su starenje


(aging) i RS Sat (WSClock).
Sistemi straničenja mogu biti modelovani izvlačenjem referencnog stringa
stranice iz programa i korištenjem istog referencnog stringa sa drugim algoritmima.
Ovi modeli se mogu koristiti za predikciju ponašanja straničenja.
Da bi sistemi straničenja radili kako treba, izbor algoritma nije dovoljan;
potrebno je obratiti pažnju na pitanja kao što su : određivanje radnog seta, politika
alokacije memorije i veličina stranice.
Segmentacija pomaže prilikom upravljanja strukturama podataka i promjene
veličine tokom izvršavanja i uprošćava povezivanje (linking) i dijeljenje (sharing).
Takođe omogućava različite nivoe zaštite za razne segmente. Ponekad se
segmentacija i straničenje kombinuju da bi dobili dvo-dimenzionu virtualnu memoriju.
MULTICS sistemi i Intel Pentium podržavaju segmentaciju i straničenje.

Autor: Prof. dr Božo Krstajić,


www.os.ucg.ac.me/…jal/Memory%20Management/Memory...

65

Das könnte Ihnen auch gefallen