MEMORIJSKA HIJERARHIJA
======================

*) KARAKTERISTIKE MEMORIJA

   0) ADRESIVOST:
   
      Svaka memorija se moze posmatrati kao niz MEMORIJSKIH LOKACIJA
      fiksirane velicine. Ukoliko su memorijskim lokacijama pridruzene
      adrese pomocu kojih im mozemo pristupiti, tada takve memorije
      nazivamo ADRESIVIM MEMORIJAMA. U suprotnom, kazemo da su
      memorije NEADRESIVE. Ukoliko su adresive memorijske lokacije
      velicine bajta ili reci, tada za takve memorije kazemo i da su
      POTPUNO ADRESIVE (npr. RAM, ROM), dok za memorije kod kojih su
      adresive memorijske lokacije vece velicine kazemo da su
      POLUADRESIVE (ovo je tipicno za spoljasnje memorije, npr. kod
      hard diskova adresive memorijske lokacije se nazivaju SEKTORI i
      velicine su 512 bajtova ili vise).

   1) VRSTE PRISTUPA:

      U slucaju adresive memorije, postavlja se pitanje na koji nacin
      se moze pristupiti memorijskoj lokaciji na zadatoj adresi i da
      li je vreme pristupa razlicitim memorijskim lokacijama jednako
      ili ne. U tom smislu razlikujemo sledece vrste pristupa:

      a) PROIZVOLJAN PRISTUP: kod ovih memorija postoji mehanizam za
      neposredno pristupanje svakoj memorijskoj lokaciji u priblizno
      konstantnom vremenu.  Ovakav pristup je neophodan za
      tzv. glavnu, tj. operativnu memoriju u kojoj se nalaze programi
      koji se trenutno izvrsavaju i njima pridruzeni podaci. Termin
      koji se jos koristi je i SLUCAJAN PRISTUP (engl. random access).

      b) SEKVENCIJALNI PRISTUP: memorijskim lokacijama u memoriji se
      moze pristupiti iskljucivo redom. Na primer, da bismo pristupili
      memorijskoj lokaciji na adresi 10, moramo pre toga da pristupimo
      svim memorijskim lokacijama od 0-te do 9-te. Ovakav pristup je
      bio karakteristican za magnetne trake koje su ranije koriscene
      kao memorije za masovno skladistenje podataka.

      c) DIREKTAN PRISTUP: kod ovih memorija postoji mogucnost
      direktnog pristupa nekoj okolini memorijske lokacije na osnovu
      zadate adrese. Kada se pristupi ovoj okolini, pretraga trazene
      memorijske lokacije se nastavlja sekvencijalno unutar te
      okoline. Vreme pristupa memorijskoj lokaciji tipicno nije
      konstantno, jer zavisi od pozicije memorijske lokacije unutar
      okoline kojoj je moguce direktno pristupiti. Ovakav pristup
      imamo kod hard diskova, CD-ROM diskova, flesh i SSD diskova.

      d) ASOCIJATIVNI PRISTUP: podatku se ne pristupa preko adrese,
      vec tako sto se zadaje neki uzorak (maska) koji se na neki nacin
      pretrazuje u memoriji. Primer ovakvih memorija su KES MEMORIJE o
      kojima ce biti vise reci kasnije.

   2) KAPACITET:
   
      -) kolicina podataka (izrazena u (kilo, mega, giga, tera,
         ...)-bajtovima) koja se moze sacuvati u memoriji.

   3) BRZINA:
   
      -) Na brzinu memorije uticu dva osnovna faktora: KASNJENJE
      (engl. memory latency) i BRZINA TRANSFERA (engl. bandwidth).
      Kasnjenje se izrazava vremenom koje protekne od trenutka
      iniciranja transfera (npr. procesor posalje zahtev za nekim
      podatkom iz memorije) do trenutka kada taj transfer zaista
      zapocne. Kasnjenje zavisi od udaljenosti od procesora, kao i od
      tehnologije izrade same memorije. Brzina transfera se izrazava
      kolicinom podataka koji se mogu preneti u jednoj sekundi.

      -) Cesto se kao parametar za izrazavanje ukupnih performansi
      memorije koristi VREME PRISTUPA. Vreme pristupa je prosecno
      ukupno vreme potrebno da se pojedinacni podatak prenese iz
      memorije u procesor. Ovo vreme zavisi i od kasnjenja i brzine
      transfera same memorije, ali i od toga da li se podatak nalazi u
      kes memoriji ili ne.

      -) VREME MEMORIJSKOG CIKLUSA predstavlja vreme koje je potrebno
      da prodje izmedju dva uzastopna zahteva za pristupom. Ono
      ukljucuje vreme pristupa, ali i dodatno vreme koje mora proci
      nakon zavrsetka transfera do ponovnog zahteva za pristupom (dok
      se memorija ne pripremi za novu operaciju).

   4) POSTOJANOST (engl. PERSISTENCY):

      -) Memorija je postojana (engl. persistent, ili non-volatile)
      ako se iskljucenjem napajanja njen sadrzaj ne gubi.
      -) Memorija je nepostojana (engl. non-persistent, ili volatile)
      ako se iskljucenjem napajanja njen sadrzaj gubi.

   5) PROMENLJIVOST

      -) Memorija ciji je sadrzj nepromenljiv (tj. u koju se ne mogu
      upisivati podaci, vec se samo mogu iz nje citati) nazivaju se
      nepromenljive memorije (engl. read-only memory -- ROM).      
      -) Memorija ciji je sadrzaj promenljiv nazivaju se promenljive
      memorije (engl. read-write memory).

*) MEMORIJSKA HIJERARHIJA

    -) Univerzalna memorija je hipoteticka memorija koja bi imala sve
    pozeljne karakteristike (proizvoljan pristup, brza isto koliko i
    procesor, ogromnog kapaciteta, postojana i promenljiva). Ovakva
    memorija jos uvek ne postoji.

    -) S obzirom da univerzalna memorija jos uvek ne postoji,
    savremeni racunarski sistemi moraju imati u svom sastavu veci broj
    razlicitih memorija, od kojih svaka ima po neko pozeljno svojstvo.
    Ove memorije su organizovane u tzv. memorijsku hijerarhiju. U toj
    hijerarhiji, one memorije koje su blize procesoru po pravilu su
    brze, ali im je kapacitet manji, cena im je skuplja, a najcesce
    nemaju svojstvo postojanosti. Memorije udaljenije od procesora su
    veceg kapaciteta i jeftinije (gledano relativno, tj. po bajtu).
    Ove memorije obicno imaju svojstvo postojanosti, pa su pogodne za
    masovno cuvanje podataka. Medjutim, znatno su sporije i nemaju
    svojstvo proizvoljnog pristupa.

    Sledece memorije u hijerarhiji (pocev od najblize procesoru)
    nazivaju se i UNUTRASNJE MEMORIJE:

    -) REGISTRI PROCESORA: najblizi ALU jedinici procesora. Podacima u
    registrima se najcesce moze pristupiti u jednom ciklusu casovnika.
    Ima ih relativno malo (kolicina podataka koja se moze cuvati u
    registrima je obicno manja od 1KB). Registarska memorija se obicno
    naziva STATICKA, zato sto je zasnovana na flip-flop-ovima i nije
    potrebno dinamicko osvezavanje sadrzaja. Ova memorija nema svojstvo
    postojanosti. 

    -) KES MEMORIJA: Brza memorija koja je takodje staticka (zasnovana
    na flip-flopovima) ali znatno veceg kapaciteta od
    registara. Kapacitet danasnjih kes memorija se krece od nekoliko
    desetina kilobajta, do nekoliko megabajta. Zbog svoje velicine i
    principa rada, kes memorija je nesto sporija od registara
    procesora ali je ipak znacajno brza od operativne (RAM)
    memorije. Koristi se za premoscavanje razlike u brzini izmedju
    procesora i operativne (RAM) memorije. Sadrzaj kes memorije je
    uvek kopija sadrzaja iz operativne (RAM) memorije, tj. koristi se
    iskljucivo kao mehanizam za ubrzavanje pristupa podacima iz
    operativne memorije, a ne kao memorija koja cuva neki ekskluzivni
    sadrzaj. Kes memorija nema svojstvo postojanosti.

    -) Operativna (RAM) memorija je osnovna memorija u kojoj se nalaze
    podaci i programi koji se trenutno izvrsavaju u nasem racunarskom
    sistemu. Njen kapacitet se danas izrazava u gigabajtima, sto je
    dovoljno za operativni rad, ali ne i za masovno skladistenje
    podataka.  Kao i prethodne dve memorije, RAM memorija nema
    svojstvo postojanosti. Savremene RAM memorije se izradjuju kao
    dinamicke sinhrone memorije (SDRAM). Samim tim, brzina rada
    memorije zavisi od frekvencije casovnika. Frekvencije savremenih
    memorija je obicno do 533MHz. Medjutim, zahvaljujuci DDR (double-data-rate)
    tehnologiji, omoguceno je da se u toku jednog ciklusa prenosi vise podataka,
    tako da je brzina transfera znatno veca (frekvencija magistrale
    ide i do 2133MHz, pri cemu se u svakom ciklusu na magistrali mogu
    preneti po 2 podatka, sto daje ukupno 4266 miliona transfera u
    sekundi). Ipak, ova memorija je znatno sporija od kesa, i kada je
    u pitanju kasnjenje, i kada je u pitanju brzina transfera.

    Veliko kasnjenje dinamickih memorija je pre svega uzrokovano
    velikim vremenom potrebnim da se ocitaju vrednosti iz
    kondenzatora, kao i da se kondenzatori ponovo napune na
    odgovarajuci nacin. Jedna od tehnika koja se koristi za smanjenje
    kasnjenja prilikom pristupa susednim memorijskim adresama je
    koriscenje tzv. ISPREPLETENIH MEMORIJA (engl. interleaved
    memory). Ideja je da se memorija podeli na nekoliko manjih
    memorijskih jedinica koje nazivamo BANKAMA. Kombinovanje banki se
    vrsi na slican nacin kao sto smo ranije kombinovali manje
    memorijske cipove u vece. Bitna razlika je sto se ovoga puta nizi
    adresni bitovi koriste za izbor banke, a visi adresni bitovi za
    izbor adrese u okviru izabrane banke. Kada pristupamo susednim
    adresama, svaka sledeca adresa ce biti u sledecoj banci. Na taj
    nacin mi naizmenicno pristupamo podacima iz razlicitih banki. Ovo
    daje vremena bankama da pripreme svoje podatke, tj. kasnjenja
    pojedinacnih banki se medjusobno preklapaju, i na taj nacin se
    negativni uticaj ovih kasnjenja smanjuje. Nakon inicijalnog
    kasnjenja pri pristupu prvoj adresi u bloku, narednim adresama se
    pristupa znatno brze, jer se te adrese nalaze u drugim bankama
    koje su na osnovu visih adresnih bitova [koji su susednim adresama
    zajednicki] blagovremeno ocitale trazene podatke i pripremile ih
    za transfer. Naravno, ovakva arhitektura memorije nema efekta ako
    ne pristupamo susednim memorijskim adresama. U praksi je ipak
    pristup memorijskim lokacijama u rastucem redosledu adresa veoma
    cest (npr. instrukcije se nalaze na susednim adresama u memoriji,
    elementi nizova takodje), sto ovu tehniku cini prilicno efektnom.

    -) ROM memorija sadrzi programe i podatke koji su nepromenljivi i
    koji treba da su stalno prisutni da bi racunar mogao da radi (npr.
    program koji se pokrece prilikom startovanja racunara, poput
    BIOS-a). ROM memorija ima proizvoljan pristup. U najjednostavnijem
    obliku, obicno se implementira kao kombinatorno kolo, jer vrednost
    na izlazu (vrednost na odredjenoj adresi) je uvek ista i zavisi
    iskljucivo od ulaza (tj. zadate adrese). Moderni racunarski
    sistemi ukljucuju i druge oblike ROM memorije: PROM (programmable
    ROM) koji se moze programirati samo jednom, spaljivanjem
    odgovarajucih kontakata, nakon cega se dobija zeljeno kombinatorno
    kolo; EPROM (erasable programmable ROM) koji se moze programirati
    uz pomoc posebnog uredjaja za programiranje; moze se programirati
    vise puta, ali je pre svakog programiranja potrebno obrisati
    prethodni sadrzaj, najcesce izlaganjem cipa ultraljubicastom
    zracenju; EEPROM (electronically erasable programmable ROM) koji
    se moze brisati elektronskim putem i zatim ponovo programirati.
    Ovaj proces se moze obavljati direktno u uredjaju u kome se EEPROM
    memorija koristi. Npr. BIOS se moze na ovaj nacin nadogradjivati
    na novije verzije. Sve varijante ROM memorije imaju svojstvo
    postojanosti.

    Sledece memorije u hijerarhiji se nazivaju i SPOLJASNJE MEMORIJE
    (sve imaju svojstvo postojanosti):

    -) Magnetne trake su primer postojanih memorija sa sekvencijalnim
    pristupom. Danas se retko koriste, jer su veoma spore. Imale su
    svojstvo promenljivosti.

    -) Hard disk: sadrzi veci broj diskova premazanih magnetnim
    materijalom koji su postavljeni na istu osovinu. Zbog velike
    gustine magnetnog materijala, hard diskovi mogu imati velike
    kapacitete koji se danas mere terabajtima. Ipak, i najbrzi
    hard-disk danas je drasticno sporiji od najsporije unutrasnje
    memorije, s obzirom da ima mehanicke delove. Hard disk je logicki
    podeljen na sektore cija je tipicna velicina 512 bajtova (u novije
    vreme 4KB). Sektori su grupisani u staze koje predstavljaju
    koncentricne kruznice na diskovima razlicitih poluprecnika. Svaki
    sektor ima svoju adresu (dakle, hard diskovi nisu
    bajt-adresibilni, vec blok-adresibilni). Prilikom pristupa se na
    osnovu adrese sektora pozicioniranjem glave za citanje pristupa
    odgovarajucoj stazi u kojoj se sektor nalazi na disku, a zatim se
    rotacijom diska pretrazuje staza dok se ne dodje do trazenog
    sektora. Dakle, ovde imamo direktan pristup.

    -) Floppy disk: kao i hard-disk, u pitanju je elektromehanicki
    uredjaj zasnovan na principu magnetizma. Kapaciteti novijih
    disketa bili su 1.44MB, a imale su i veoma veliko kasnjenje. U
    danasnje vreme su gotovo potpuno istisnute iz upotrebe. Slicno
    hard-diskovima, ove memorije imale su direktan pristup.

    -) CD i DVD ROM: uredjaji koji omogucavaju samo citanje (u tzv. RW
    varijanti omogucavaju i pisanje, ali tek nakon kompletnog brisanja
    diska). Ove memorije su zasnovane na optickom principu
    (tj. laserom se urezuju udubljenja u povrsinu diska prilikom
    pisanja, dok se prilikom citanja, takodje laserom prepoznaju
    odgovarajuca udubljenja i tako se ocitavaju bitovi). Slicno
    hard-diskovima, ove memorije imaju direktan pristup. Danas se sve
    redje koriste.

    -) Flash memorije i SSD diskovi: zasnovani na slicnoj tehnologiji
    kao i EEPROM memorije, s tom razlikom sto ne omogucavaju brisanje
    pojedinacnih bajtova, vec iskljucivo brisanje i upis citavih
    blokova. Dakle, imamo blok-adresibilnost. Ovo ih cini znatno
    jeftinijim od EEPROM memorija, sto omogucava znatno vece
    kapacitete (ali su zato i znacajno sporiji od EEPROM-a). Brzi su
    od hard-diskova, jer ne sarze mehanicke delove. Ipak, cena im je
    jos uvek znacajno veca (gledano relativno, po bajtu). Daljim
    usavrsavanjem ove tehnologije mozemo ocekivati potpuno
    istiskivanje mehanickih memorija (hard diskova).  Jedan od velikih
    nedostataka je ogranicen broj brisanja i pisanja, nakon cega se
    odgovarajuca memorijska celija trajno unistava.


MAPIRANJE MEMORIJSKIH ADRESA
============================

Deo arhitekture procesora je i velicina njegovog adresnog prostora.
ADRESNI PROSTOR procesora je skup adresa koje procesor moze direktno
da adresira. Velicina adresnog prostora obicno odgovara sirini njegove
adresne magistrale: npr, ako je adresna magistrala 20-bitna, tada
mozemo adresirati 2^20-ti bajtova, tj. 1MB memorije.

Sa druge strane, operativna memorija moze biti manjeg
kapaciteta. Zapravo, najcesce i jeste, jer se prilikom dizajna
procesora obicno pretpostavlja da ce se memorije vremenom uvecavati,
pa se zato adresni prostor obicno pravi vecim nego sto je u tom
trenutku potrebno. Na primer, savremeni Intel-ovi procesori imaju i do
40 bitova za adresiranje, sto im omogucava da pristupaju 1TB
operativne memorije, iako vecina racunara ipak nema toliko RAM
memorije. Otuda ce memorija zauzimati samo deo adresnog prostora
procesora, pa je potrebno odrediti koji ce to deo biti, tj. koje
adrese procesorskog adresnog prostora ce biti pridruzene adresibilnim
lokacijama u memoriji. Ovaj postupak naziva se MAPIRANJE MEMORIJSKIH
ADRESA.

Takodje, pored operativne (RAM) memorije, u adresni prostor procesora
se mogu ugradjivati i druge unutrasnje memorije, poput ROM memorije.
Drugim recima, tipicno imamo vise razlicitih memorija koje ugradjujemo
u isti adresni prostor. Zato je potrebno odrediti koje adrese
pridruzujemo kojim memorijama.

Mapiranje adresa se vrsi tako sto se adresa podeli na nizi i visi deo.
Visi deo adrese aktivira memorijski modul u kome ce se traziti
odgovarajuca adresa, a nizi deo adrese odredjuje adresu u okviru
modula. Jednostavan nacin za selekciju memorijskog modula na osnovu
viseg dela adrese je da se odgovarajucom kombinatornom logikom
implementira funkcija koja ima vrednost 1 samo za odgovarajucu
kombinaciju visih bitova adrese. Vrednost ove funkcije se salje na
"enable" ulaz odgovarajuce memorije, cime se ona aktivira. Nizi
bitovi adrese se salju direktno na adresni ulaz memorijskog modula,
cime se bira odgovarajuca adresa u okviru izabranog modula.

Ukoliko svakom memorijskom modulu odgovara jedinstvena kombinacija
visih bitova adrese, tada ovakvo mapiranje nazivamo POTPUNO MAPIRANJE.
Ovo znaci da se svakoj memorijskoj lokaciji moze pristupiti pomocu
jedinstvene adrese u adresnom prostoru procesora.

Postoji mogucnost da se memorijski modul aktivira za veci broj
kombinacija visih adresnih bitova, tj. da funkcija koja aktivira
memorijski modul ima vrednost 1 za vise razlicitih kombinacija visih
adresnih bitova.  U tom slucaju je istom memorijskom modulu pridruzeno
vise opsega adresa u okviru adresnog prostora procesora, te se svakoj
njegovoj memorijskoj lokaciji moze pristupiti pomocu vise razlicitih
adresa. Ovaj nacin mapiranja nazivamo PARCIJALNO MAPIRANJE. Prednost
parcijalnog mapiranja je cesto jednostavnija implementacija funkcije
mapiranja.

Primer: pretpostavimo da imamo 32-bitni adresni prostor (tj. 4GB
adresive memorije). Pretpostavimo da imamo RAM memoriju velicine 2GB,
kao i ROM memoriju velicine 64MB. Jedan nacin mapiranja je da RAM
memoriju smestimo u visi deo adresnog prostora, tj. u adresnom opsegu
0x80000000-0xffffffff, a da ROM memoriju smestimo pocev od 0-te adrese
(tj. u opsegu 0x00000000-0x03ffffff). Ovo mozemo postici na sledeci
nacin. Za RAM memoriju, adresu cemo logicki podeliti na dva dela: prvi
deo cini najvisi bit, a drugi deo cine nizih 31 bita. Najvisi bit vrsi
aktivaciju RAM memorije (ukoliko je vrednost ovog bita 1). Nizih 31
bita odredjuju adresu u okviru 2GB velike RAM memorije. Za ROM
memoriju cemo adresu logicki podeliti na visih 6 bita i nizih 26
bita. Ukoliko je visi deo adrese 000000, tada aktiviramo ROM (ovo
mozemo implementirati pomocu jednog 6-ulaznog NILI kola ciji ce izlaz
biti povezan na "enable" ulaz ROM memorije). Nizih 26 bita se salju na
adresne ulaze ROM memorije za adresiranje jedne od 64MB memorijskih
lokacija. Ovo mapiranje je potpuno, jer svakoj od lokacija u RAM-u i
ROM-u odgovara tacno po jedna adresa iz adresnog prostora procesora.

Pretpostavimo sada isti primer, ali da se umesto 6-ulaznog NILI kola
koristi jedno 2-ulazno NILI kolo na koje se povezuju samo dva najvisa
bita adrese, dok se preostala 4 bita iz viseg dela adrese ne uzimaju u
obzir. Tada ce svaka kombinacija oblika 00bbbb u visem delu adrese
aktivirati ROM cip. Otuda ce npr. adrese 0x00000000, 0x30000000 i
0x1c000000 sve odgovarati istoj lokaciji u ROM memoriji. Ovo je primer
parcijalnog mapiranja. Dakle, istim lokacijama u ROM-u mozemo
pristupiti preko vise razlicitih adresa.

Bez obzira da li je u pitanju potpuno ili parcijalno mapiranje, uvek
se mora obezbediti da skupovi adresa koji su pridruzeni razlicitim
memorijskim cipovima budu medjusobno disjunktni, da ne bi doslo
do kolizije.

Napomenimo da se u savremenim racunarima, pored RAM i ROM memorije, u
adresni prostor procesora mapiraju i ulazno/izlazni uredjaji, pa se na
taj nacin komunikacija sa njima odvija na identican nacin kao u
slucaju komunikacije sa memorijom (npr. kada zelimo da procitamo nesto
sto stize sa tastature, potrebno je da izvrsimo citanje sa
odgovarajuce memorijske adrese sa kojom je mapiran kontroler
tastature). O ovome ce biti vise reci kasnije.

U savremenim racunarima, memorijsko mapiranje se cesto vrsi
automatski, od strane BIOS-a. Naravno, sam ROM cip u kome se nalazi
BIOS je fizicki mapiran na fiksiranim adresama kako bi procesor mogao
da ga pronadje pri ukljucivanju racunara. Nakon toga BIOS testira
prisustvo drugih uredjaja i RAM memorije i pridruzuje im odgovarajuce
adrese adresnog prostora procesora. Nakon toga su RAM i U/I uredjaji
dostupni procesoru putem odgovarajucih memorijskih adresa.

O MEMORIJSKOM PORAVNANJU
------------------------

Unutrasnje memorije poput RAM-a i ROM-a su BAJT-ADRESIVE, sto znaci
da svaki bajt ima svoju adresu preko koje mu se moze
pristupiti. Medjutim, magistrala podataka je po pravilu sira (na
modernim Intel-ovim procesorima ova magistrala je tipicno 64-bitna).
Ovo znaci da mi prilikom transfera retko prebacujemo samo jedan bajt,
vec nekoliko susednih bajtova pocev od neke adrese. Zbog nacina
organizacije memorije, cesto postoji zahtev da se prilikom transfera
vise susednih bajtova zahteva da odgovarajuci blok u memoriji pocinje
od adrese koja je deljiva nekim stepenom dvojke. Na primer, ako
prenosimo blok od 8 bajtova, tada mozemo zahtevati da adresa ovog
bloka u memoriji (tj. najnizeg bajta u ovom bloku) bude deljiva sa 8
(tj. zavrsava se sa tri nule u binarnom zapisu). Neke arhitekture
imaju stroge zahteve po ovom pitanju, tj. ne dozvoljavaju krsenje
pravila poravnanja. Neke druge (poput Intel-ove) ce u slucaju
transfera koji nije adekvatno poravnat, blok koji se prenosi podeliti
na dva dela i preneti ih u dva ciklusa na magistrali.  Ovako nesto
povecava fleksibilnost, ali smanjuje performanse. Zbog toga vecina
programskih prevodilaca vodi racuna o pravilima poravnanja, cak i kada
arhitektura to ne zahteva eksplicitno (npr.  tip int u C-u je 32-bitni
i C prevodioci uvek podatke ovog tipa smestaju na lokacije cije su
adrese deljive sa 4).

