Arhitektura računara
ARHITEKTURA RAČUNARA
1
Poglavlje 1
Organizacija i arhitektura
U opisivanju računara često se pravi razlika između njihove
arhitekture i organizacije.
Mada je teško
dati precizne definicije tih termina, postoji saglasnost u vezi sa opštim oblastima koje su obuhvaćene
svakim od njih.
Arhitektura računara odnosi se na one atribute sistema koji su vidljivi programeru ili,
drugačije rečeno, one atribute koji imaju direktnog uticaja na logičko izvršenje programa.
Organizacija računara odnosi se na operacionaine jedinice i njihove međusobne veze koje
realizuju specifikacije arhitekture.
Primeri atributa arhitekture uključuju skup instrukcija, broj bitova koji se koriste da bi predstavili
razne tipove podataka (na primer, brojeve, znakove), U/I mehanizme i tehnike za adresiranje memorije.
Organizacioni atributi uključuju one hardverske detalje koji su transparentni za programera, kao
što su upravljački signali, intefejsi između računara i periferijskih uređaja i upotrebljena memorijska
tehnologija.
Na primer, pitanje dizajna arhitekture je da li će računar imati instrukciju za množenje.
Organizaciono pitanje je da li će se ta instrukcija implementirati pomoću specijalne jedinice za
množenje, ili pomoću mehanizma koji više puta koristi jedinicu za sabiranje sistema. Organizaciona
odluka može se zasnivati na predviđenoj učestalosti korišćenja instrukcije za množenje, relativnoj
brzini dva pristupa i ceni i fizičkoj veličini specijalne jedinice za množenje.
Istorijski, pa čak i danas, razlika između arhitekture i organizacije bila je značajna. Mnogi
proizvođači računara nude porodicu modela računara, od kojih su svi sa istom arhitekturom, ali sa
razlikama u organizaciji. Zbog toga razni modeli imaju različite cene i karakteristike performanse.
Pored toga, poneka arhitektura može da se protegne na mnogo godina i da obuhvati brojne različite
modele računara, a da se njena organizacija menja sa tehnologijom.
U klasi računara koji se zovu
mikroračunari
, odnos između arhitekture i organizacije je veoma
blizak. Promene u tehnologiji ne samo da utiču na organizaciju, nego za rezultat imaju i uvođenje
moćnijih i složenijih arhitektura. Uopšte, za te manje mašine ima manje zahteva za kompatibilnost od
jedne do druge generacije. Dakle, postoji više međusobne igre između organizacionih i arhitektonskih
odluka. Intrigantan primer za to je računar sa smanjenim skupom instrukcija (RISC), koji ćemo
analizirati kasnije.
1.2 STRUKTURA i FUNKCIJA
Računar je složen sistem; savremeni računari sadrže na milione elektronskih komponenata. Kako oni
onda mogu jasno da se opišu? Ključno je da se prepozna hijerarhijska priroda većine složenih sistema,
uključujući tu i računar. Hijerarhijski sistem je skup podsistema u međusobnom odnosu, od kojih je
svaki, sa svoje strane, hijerarhijski po strukturi sve dok ne dostignemo neki najniži nivo elementarnog
podsistema.
Hijerarhijska priroda složenih sistema je od suštinskog značaja, kako za njihovo projektovanje, tako
i za opis. Projektant treba da se bavi samo posebnim nivoom sistema odjednom.
Na svakom nivou, sistem se sastoji od skupa komponenata i njihovih međusobnih odnosa. Ponašanje na
svakom nivou zavisi samo od pojednostavljene, apstrahovane karakterizacije sistema na sledećem nižem
nivou. Na svakom nivou, projektant se stara o strukturi i funkciji:
Struktura: način na koji su komponente u međusobnom odnosu.
Funkcija: rad svake pojedinačne komponente kao deo strukture.
2

Struktura
Na slici 1.3 prikazan je najjednostavniji opis računara. Računar na neki način međusobno reaguje sa
svojim spoljašnjim okruženjem. Uopšte, sva njegova povezivanja sa spoljašnjim okruženjem mogu da se
klasifikuju kao
periferijski uređaji ili kao komunikacione linije.
Biće potrebno da kažemo nešto o obe
vrste povezivanja.
Mi ćemo se više baviti unutrašnjom strukturom samog računara, što je na gornjem nivou prikazano na
slici 1.4. Postoje sledeće glavne strukturne komponente:
Centralna procesorska jedinica (CPU):
upravlja radom računara i izvodi njegove funkcije
obrade podataka; često se jednostavno naziva
procesor.
Glavna memorija:
skladišti podatke.
Sistemsko međupovezivanje:
neki mehanizam koji obezbeduje komunikaciju izmedu CPU,
glavne memorije i U/I.
Može da postoji jedna ili više svih pomenutih jedinica. Tradicionalno je bila samo jedna CPU.
Poslednjih godina, sve je veća upotreba višestrukih procesora u jednom računaru. Pojavljuju se neka
pitanja projektovanja u vezi sa višestrukim procesorima i o tome ćemo kasnije da govorimo.
Svaka od tih komponenata će se detaljno ispitati u drugom delu. Međutim, za naše potrebe,
najzanimljivija i na neki način najsloženija komponenta je CPU; njena struktura je prikazana na slici 1.5.
Njene glavne strukturne komponente su:
Upravljačka jedinica:
upravlja radom CPU, a time i računara u celini.
Aritmetička i logička jedinica (ALU):
izvodi funkcije obrade podataka računara.
Registri:
obezbeđuju unutrašnje skladištenje za CPU.
Međupovezivanje CPU:
neki mehanizam koji obezbeđuje komunikaciju između upravljačke
jedinice, ALU i registara.
Svaka od tih komponenata detaljno će se ispitati, pa ćemo videti da se složenost povećava
upotrebom organizacionih tehnika paralelne i protočne obrade. Najzad, postoji više pristupa
implementaciji upravljačke jedinice; jedan od uobičajenih pristupa je
mikroprogramirana
implementacija
. Mikroprogramirana upravljačka jedinica u suštini radi tako što izvršava
mikroinstrukcije koje definišu njenu funkcionalnost. Takvim pristupom, struktura upravljačke jedinice
može da bude opisana kao na slici 1.6.
Poglavlje 2
EVOLUCIJA I PERFORMANSA RAČUNARA
Evoluciju računara su obeležili povećanje brzina procesora, smanjivanje veličine računara,
povećavanje veličine memorije i povećavanje kapaciteta i brzine U/I.
Jedan od činilaca odgovornih za veliko povećanje brzine procesora jeste smanjenje veličine
mikroprocesorskih komponenata; to smanjuje rastojanje izmedu komponenata i stoga povećava
brzinu. Međutim, pravi dobitak u brzini poslednjih godina posledica je organizacije procesora,
uključujući obimnu upotrebu tehnika protočne obrade i paralelnog izvršenja i korišćenje tehnike
spekulativnog izvršenja, koja rezultuje probnim izvršenjem budućih instrukcija koje bi mogle biti
potrebne. Sve te tehnike su projektovane da bi se procesor držao zaposlenim u što je moguće većem
delu vremena.
Najvažnije pitanje u projektovanju računara jeste uravnoteženje performanse raznih elemenata,
tako da dobici u performansi u jednoj oblasti ne budu ometeni zaostajanjem u drugim oblastima.
4
Posebno, brzina procesora se više povećavala od vremena pristupa memoriji. Razne tehnike se
koriste da bi se kompenzovala ta nesaglasnost, uključujući keš memorije, šire putanje podataka od
memorije do procesora i inteligentnije memorijske čipove.
Našu studiju računara počinjemo kratkom istorijom. Ta istorija je sama po sebi zanimljiva, a takođe
služi i za obezbeđenje pregleda strukture i funkcije računara. Zatim ćemo se posvetiti pitanju
performanse. Razmatranje potrebe za uravnoteženim korišćenjem računarskih resursa pruža kontekst
koji je koristan u celoj knjizi. Najzad, ukratko razmatram o evoluciju dva sistema koji služe kao ključni
primeri u celoj knjizi: Pentium i PowerPC.
KRATKA ISTORIJA RAČUNARA
Von Neumann i njegove kolege počeli su, 1946. godine, na Prinstonovom institutu za napredne
studije, projekat novog računara sa unutrašnjim programom, poznatog kao računar lAS. Računar lAS,
iako nezavršen do 1952. godine, predstavlja prototip svih sledećih računara opšte namene.
Na slici 2.1 prikazana je opšta struktura računara lAS. Ona se sastoji od:
glavne memorije, u kojoj su uskladišteni i podaci i instrukcije
aritmetičke i logičke jedinice (ALU), sposobne za rad na binarnim podacima;
upravljačke jedinice, koja interpretira instrukcije u memoriji i prouzrokuje njihovo izvršenje;
ulazne i izlazne (U/I) opreme kojom rukuje upravljačka jedinica.
Ta struktura bila je skicirana u ranijem von Neumannovom predlogu.
Sa retkim izuzecima, svi današnji računari imaju ovu istu opštu strukturu i funkciju, pa se zato zovu
von Neumannove
mašine. Dakle, vredi na ovom mestu ukratko opisati rad računara lAS terminologija i
notacija von Neumanna su se promenile da bi bile u većoj saglasnosti sa savremenom upotrebom; primeri
i ilustracije uz ovu raspravu zasnovani su na ovom poslednjem tekstu.
Memorija IAS-a sastoji se od 1000 lokacija, koje se zovu
reči, svaka od po 40 binarnih cifara
(bitova). Nema univerzalne definicije termina
reč.
Uopšte,
reč
je uređen skup bajtova ili bitova koji je normalna jedinica u kojoj informacije mogu da se
skladište, prenose ili na njima radi unutar datog računara. Tipično, ako procesor ima skup instrukcija
fiksirane dužine, onda je dužina instrukcije jednaka dužini reči.
Tu se skladište i podaci i instrukcije. Dakle, brojevi moraju da se predstavljaju u binarnom obliku, a
svaka instrukcija takođe mora da bude u binarnom kodu. Na slici 2.2 ilustrovani su ti formati. Svaki broj
se predstavlja pomoću bita za znak i 39-bitne vrednosti. Reč takođe može da sadrži 20-bitne
instrukcije, gde se svaka instrukcija sastoji od 8-bitnog koda operacije (opkoda) koji određuje
operaciju za izvođenje i 12-bitne adrese koja označava jednu od reči u memoriji (numerisanih od 0 do
999).
Upravljačka jedinica rukuje IAS-om pomoću donošenja instrukcija iz memorije i njihovim
izvršavanjem, po jedne istovremeno. Da bi se to objasnilo, potreban je detaljniji strukturni dijagram,
kao što je prikazano na slici 2.3. Ta slika otkriva da i upravljačka jedinica i ALU sadrže memorijske
lokacije koje se zovu
registri,
definisani na sledeći način:
Memorijski bafer registar
(MBR): sadrži reč koja treba da se skladišti u memoriji ili pošalje u
U/I jedinicu, ili se koristi da prima reč iz memorije ili iz U/I jedinice.
Memorijski adresni registar (MAR):
određuje adresu u memorlji reči koja treba da se upiše iz
MBR-a, ili učita u njega.
Instrukcijski registar (IR):
sadrži 8-bitni kod operacije instrukcije koja se izvršava.
Instrukcijski bafer registar (IBR):
koristi se da privremeno drži desnu instrukciju iz reči u
5

specifično projektovana za to računanje. O procesu povezivanja raznih komponenata u željenu
konfiguraciju, možemo da razmišljamo kao o jednom obliku programiranja. Rezultujući "program" je u
obliku hardvera i zove se
ožičeni program.
Razmotrite sada ovu alternativu. Pretpostavite da konstruišemo konfiguraciju opšte namene za
aritmetičke i logičke funkcije. Taj skup hardvera će izvoditi razne funkcije na podacima, u zavisnosti od
upravljačkih signala koji se dovode na hardver. U prvo
bitnom slučaju posebno
razvijenog hardvera, sistem prihvata podatke i proizvodi rezultate (slika 3.1a). Sa hardverom opšte
namene, sistem prihvata podatke i upravljačke signale i proizvodi rezultate. Dakle, umesto da ponovo
ožičava hardver za svaki nov program, programer treba samo da obezbedi nov skup upravljačkih signala.
Kako da se obezbede upravljački signali? Odgovor je jednostavan, ali ne i suptilan. Ceo program je, u
stvari, niz koraka. U svakom koraku izvode se neke aritmetičke ili logičke operacije nad nekim podacima.
Za svaki korak, potreban je nov skup upravljačkih signala. Hajde da obezbedimo jedinstven kod za svaki
mogući skup upravljačkih signala i da dodamo hardveru opšte namene segment koji može da prihvati kod
i generiše upravljačke signale (slika 3.1 b).
Programiranje je sada mnogo lakše. Umesto da ponovo ožičavamo hardver za svaki nov program, samo
treba da obezbedimo nov niz kodova. Svaki kod je u stvari instrukcija, a deo hardvera interpretira
svaku instrukciju i generiše upravljačke signale. Da bi se razlikovala ta nova metoda programiranja, niz
kodova instrukcija zove se
softver.
Na slici 3.1 b prikazane su dve glavne komponente sistema
: interpreter instrukcija i modul opšte
namene za aritmetičke i logičke funkcije.
Te dve komponente čine CPU. Potrebno je još nekoliko
drugih komponenata da bi se dobilo funkcionisanje računara. Podaci i instrukcije moraju da se stave u
sistem. Za to nam treba neka vrsta
ulaznog modula.
Taj modul sadrži osnovne komponente za
prihvatanje podataka i instrukcija u nekom obliku i njihovo pretvaranje u unutrašnji oblik signala koje
sistem može da koristi. Potrebno je sredstvo za izveštavanje o rezultatima i ono je u obliku
izlaznog
modula
. Uzete zajedno, to se zovu
U/I komponente.
Potrebna je još jedna komponenta. Ulazni uređaj će doneti instrukcije i podatke sekvencijalno. Ali,
program se ne izvršava nepromenljivo sekvencijalno; on može da ima skokove (odnosno, lAS instrukciju
za skok). Slično tome, operacije nad podacima mogu da zahtevaju pristup više nego samo jednom
elementu istovremeno, u unapred određenoj sekvenci. Dakle, mora postojati mesto za privremeno
skladištenje i instrukcija i podataka. Taj modul zove se
memorija, ili glavna memorija
, za razliku od
spoljašnje memorije ili periferijskih uređaja. Von Neumann je istakao da bi ista memorija mogla da se
upotrebi za
skladištenje i instrukcija i podataka.
Na slici 3.2 ilustrovane su te komponente gornjeg nivoa i nagoveštena su njihova međusobna dejstva.
CPU razmenjuje podatke sa memorijom. Za tu svrhu on tipično koristi dva unutrašnja (za CPU) registra:
memorijski adresni registar (MAR), koji određuje adresu u memoriji za sledeće čitanje ili upisivanje i
memorijski bafer registar (MBR), koji sadrži podatak koji treba da se upiše u memoriju, ili prima
podatak koji se čita iz memorije. Slično tome, U/I adresni registar (U/IAR) specificira određeni U/I
uređaj. U/I bafer registar (U/IBR) se koristi za razmenu podataka između U/I modula i CPU-a.
Memorijski modul se sastoji od skupa lokacija, definisanih sekvencijalno numerisanim adresama.
Svaka lokacija sadrži binarni broj koji može da se interpretira, ili kao instrukcija ili kao podatak. U/I
modul prenosi podatke iz spoljašnjih uređaja ka centralnoj procesorskoj jedinici i memoriji i obrnuto.
On sadrži unutrašnje bafere za privremeno držanje tih podataka, dok oni ne budu mogli da se pošalju.
Sad, kada smo ukratko razmotrili glavne komponente, razmotri ćemo kako te komponente funkcionišu
zajedno da bi izvršile program.
Osnovna funkcija koju izvodi računar je
izvršenje programa,
koji se sastoji od skupa instrukcija
7
uskladištenih u memoriji. Procesor obavlja stvarni posao izvršavajući instrukcije specificirane u
programu. U ovom odeljku daje se pregled ključnih elemenata izvršenja programa. U svom
najjednostavnijem obliku, obrada instrukcija se sastoji od dva koraka: procesor čita (donosi) instrukcije
iz memorije, po jednu istovremeno i izvršava svaku instrukciju. Izvršenje programa se sastoji od
ponavljanja procesa donošenja i izvršenja instrukcije. Izvršenje instrukcije može da obuhvati više
operacija i zavisi od prirode instrukcije (pogledajte, na primer, donji deo slike 2.4).
Obrada koja se zahteva za jednu instrukciju zove se
instrukcijski ciklus. Koristeći pojednostavljeni
opis u dva koraka koji je prethodno dat, ciklus instrukcije je prikazan na slici 3.3. Dva koraka se zovu
ciklus donošenja i ciklus izvršenja. Izvršenje programa zaustavlja se samo ako se mašina isključi, ako se
pojavi neka vrsta nepopravljive greške, ili ako se naiđe na instrukciju programa koja zaustavlja računar.
Donošenje i izvršenje instrukcije
Na početku svakog instrukcijskog ciklusa, procesor donosi instrukciju iz memorije. U tipičnom
procesoru, registar koji se zove programski brojač (PC) drži adresu instrukcije koja treba sledeća da
se donese. Ukoliko mu se ne kaže drugačije, procesor uvek povećava sadržaj programskog brojača posle
svakog donošenja instrukcije, tako da će da donese sledeću instrukciju u nizu (odnosno, instrukciju koja
se nalazi na sledećoj višoj memorijskoj adresi). Tako, na primer, zamislite računar u kome svaka
instrukcija zauzima jednu 16-bitnu reč memorije. Pretpostavite da je programski brojač postavljen na
lokaciju 300. Procesor će kao sledeću doneti instrukciju na lokaciji 300. U sledećim instrukcijskim
ciklusima, on će donositi instrukcije sa lokacija 301, 302, 303 i tako dalje. Ta sekvenca može da se
promeni, što ćemo uskoro objasniti.
Donesena instrukcija se učitava u registar u procesoru koji je poznat kao instrukcijski registar (IR).
Instrukcija sadrži bitove koji određuju akciju koju procesor treba da preduzme. Procesor interpretira
instrukciju i izvodi zahtevanu akciju. Te akcije obično spadaju u jednu od sledeće četiri kategorije:
Procesor-memorija: podaci mogu da se prenose od procesora do memorije ili od memorije do
procesora.
Procesor-U/I: podaci mogu da se prenose do periferijskog uređaja ili od njega, prenosom između
procesora i U
II modula.
Obrada podataka: procesor može da izvodi neke aritmetičke ili logičke operacije nad podacima.
Upravljanje: instrukcija može da odredi da se promeni sekvenca izvršenja. Na primer, procesor
može da donese instrukciju sa lokacije 149, koja određuje da sledeća instrukcija bude sa
lokacije 182. Procesor će zapamtiti tu činjenicu postavljanjem programskog brojača na 182.
Dakle, prilikom sledećeg ciklusa donošenja, instrukcija će se doneti sa lokacije 182, a ne 150.
Izvršenje instrukcije može da obuhvati kombinaciju tih akcija.
Razmotrite jednostavan primer, koristeći hipotetičku mašinu koja ima karakteristike izlistane na
slici 3.4. Procesor sadrži jedan registar za podatke, koji se zove akumulator (AC). I instrukcije i podaci
su dužine 16 bitova. Dakle, pogodno je organi. zovati memoriju tako da se koriste 16-bitne reči. Format
instrukcije obezbeđuje 4 bita za kod operacije, pa može da bude 24 = 16 različitih kodova operacije i
do 212 = 4096 (4K) reči memorije koje mogu direktno da se adresiraju.
Na slici 3.5 ilustrovano je delimično izvršenje programa, pokazujući bitne delove memorije i
procesorske registre. Prikazani deo programa dodaje sadržaj memorijske reči na adresi 940 sadržaju
memorijske reči na adresi 941 i skladišti rezultat u tu poslednju lokaciju. Zahtevaju se tri instrukcije,
koje mogu da se opišu kao tri ciklusa donošenja i tri ciklusa izvršenja:
1. PC sadrži 300, adresu prve instrukcije. Ta instrukcija (vrednost 1940 u heksadecimalnom
sistemu) učitava se u instrukcijski registar IR i povećava se sadržaj PC-a. Zapazite da taj proces
8

Stanja u gornjem delu slike 3.6 obuhvataju razmenu između procesora i memorije ili U/I modula.
Stanja u donjem delu dijagrama obuhvataju samo unutrašnje operacije procesora. Stanje proračuna
adrese operanda pojavljuje se dva puta zato što instrukcija može da obuhvati čitanje, upisivanje ili oba.
Međutim, akcija koja se izvodi za vreme tog stanja je u osnovi ista u oba slučaja, pa je potreban samo
jedan identifikator stanja.
Takođe zapazite da dijagram dozvoljava višestruke operande i višestruke rezultate zato što neke
instrukcije na pojedinim mašinama to zahtevaju. Na primer, instrukcija ADD A,B na mašini PDP-11
rezultuje sledećom sekvencom stanja: iac, if, iod, oac, of, oac, of , do, oac, os.
Najzad, na nekim mašinama, jedna instrukcija može da odredi da se operacija izvrši na vektoru
(jednodimenzionalnoj matrici) brojeva ili nizu (jednodimenzionalnoj matrici) znakova. Kao što se vidi na
slici 3.6, to bi obuhvatilo ponavljanje operacija donošenja ilili skladištenja.
Prekidi
Skoro svi računari obezbeđuju mehanizam pomoću koga drugi moduli (U/I, memorija) mogu da prekinu
normalnu obradu procesora. U tabeli 3.1 izlistane su najčešće klase prekida. Treba da uvedemo koncept
sada da bi se jasnije razumela priroda instrukcijskog ciklusa i implikacija prekida na strukturu
međusobnog povezivanja.
Prekidi
se obezbeđuju prvenstveno kao način da se poboljša efikasnost obrade. Na primer, većina
spoljašnjih uređaja je mnogo sporija od procesora. Pretpostavite da procesor prenosi podatke do
štampača, koristeći šemu instrukcijskog ciklusa sa slike 3.3. Posle svake operacije upisivanja, procesor
mora da napravi pauzu i ostane besposlen, dok štampač ne uhvati korak. Dužina te pauze može da bude
reda veličine više stotina ili čak hiljada instrukcijskih ciklusa, koji ne obuhvataju memoriju. Jasno je da
je to vrlo rasipnička upotreba procesora.
Na slici 3.7a ilustrovano je takvo stanje stvari. Korisnički program izvodi seriju WRITE poziva
isprepletanih sa obradom. Segmenti koda 1, 2 i 3 odnose se na sekvence instrukcija koje ne obuhvataju
U/I. Pozivi WRITE se odnose na sistemski uslužni program koji će da izvede stvarnu U/I
operaciju. U/I
program se sastoji od tri odeljka:
Sekvenca instrukcija, na slici označena sa 4, za pripremu stvarne U/I operacije. To može da
uključi kopiranje podataka za izlaz u specijalni bafer i pripremanje parametara za komandu
uređaja.
Stvarna U/I komanda. Bez upotrebe prekida, jednom kada se ta komanda izda, program mora da
čeka da U/I uređaj izvede zahtevanu funkciju (ili periodično da proziva taj uređaj). Program
mora da čeka jednostavno ponavljajući test operaciju kako bi utvrdio da li je U/I operacija
izvršena.
Sekvenca instrukcija, na slici označena sa 5, za kompletiranje operacije. To može da uključi
postavljanje signala koji ukazuje na uspeh ili neuspeh operacije.
S obzirom na to da U/I operacija može da traje relativno dugo da bi se kompletirala, U/I program
može da prestane da čeka da se operacija završi; dakle, korisnički program se zaustavio u tački poziva
WRITE za izvestan značajan vremenski period.
Prekidi i instrukcijski ciklus
Kod prekida, procesor može da se angažuje u izvršenju drugih instrukcija
dok je u toku U/I operacija. Razmotrite tok upravljanja na slici 3.7b. Kao i u prethodnom slučaju,
program dostiže tačku u kojoj pravi sistemski poziv u obliku WRITE poziva. U/I program koji je pozvan
u tom slučaju, sastoji se samo od pripremnog koda i stvarne U/I komande. Pošto se tih nekoliko
instrukcija izvrše, upravljanje se vraća korisničkom programu. U međuvremenu, spoljašnji uređaj je
10
zauzet prihvatanjem podataka iz računarske memorije i njihovim štampanjem. Ta U/I operacija
sprovodi se konkurentno sa izvršenjem instrukcija u korisničkom programu.
Kada spoljašnji uređaj postane spreman da bude opslužen, odnosno, kada je spreman da prihvati još
podataka iz procesora, U/I modul za taj spoljašnji uređaj šalje procesoru signal
zahteva za prekidom.
Procesor odgovara prekidanjem operacije trenutno izvršavanog programa, grananjem u program za
opsluživanje tog posebnog U/I uređaja, koji se zove upravljački program signala prekida, i
nastavljanjem prvobitnog izvršenja kada se uređaj opsluži. Tačke u kojima dolazi do takvih prekida
obeležene su zvezdicom na slici 3.7b.
Sa tačke gledišta korisničkog programa, prekid je baš to: prekidanje normalne sekvence izvršenja.
Kada se obrada prekida završi, izvršenje se nastavlja (slika 3.8). Dakle, korisnički program ne mora da
sadrži nikakav specijalan kod da bi prihvatio prekide; procesor i operativni sistem su odgovorni za
prekidanje korisničkog programa i zatim njegovo nastavljanje u istoj tački.
Da bi se prihvatili prekidi, instrukcijskom ciklusu dodaje se
ciklus prekida, kao što je prikazano na
slici 3.9. U ciklusu prekida, procesor proverava kako bi video da li se pojavio bilo kakav prekid, što se
pokazuje prisustvom signala prekida. Ako nema nerešenog prekida, procesor prelazi u ciklus donošenja i
donosi sledeću instrukciju trenutno izvršavanog programa. Ako postoji nerešen prekid, procesor postupa
na sledeći način:
Suspenduje izvršenje trenutno izvršavanog programa i čuva njegov kontekst. To znači čuvanje
adrese sledeće instrukcije za izvršenje (trenutni sadržaj programskog brojača) i svih drugih
podataka značajnih za trenutnu aktivnost procesora.
Postavlja programski brojač na početnu adresu rutine
upravljačkog programa signala prekida.
Procesor sada produžava u ciklus donošenja i donosi prvu instrukciju upravljačkog programa signala
prekida, koji će opslužiti prekid. Upravljački program signala prekida obično je deo operativnog sistema.
Tipično, taj program određuje prirodu prekida i izvodi sve akcije koje su potrebne. U primeru koji smo
koristili, upravljački program prekida određuje koji U/I modul je generisao prekid i može da skoči na
program koji će upisati još podataka u taj U/I modul. Kada se rutina upravljačkog programa za signal
prekida završi, procesor može da nastavi izvršenje korisničkog programa u tački prekida.
Jasno je da u ovom procesu ima nešto dodatnog opterećenja. Moraju da se izvrše dodatne
instrukcije (u upravljačkom programu za signal prekida) kako bi se odredila priroda prekida i da bi se
odlučilo o odgovarajućoj akciji. Ipak, zbog relativno velike količine vremena koje bi se izgubilo prosto
čekajući na U/I operaciju, uz upotrebu prekida procesor može efikasnije da se zaposli.
Da biste procenili dobitak u efikasnosti, razmotrite sliku 3.10, koja predstavlja vremenski dijagram
zasnovan na toku upravljanja na slikama 3.7a i 3.7b. Na slikama 3.7b i 3.10 usvojeno je da je vreme
potrebno za U/I operaciju relativno kratko: manje od vremena potrebnog da se kompletira izvršenje
instrukcija između operacija upisivanja u korisničkom programu. U tipičnijem slučaju, posebno za spore
uređaje kao što je štampač, U/I operacija će uzeti mnogo više vremena od izvršenja sekvence
korisničkih instrukcija. Na slici 3.7c prikazano je takvo stanje stvari. U tom slučaju, korisnički program
dostiže drugi poziv WRITE pre nego što se završi U/I operacija koju je prouzrokovao prvi poziv.
Rezultat je da korisnički program prekida u toj tački. Kada se kompletira prethodna U/I operacija, taj
novi poziv WRITE može da se obradi i započne nova U/I operacija. Na slici 3.11 prikazano je vremensko
usklađenje za tu situaciju, sa i bez upotrebe prekida. Možemo videti da će i dalje biti dobitka u
efikasnosti zato što se deo vremena u kome se odvija U/I operacija preklapa sa izvršenjem korisničkih
instrukcija.
Na slici 3.12 prikazanje prerađen dijagram stanja instrukcijskog ciklusa koji uključuje obradu
ciklusa prekida.
11

prenos U/I - memorija može da se dogodi bez vezivanja procesora. Za vreme takvog prenosa, U/I modul
izdaje komande za čitanje ili upisivanje u memoriju, oslobađajući procesor odgovornosti za takvu
razmenu. Ta operacija je poznata kao direktan pristup memoriji (DMA) i detaljno se ispituje kasnije.
3.3 STRUKTURE ZA MEĐUSOBNO POVEZIVANJE
Računar se sastoji od skupa komponenata ili modula tri osnovne vrste (procesor, memorija, U/I), koji
komuniciraju jedan sa drugim. U stvari, računar je mreža osnovnih modula. Dakle, moraju da postoje
putanje za povezivanje modula.
Zbirka putanja koje povezuju razne module zove se
struktura za medusobno povezivanje. Dizajn te
strukture će zavisiti od razmena, koje moraju da se prave između modula.
Na slici 3.5 date su potrebne vrste razmena, pomoću ukazivanja na glavne oblike ulaza i izlaza za
svaku vrstu modula:
Memorija: memorijski modul se tipično sastoji od
N reči jednake dužine. Svakoj reči se
pridružuje jedinstvena numerička adresa (0,2,...,
N-I). Reč podatka može da se pročita iz
memorije, ili u nju upiše. Priroda operacije je pokazana pomoću upravljačkih signala za čitanje i
upisivanje.
U/I modul: sa (za računar) unutrašnje tačke gledišta, U/I je funkcionalno sličan memoriji.
Postoje dve operacije, čitanje i upisivanje. Pored toga, U/I modul može da upravlja jednim ili više
spoljašnjih uređaja. Na svaki od interfejsa ka spoljašnjim uređajima pozivaćemo se kao na
port i
svakom ćemo dati jedinstvenu adresu (na primer 0, 1,...,
M-I). Uz to, postoje spoljašnje putanje
podataka za ulaz i izlaz podataka sa spoljašnjeg uređaja. Najzad, U/I modul može biti sposoban
da šalje procesoru signale prekida.
Procesor: procesor čita instrukcije i podatke, upisuje podatke posle obrade i koristi upravljačke
signale da upravlja celokupnim radom sistema. On takođe prima i signale prekida.
Prethodna lista definiše podatke koji treba da se razmenjuju. Struktura međusobnog povezivanja
mora da podrži sledeće vrste prenosa:
Memorija ka procesoru: procesor čita instrukciju ili jedinicu podataka iz memorije.
Procesor ka memoriji: procesor upisuje jedinicu podataka u memoriju.
U/I ka procesoru: procesor čita podatke iz U/I uređaja preko U/I modula.
Procesor ka U/I: procesor šalje podatke ka U/I uređaju.
U/I ka memoriji ili od nje: za ta dva slučaja, U/I modulu se dozvoljava da razmenjuje podatke
direktno sa memorijom, bez prolaženja kroz procesor, koristeći direktan pristup memoriji
(DMA).
Tokom godina, isproban je veliki broj struktura za međusobno povezivanje. Najzastupljenije su
magistrala i različite strukture sa višestrukim magistralama. Ostatak ovog poglavlja posvećen je proceni
struktura magistrala.
3.4 MEĐUSOBNO POVEZIVANJE MAGISTRALOM
Magistrala je komunikaciona putanja, koja povezuje dva ili više uređaja. Ključna karakteristika
magistrale je da je ona deljeni prenosni medijum. Više uređaja se priključuju na magistralu, a signal koji
prenosi bilo koji uređaj na raspolaganju je za prijem svim ostalim uređajima priključenim na magistralu.
Ako dva uređaja predaju u istom vremenskom periodu, njihovi signali će se preklopiti i pokvariti. Dakle,
samo jedan uređaj može uspešno da predaje istovremeno.
Magistrala se tipično sastoji od više komunikacionih putanja, ili linija. Svaka linija je sposobna da
prenosi signale koji predstavljaju binarne cifre 1 i O. U toku vremena, sekvenca binarnih cifara može da
13
se prenese preko jedne linije. Uzete zajedno, više linija magistrale mogu da se upotrebe da istovremeno
(paralelno) predaju binarne cifre. Na primer, 8-bitna jedinica podataka može da se preda preko osam
linija magistrale.
Računarski sistemi sadrže izvestan broj različitih magistrala koje obezbeđuju putanje između
komponenata na raznim nivoima hijerarhije računarskog sistema. Magistrala koja povezuje glavne
računarske komponente (procesor, memoriju, U/I) zove se
sistemska magistrala. Najčešće računarske
strukture za međusobno povezivanje zasnivaju se na upotrebi jedne ili više sistemskih magistrala.
Struktura magistrale
Sistemska magistrala se tipično sastoji od oko 50 do više stotina posebnih linija. Svakoj liniji dodeljuje
se posebno značenje ili funkcija. Mada postoji mnogo različitih konstrukcija magistrala, na svakoj od
njih linije mogu da se klasifikuju u tri funkcionalne grupe (slika 3.16): linije za podatke, adresne i
upravljačke linije.
Unije podataka obezbeđuju putanju za pomeranje podataka između modula sistema. Te linije se
zajedno zovu
magistrala podataka. Magistrala podataka može da se sastoji od 32 do više stotina linija,
na šta se poziva kao na
širinu magistrale podataka. S obzirom na to da jedna linija može da prenosi samo
1 bit istovremeno, broj linija određuje koliko bitova može da se prenosi odjednom. Širina magistrale
podataka je ključni činilac u određivanju ukupne performanse sistema. Na primer, ako je magistrala
podataka širine 8 bitova, a svaka instrukcija duga 16 bitova, onda procesor mora da pristupa memoriji
dva puta za vreme svakog instrukcijskog ciklusa.
Adresne linije se koriste da označe izvor ili odredište podataka na magistrali podataka. Na primer,
ako procesor želi da čita reč (od 8, 16 ili 32 bita) podataka iz memorije, on stavlja adresu željene reči
na adresne linije. Jasno, širina adresne magistrale određuje maksimalno moguć kapacitet memorije
sistema. Pored toga, adresne linije se obično koriste i za adresiranje U/I portova. Bitovi višeg reda se
tipično koriste da se izabere određeni modul na magistrali, a bitovi nižeg reda da se izabere
memorijska lokacija ili U/I port unutar modula. Na primer, na 8-bitnoj adresnoj magistrali, adrese
01111111 i niže bi mogle da se odnose na memorijski modul (modul O) sa 128 reči memorije, a adrese
10000000 i više bi mogle da se odnose na uređaje priključene na U/I modul (modul!).
Upravljačke linije se koriste da se upravlja pristupom i upotrebom linija za podatke i adrese. S
obzirom na to da linije za adrese i podatke dele sve komponente, one moraju da budu sredstvo za
upravljanje njihovom upotrebom. Upravljački signali predaju i komandne i vremenske informacije između
modula sistema. Vremenski signali ukazuju na validnost informacija o podacima i adresama. Komandni
signali određuju operacije koje treba da se izvedu. Tipične upravljačke linije uključuju:
Upis u memoriju: prouzrokuje da se podatak na magistrali upiše u adresiranu lokaciju.
Čitanje iz memorije: prouzrokuje da se podatak iz adresirane lokacije postavi na magistralu.
U/I upis: prouzrokuje da podatak na magistrali izađe na adresirani U/I port.
U/I čitanje: prouzrokuje da se podatak iz adresiranog U/I porta postavi na magistralu.
Prenos ACK: pokazuje da je podatak prihvaćen sa magistrale, ili postavljen na nju.
Zahtev za magistralu: pokazuje da je modulu potrebno da dobije upravljanje nad magistralom.
Odobrenje magistrale: pokazuje da je modulu koji je to zahtevao odobreno upravljanje nad
magistralom.
Zahtev za prekidom: pokazuje da je prekid nerešen.
Prekid ACK: potvrđuje da je nerešen prekid prepoznat.
Clock: koristi se za sinhronizaciju operacija.
Reset: inicijalizuje sve module.
14

aranžman dozvoljava sistemu da podrži veoma raznovrsne U/I uređaje i da u isto vreme izoluje
saobraćaj od memorije do procesora, od U/I saobraćaja.
Na slici 3.18a prikazani su neki tipični primeri U/I uređaja koji bi mogli da se priključe na magistralu
za proširenje. Mrežna povezivanja uključuju lokalne računarske mreže (LAN), kao što je 10 Mb/s
Ethernet i povezivanja za regionalne računarske mreže (WAN), kao što je mreža sa komutacijom
paketa. SC SI (interfejs malih računarskih sistema) je i sam vrsta magistrale koja se koristi da podrži
lokalne diskove i druge periferijske uređaje. Serijski port bi mogao da se upotrebi da podrži štampač ili
skener.
Ta tradicionalna arhitektura magistrale je razumno efikasna, ali počinje da koči kada U/I uređaji
postaju sve brži. Odgovor na te rastuće zahteve je uobičajeni pristup industrije da gradi veoma brze
magistrale koje su blisko integrisane sa ostatkom sistema, zahtevajući samo most između procesorske
magistrale i magistrale velike brzine. Takav aranžman se ponekad zove arhitektura međusprata.
Na slici 3.18b prikazana je tipična realizacija tog pristupa. Opet postoji lokalna magistrala koja
povezuje procesor sa kontrolerom keša, koji je sa svoje strane povezan sa sistemskom magistralom koja
podržava glavnu memoriju. Kontroler keš memorije je integrisan u most, ili uređaj za baferovanje, koji
je povezan sa magistralom velike brzine. Ta magistrala podržava povezivanja sa veoma brzim LAN-
ovima, kao što je Fast Ethernet na 100 Mb/s, kontrolere video i grafičkih radnih stanica, kao i
kontrolere na lokalnim periferijskim magistralama, uključujući tu SCSI i FireWire. Ova poslednja je
aranžman magistrale velike brzine, projektovana posebno da podrži U/I uređaje velikog kapaciteta.
Uređaji manje brzine se i dalje podržavaju sa magistrale za proširenje, pomoću interfejsa koji baferuje
saobraćaj između magistrale za proširenje i magistrale velike brzine.
Prednost tog aranžmana je u tome što magistrala velike brzine dovodi zahtevne uređaje u bližu
integraciju sa proces~rom, a u isto vreme je nezavisna od procesora. Dakle, razlike u brzinama
procesora i magistrale velike brzine i definicijama signalnih linija se tolerišu. Promene u arhitekturi
procesora ne utiču na magistralu velike brzine i obrnuto.
Elementi projektovanja magistrale
lako ima raznih implementacija magistrale, postoji malo parametara ili elemenata za projektovanje koji
služe da se klasifikuju magistrale i da se među njima napravi razlika. U tabeli 3.2 data je lista ključnih
elemenata.
Vrste magistrala
Linije magistrale mogu da budu razdvojene u dve generičke vrste: namenske i
multipleksirane. Namenska magistrala je stalno dodeljena ili jednoj funkciji, ili fizičkom podskupu
računarskih komponenata.
Primer funkcionalne namene je upotreba razdvojenih namenskih adresnih linija i linija za podatke,
što je uobičajeno na mnogim magistralama. Međutim, to nije od suštinskog značaja. Na primer,
informacije o adresama i podacima mogu da se prenose preko istog skupa linija, koristeći upravljačku
liniju Address Valid (adresa validna). Na početku prenosa podataka, adresa se postavlja na magistralu i
aktivira se linija Address Valid. U tom trenutku svaki modul ima određeni vremenski period da kopira
adresu i utvrdi da li je on adresiran. Adresa se onda uklanja sa magistrale i iste veze magistrale se
koriste za sledeći prenos pročitanog ili upisanog podatka. Ta metoda korišćenja istih linija za višestruke
namene poznata je kao
vremensko multipleksiranje.
Prednost vremenskog multipleksiranja je upotreba manjeg broja linija, što štedi prostor, a obično i
troškove. Nedostatak je što je potrebno složenije elektronsko kolo unutar svakog modula. Takođe,
postoji moguće smanjenje performanse zato što izvesni događaji koji dele iste linije ne mogu da se
dešavaju paralelno.
16
Fizička namena se odnosi na upotrebu višestrukih magistrala, od kojih svaka povezuje samo podskup
modula. Tipičan primer je upotreba U/I magistrale da bi se međusobno povezali svi U/I moduli; ta
magistrala se onda povezuje sa glavnom magistralom preko neke vrste U/I adapterskog modula. Moguća
prednost fizičke namene je velika propusna moć zato što ima manje nadmetanja za magistralu.
Nedostatak je povećanje dimenzija i cene sistema.
Metoda arbitraže
U svim sistemima, sem u onim najjednostavnijim, više od jednog modula mogu da
zahtevaju upravljanje nad magistralom. Na primer, U/I modulu može biti potrebno da čita ili upisuje
direktno u memoriju, bez slanja podataka u procesor. S obzirom na to da samo jedna jedinica
istovremeno može da uspešno predaje preko magistrale, potrebna je neka metoda arbitraže. Razne
metode mogu grubo da se klasifikuju kao centralizovane ili distribuirane. U centralizovanoj šemi, jedan
hardverski element, na koji se poziva kao na
kontroler magistrale, ili arbitar, odgovoran je za
dodeljivanje vremena na magistrali. Uređaj može da bude poseban modul ili deo procesora. U distri-
buiranoj šemi, nema centralnog kontrolera. Umesto toga, svaki modul sadrži pristupnu upravljačku
logiku, a moduli rade zajedno deleći magistralu. Kod obe metode arbitraže, svrha je da se označi jedan
uređaj, bio to procesor ili U/I modul kao gospodar (eng!.
master). Gospodar onda može da započne
prenos podataka (odnosno da čita ili upisuje) sa nekim drugim uređajem, koji za tu posebnu razmenu
deluje kao sluga (eng!.
slave).
Vremensko usklađivanje se odnosi na način na koji se koordiniraju događaji na magistrali.
Magistrale koriste ili sinhrono ili asinhrono vremensko usklađivanje.
Kod sinhronog vremenskog uskladivanja, pojavu događaja na magistrali određuje generator takta.
Magistrala ima liniju generatora takta, preko koje generator takta predaje pravilan niz binarnih cifara 1
i 0. Jedna predaja 1- 0 naziva se
ciklus generatora takta ili ciklus magistrale i definiše vremenski
odsečak. Svi drugi uređaji na magistrali mogu da čitaju liniju takta i svi događaji počinju na početku
ciklusa generatora takta. Na slici 3.19 prikazan je tipičan, ali uprošćen vremenski dijagram za operacije
sinhronog čitanja i upisivanja (za opis vremenskih dijagrama pročitajte dodatak 3A). Ostali signali
magistrale mogu da se menjaju na prednjoj ivici signala generatora takta (uz malo kašnjenje reakcije).
Većina događaja zauzima jedan ciklus generatora takta. U ovom jednostavnom primeru, procesor
postavlja memorijsku adresu na adresne linije za vreme prvog ciklusa generatora takta i može da
potvrdi razne linije stanja. Jednom kada su se adresne linije stabilizovale, procesor izdaje signal
omogućenja adrese. Za operaciju čitanja, procesor izdaje komandu čitanja na početku drugog ciklusa.
Memorijski modul prepoznaje adresu i, posle kašnjenja od jednog ciklusa, postavlja podatak na linije za
podatke. Procesor čita podatak sa linija za podatke i obara signal čitanja. Za operaciju upisivanja,
procesor stavlja podatak na linije za podatke na početku drugog ciklusa i izdaje komandu za upisivanje
kada su se linije za podatke stabilizovale. Memorijski modul kopira informaciju sa linija za podatke za
vreme trećeg ciklusa generatora takta.
Kod asinhronog vremenskog usklađivanja, pojava jednog događaja na magistrali sledi i zavisi od
pojave prethodnog događaja. U jednostavnom primeru čitanja sa slike 3.20a, procesor postavlja adresu
i signale stanja na magistralu. Posle zastanka da bi se ti signali stabilizovali, on izdaje komandu za
čitanje, ukazujući na prisustvo validne adrese i upravljačkih signala. Odgovarajuća memorija dekoduje
adresu i odgovara postavljanjem podatka na linije za podatke. Jednom kada su se linije za podatke
stabilizovale, memorijski modul daje signal na liniji za potvrđivanje da bi obavestio procesor da je
podatak raspoloživ. Kada gospodar pročita podatak sa linija za podatke, on ukida signal za čitanje.
Najzad, kada se linija za potvrđivanje obori, gospodar uklanja adresnu informaciju.
Na slici 3.30b prikazana je jednostavna asinhrona operacija upisivanja. U tom slučaju, gospodar
postavlja podatak na linije za podatke u isto vreme kada stavlja signale na linije za stanja i adrese.
17

savremenih sistema; potrebno je vrlo malo čipova da bi se ona implementirala i podržala druge
magistrale, priključene na PCI magistralu.
Intel je započeo radove na PCI magistrali 1990. godine, za svoje sisteme zasnovane na procesoru
Pentium. Intel je uskoro objavio sve patente u javnom domenu i promovisao stvaranje industrijskog
udruženja PCI SIG, da dalje razvija i održava kompatibilnost specif1kacija PCI. Rezultat je da je PCI
magistrala bila široko prihvaćena i da je sve veća njena upotreba u personalnim računarirna, radnim
stanicama i serverskim sistemima. S obzirom na to da je specif1kacija u javnom domenu i da je podržava
širok presek industrije mikroprocesora i periferijskih uređaja, PCI proizvodi koje prave razni
proizvođači su kompatibilni.
PCI magistrala je projektovana da podrži razne konfiguracije zasnovane na mikroprocesorima,
uključujući i jednoprocesorske i multiprocesorske sisteme. Prema tome, ona obezbeđuje skup funkcija
opšte namene. Ona koristi sinhrono vremensko usklađivanje i centralizovanu šemu arbitraže.
Na slici 3.22a prikazana je tipična upotreba PCI magistrale u jednoprofesorskom sistemu.
Kombinovani kontroler DRAM memorije i most ka PCI magistrali obezbeđuje čvrsto sprezanje sa
procesorom i sposobnost da se podaci isporučuju velikom brzinom. Most radi kao bafer za podatke, tako
da brzina magistrale PCI može da se razlikuje od U/I sposobnosti procesora. U mu1tiprocesorskom
sistemu (slika 3.22b), jedna ili više PCI konfiguracija mogu da se povežu pomoću mostova sa sistemskom
magistralom procesora. Sistemska magistrala podržava samo jedinice procesora/keš memorije, glavnu
memoriju i PCI mostove. I ovde upotreba mostova održava PCI magistralu nezavisnom od brzine
procesora, a da ipak obezbeđuje sposobnost da se podaci brzo primaju i isporučuju.
Struktura magistrale
PCI može da se konfiguriše kao 32-bitna ili 64-bitna magistrala. U tabeli 3.3 definisano je 49 obaveznih
linija za PCI magistralu. One se dele na sledeće funkcionalne grupe:
Sistemski pinovi: uključuju pinove za generator takta ireset.
Pinovi za adrese i podatke: uključuju 32 linije koje se vremenski multiplfksiraju za adrese i
podatke. Ostale linije u toj grupi se koriste da interpretirajl1 i vrše validaciju signalnih linija
koje nose adrese i podaci.
Pinovi upravljačkog interfejsa: upravljaju vremenskim usklađenjem transakcija
i
obezbeđuju koordinaciju između inicijatora i ciljeva.
Pinovi za arbitražu: za razliku od ostalih signalnih linija PCI, ove nisu deljene. Umesto toga, svaki
gospodar PCI magistrale ima sopstveni par linija za arbitražu
, koji ga direktno povezuje sa
arbitrom PCI magistrale.
Pinovi za izveštavanje o greškama: koriste se da izveste o greškama parnosti i drugim greškama.
Pored toga, specifikacija PCI magistrale definiše 51 opcionalnu signalnu liniju (tabela 3.4), koje su
podeljene na sledeće funkcionalne grupe:
Pinovi za prekide: oni su dati PCI uređajima koji mogu da generišu zahteve za uslu
gama. Kao
kod pinova za arbitražu, to nisu deljene linije. Umesto toga, svaki PCI uređaj ima sopstvenu
liniju ili linije za prekide, koje vode do kontrolera prekida.
Pinovi za podršku keš memorija: ti pinovi su potrebni da podrže memoriju na PCI magistrali, koja
može da bude keširana u procesoru ili nekom drugom uređaju. Ti pinovi podržavaju ispitne keš
protokole (pročitajte poglavlje 18 radi diskusije o takvim protokolima).
Komande PCI
Aktivnost magistrale se odvija u obliku transakcija između inicijatora, ili gospodara, i ciljnog uređaja.
Kada gospodar magistrale dobije upravljanje nad magistralom, on određuje vrstu transakcije koja će se
19
sledeća dogoditi. Za vreme adresne faze transakcije, linije C/BE se koriste da signaliziraju vrstu
transakcije. Komande su sledeće:
potvrda prekida,
specijalan ciklus,
U/I čitanje,
U/I upisivanje,
čitanje memorije,
čitanje reda memorije,
višestruko čitanje memorije,
upisivanje u memoriju,
upisivanje u memoriju i poništavanje,
čitanje konfiguracije,
upisivanje konfiguracije,
dvostruki adresni ciklus.
Potvrda prekida je komanda čitanja, namenjena za uređaj koji radi kao kontroler prekida na
magistrali PCI. Adresne linije se ne koriste za vreme adresne faze, alinije za omogućavanje bajta
pokazuju veličinu identifikatora prekida koji treba da se vrati.
Komandu specijalni ciklus koristi inicijator da difuzno emituje poruku ka jednom ili više ciljnih
uređaja.
Komande U/I čitanje i upisivanje koriste se za prenos podataka između inicijatora i U/I kontrolera.
Svaki U/I uređaj ima sopstveni adresni prostor, a adresne linije se koriste da pokažu određeni uređaj i
specificira ju podatke koji treba da se prenesu u taj uređaj ili iz njega. Koncept U/I adresa istražuje
se u poglavlju 7.
Komande za memorijsko čitanje ili upisivanje koriste se da odrede prenos niza podataka, zauzimajući
jedan ili više ciklusa. Interpretacija tih komandi zavisi od toga da li memorijski kontroler na magistrali
PCI podržava ili ne podržava PCI protokol za prenose između memorije i keša. Ako podržava, prenos
podataka u memoriju i iz nje odvija se tipično u vidu keš redova, ili blokova2. Tri komande čitanja
memorije imaju primene navedene u tabeli 3.5. Komanda upisivanja u memoriju i poništavanja prenosi
podatke u memoriju u jednom ili više ciklusa. Pored toga, ona garantuje da je najmanje jedan red keša
upisan. Ta komanda podržava keš funkciju upisivanja reda natrag u memoriju.
Dve komande za konfiguraciju 6mogućavaju gospodaru da čita i ažurira paramere konfiguracije u
uređaju priključenom na PCI. Svaki PCI uređaj može da uključi lo 256 unutrašnjih regi~tara koji se
koriste za vreme inicijalizacije sistema da bi se konfigurisao taj uređaj.
Komandu dvostrukog adresnog ciklus koristi gospodar kako bi pokazao da uporebljava 64-bitno
adresiranje.
prenosi podataka svaki prenos podataka na magistrali PCI je jedna transakcija koja se sastoji od jedne
ze adrese i jedne ili više faza podataka. U ovoj diskusiji, ilustrujemo tipičnu operaciju čitanja; operacija
upisivanja odvija se na sličan način.
Na slici 3.23 prikazano je vremensko usklađenje transakcije čitanja. Svi događaji su sinhronizovani
sa opadajućim prelaskom signala generatora takta, koji se javlja u sredini svakog ciklusa takta. Uređaji
na magistrali uzorkuju linije magistrale na prednjoj ivici na početku ciklusa magistrale. Ovo su značajni
događaji koji su označeni na dijagramu:
Jednom kada je gospodar dobio upravljanje nad magistralom, on može da počne transakciju potvrđujući
FRAME. Ta linija ostaje potvrđena sve dok inicijator ne bude spreman da kompletira poslednju fazu
podatka. Inicijator takođe stavlja adresu na adresnu magistralu i komandu čitanja na linije C/BE.
20

sledećeg ciklusa generatora takta.
Na početku takta 5, B otkriva da su IRDY i FRAME oboreni, pa je tako sposoban da preuzme
upravljanje magistralom potvrđivanjem FRAME. On takođe obara signal na svojoj liniji REQ zato što želi
da izvede samo jednu transakciju.
Zatim se gospodaru A odobrava pristup magistrali radi sledeće transakcije. Zapazite da se arbitraža
dešava u isto vreme kada trenutni gospodar magistrale izvodi prenos podatka. Dakle, nijedan ciklus
magistrale se ne gubi na izvođenje arbitraže. To se zove
skrivena arbitraža.
Poglavlje 4
KEŠ MEMORIJA
KLJUČNE TEZE
Računarska memorija je hijerarhijski organizovana. Na najvišem nivou (najbliže procesoru) nalaze se
procesorski registri. Zatim dolazi jedan ili više nivoa keš memorije. Kada se koristi više nivoa, oni se
označavaju sa L1, L2 itd. Zatim dolazi glavna memorija, koja se obično pravi od dinamičke memorije
sa slučajnim pristupom (DRAM). Sve dosada spomenute memorije smatraju se unutrašnjim
memorijama računarskog sistema. Hijerarhija se nastavlja spoljašnjom memorijom, čiji je sledeći
nivo obično fIksirani čvrsti disk i jedan ili više nivoa ispod njega, koji se sastoje od izmenljivih
medijuma, kao što su optički diskovi i trake.
Kako idemo niz memorijsku hijerarhiju, nailazimo na smanjivanje cene po bitu, povećavanje
kapaciteta i duže vreme pristupa. Bilo bi lepo koristiti samo najbržu memoriju, ali, imajući u vidu da
je ona najskuplja, pravimo kompromis vremena pristupa i cene, više koristeći sporiju memoriju. Izazov
za projektovanje je da se podaci i programi organizuju u memoriji tako da su memorijske reči kojima
se pristupa obično u bržoj memoriji.
Uopšte, verovatno je da će većina budućih pristupanja procesora glavnoj memoriji biti ka onim
lokacijama kojima se nedavno pristupalo. Zato se u keš memoriji zadržavaju kopije nekih nedavno
korišćenih reči iz DRAM memorije. Ako je keš projektovan kako treba, onda će u većini slučajeva
procesor zahtevati memorijske reči koje se već nalaze u kešu.
Mada je naizgled konceptualno jednostavna, računarska memorija ima možda najširi opseg vrsta,
tehnologije, organizacije, performanse i cene od svih svojstava računarskog sistema. Posledica toga je
da je računarski sistem opremljen hijerarhijom memorijskih podsistema, od kojih su neki unutrašnji za
sistem (direktno pristupačni procesom), a neki spoljašnji (pristupačni procesoru preko U/I modula).
4.1 PREGLED RAČUNARSKOG MEMORIJSKOG SISTEMA
Karakteristike memorijskih sistema
Sa složenom temom računarske memorije lakše ćemo izaći na kraj ako memorijske sisteme
klasifikujemo prema njihovim ključnim karakteristikama. One najvažnije nabrojane su u tabeli 4.1.
Pojam lokacija u tabeli 4.1 odnosi se na to da li je memorija unutrašnja ili spoljašnja za računar.
Unutrašnja memorija se često izjednačava sa glavnom memorijom.
Ali, postoje i drugi oblici unutrašnje memorije. Procesor zahteva sopstvenu lokalnu memoriju, u
obliku registara (pogledajte sliku 2.3). Pored toga, kao što ćemo videti, deo procesora upravljačka
jedinica može takođe da zahteva sopstvenu unutrašnju memoriju. Objašnjenja ove poslednje dve vrste
unutrašnje memorije odložićemo do nekih narednih poglavlja. Keš je drugi oblik unutrašnje memorije.
Spoljašnja memorija se sastoji od periferijskih uređaja za skladištenje, kao što su disk i traka, kojima
procesor može da pristupa preko U/I kontrolera.
Očigledna karakteristika memorije je njen
kapacitet.
Za unutrašnju memoriju, on se obično
22
izražava u bajtovima (1 bajt = 8 bitova), ili u rečima. Uobičajene dužine reči su 8, 16 i 32 bita.
Kapacitet spoljašnje memorije se tipično izražava u bajtovima.
Srodan koncept je
jedinica prenosa.
Za unutrašnju memoriju, jedinica prenosa jednaka je broju
linija za podatke koje vode u memorijski modul i iz njega. Ona može da bude jednaka dužini reči, ali je
češće veća, na primer 64, 128 ili 256 bitova. Da biste
to razjasnili, zamislite tri povezana koncepta
unutrašnje memorije:
Reč
Reč je "prirodna" jedinica organizacije memorije. Veličina reči je tipično jednaka broju
bitova koji se koriste da bi se predstavio ceo broj i dužina instrukcije. Nažalost, ima mnogo
izuzetaka. Na primer, CRAY C90 ima 64-bitnu dužinu reči, ali koristi 46-bitnu predstavu
celog broja. VAX ima fantastično šarenilo dužina instrukcija, izraženih u umnošcima bajtova i
dužinu reči od 32 bita.
Adresibilne jedinice
U nekim sistemima, adresibilna jedinica je reč. Međutim, mnogi sistemi
dozvoljavaju adresiranje na nivou bajta. U svakom slučaju, odnos između dužine adrese
ubitovima
A i broja adresibilnih jedinica N je 2 = N.
Jedinica prenosa
Za glavnu memoriju, to
je broj čitanja bitova iz memorije ili upisivanja u
nju u vremenu. Jedinica prenosa ne mora da bude reč ili adresibilna jedinica. Za spoljašnju
memoriju, podaci se često prenose u jedinicama mnogo većim od reči, koje se nazivaju
blokovima.
Druga razlika među vrstama memorije je
metoda pristupanja
jedinicama podataka.
Te metode
uključuju sledeće:
Sekvencijalni pristup
Memorija je organizovana po jedinicama podataka koje se zovu zapisi.
Pristup mora da se napravi u specifičnoj linearnoj sekvenci. Zapamćena informacija za
adresiranje upotrebljava se za razdvajanje zapisa i pomoć u njihovom izdvajanju. Koristi se
deljeni mehanizam za čitanje/upisivanje, a on mora da se premešta sa svoje trenutne na
željenu lokaciju, prolazeći i odbacujući svaki zapis koji se nalazi između. Prema tome, vreme
za pristupanje nekom proizvoljnom zapisu veoma je promenijivo. Jedinice traka, o kojima se
govori u poglavlju 6, koriste sekvencijalni pristup.
Direktan pristup
Kao kod sekvencijalnog, i kod direktnog pristupa koristi se deljeni
mehanizam za čitanje/upisivanje. Međutim, pojedinačni blokovi ili zapisi imaju jedinstvenu
adresu, zasnovanu na fizičkoj lokaciji. Pristup se ostvaruje direktnim pristupom da bi se
postigla opšta susednost, plus sekvencijalno traženje, brojanje ili čekanje da bi se dostigla
konačna lokacija. I ovde je vreme promenijivo. Jedinice diskova, o kojima se govori u
poglavlju 6, koriste direktan pristup.
Slučajan pristup
Svaka adresibilna jedinica u memoriji ima jedinstven, fizički ožičen
mehanizam za adresiranje. Vreme za pristup datoj lokaciji konstantno je i nezavisno od
sekvence prethodnih pristupa. Glavna memorija i neki sistemi keš memorija koriste slučajan
pristup.
Asocijativan pristup
Taj pristup koristi vrsta memorije sa slučajnim pristupom, koja
omogućava da se porede željene lokacije bitova unutar reči, da bi se postigla podudarnost sa
određenim uzorkom, i da se to uradi za sve reči istovremeno. Dakle, reč se izvlači zasnovano
na delu njenog sadržaja, a ne na osnovu njene adrese. Kao i kod obične memorije sa slučajnim
pristupom, svaka lokacija ima sopstveni mehanizam za adresiranje, a vreme izvlačenja je
konstantno, nezavisno od lokacije ili prethodnih uzoraka pristupanja. Keš memorije mogu da
koriste asocijativan pristup.
Sa tačke gledišta korisnika, dve najvažnije karakteristike memorije su kapacitet i performansa.
23

memorije mora da bude razumna u odnosu na druge komponente.
Kao što bi se moglo i očekivati, postoji kompromis između tri ključne karakteristike memorije: cene,
kapaciteta i vremena pristupa. U bilo kom datom trenutku, koriste se razne tehnologije da se
implementiraju memorijski sistemi. U celom tom spektru tehnologija, važe sledeći odnosi:
kraće vreme pristupa, veća cena po bitu;
veći kapacitet, manja cena po bitu;
veći kapacitet, duže vreme pristupa.
Dizajner se suočava sa jasnom dilemom. On bi voleo da koristi tehnologije koje obezbeđuju
memorije velikog kapaciteta, kako zbog toga što je kapacitet potreban, tako i zato što je cena po bitu
niska. Međutim, da bi ispunio zahtev performanse, projektant mora da upotrebi skupu memoriju, sa
kratkim vremenom pristupa i relativno malim kapacitetom.
Način da se ta dilema razreši nije u oslanjanju samo na jednu memorijsku komponentu ili tehnologiju,
nego da se upotrebi
memorijska hijerarhija.
Tipična hijerarhija ilustrovana je na slici 4.1. Kako se ide
niz hijerarhiju, događa se sledeće:
smanjuje se cena po bitu;
povećava se kapacitet;
povećava se vreme pristupa;
smanjuje se učestalost pristupa memoriji od strane procesora.
Na taj način, skuplje, brže memorije dopunjavaju se većim, jeftinijim i sporijim memorijama. Ključ
za uspeh te organizacije je u stavki (d): smanjivanju učestalosti pristupa. Ispitivaćemo taj koncept
detaljnije, kada budemo govorili o keš memoriji, kasnije u ovom poglavlju, i virtueinoj memoriji, u
poglavlju 8. Sada dajemo samo kratko objašnjenje.
Korišćenje dva nivoa memorije da bi se smanjilo srednje vreme pristupa u principu radi, ali samo ako
su ispunjeni uslovi od (a) do (d). Primenom različitih tehnologija, postoji spektar memorijskih sistema
koji zadovoljavaju uslove od (a) do (c). Srećom, uslov (d) često takođe važi.
Osnova važenja uslova (d) je u principu koji je poznat kao
lokalnost reference
[DENN68]. U toku
izvršenja programa, reference memorije od strane procesora, kako za instrukcije tako i za podatke,
teže da se grupišu. Programi obično sadrže jedan broj iterativnih petlji i potprograma. Jednom kada se
uđe u petlju ili potprogram, ponavljaju se reference na mali skup instrukcija. Slično tome, operacije nad
tabelama i nizovima obuhvataju pristup grupisanom skupu reči sa podacima. U toku dugog vremenskog
perioda, grupe u upotrebi se menjaju, ali u kratkom vremenu procesor uglavnom radi sa fiksiranim
grupama referenci memorije.
Prema tome, moguće je organizovati podatke kroz hijerarhiju, tako da procenat pristupa svakom
sledećem nižem nivou bude značajno manji od onog prema nivou iznad. Razmotrite upravo predstavljen
primer sa dva nivoa. Neka memorija nivoa 2 sadrži sve instrukcije i podatke programa. Trenutno
postojeće grupe mogu privremeno da se smeste u nivo 1. S vremena na vreme, jedna od grupa iz nivoa 1
će morati da se vrati nazad u nivo 2 da bi napravila mesto za novu grupu koja dolazi u nivo 1. Međutim, u
proseku, većina referenci će biti instrukcije i podaci koji se nalaze u nivou 1.
Taj princip može da se primeni preko više od dva nivoa memorije, kao što se nagoveštava
hijerarhijom prikazanom na slici 4.1. Najbrža, najmanja i najskuplja vrsta memorije sastoji se od
registara koji su interni za procesor. Procesor će tipično sadržati nekoliko desetina takvih registara
mada neke mašine mogu da ih imaju na stotine. Ako preskočimo dva nivoa naniže, glavna memorija je
najvažnija unutrašnja memorija računara. Svaka lokacija u glavnoj memoriji ima jedinstvenu adresu.
Glavna memorija se obično proširuje bržim i manjim kešom. Keš obično nije vidljiv za programera ili,
zaista, za procesor. To je uređaj za privremeno prihvatanje podataka između glavne memorije i
25
procesora da bi se poboljšala performansa.
Tri upravo opisana oblika memorije su, tipično, nepostojane i koriste poluprovodničku tehnologiju.
Upotreba tri nivoa eksploatiše činjenicu da poluprovodnička memorija dolazi u više vrsta, koje se
razlikuju u brzini i ceni. Podaci se trajnije skladište na spoljašnjim masovnim memorijskim uređajima, od
kojih su najčešći čvrsti disk i izmenljivi medijumi, kao što su zamenljivi magnetski disk, traka i optička
memorija. Spoljašnje, trajne memorije takođe se zovu i sekundarne ili pomoćne memorije. One se
koriste za skladištenje programa i datoteka podataka i obično su za programera vidljive samo u obliku
datoteka i zapisa, suprotno od pojedinačnih bajtova ili reči. Disk se takođe koristi da obezbedi
proširenje glavne memorije koje je poznato kao virtueina memorija, o čemu se govori u poglavlju 8.
U hijerahiju mogu da se uključe i drugi oblici memorije. Na primer, veliki IBM-ovi računari
obuhvataju oblik. unutrašnje memorije koji je poznat kao prošireno skladište
(Expanded Storage). Ono
koristi poluprovodničku tehnologiju koja je sporija i jeftinija od one u glavnoj memoriji. Strogo
govoreći, ta memorija se ne uklapa u hijerahiju, nego predstavlja sporednu granu: podaci mogu da se
kreću između glavne memorije i proširenog skladišta, ali ne i između proširenog skladišta i spoljašnje
memorije. Drugi oblici sekundarne memorije uključuju optičke i magnetno-optičke diskove. Najzad,
efektivno može da se doda još nivoa hijerarhije u softveru.
Deo glavne memorije može da se upotrebi
kao bafer, da privremeno drži podatke koji treba da se učitaju na disk. Takva tehnika, koja se ponekad
zove disk keš, poboljšava performansu na dva načina:
Upisi na disk su grupisani. Umesto mnogo
malih prenosa podataka, imamo malo velikih prenosa
podataka. To poboljšava performansu diska i minimizuje umešanost procesora.
Ponekad podaci predodređeni za upisivanje mogu da budu referencirani programom pre sledećeg
izbacivanja na disk. U tom slučaju, podaci se veoma brzo izvlače iz softverskog keša, umesto da
se to sporo uradi sa diska.
PRINCIPI KEŠ MEMORIJE
Keš memorija je namenjena da pruži memoriji brzinu koja se približava onoj koju imaju najbrže
raspoložive memorije, a u isto vreme da obezbedi veliki kapacitet memorije po ceni jeftinijih vrsta
poluprovodničkih memorija. Koncept je ilustrovan na slici 4.3. Postoji relativno velika i spora glavna
memorija, zajedno sa manjom i bržom keš memorijom. Keš sadrži kopiju delova glavne memorije. Kada
procesor pokuša da čita reč memorije, napravi se provera da bi se utvrdilo da li je reč u kešu. Ako
jeste, reč se isporučuje procesoru. Ako nije, blok glavne memorije, koji se sastoji od nekog fiksnog
broja reči, učitava se u keš i onda se reč isporučuje procesoru. Zbog fenomena lokalnosti reference,
kada se blok podataka donese u keš da bi se zadovoljila jedna referenca memorije, verovatno će biti
budućih referenci na tu istu memorijsku lokaciju, ili na druge reči u bloku.
Na slici 4.4 prikazana je struktura sistema keš/glavna memorija. Glavna memorija se sastoji od 2
adresibilnih reči, gde svaka reč ima jedinstvenu
n-bitnu adresu. U svrhu preslikavanja, ta memorija je
zamišljena da se sastoji od izvesnog broja blokova fiksne dužine, svaki po K
reči. To znači da postoji M
= 2 /K
blokova. Keš memorija se sastoji od C
redova.
Svaki red sadrži K reči, plus tag od nekoliko
bitova; broj reči u redu zove se
veličina reda.
Broj redova je mnogo manji od broja blokova u glavnoj
memoriji (C
«M). U bilo kom trenutku, neki podskup blokova memorije nalazi se u redovima u kešu. Ako se
čita reč u bloku memorije, taj blok se prenosi u jedan od redova keša. S obzirom na to da ima više
blokova od redova, pojedinačni red ne može da se jedinstveno i trajno dodeli određenom bloku. Prema
tome, svaki red uključuje
tag
koji identifikuje koji određeni blok je trenutno uskladišten. Tag je obično
deo adrese glavne memorije, što se opisuje kasnije u ovom odeljku.
Na slici 4.5 ilustrovana je operacija čitanja. Procesor generiše adresu, RA, reči koja treba da se
26

U starijim računarima, najčešća forma skladišta sa slučajnim pristupom za glavnu memoriju računara
bio je niz prstenasto oblikovanih feromagnetskih petlji, koje su se zvale
jezgra (engl. cores). Dakle, na
glavnu memoriju se često pozivalo kao na
jezgro, što je termin koji je opstao do danas. Pronalazak
mikroelektronike i njene prednosti odavno su već istisnule memoriju od magnetskih jezgara. Danas je
upotreba poluprovodničkih čipova za glavnu memoriju skoro univerzalna. U ovom odeljku se objašnjavaju
ključni aspekti te tehnologije.
Organizacija
Osnovni element poluprovodničke memorije je memorijska ćelija. Mada se koriste razne elektronske
tehnologije, sve poluprovodničke memorijske ćelije dele izvesne osobine:
one imaju dva stabilna (ili polustabilna) stanja, koja mogu da se upotrebe kako bi se
predstavile binarne cifre 1 i 0;
one su sposobne da se u njih upisuje (bar jednom) kako bi uspostavile stanje;
one su sposobne da se iz njih čita kako bi se saznalo njihovo stanje.
Na slici 5.1 prikazan je rad memorijske ćelije. Ćelija najčešće ima tri funkcionalna terminala koji su
u stanju da nose električni signal. Terminalom za izbor, kao što mu ime nagoveštava, bira se memorijska
ćelija za operaciju čitanja ili upisivanja. Upravljački terminal ukazuje na čitanje ili upisivanje. Za
upisivanje, drugi terminal obezbeđuje električni signal kojim se stanje ćelije postavlja na 1 ili O. Za
čitanje, taj terminal se koristi za izlaz stanja ćelije. Detalji unutrašnje organizacije, funkcionisanja i
vremenskog usklađivanja memorijske ćelije zavise od specifične upotrebljene tehnologije integrisanih
kola i izlaze iz domena ove knjige, izuzev u vidu kratkog pregleda. Za naše potrebe, uzećemo kao dato da
pojedinačne ćelije mogu da se izaberu za operacije čitanja i upisivanja.
DRAM i SRAM
Sve vrste memorija koje ćemo istražiti u ovom poglavlju su sa slučajnim pristupom. To znači da se
pojedinačnim rečima memorije pristupa direktno, preko ožičene logike za adresiranje.
U tabeli 5.1 navedene su glavne vrste poluprovodničke memorije. Najzastupljenija od njih zove se
memorija sa slučajnim pristupom, odnosno RAM (engl. random-access memory). To je, naravno, pogrešna
upotreba termina zato što su sve vrste navedene u tabeli sa slučajnim pristupom. Jedna od
karakteristika kojom se odlikuje RAM memorija je to što se podaci mogu čitati iz memorije i novi podaci
u nju upisivati, na lak i brz način. I čitanje i upisivanje se postižu upotrebom električnih signala.
Druga posebna karakteristika RAM memorije je da je ona nepostojana. RAM memoriji mora da se
obezbedi stalno napajanje električnom energijom. Ako se napajanje prekine, podaci se gube. Prema
tome, RAM memorija može da se upotrebi samo kao privremeno skladište. Dva tradicionalna oblika RAM
memorije koji se koriste u računarima su DRAM i SRAM memorije.
Dinamička RAM memorija
Tehnologija RAM memorija deli se na dve tehnologije: dinamičku i
statičku. Dinamička RAM memorija (DRAM) pravi se od ćelija koje skladište podatke kao naelektrisanja
na kondenzatorima. Prisustvo ili odsustvo naelektrisanja na kondenzatoru interpretira se kao binarna
cifra 1 ili O. S obzirom na to da kondenzatori imaju prirodnu težnju da se prazne, dinamičke RAM
memorije zahtevaju periodično osvežavanje naelektrisanja da bi se održalo skladište podataka. Termin
dinamička odnosi se na tu težnju uskladištenih podataka da iščeznu, čak i kada je napajanje trajno
uključeno.
Na slici 5.2a prikazana je tipična struktura DRAM memorije za pojedinačnu ćeliju u kojoj se
skladišti jedan bit. Adresna linija se aktivira kada vrednost bita u toj ćeliji treba da se pročita, ili da se
upiše. Tranzistor radi kao prekidač koji je zatvoren (dozvoljavajući struji da teče) ako se dovede napon
28
na adresnu liniju, ili otvoren (struja ne teče) ako nema napona prisutnog na adresnoj liniji.
Za operaciju upisivanja, naponski signal se dovodi na liniju bita; visok napon predstavlja 1, a nizak
napon O. Zatim se signal dovede na adresnu liniju, dozvoljavajući naelektrisanju da se prenese na
kondenzator.
Za operaciju čitanja, kada se izabere adresna linija, tranzistor se uključuje i naelektrisanje
uskladišteno u kondenzatoru prenosi se na liniju bita i sens pojačavač. Sens pojačavač poredi napon
kondenzatora sa referentnom vrednošću i određuje da li ćelija sadrži logičku cifru 1 ili O. Očitavanje
ćelije prazni kondenzator, koji mora da se obnovi kako bi se završila operacija.
Mada se ćelija DRAM memorije koristi za skladištenje jednog bita (O ili 1), ona je u suštini analogni
uređaj. Kondenzator može da skladišti bilo koju vrednost naelektrisanja unutar opsega; vrednost praga
određuje da li se naelektrisanje interpretira kao 1 ili O.
Statička RAM memorija
Suprotno od toga, statička RAM (SRAM) memorija je digitalni uređaj, koji koristi iste logičke
elemente kao što su oni koji se upotrebljavaju u procesoru. U SRAM memoriji, binarne vrednosti se
skladište koristeći konfiguracije tradicionalnih flip-flop logičkih kola (o njima se govori u dodatku B).
Statička RAM memorija će držati svoje podatke sve dok joj se dovodi napajanje električnom
energijom.
Na slici 5.2b, prikazana je tipična struktura SRAM memorije za pojedinačnu ćeliju. Četiri
tranzistora (TI, T2, T3 i T4) su unakrsno povezani, u rasporedu koji proizvodi stabilno logičko stanje. U
logičkom stanju 1, tačka Cl je na visokom, a tačka C2 na niskom nivou; u tom stanju, T1 i T4 su
isključeni, a T2 i T3 su uključeni.! U logičkom stanju O, tačka C1 je na niskom, a tačka C2 na visokom
nivou; u tom stanju, TI i T4 su uključeni, a T2 i T3 su isključeni. Oba stanja su stabilna, sve dok je
uključen jednosmerni (dc) napon. Za razliku od DRAM memorije, nije potrebno nikakvo osvežavanje da
bi se zadržali podaci.
Kao i kod DRAM memorije, kod SRAM memorije se koristi adresna linija da bi se otvorio ili zatvorio
prekidač. Adresna linija upravlja sa dva tranzistora (Ts i T6). Kada se na tu liniju dovede signal, dva
tranzistora se uključuju, dozvoljavajući operaciju čitanja ili upisivanja. Za operaciju upisivanja, željena
vrednost bita dovodi se na liniju B, dok se njen komplement dovodi na liniju B. To prisiljava četiri
tranzistora (TI, T2, T3 i T4) da uđu u odgovarajuće stanje. Za operaciju čitanja, vrednost bita očitava
se sa linije B.
SRAM prema DRAM memoriji i statička i dinamička RAM memorija su nepostojane; to znači da
se mora obezbediti trajno napajanje električnom energijom kako bi se očuvale vrednosti bitova. Ćelija
dinamičke memorije jednostavnija je i manja od ćelije statičke memorije. Dakle, DRAM memorija je
gušća (manje ćelije = više ćelija po jedinici površine) i jeftinija od odgovarajuće SRAM memorije. S
druge strane, DRAM memorija zahteva elektronska kola za podršku osvežavanju. Za veće memorije,
f1ksirana cena kola za osvežavanje je više nego kompenzovana manje promenljivom cenom DRAM ćelija.
Prema tome, DRAM memorije teže da budu favorizovane kod velikih zahteva za memorijom. Poslednji
aspekt u ovom razmatranju je činjenica da su SRAM memorije obično brže od DRAM memorija. Zbog
tih relativnih karakteristika, SRAM memorije se koriste za keš memoriju (kako na čipu, tako i van
njega), a DRAM memorija za glavnu memoriju.
Vrste ROM memorija
Kao što joj i ime nagoveštava, memorija samo za čitanje
(read-only memory, ROM) sadrži stalni uzorak
podataka koji ne može da se menja. ROM memorija je trajna; to znači da se ne zahteva izvor napajanja
29

sekundi, što je mnogo brže od EPROM memorije. Pored toga, moguće je obrisati samo blokove memorije,
a ne ceo čip. Fleš memorija dobija svoje ime zato što je čip organizovan tako da se odeljci memorijskih
ćelija brišu jednostrukom akcijom ili "flešom". Međutim, fleš memorija ne obezbeđuje brisanje na nivou
bajta. Kao i EPROM memorija, fleš memorija koristi samo jedan tranzistor po bitu i tako postiže veliku
gustinu EPROM memorije (u poređenju sa EEPROM memorijom).
Poglavlje 6
SPOLJAŠNJA MEMORIJA
U ovom poglavlju ispituje se niz uređaja i sistema spoljašnje memorije. Počinjemo sa najvažnijim
uređajem, magnetnim diskom. Magnetni diskovi su temelj spoljašnje memorije u skoro svim računarskim
sistemima. U sledećem odeljku ispituje se upotreba grupa diskova da bi se postigla bolja performansa,
sa posebnim osvrtom na familiju sistema poznatih kao RAID (engl.
Redundant Array of Independent
Disks, redundantna grupa nezavisnih diskova). Spoljašnja optička memorija je sve značajnija
komponenta mnogih računarskih sistema i o tome se govori u trećem delu. Najzad opisuje se magnetna
traka.
MAGNETNI DISK
Disk je kružna ploča, konstruisana od nemagnetnog materijala, koja se zove supstrat, presvučena
materijalom koji se može namagnetisati. Supstrat je tradicionalno bio od aluminijuma ili aluminijumske
legure. U novije vreme, uvedeni su supstrati od stakla. Stakleni supstrat donosi više koristi, uključujući:
poboljšanje uniformnosti površine magnetnog filma da bi se povećala pouzda
nost diska;
značajno smanjenje ukupnih neispravnosti površine da bi se potpomoglo smanjivanje broja
grešaka čitanja-upisivanja;
sposobnost podrške manjih visina preleta (što se objašnjava kasnije u tekstu);
bolju čvrstinu da bi se smanjila dinamika diska;
veću sposobnost izdržavanja udara i oštećenja.
Magnetni mehanizmi za čitanje i upisivanje
Podaci se upisuju na disk i posle sa njega izvlače preko provodnog namotaja koji se zove glava; u mnogim
sistemima postoje dve glave, za čitanje i za upisivanje.
Za vreme operacije čitanja ili upisivanja, glava je stacionarna, dok ploča rotira ispod nje.
Mehanizam za upisivanje koristi činjenicu da elektricitet koji teče kroz namotaj stvara magnetno
polje. Električni impulsi se šalju u glavu za upisivanje i rezultujući magnetni uzorak se zapisuje na
površinu ispod glave, sa različitim uzorcima za pozitivne i negativne struje. Sama glava za upisivanje
napravljena je od materijala koji se lako namagnetiše i u obliku je pravougaonog prstena sa procepom
duž jedne strane i nekoliko namotaja provodne žice duž suprotne strane (slika 6.1). Električna struja u
žici indukuje magnetno polje preko procepa koje, sa svoje strane, namagnetiše malu površinu medijuma
za upisivanje. Menjanje smera struje obrće smer namagnetisanja na medijumu za zapis.
Tradicionalni mehanizam za čitanje koristi činjenicu da magnetno polje, koje se kreće relativno u
odnosu na namotaj, u njemu stvara električnu struju. Kada površina diska prolazi ispod glave, ona stvara
struju istog polariteta kao što je ona koja je već zapisana. Struktura glave za čitanje je u tom slučaju u
suštini ista kao i ona za upisivanje i stoga ista glava može da se koristi za obe operacije. Takve
jednostruke glave koriste se za sisteme fleksibilnih disketa i za starije sisteme čvrstih diskova.
Savremeni sistemi čvrstih diskova koriste drugačiji mehanizam za upisivanje, koji zahteva posebnu
31
glavu za čitanje, zbog pogodnosti postavljenu u blizini glave za upisivanje. Glava za čitanje sastoji se od
delimično oklopljenog magnetno-otpornog (MR) senzora.
MR
materijal ima električnu otpornost koja
zavisi od smera namagnetisanja medijuma koji se kreće ispod njega. Proticanjem struje kroz
MR
senzor, otkrivaju se promene otpornosti kao naponski signali.
MR
dizajn dozvoljava rad na višim
frekvencijama, što znači veće gustine skladišta i brzine rada.
Organizacija i formatiranje podataka
Glava je relativno mali uređaj, sposoban za čitanje iz dela ploče koja rotira ispod njega, ili za upisivanje
u taj deo ploče. To postavlja pitanje organizacije podataka na ploči u koncentričnom skupu prstenova
koji se zovu staze. Svaka staza je iste širine kao i glava. Postoje hiljade staza na površini diska.
Na slici 6.2 prikazan je taj raspored podataka. Susedne staze razdvojene su razmacima. To
sprečava, ili u najmanju ruku minimizuje greške zbog razdešenosti glave ili jednostavne interferencije
magnetnih polja.
Podaci se prenose na disk i sa njega u sektorima (slika 6.2). Postoje na stotine sektora po stazi i
mogu da budu fiksne ili promenljive dužine. U većini savremenih sistema, koriste se sektori fiksne
dužine, gde je 512 bajtova skoro univerzalna veličina sektora. Da bi se izbeglo postavljanje nerazumnih
zahteva za preciznošću pred sistem, susedni sektori se razdvajaju razmacima između sektora i između
staza.
Disk koji rotira prolazi fiksiranu tačku (kao što je glava za čitanje-upisivanje) sporije nešto bliže
centru rotacije nego nešto dalje od njega. Prema tome, mora da se pronađe neki način da se kompenzuje
promenljivost brzine tako da glava može da čita sve bitove istom brzinom. To može da se uradi
povećavanjem razmaka između bitova informacije zapisane li segmentima diska. Informacija onda može
da se skenira istom brzinom rotacijom diska fiksiranom brzinom, poznatom kao
konstantna ugaona
brzina
(constant angular velocity, CAV). Na slici 6.3a prikazan je nacrt diska koji koristi CAV. Disk je
podeljen na izvestan broj sektora i niz koncentričnih staza. Prednost korišćenja CAV-aje u tome što
pojedinačni blokovi podataka mogu direktno da se adresiraju po stazi i sektoru. Da bi se glava pomerila
sa svoje trenutne pozicije na specifičnu adresu, potreban je samo kratak pokret glave na određenu
stazu i kratko vreme da se odgovarajući sektor obrne do mesta ispod glave. Nedostatak CAV-a je to što
je količina podataka koja može da se uskladišti na dužim spo!jašnjim stazama ista kao i ona koja može da
se uskladišti na kraćim unutrašnjim stazama.
Zbog gustine, u bitovima po linearnom in ču, povećanja u kretanju od najspoljašnjije do
najunutrašnjije staze, kapacitet skladišta diska u direktnom CAV sistemu ograničen je maksimalnom
gustinom zapisivanja koja može da se postigne na najunutrašnjijoj stazi. Da bi se povećala gustina,
savremeni sistemi čvrstih diskova koriste tehniku koja je poznata kao zapisivanje u više zona, gde je
površina podeljena na izvestan broj koncentričnih zona (obično 16). Zone koje su dalje od centra sadrže
više bitova (više sektora) od onih koje su mu bliže. To dozvoljava veći ukupan kapacitet skladišta po cenu
nešto složenijih elektronskih kola. Kako se glava diska pomera sa jedne zone na drugu, dužina (po stazi)
pojedinačnih bitova se menja, što prouzrokuje prornenu u vremenu za čitanje i upisivanje. Na slici 6.3b
nagoveštava se struktura zapisivanja u više zona; na toj ilustraciji, svaka zona je širine samo jedne
staze.
Potrebno je neko sredstvo da bi se locirale pozicije sektora unutar staze. Jasno je da mora
postojati neka polazna tačka na stazi i način kako da se identifikuju početak i kraj svakog sektora. Ti
zahtevi se opslužuju pomoću upravljačkih podataka zapisanih na disku. Prema tome, disk je formatiran
sa nekim dodatnim podacima koje koristi samo uređaj diska i koji nisu dostupni korisniku.
Primer formatiranja diska prikazan je na slici 6.4. U tom slučaju, svaka staza sadrži 30 sektora
32

Kao zanimljivu istorijsku činjenicu, napominjemo da je termin Winchester prvobitno koristila firma
IBM
kao šifrovano ime za model diska 3340 pre njegovog uvođenja. Model 3340 bio je izmenljivi paket
diskova sa glavama zatopljenim u pakovanju. Termin se sada primenjuje na bilo koju zatopljenu jedinicu
diskova sa aerodinamičkom konstrukcijom glave. Winchester disk se obično nalazi ugrađen u
personalnim računarima i radnim stanicama, gde se naziva
čvrstim diskom.
Parametri performanse diskova
Stvarni detalji U/I operacije diska zavise od računarskog sistema, operativnog sistema i prirode U/I
kanala i hardvera kontrolera diska. Opšti vremenski dijagram U/I prenosa diska prikazan je na slici 6.7.
Kada uređaj diska radi, disk rotira konstantnom brzinom. Da bi čitala ili upisivala, glava mora da se
postavi na željenu stazu i na početak željenog sektora na stazi. Izbor staze obuhvata pomeranje glave u
sistemu sa pokretnom glavom, ili elektronski izbor jedne od glava u sistemu sa fiksnim glavama. U
sistemu sa pokretnom glavom, vreme koje je potrebno da bi se glava postavila na stazu zove se vreme
pozicioniranja (engl.
seek time). U oba slučaja, jednom kada se staza izabere, kontroler diska čeka dok
se odgovarajući sektor ne obrne da bi se poravnao sa glavom. Vreme koje je potrebno da bi početak
sektora stigao do glave zove se rotaciono kašnjenje (engl.
Rotational latency). Zbir vremena
pozicioniranja, ako ga ima, i rotacionog kašnjenja daje vreme pristupa, koje predstavlja vreme potrebno
da se dođe na položaj za čitanje ili upisivanje. Kada je glava na tom položaju, izvodi se operacija čitanja
ili upisivanja kako se sektor pomera ispod glave; to je deo prenosa podataka operacije; vreme potrebno
za prenos je vreme prenosa.
Pored vremena pristupa i vremena prenosa, postoji više kašnjenja čekanja koja se normalno
pridružuju U/I operaciji diska. Kada proces izda U/I zahtev, on mora prvo da čeka u redu da mu se
uređaj stavi na raspolaganje. U tom trenutku, uređaj se dodeljuje procesu. Ako uređaj deli jedan U/I
kanal ili skup U/I kanala sa drugim uređajima diskova, onda može doći do dodatnog čekanja da kanal
bude raspoloživ. U tom trenutku izvodi se pozicioniranje da bi počeo pristup disku.
U nekim vrhunskim sistemima za servere, koristi se tehnika poznata kao rotaciono poziciono
detektovanje (RPS). Ona radi na sledeći način: kada se izda komanda za pozicioniranje, kanal se
oslobađa da bi opslužio druge U/I operacije. Kada se pozicioniranje završi, uređaj određuje kada će
podatak rotirati ispod glave. Kako se taj sektor približava glavi, uređaj pokušava da ponovo uspostavi
komunikacionu putanju nazad ka hostu. Ako su upravljačka jedinica ili kanal zauzeti drugim U/I, onda
pokušaj ponovnog uspostavljanja veze ne uspeva i uređaj mora da rotitra još jedan ceo obrtaj pre nego
što može da pokuša ponovno povezivanje, što se zove RPS promašaj. To je dodatni element kašnjenja koji
mora da se sabere sa vremenima na slici 6.7.
Vreme pozicioniranja
Vreme pozicioniranja je vreme potrebno da se ručica diska pomeri na
zahtevanu stazu. Ispostavlja se da je to veličina koju je teško staviti u određen okvir. Vreme
pozicioniranja sastoji se od dve ključne komponente: početnog vremena startovanja i vremena
potrebnog za prelazak staza koje treba da se prođu jednom kada je pristupna ručica postigla svoju
brzinu. Nažalost, vreme prelaska nije linearna funkcija broja staza, nego obuhvata vreme uspostavljanja
(vreme od pozicioniranja glave iznad ciljne staze dok se ne potvrdi identifikacija staze).
Mnogo poboljšanja dolazi od manjih i lakših komponenata diskova. Pre nekoliko godina, tipičan disk
bio je prečnika 14 inča (36 cm), dok je danas najzastupljenija veličina od 3,5 inča (8,9 cm), što
smanjuje rastojanje koje treba da pređe ručica. Tipično vreme pozicioniranja na savremenim čvrstim
diskovima je ispod 10 ms.
Rotaciono kašnjenje
Diskovi različiti od fleksibilnih disketa, rotiraju brzinama koje se kreću od
34
3600 o/min (za ručne uređaje, kao što su digitalne kamere) do, u trenutku pisanja ovog teksta, 15000
o/min; pri ovoj poslednjoj brzini, imamo jedan obrtaj na 4 ms. Dakle, u proseku, rotaciono kašnjenje biće
2 ms. Fleksibilne diskete tipično rotiraju između 300 i 600 o/min. Prema tome, prosečno kašnjenje će
biti između 100 i 50 ms.
Vreme prenosa
Vreme prenosa na disk ili sa njega zavisi od brzine rotacije diska na sledeći
način:
T=b/N gde je
T = vreme prenosa
b = broj bajtova koji treba da se prenesu
N = broj bajtova na stazi
r = brzina rotacije, u obrtajima po sekundi
Prema tome, ukupno srednje vreme pristupa može da se izrezi kao
Ta =Ts +1/2r+/rN
gde je
T, prosečno vreme pozicioniranja. Zapazite da je na zoniranom uređaju broj bajtova po stazi
promenljiv, što usložnjava proračun.
Vremensko poređenje
Sada, kada smo definisali prethodne parametre, razmotrićemo dve
različite U/I operacije koje ilustruju opasnost od oslanjanja na srednje vrednosti. Zamislite disk sa
objavljenim srednjim vremenom pozicioniranja od 4 ms, brzinom rotacije od 15000 o/min i 5l2-bajtnim
sektorima, sa 500 sektora po stazi. Pretpostavite da želimo da čitamo datoteku koja se sastoji od 2500
sektora, što je ukupno 1,28 MB. Hteli bismo da procenimo ukupno vreme za prenos.
Pretpostavimo najpre da je datoteka uskladištena na disku što je moguće kompaktnije. To znači da
datoteka zauzima sve sektore na 5 susednih staza (5 staza x 500 sektora/stazi = 2500 sektora): to je
poznato kao
sekvencijalna organizacija. Vreme potrebno za čitanje prve staze računa se na sledeći
način:
Prosečno pozicioniranje
4ms
Prosečno rotaciono kašnjenje
2ms
Čitanje 500 sektora
4ms
-------
10 ms
Pretpostavite da preostale staze sada mogu da se čitaju u suštini bez vremena pozicioniranja. To znači
da U/I operacija može da nastavi sa tokom podataka sa diska. Onda, u najgorem slučaju, imamo posla sa
rotacionim kašnjenjem za svaku narednu stazu. Na taj način, svaka naredna staza se čita u 2 + 4 = 6 ms.
Da bi se pročitala cela datoteka, potrebno je
Ukupno vreme = 10 + (4 x 6) = 34 ms = 0,034 sekunde.
Hajde sada da izračunamo vreme koje se zahteva za čitanje istih podataka kada se koristi slučajni,
a ne sekvencijalni pristup; to znači da su pristupi sektorima slučajno raspodeljeni po disku. Za svaki
sektor imamo
Prosečno pozicioniranje
4ms
Rotaciono kašnjenje
2ms
Čitanje jednog sektora
0,008 ms
6,008 ms
Ukupno vreme = 2500 x 6,008 = 15020 ms = 15,02 sekundi.
Jasno je da redosled u kome se sektori čitaju sa diska ima ogroman uticaj na U/I performansu. U
slučaju pristupa datoteci u kome se više sektora čita ili u njih upisuje, imamo neku kontrolu nad načinom
35

vidimo kao U/I uređaje, dok smo ih u poglavlju posmatrali kao memorijske uređaje. Sa tačke gledišta
funkcije, ti uređaji su deo memorijske hijerarhije i o njihovoj upotrebi se na odgovarajući način govori
u poglavlju 6. Sa tačke gledišta strukture, tim uređajima upravljaju U/I moduli i zato se razmatraju u
ovom poglavlju.
Komunikacioni uređaji omogućavaju računaru da razmenjuje podatke sa udaljenim uređajima, koji
mogu biti čitljivi za ljude kao što je terminal, čitljivi za mašine, ili čak i drugi računar.
Veoma uopšteno, priroda spoljašnjeg uređaja prikazana je na slici 7.2. Interfejs prema U/I modulu
je u obliku signala za upravljanje, podatke i stanje.
Upravljački signali određuju funkciju koju će uređaj
izvršavati, kao što je slanje podataka U/I modulu (INPUT ili READ), prihvatanje podataka iz U/I modula
(OUTPUT ili WRITE), izveštavanje o stanju ili izvođenje neke upravljačke funkcije specifične za uređaj
koji je u pitanju (na primer, pozicioniranje glave diska). Podaci
su u obliku skupa bitova koji treba da se
šalju ili primaju iz U/I modula.
Signali stanja ukazuju na stanje uređaja. Primeri su READY/NOT-READY
koji pokazuju da li je uređaj spreman za prenos podataka.
Upravljačka logika pridružena uređaju upravlja radom uređaja, kao odzivom na naredbu iz U/I
modula.
Pretvarač pretvara podatke iz električnog u druge oblike energije za vreme izlaza i iz drugih
oblika u električni za vreme ulaza. Tipično, pretvaraču se pridružuje bafer za privremeno držanje
podataka koji se prenose između U/I modula i spoljašnjeg okruženja; uobičajena veličina bafera je od 8
do 16 bitova.
Interfejs između U/I modula i spoljašnjeg uređaja će se ispitati u odeljku 7.7. Interfejs između
spoljašnjeg uređaja i okruženja je izvan domena ove knjige, ali se daje nekoliko kratkih primera.
Tastatura/monitor
Najzastupljenije sredstvo za interakciju računara i korisnika jeste aranžman tastatura/monitor.
Korisnik daje ulaz preko tastature. Taj ulaz se onda prenosi u računar i može takođe da se prikazuje na
monitoru. Pored toga, monitor prikazuje podatke koje obezbeđuje računar.
Osnovna jedinica razmene je znak. Svakom znaku pridružen je kod, dužine tipično 7 ili 8 bitova.
Najčešće korišćen tekstualni kod je međunarodna referentna azbuka
(International Reference
Alphabet, IRA). Svaki znak u tom kodu predstavlja se jedinstvenim 7-bitnim binarnim kodom; dakle,
može se predstaviti 128 različitih znakova. U tabeli 7.1 navedene su sve vrednosti kodova. U toj tabeli,
bitovi svakog znaka označeni su od b , koji je najznačajniji bit, do bi, koji je najmanje značajan bit.
Postoje dve vrste znakova: za štampanje i upravljački (tabela 7.2). Znakovi za štampanje su slovni,
numerički i specijalni znakovi koji mogu da se štampaju na hartiji ili prikazuju na ekranu. Na primer,
predstava znaka "K" je b7b6b5b4b3b2b1 = 1001011. Neki od upravljačkih znakova moraju da se bave
upravljanjem štampanjem ili prikazivanjem znakova; primer je znak za povratak na novi red. Drugi
upravljački znakovi se staraju o komunikacionim procedurama.
IRA
je definisana u ITU-T Preporuci T.50 i bila je prvo poznata kao Međunarodna azbuka 5 (IA5).
Nacionalna verzija SAD IRA-e zove se American Standard Code for Information Interchange (ASCII).
IRA-kodovani znakovi se skoro uvek skladište i predaju koristeći 8 bitova po znaku. Osmi bit je za
parnost i koristi se za otkrivanje greške.
Bit
parnosti je najznačajniji bit i zato se označava sa b,.
Kod unosa sa tastature, kada korisnik pritisne taster, on generiše elektronski signal koga
interpretira pretvarač tastature i prevodi ga u uzorak bitova odgovarajućeg koda IRA. Taj uzorak
bitova se zatim prenosi do U/I modula u računaru. U računaru, tekst može da se skladišti u istom kodu
IRA. Na izlazu, kodovi IRA se prenose ka spoljašnjem uređaju iz U/I modula. Pretvarač u uređaju
interpretira taj kod i šalje traženi elektronski signal u izlazni uređaj da bi prikazao ukazani znak ili da
bi izveo zahtevanu upravljačku funkciju.
37
Uređaj diska
Uređaj diska sadrži elektroniku za razmenu signala podataka, upravljanja i stanja sa U/I modula, plus
elektroniku za upravljanje mehanizmom diska za čitanje/upisivanje. U disku sa fiksnom glavom,
pretvarač je sposoban da konvertuje podatke između magnetnih uzoraka na površini diska i bitova u
baferu uređaja (slika 7.2). Disk sa pokretnom glavom mora takođe biti sposoban da prouzrokuje
kretanje ručice diska radijaIno preko površine diska.
7.2 U/I MODULI
Funkcija modula
Glavne funkcije ili zahtevi za U/I modul spadaju u sledeće kategorije:
upravljanje i vremensko usklađivanje;
komunikacija procesora;
komunikacija uređaja;
baferovanje podataka;
otkrivanje grešaka.
U bilo kom trenutku, procesor može da komunicira sa jednim ili više spoljašnjih uređaja po
nepredvidivim uzorcima, u zavisnosti od potreba programa za ulazom/izlazom.
Unutrašnji resursi, kao što su glavna memorija i sistemska magistrala, moraju da se dele između više
aktivnosti, uključujući U/I podataka. Prema tome, funkcija U/I uključuje zahtev za upravljanjem i
vremenskim uskladivanjem da bi upravljala tokom saobraćaja između unutrašnjih resursa i spoljašnjih
uređaja. Na primer, upravljanje prenosom podataka od spoljašnjeg uređaja do procesora bi moglo da
obuhvati sledeći niz postupaka:
1. Procesor ispituje U/I modul da bi proverio stanje priključenog uređaja.
2. U/I modul vraća stanje uređaja.
3. Ako je uređaj operativan i spreman da predaje, procesor zahteva prenos podataka, pomoću komande
U/I modulu.
4. U/I modul dobija jedinicu podataka (odnosno, 8 ili 16 bitova) od spoljašnjeg uređaja.
5. Podaci se prenose od U/I modula do procesora.
Ako sistem koristi magistralu, onda svaka od interakcija između procesora i U/I modula obuhvata
jedno ili više arbitriranja magistrale.
Prethodni pojednostavljeni scenario takođe ilustruje da U/I modul mora da komunicira sa
procesorom i sa spoljašnjim uređajem. Komunikacija procesora obuhvata sledeće:
Dekodovanje komande: U/I modul prihvata komande od procesora, koje se tipično šalju kao
signali na upravljačkoj magistrali. Na primer, U/I modul za uređaj diska bi mogao da prihvati
sledeće komande: READ SECTOR, WRITE SECTOR, SEEK broj staze, i SCAN zapis ID.
Svaka od poslednje dve komande uključuje parametar koji se šalje na magistralu podataka.
Podaci
: podaci se razmenjuju između procesora i U/I modula preko magistrale
podataka.
Izveštavanje o stanju:
s obzirom na to da su periferijski uređaji tako spori, važno je znati
stanje U/I modula. Na primer, ako se od U/I modula traži da pošalje podatke procesoru
(čitanje), on može biti nespreman da to uradi zato što još uvek radi na prethodnoj U/I
komandi. O toj činjenici može da se izvesti pomoću signala stanja. Uobičajeni signali stanja
su BUSY i READY. Mogu takođe da postoje signali za izveštavanje o raznim uslovima grešaka.
Prepoznavanje adrese:
baš kao što svaka reč memorije ima adresu, to važi i za svaki U/I
uređaj. Zbog toga U/I modul mora da prepozna jednu jedinstvenu adresu za svaki
periferijski uređaj kojim upravlja.
38

7.3
PROGRAMIRANI
U/I
Za U/I operacije moguće su tri tehnike. Kod
programiranog U/I, podaci se razmenjuju između
procesora i U/I modula. Procesor izvršava program koji mu daje direktno upravljanje nad U/I
operacijom, uključujući otkrivanje stanja uređaja, slanje komandi za čitanje ili upisivanje i prenošenje
podataka. Kada procesor izda komandu U/I modulu, on mora da čeka dok se ne završi U/I operacija. Ako
je procesor brži od U/I modula, to je čisto gubljenje procesorskog vremena. Kod
U/I uprav/janog
prekidima, procesor izdaje U/I komandu i nastavlja da izvršava druge instrukcije, a U/I modul ga
prekida kada završi svoj posao. I kod programiran og U/I i kod U/I upravljanog prekidima, procesor je
odgovoran za izvlačenje podataka iz glavne memorije radi izlaza i skladištenje podataka u glavnu
memoriju radi ulaza. Alternativa je poznata kao
direktan pristup memoriji (DMA). U tom režimu, U/I
modul i glavna memorija razmenjuju podatke direktno, bez učešća procesora.
U tabeli 7.3 prikazan je odnos između te tri tehnike. U ovom odeljku, istražujemo programirani U/I.
U/I sa prekidima i DMA ćemo ispitati u sledeća dva odeljka, respektivno.
Pregled programiranog U/I
Kada procesor izvršava program i naiđe na instrukciju koja se odnosi na U/I, on je izvršava izdajući
komandu za odgovarajući U/I modul. Kod programiran og U/I, U/I modul će izvesti zahtevanu akciju i
zatim postaviti odgovarajuće bitove u U/I registru stanja (slika 7.3). U/I modul ne preduzima nikakvu
dalju akciju da bi uzbunio procesor. Posebno, on ne prekida procesor. Prema tome, na procesoru je
odgovornost da periodično proverava stanje U/I modula dok ne otkrije da je operacija završena.
Da bismo objasnili tehniku programiranog U/I, sagledaćemo je prvo sa tačke gledišta U/I komandi
koje procesor izdaje U/I modulu, a zatim sa tačke gledišta U/I instrukcija koje izvršava procesor.
U/I komande
Da bi izvršio instrukciju u vezi sa U/I, procesor izdaje adresu, koja određuje poseban U/I modul i
spoljašnji uređaj, i U/I komandu. Postoje četiri vrste U/I komandi koje U/I modul može da primi kada
ga adresira procesor:
Upravljanje:
koristi se za aktiviranje periferijskog uređaja i da mu se kaže šta da radi. Na
primer, jedinici magnetne trake može da se dostavi instrukcija da premota, ili po meri
unapred za jedan zapis. Te komande su prilagođene za posebnu vrstu periferijskog uređaja.
Test:
koristi se za ispitivanje uslova stanja pridruženih U/I modulu i njegovim periferijskim
uređajima. Procesor će želeti da zna da je periferijski uređaj od interesa uključen i
raspoloživ za upotrebu. On će takođe želeti da zna da li je najskorija U/I operacija završena
i da li se dogodila bilo kakva greška.
Čitanje:
prouzrokuje da U/I modul dobije stavku podataka sa periferijskog uređaja i smesti
je u unutrašnji bafer (opisan kao registar podataka na slici 7.3). Procesor zatim može da
dobije stavku podataka zahtevanjem daje U/I modul postavi na magistralu podataka.
Upisivanje:
prouzrokuje da U/I modul uzme stavku podataka (bajt ili reč) sa magistrale
podataka i posle je prenese na periferijski uređaj.
Na slici 7.4a dat je primer upotrebe programiranog U/I za učitavanje bloka podataka sa
periferijskog uređaja u memoriju (na primer, zapis sa trake). Podaci se čitaju po jedna reč (odnosno 16
bitova) istovremeno. Za svaku reč koja se pročita, procesor mora da ostane u ciklusu provere stanja
dok ne odredi da je reč raspoloživa u registru podataka U/I modula. Taj dijagram toka ističe glavni
nedostatak te tehnike: to je proces koji troši vreme i bez potrebe zapošljava procesor.
40
U/I instrukcije
Kod programiranog U/I, postoji bliska korespondencija između instrukcija koje se odnose na U/I koje
procesor donosi iz memorije i U/I komandi koje procesor izdaje U/I modulu da izvrši instrukcije.
Odnosno, instrukcije se lako preslikavaju u U/I komande i među njima često postoji odnos jedan prema
jedan. Oblik instrukcija zavisi od načina na koji se spoljašnji uređaji adresiraju.
Tipično, biće mnogo U/I uređaja povezanih sa sistemom preko U/I modula. Svakom uređaju dat je
jedinstven identifikator ili adresa. Kada procesor izda U/I komandu, ona sadrži adresu željenog
uređaja. Prema tome, svaki U/I modul mora da interpretira adresne linije kako bi odredio da li je
komanda za njega.
Kada procesor, glavna memorija i U/I dele zajedničku magistralu, moguća su dva načina adresiranja:
memorijski preslikan i izolovan. Kod
memorijski preslikanog
U/I, postoji jedan adresni prostor za
memorijske lokacije i U/I uređaje. Procesor postupa sa registrima stanja i podataka U/I modula kao sa
memorijskim lokacijama i koristi iste mašinske instrukcije da bi pristupao i memoriji i U/I uređajima.
Tako, na primer, sa 10 adresnih linija, kombinovanih ukupno 210 = 1024 memorijskih lokacija i U/I
adresa može da se podrži u bilo kakvoj kombinaciji.
Kod memorijski preslikanog U/I, na magistrali su potrebne jedna linija za čitanje i jedna linija za
upisivanje. Alternativno, magistrala može da se opremi linijom za čitanje i upisivanje u memoriju i
upravljačkom linijom za ulaz i izlaz. U tom slučaju, upravljačka linija određuje da li se adresa odnosi na
memorijsku lokaciju ili na U/I uređaj. Celokupan adresni opseg može da bude na raspolaganju i jednom i
drugom. Opet, sa 10 adresnih linija, sistem sada može da podržava i 1024 memorijske lokacije i 1024
U/I adrese. To se zove
izolovani
U/I zato što je adresni prostor za U/I izolovan od onog za memoriju.
Na slici 7.5 suprotstavljene su te dve tehnike programiranog U/I. Na slici 7.5a pokazano je kako
interfejs za jednostavan U/I uređaj, kao što je tastatura, može da izgleda programeru koji koristi
memorijski preslikan U/I. Pretpostavite 10-bitnu adresu sa 512-bajtnom memorijom (lokacije od 0 do
511) i do 512 U/I adresa (lokacije 5121023). Dve adrese namenjene su za ulaz tastature sa određenog
terminala. Adresa 516 odnosi se na registar podataka, a adresa 517 na registar stanja, koji takođe
funkcioniše kao upravljački registar za primanje komandi od procesora. Prikazani program će učitati 1
bajt podataka sa tastature u akumulatorski registar u procesoru. Skrećemo vam pažnju da je procesor
u petlji sve dok bajt podataka ne bude raspoloživ.
Kod izolovanog U/I (slika 7.5b, U/I portovima se može pristupiti samo pomoću specijalnih U/I
komandi, koje aktiviraju U/I komandne linije na magistrali.
Za većinu procesora, postoji relativno veliki skup različitih instrukcija za referenciranje memorije.
Ako se koristi izolovani U/I, postoji samo mali broj U/I instrukcija. Prema tome, prednost memorijski
preslikanog U/I je u tome što može da se koristi taj veliki repertoar instrukcija, što dozvoljava
efikasnije programiranje. Nedostatak je što se rasipa dragoceni memorijski prostor. Često se koriste i
memorijski preslikan i izolovani U/I.
7.4 U/I
UPRAVLJAN PREKIDIMA
Problem kod programiranog U/I je u tome što procesor treba vrlo dugo da čeka kako bi U/I modul
koji je u pitanju bio spreman, bilo za prijem bilo za predaju podataka.
Dok čeka, procesor mora više puta da ispituje stanje U/I modula. Rezultat je ozbiljno degradirana
performansa celog sistema.
Alternativa za procesor je da izda U/I komandu modulu i onda ode da radi neki drugi koristan posao.
U/I modul će onda prekinuti procesor da bi zahtevao uslugu kada bude spreman za razmenu podataka sa
procesorom. Procesor onda izvršava prenos podataka, kao i pre, a zatim nastavlja sa prethodnom
41

se na sistemskom steku. Međutim, postoje i druge informacije koje se smatraju delom
"stanja" programa koji se izvršava. Posebno, treba da se zapamti sadržaj procesorskih
registara zato što te registre može da koristi i opsluživač prekida. Dakle, sve te
vrednosti, plus svaka druga informacija o stanju, treba da se memorišu. Tipično,
opsluživač prekida će početi sa memorisanjem sadržaja svih registara na steku. Na slici
7.7a prikazan je jednostavan primer. U tom slučaju, korisnički program se prekida posle
instrukcije na lokaciji
N. Sadržaj svih registara, plus adre~a sledeće instrukcije (N + I),
stavljaju se na stek. Pokazivač steka se ažurira da pokazuje na vrh steka, a programski
brojač da pokazuje na početak rutine za opsluživanje prekida.
Opsluživač prekida zatim obrađuje prekid. To obuhvata ispitivanje informacija o stanju
koje se odnose na U/I operaciju ili drugi događaj koji je prouzrokovao prekid. To može da
obuhvati i slanje dodatnih komandi ili potvrda U/I uređaju.
Kada se obrada prekida završi, sačuvane vrednosti registara se uzimaju sa steka i
obnavljaju u registrima (slika 7.7b).
Konačni čin je obnavljanje vrednosti PSW i programskog brojača sa steka. Rezultat je da
će sledeća instrukcija koja treba da se izvrši biti iz prethodno prekinutog programa.
Važno da se sačuvaju sve informacije stanja prekinutog programa radi njegovog kasnijeg
nastavljanja. To je zato što prekid nije rutina koja se poziva iz programa. Prekid može da se pojavi u
bilo kom trenutku i stoga na bilo kom mestu izvršenja korisničkog programa. Njegovo pojavljivanje je
nepredvidivo. Zaista, kao što ćemo videti u sledećem poglavlju, dva programa ne moraju imati ništa
zajedničko i mogu pripadati različitim korisnicima.
Pitanja projektovanja
Prilikom implementiranja U/I, postavljaju se dva pitanja projektovanja. Prvo, kako procesor određuje
koji uređaj je izdao prekid, s obzirom na to da će skoro uvek postojati više U/I modula? I drugo, ako se
pojavilo više prekida, kako procesor odlučuje koji od njih da obradi?
Prvo ćemo razmotriti identifikaciju uređaja. Uobičajeno se koriste četiri opšte kategorije tehnika:
više linija prekida;
softversko prozivanje;
zrakasto ulančavanje (hardversko prozivanje, vektorsko);
arbitraža magistrale (vektorska).
Najdirektniji pristup problemu je da se obezbedi više linija prekida između procesora i U/I modula.
Međutim, nije praktično nameniti više od nekoliko linija magistrale ili pinova procesora za linije prekida.
Zbog toga, čak i ako se koriste višestruke linije, verovatno će na svaku liniju biti priključeno više U/I
modula. Prema tome, jedna od druge tri tehnike mora da se upotrebi na svakoj liniji.
Jedna od alternativa je softversko prozivanje. Kada procesor otkrije prekid, on skoči u rutinu za
opsluživanje prekida čiji je posao da prozove svaki od U/I modula kako bi odredila koji modul je
prouzrokovao prekid. Prozivanje može da bude u obliku posebnog reda komande (na primer, TESTU/I).
U tom slučaju, procesor podiže TESTU /1 i postavlja adresu određenog U/I modula na adresne linije.
U/I modul odgovara pozitivno ako je on postavio prekid. Alternativno, svaki modul bi mogao da sadrži
adresibilni registar stanja. Procesor onda čita registar stanja svakog modula da bi identifikovao modul
koji je postavio prekid. Jednom kada se pravi modul identifikuje, procesor skače u rutinu uređaja,
specifičnu za taj uređaj.
Nedostatak softverskog prozivanja je u tome što troši mnogo vremena. Efikasnija tehnika je da se
upotrebi zrakasto ulančavanje, koje u stvari obezbeđuje hardversko prozivanje. Primer konfiguracije
43
zrakastog ulančavanja prikazan je na slici 3.26. Za prekide, svi U/I moduli dele zajedničku liniju za
zahtev prekida. Linija za potvrdu prekida je zraka sto ulančana kroz module. Kada procesor otkrije
prekid, on šalje potvrdu prekida. Taj signal se prostire kroz nizove U/I modula dok ne stigne do modula
koji je postavio zahtev. Taj modul tipično odgovara postavljanjem reči na linije podataka. Ta reč se
zove
vektor i predstavlja adresu U/I modula ili neki drugi jedinstveni identifikator. U oba slučaja,
procesor koristi vektor kao pokazivač na odgovarajuću rutinu za uslugu uređaju. Tako se izbegava
potreba da se prvo izvrši opšta rutina za opsluživanje prekida. Ta tehnika se zove
vektorski prekid.
Postoji druga tehnika koja koristi vektorske prekide, a to je arbitraža magistrale. Kod arbitraže
magistrale, U/I modul mora prvo da dobije upravljanje nad magistralom pre nego što podigne signal na
liniji za zahtev prekida. Prema tome, samo jedan modul može da podigne tu liniju istovremeno. Kada
procesor otkrije prekid, on odgovara preko linije za potvrdu prekida. Zahtevajući modul onda postavlja
svoj vektor na linije podataka.
Gore pomenute tehnike služe da se identifikuje U/I modul koji je postavio zahtev. One takođe
obezbeđuju način dodeljivanja prioriteta kada više od jednog uređaja zahteva uslugu prekida. Kod
višestrukih linija, procesor samo izabere liniju sa najvišim prioritetom. Kod softverskog prozivanja,
redosled u kome se moduli prozivaju određuje njihov prioritet. Slično tome, redosled modula u
zrakastom ulančavanju određuje njihov prioritet. Najzad, arbitraža magistrale može da upotrebi
prioritetnu šemu, o čemu se govori u odeljku 3.4.
Poglavlje 8
PODRŠKA OPERATIVNOG SISTEMA
Mada se u ovoj knjizi govori uglavnom o računarskom hardveru, postoji jedna oblast softvera kojom
treba da se bavimo: operativni sistem računara. Operativni sistem je program koji upravlja resursima
računara, pruža usluge programerima i raspoređuje izvršavanje drugih programa. Da bi se shvatili
mehanizmi pomoću kojih centralna procesorska jedinica upravlja računarskim sistemom, važno je
izvesno poznavanje operativnih sistema. Posebno, efekti prekida i upravljanje memorijskom
hijerarhijom najbolje se objašnjavaju u tom kontekstu.
U najvećem delu poglavlja razmatraju se dve funkcije operativnog sistema koje su najbitnije za
proučavanje organizacije i arhitekture računara: raspoređivanje i upravljanje memorijom.
8.1 PREGLED OPERATIVNOG SISTEMA
Ciljevi i funkcije operativnog sistema
Operativni sistem je program koji upravlja izvršavanjem aplikativnih programa ideluje kao interfejs
između korisnika računara i računarskog hardvera. O njemu može da se misli kao da ima dva cilja:
Pogodnost:
operativni sistem čini računar pogodnijim za upotrebu.
Efikasnost:
operativni sistem dozvoljava da se resursi računarskog sistema koriste na efikasan
način.
Redom ćemo ispitati ta dva aspekta operativnog sistema.
Operativni sistem kao interfejs između korisnika i računara
Hardver i softver koji se koriste da bi
se korisniku obezbedila aplikacija mogu se sagledati na slojevit ili hijerarhijski način, prikazan na slici
8.1. Korisnik tih aplikacija, krajnji korisnik, obično se ne brine o arhitekturi računara. Prema tome,
krajnji korisnik vidi računarski sistem preko aplikacije. Ta aplikacija može da se izrazi u jeziku za
programiranje i razvija je aplikacioni programer. Razvoj aplikacionog programa u vidu skupa
44

termostata koji je potpuno izdvojen od aparatura za proizvođenje i distribuciju toplote.) To nije slučaj
kod operativnog sistema koji je, kao upravljački mehanizam, neuobičajen u dva pogleda:
Operativni sistem funkcioniše na isti način kao i običan računarski softver;
odnosno, to
je program koji izvršava procesor.
Operativni sistem se često odriče upravljanja i mora zavisiti od procesora kako bi mu on
dozvolio da ponovo preuzme pravljanje.
Operativni sistem, u stvari, nije ništa više od računarskog programa. Kao i svaki drugi računarski
program, on daje procesoru instrukcije. Ključna razlika je u nameni programa. Operativni sistem
upravlja procesorom u upotrebi ostalih sistemskih resursa i vremenskom usklađivanju njegovog
izvršavanja drugih programa. Ali da bi procesor mogao da radi bilo šta od toga, on mora prestati da
izvršava program operativnog sistema i početi da izvršava druge programe. Dakle, operativni sistem se
odriče upravljanja da bi procesor uradio neki "koristan'; posao i zatim ponovo preuzima upravljanje,
dovoljno dugo da bi pripremio procesor da uradi sledeći deo posla. Mehanizmi koji su obuhvaćeni svim
tim biće detaljnije objašnjeni u ovom poglavlju.
Na slici 8.2 nagoveštava se da operativni sistem upravlja glavnim resursima. Deo operativnog sistema
je u glavnoj memoriji. On obuhvata jezgro, ili nukleus, koji sadrži najčešće korišćene funkcije
operativnog sistema i, u datom trenutku, druge delove operativnog sistema koji se tada koriste.
Ostatak glavne memorije sadrži korisničke programe i podatke. Kao što ćemo videti, dodeljivanjem tog
resursa (glavne memorije) zajednički upravljaju operativni sistem i hardver za upravljanje memorijom u
procesoru. Operativni sistem odlučuje kada program u izvršenju može da koristi U/I uređaj, a upravlja i
pristupom datotekama i njihovom upotrebom. I sam procesor je resurs, pa operativni sistem mora da
odredi koliko procesorskog vremena treba da se nameni izvršavanju određenog korisničkog programa. U
slučaju višeprocesorskog sistema, ta odluka može da se proširi na sve procesore.
Vrste operativnih sistema
Neke ključne karakteristike služe da se napravi razlika između vrsta operativnih sistema. Te
karakteristike se kreću duž dve nezavisne dimenzije. Prva dimenzija određuje da li je sistem namenjen
za paketnu obradu, ili je interaktivan. U interaktivnom sistemu, korisnik/programer direktno međusobno
deluje sa računarom, obično preko terminala tastatura/displej, da bi zahtevao izvršenje posla ili izveo
transakciju. Štaviše, korisnik može, zavisno od prirode aplikacije, da komunicira sa računarom u toku
izvršenja posla. Sistem za paketnu obradu je suprotan interaktivnom sistemu. Korisnikov program se
pakuje zajedno sa programima drugih korisnika i sve ih na izvršenje podnosi operator računara. Kada se
program završi, rezultati se štampaju za korisnika. Danas su retki sistemi samo za paketnu obradu.
Međutim, za opis savremenih operativnih sistema je korisno da se ukratko ispitaju sistemi za paketnu
obradu.
Nezavisna dimenzija određuje da li sistem primenjuje, ili ne primenjuje muItiprogramiranje. Kod
multiprogramiranja je učinjen pokušaj da se procesor drži zaposlenim što je više moguće tako što radi
na više od jednog programa istovremeno. Više programa se učitava u memoriju, a procesor brzo prelazi
sa jednog na drugi među njima. Alternativa je jednoprogramirani sistem koji radi na samo jednom
programu odjednom.
Prvi sistemi
Kod najranijih sistema, od kraja 1940-ih do sredine 1950-ih godina, programer je direktno
međusobno delovao sa računarskim hardverom; nije bilo operativnog
sistema. Tim procesorima se
upravljalo sa konzole, koja se sastojala od sijalica displeja, prekidača, neke vrste ulaznog uređaja i
štampača. Programi u procesorskom kodu su se unosili preko ulaznog uređaja (na primer, čitača kartica).
Ako bi neka greška zaustavila program, uslov greške bi se prikazao pomoću sijalica. Programer je mogao
46
da nastavi sa ispitivanjem registara i glavne memorije kako bi utvrdio uzrok greške. Ako bi program
nastavio do normalnog završetka, izlaz bi se pojavio na štampaču.
Ti rani sistemi su postavili dva glavna problema:
Raspoređivanje
Većina instalacija je koristila upisnu listu za rezervisanje procesorskog vremena.
Tipično, korisnik je mogao da se upiše za blok vremena u umnošcima od pola sata i slično. Korisnik
je mogao da se upiše za jedan sat i da završi za 45 minuta: to
bi rezultovalo rasipanjem
računarskog vremena u besposlici. Sa druge strane, korisnik bi mogao da ima problema ako ne
završi u dodeljenom vremenu i bude prisiljen da zaustavi upotrebu mašine pre završetka svog
posla.
Vreme uspostavljanja
Pojedinačan program, koji se zvao
posao,
mogao je da obuhvati
učitavanje u memoriju kompajlera plus programa u jeziku visokog nivoa (izvorni program),
skladištenje prevedenog programa (objektni program), a zatim učitavanje i povezivanje
objektnog programa i zajedničkih funkcija. Svaki od tih koraka je mogao da obuhvati montiranje
ili demontiranje traka, ili postavljanje paketa kartica. Ako bi došlo do greške, nesrećni korisnik
je tipično morao da se vraća na početak sekvence uspostavljanja. Prema tome, značajna količina
vremena se trošila samo na uspostavljanje programa da bi se izvršavao.
Taj režim rada mogao bi se nazvati serijskom obradom, odražavajući činjenicu da korisnici imaju
pristup računaru u seriji. Vremenom, razvijen je niz raznih softverskih alatki u pokušaju da se serijska
obrada učini efikasnijom. One obuhvataju biblioteke zajedničkih funkcija, povezivače, punioce,
programe za otklanjanje grešaka i U/I upravljačke rutine, koje su kao zajednički softver bile na
raspolaganju svim korisnicima.
Jednostavni sistemi za paketnu obradu
Prvi procesori bili su vrlo skupi i zato je bilo važno
maksimizovati iskorišćenje procesora. Vreme izgubljeno zbog raspoređivanja i uspostavljanja bilo je
neprihvatljivo.
Da bi se poboljšalo iskorišćenje, razvijeni su jednostavni sistemi za paketnu obradu. Kod takvog
sistema, koji se takođe zvao i
monitor,
korisnik više nije imao direktan pristup procesoru. Umesto toga,
korisnik podnosi posao na karticama ili traci operatoru računara, koji sekvencijalno pakuje poslove
zajedno i stavlja ceo paket na ulazni uređaj da bi ga upotrebio monitor.
Da biste razumeli kako ta šema radi, razmotrićemo je sa dve tačke gledišta: monitorove i
procesorove. Sa tačke gledišta monitora, on je taj koji upravlja sekvencom događaja. Da bi to bilo
moguće, najveći deo monitora mora uvek da bude u glavnoj memoriji i na raspolaganju za izvršenje (slika
8.3). Taj deo se zove
rezidentni monitor.
Ostatak monitora sastoji se od uslužnih programa i
zajedničkih funkcija koje se učitavaju kao potprogrami korisničkog programa na početku svakog posla
koji ih zahteva. Monitor učitava poslove, po jedan odjednom, iz ulaznog uređaja (tipično čitača kartica
ili trake). Kada se učita, posao se smešta u oblast korisničkih programa i upravljanje se prepušta tom
poslu. Kada se posao završi, on vraća upravljanje monitoru, koji odmah učitava sledeći posao. Rezultati
svakog posla štampaju se za isporuku korisniku.
Sada razmotrite tu sekvencu sa tačke gledišta procesora. U izvesnom trenutku, procesor izvršava
instrukcije iz dela glavne memorije koji sadrži monitor. Te instrukcije prouzrokuju da se sledeći posao
učita u drugi deo glavne memorije. Kada se posao učita, procesor će u monitoru naići na instrukciju
grananja koja ga upućuje da nastavi sa izvršavanjem na početku korisničkog programa. Procesor će
zatim izvršavati instrukcije u korisnikovom programu sve dok ne naiđe da završetak, ili na uslov greške.
Prema tome, izraz "upravljanje se prepušta poslu" jednostavno znači da procesor sada donosi i izvršava
instrukcije iz korisničkog programa, a "upravljanje se vraća monitoru" znači da procesor sada donosi i
izvršava instrukcije iz programa monitora.
47

završetka izvršenja posmatrane instrukcije.
Sledeća instrukcija koja treba da se donese, nalazi se u glavnoj memoriji ili, u slučaju virtueInog
memorijskog sistema, u glavnoj memoriji ili sekundarnoj memoriji (na disku). U većini slučajeva, sledeća
instrukcija koja treba da se donese neposredno sledi iza tekuće instrukcije. U tim slučajevima nema
eksplicitne reference na sledeću instrukciju. Kada je potrebna eksplicitna referenca, onda mora da se
obezbedi adresa u glavnoj ili virtueInoj memoriji. O obliku u kome se obezbeđuje ta adresa govori se u
poglavlju Il.
Operandi izvora i rezultata mogu da budu u jednoj od sledeće tri oblasti:
Glavna ili virtuelna memorija:
kao i kod reference na sledeću instrukciju, mora da se obezbedi
adresa u glavnoj ili u virtueInoj memoriji.
Registar procesora:
sa retkim izuzecima, procesor sadrži jedan ili više registara koji mogu da se
referenciraju mašinskim instrukcijama. Ako postoji samo jedan registar, referenca na njega
može da bude implicitna. Ako postoji više od jednog registra, onda se svakom registru dodeljuje
jedinstven broj, a instrukcija mora da sadrži broj željenog registra.
U/I uređaj:
instrukcija mora da odredi U/I modul i uređaj za operaciju. Ako
se koristi
memorijski preslikan U/I, to je samo druga adresa u glavnoj ili virtueInoj memoriji.
Predstavljanje instrukcije
Unutar računara, svaka instrukcija predstavlja se nizom bitova. Instrukcija je podeljena na polja koja
odgovaraju elementima koji su sastavni delovi instrukcije. Jednostavan primer formata instrukcije
prikazan je na slici 10.2. Kao drugi primer, format instrukcije lAS prikazan je na slici 2.2. Kod većine
skupova instrukcija, koristi se više od jednog formata. Za vreme izvršenja instrukcije, ona se učitava u
instrukcijski registar (IR) u procesoru. Procesor mora da bude u stanju da izdvoji podatke iz raznih
polja instrukcije kako bi izveo zahtevanu operaciju.
Teško je i za programera i za čitaoca udžbenika da se bave binarnim predstavljanjima mašinskih
instrukcija. Stoga je postala uobičajena praksa da se koristi simboličko predstavljanje mašinskih
instrukcija. Primer toga je upotrebljen za skup instrukcija lAS u tabeli 2.1.
Operacioni kodovi predstavljaju se skraćenicama koje se zovu mnemonici i ukazuju na operaciju.
Uobičajeni primeri su:
ADD Sabiranje
SUB Oduzimanje
MPY Množenje
DIV
Deljenje
LOAD Učitavanje podatka iz memorije
STOR Skladištenje podatka u memoriji
Operandi se takođe predstavljaju simbolički. Na primer, instrukcija
ADD R,Y
može da znači: saberi vrednost koja je sadržaj u lokaciji podatka Y sa sadržajem registra R. U tom
primeru, Y se odnosi na adresu lokacije u memoriji, a R na određeni registar. Obratite pažnju na to da
se operacija izvodi nad sadržajem lokacije, a ne nad njenom adresom.
Prema tome, moguće je napisati program u mašinskom jeziku u simboličkom obliku. Svaki simbolički
operacioni kod ima fiksno binarno predstavljanje, a programer određuje specifičnu lokaciju svakog
simboličkog operanda. Na primer, programer bi mogao da počne sa listom definicija:
X = 513
49
Y = 514
i tako dalje. Jednostavan program bi prihvatio taj simbolički ulaz, pretvorio operacione kodove i
reference operanada u binarni oblik i konstruisao binarne mašinske instrukcije.
Programeri u mašinskom jeziku su retki i gotovo da iščezavaju. Većina programa danas se piše u
jeziku visokog nivoa ili, u njegovom nedostatku, u asemblerskom jeziku, o čemu se govori na kraju ovog
poglavlja. Međutim, simbolički mašinski jezik ostaje koristan alat za opisivanje mašinskih instrukcija i mi
ćemo ga koristiti u tu svrhu.
Vrste instrukcija
Razmotrite instrukciju jezika visokog nivoa koja bi mogla da se izrazi u jeziku kao što je BASIC ili
FORTRAN. Na primer,
X = X + Y
Taj iskaz upućuje računar da doda vrednost uskladištenu u Y vrednosti uskladištenoj u X i da stavi
rezultat u X. Kako bi se to moglo izvršiti mašinskim instrukcijama? Pretpostavimo da X i Y odgovaraju
lokacijama 513 i 514. Ako pretpostavimo jednostavan skup mašinskih instrukcija, ta operacija bi se
mogla izvršiti pomoću tri instrukcije:
1. Učitaj u registar sadržaj memorijske lokacije 513.
2. Saberi sadržaj memorijske lokacije 514 sa sadržajem registra.
3. Uskladišti sadržaj registra u memorijsku lokaciju 513.
Kao što se može videti, jednostavna instrukcija BASIC-a može da zahteva tri mašinske instrukcije.
To je tipično za odnos između jezika visokog nivoa I mašinskog jezika. Jezik visokog nivoa izražava
operacije u sažetom algebarskom obliku, koristeći promenljive. Mašinski jezik izražava operacije u
osnovnom obliku, obuhvatajući pomeranje podataka u registre ili iz njih.
Imajući na umu ovaj jednostavan primer, razmotrimo vrste instrukcija koje moraju da se uključe u
praktičnom računaru. Računar bi trebalo da ima skup instrukcija koji dozvoljava korisniku da formuliše
bilo koji zadatak obrade podataka. Drugi način da se to sagleda je da se razmotre sposobnosti jezika za
programiranje visokog nivoa. Svaki program napisan u jeziku visokog nivoa mora da se prevede u mašinski
jezik da bi se izvršio. Prema tome, skup mašinskih instrukcija mora da bude dovoljan da izrazi svaku od
instrukcija iz jezika visokog nivoa. Imajući to u vidu, možemo da razvrstamo instrukcije na sledeći
način:
Obrada podataka:
aritmetičke i logičke instrukcije.
Skladištenje podataka:
memorijske instrukcije.
Pomeranje podataka:
U/I instrukcije.
Upravljanje:
instrukcije za testiranje i grananje.
Aritmetičke instrukcije obezbeđuju sposobnosti računanja za obradu numeričkih podataka. Logičke
(Bulove) instrukcije rade na bitovima reči, a ne na brojevima; zato one obezbeđuju sposobnosti za
obradu bilo kog drugog tipa podataka koji bi korisnik želeo da upotrebi. Te operacije se izvode
prvenstveno nad podacima u registrima procesora. Zato moraju da postoje memorijske instrukcije za
pomeranje podataka između memorije i registara. U/I instrukcije su potrebne da prenose programe i
podatke u memoriju i rezultate računanja natrag ka korisniku. Instrukcije za testiranje koriste se za
ispitivanje vrednosti reči podataka ili stanja računanja. Instrukcije za grananje se upotrebljavaju da bi
se prešlo na drugi skup instrukcija, u zavisnosti od donesene odluke.
Kasnije ćemo detaljnije ispitati razne vrste instrukcija.
Broj adresa
50

Korisno je ako se struktura steka obezbedi kao deo implementacije procesora. Kao što je rečeno u
odeljku 10.4, jedna od upotreba steka je da se upravlja pozivima i povracima iz procedura. Stekovi
takođe mogu da koriste programeru. Primer je procena izraza o kojoj se govori kasnije u ovom odeljku.
Implementacija steka delimično zavisi od njegovih potencijalnih upotreba. Ako se želi da se
operacije sa stekom stave na raspolaganje programeru, onda će skup instrukcija uključiti operacije
orijentisane na stek, kao što su PUSH, POP i operacije koje koriste jedan ili dva gornja elementa steka
kao operande. Zbog toga što se sve te operacije pozivaju na jedinstvenu lokaciju, odnosno vrh steka,
adresa operanda ili operanada je implicitna i ne treba da bude uključena u instrukciju. To su nulto-
adresne instrukcije koje su referencirane u odeljku 10.1.
Ako mehanizam steka treba da koristi samo procesor, za namene kao što je rukovanje procedurom,
tada u skupu instrukcija neće biti instrukcija eksplicitno orijentisanih na stek. U oba slučaja,
implementacija steka zahteva da postoji neki skup lokacija koje se koriste za skladištenje elemenata
ste ka. Tipičan pristup ilustrovan je na slici 10.14a. Za stek se rezerviše blok uzastopnih lokacija u
glavnoj memoriji (ili u virtueInoj memoriji). U najvećem delu vremena, blok je delimično popunjen
elementima steka, a njegov ostatak je na raspolaganju za porast steka.
Za ispravan rad, potrebne su tri adrese i one se često skladište u registrima procesora:
Pokazivač steka:
sadrži adresu vrha steka. Ako stavka treba da se doda u stek ili iz njega
ukloni, pokazivač se povećava ili smanjuje kako bi sadržao adresu novog vrha steka.
Osnova steka:
sadrži adresu lokacije na dnu rezervisanog bloka. Ako se pokuša
izvršenje
instrukcije
POP
kada je stek prazan, izveštava se o grešci.
Granica steka:
sadrži adresu drugog kraja rezervisanog bloka. Ako se pokuša
izvršenje
instrukcije PUSH kada je blok potpuno iskorišćen za stek, izveštava se o grešci.
Tradicionalno, a i na svim današnjim mašinama, osnova steka je na adresi većeg kraja bloka
rezervisanog za stek, a granica je na adresi manjeg kraja. Prema tome, stek raste sa većih ka manjim
adresama.
Da bi se ubrzale operacije sa stekom, dva njegova gornja elementa često se skladište u registrirna,
kao što je prikazano na slici 1O.14b. U tom slučaju, pokazivač steka sadrži adresu trećeg elementa
steka.
Procena izraza
Matematičke formule se obično izražavaju na način koji je poznat kao
infiksna
notacija. U tom obliku,
binarna operacija se pojavljuje između operanada (na primer, a + b). Za složene izraze, koriste se
zagrade da bi se odredio redosled procene izraza. Na primer, a + (b x c) će dati različit rezultat od (a +
b) x c. Da bi se minimizovala upotreba zagrada, operacije imaju implicitnu prednost. Uopšte no govoreći,
množenje ima prednost nad sabiranjem, pa je a + b x c ekvivalentno a + (b x c).
Alternativna tehnika je poznata kao
inverzna poljska ili postfiksna
notacija. U toj notaciji,
operator prati svoja dva operanda. Na primer:
a+b
postaje a b +
a + (b x c)
postaje abc x +
(a+b)xc
postaje a b + c x
Zapazite da, bez obzira na složenost izraza, kada se koristi inverzna poljska notacija, nisu potrebne
nikakve zagrade.
Prednost postfiksne notacije je što se izraz u tom obliku lako procenjuje koristeći stek. Izraz u
postfiksnoj notaciji se skenira sa leva nadesno. Za svaki element izraza, primenjuju se sledeća pravila:
1. Ako je element promenljiva ili konstanta, stavlja se na stek.
2. Ako je element operator, skidaju se dva gornja elementa steka, izvodi operacija i rezultat
52
stavlja na stek.
Pošto se skenira ceo izraz, rezultat se nalazi na vrhu steka.
Jednostavnost tog algoritma čini ga pogodnim za procenu izraza. U skladu sa tim, mnogi kompajleri
će uzeti izraz u jeziku visokog nivoa, pretvoriti ga u postfiksnu notaciju, a zatim generisati mašinske
instrukcije iz te notacije. Na slici 10.15 prikazuje se niz mašinskih instrukcija za procenjivanje f= (a -
b)f(c + d x e), koristeći instrukcije orijentisane na stek. Na slici se takođe prikazuje upotreba
jednoadresnih i dvoadresnih instrukcija. Zapazite da je, čak i ako se u poslednja dva slučaja ne koriste
pravila orijentisana na stek, postfiksna notacija poslužila za generisanje mašinskih instrukcija. Niz
događaja za program steka prikazan je na slici 10.16.
Proces pretvaranja infiksnog izraza u postfiksni izraz se samo po sebi najlakše obavlja pomoću
steka. Postupci su sledeći:
1. Ispituje se sledeći element ulaza.
2. Ako je operand, daje se na izlaz.
3. Ako je leva zagrada, stavlja se na stek.
4. Ako je operator, onda
ako je na vrhu steka leva zagrada, operator se stavlja na stek;
ako ima viši prioritet od vrha steka (množenje i deljenje imaju viši prioritet od
sabiranja i oduzimanja), operator se stavlja na stek;
inače, skida se operacija sa steka na izlaz i ponavlja postupak 4.
5. Ako je desna zagrada, skidaju se operatori na izlaz sve dok se naiđe na levu zagradu. Skida
se sa steka i odbacuje leva zagrada.
6. Ako ima još ulaza, ide se na postupak 1.
7. Ako više nema ulaza, skidaju se preostali operatori sa steka.
Na slici 10.17 prikazana je upotreba tog algoritma. Taj primer bi čitaocu trebalo da pruži izvestan
osećaj o snazi algoritama zasnovanih na steku.)
Moguće je, u stvari, da se za neke instrukcije posao uradi bez ijedne adrese. Instrukcije bez adresa
su primenljive u specijalnoj organizaciji memorije koja se zove stek. Stek je skup lokacija sa kojima se
radi po pravilu "poslednji u stek - prvi iz steka". Stek je na poznatoj lokaciji i, često, najmanje gornja
dva njegova elementa su u registrima procesora. Prema tome, instrukcija bez adrese bi referencirala
gornja dva elementa steka. Stekovi su opisani u dodatku 10A. Njihova upotreba se istražuje kasnije u
ovom poglavlju, kao i u poglavlju 11.
U tabeli 10.1 zbirno su data tumačenja instrukcija sa nula, jednom, dve ili tri adrese. U svakom
slučaju, u tabeli, pretpostavljeno je da je adresa sledeće instrukcije implicitna i da treba da se izvrši
jedna operacija sa dva izvorna operanda i jednim operandom za rezultat.
Broj adresa po instrukciji je osnovna odluka za projektovanje. Manje adresa po instrukciji
rezultovaće instrukcijama koje su primitivnije i zahtevaju manje složen procesor. To će takođe
rezultovati kraćim instrukcijama. Sa druge strane, program ukupno sadrži više instrukcija, što obično
ima za posledicu duža vremena izvršenja i duže, složenije programe. Takođe, postoji jedan značajan
prag između jednoadresnih i višadresnih instrukcija. Sa jednoadresnim instrukcijama, programer obično
ima na raspolaganju samo jedan registar opšte namene, akumulator. Sa višeadresnim instrukcijama,
obično se poseduje više registara opšte namene. To dozvoljava da se neke od operacija izvode samo na
registrirna. Zbog toga što su reference registara brže od referenci memorije, to ubrzava izvršenje.
Zbog fleksibilnosti i mogućnosti upotrebe više registara, većina savremenih mašina koristi mešavinu
dvoadresnih i troadresnih instrukcija.procesor. To će takođe rezultovati kraćim instrukcijama. Sa
53

adrese;
brojevi;
znakovi;
logički podaci.
Kada budemo govorili o načinima adresiranja u poglavlju 11, videćemo da su adrese, u stvari, oblik
podataka. U mnogim slučajevima, neka računanja moraju da se izvrše na referenci operanda u instrukciji
kako bi se odredila adresa u glavnoj ili virtuelnoj memoriji. U tom kontekstu, adrese mogu da se
smatraju neoznačenim celim brojevima.
Ostali uobičajeni tipovi podataka su brojevi, znakovi i logički podaci i svaki od njih se ukratko
ispituje u ovom odeljku. Pored toga, u nekim mašinama se definišu specijalizovani tipovi podataka ili
strukture podataka. Na primer, mogu da postoje mašinske operacije koje rade direktno sa listom ili
nizom znakova.
Brojevi
Svi mašinski jezici uključuju numeričke tipove podataka. Čak i u nenumeričkoj obradi podataka, brojevi
su potrebni da deluju kao brojači, širine polja itd. Značajna razlika između brojeva koji se koriste u
običnoj matematici i brojeva koji su uskladišteni u računaru je što su ovi poslednji ograničeni. To je
tačno u dva smisla. Prvo, postoji granica apsolutne vrednosti brojeva koji se mogu predstaviti u mašini i
drugo, u slučaju brojeva u pokretnom zarezu, postoji ograničenje njihove tačnosti. Prema tome,
programer se suočava sa razumevanjem posledica zaokruživanja, prekoračenja i podbačaja.
U računarima su uobičajena tri tipa numeričkih podataka:
celi brojevi ili brojevi u fiksnom zarezu;
brojevi u pokretnom zarezu;
decimalni brojevi.
Prva dva tipa smo detaljno ispitali u poglavlju 9. Preostaje da kažemo nekoliko reči o decimalnim
brojevima.
Mada su sve unutrašnje računarske operacije po prirodi binarne, korisnici sistema, kao ljudi, rade sa
decimalnim brojevima. Prema tome, potrebno je da se decimalni brojevi pretvaraju u binarne na ulazu i
binarni brojevi u decimalne na izlazu. Za aplikacije u kojima ima mnogo U/I i, u poređenju sa tim, malo
jednostavnih računanja, poželjno je skladištiti i raditi sa brojevima u decimalnom obliku.
Najzastupljenije predstavljanje sa tom namenom je
pakovani decimalni
broji.
Kod pakovanog decimainog broja, svaka decimalna cifra predstavlja se 4-bitnim kodom, na očigledan
način, sa dve cifre koje se skladište po bajtu. Prema tome, O = 0000, 1 = 0001, ... , 8 = 1000, i 9 = 1001.
Obratite pažnju daje to prilično neefikasan kod zato što se koristi samo 10 od 16 mogućih 4-bitnih
vrednosti. Da bi se formirali brojevi, 4-bitni kodovi se nižu zajedno, obično u umnošcima od po 8 bitova.
Prema tome, kod za 246 je 0000 0010 0110. Jasno je da je taj kod manje kompaktan od direktnog
binarnog predstavljanja, ali izbegava dodatni rad na pretvaranju. Negativni brojevi mogu da se
predstave uključivanjem 4-bitne cifre predznaka na levom ili desnom kraju niza pakovanih decimalnih
cifara. Na primer, kod 1111 bi mogao da posluži za predznak minus.
Mnoge mašine obezbeđuju aritmetičke instrukcije za izvođenje operacija direktno na pakovanim
decimalnim brojevima. Algoritmi su slični onima opisanim u odeljku 9.3, ali moraju da uzmu u obzir
operaciju decimalnog prenosa.
Znakovi
Opšti oblik podataka je tekst ili niz znakova. Mada su tekstualni podaci najpogodniji da ih čitaju ljudi,
55
oni ne mogu, u obliku znakova, lako da se skladište ili prenose u sistemima za obradu podataka ili
komunikacionim sistemima. Takvi sistemi su pIojektovani za binarne podatke. Zato je smišljen jedan
broj kodova, pomoću kojih se znakovi predstavljaju kao nizovi bitova. Možda je prvi opšteprihvaćen
primer bio Morzeov kod. Danas, najviše korišćen kod za znakove je International Reference Alphabet
(IRA), koji se u SAD zove American Standard Code for Information Interchange (ASCII; pogledajte
tabelu 7.1). Svaki znak u tom kodu predstavlja se jedinstvenim 7-bitnim oblikom; prema tome, može da
se predstavi 128 znakova. To je veći broj nego što je potrebno da bi se predstavili znakovi koji se mogu
štampati, pa neki oblici predstavljaju upravljačke znakove. Neki od tih upravljačkih znakova su u vezi sa
upravljanjem štampanjem znakova na stranici. Drugi se staraju o komunikacionim procedurama. lRA-
kodovani znakovi se skoro uvek skladište i prenose koristeći 8 bitova po znaku. Osmi bit može da se
postavi na O ili da se koristi kao bit parnosti za otkrivanje greške. U tom poslednjem slučaju, bit se
postavlja tako da ukupan broj binarnih cifara 1 u svakom oktetu bude uvek neparan (neparna parnost), ili
uvek paran (parna parnost).
Zapazite u tabeli 7.1 da se za IRA oblik bitova 011XXXX, cifre O do 9 predstavljaju svojim
binarnirri ekvivalentima, 0000 do 1001, na 4 bita krajnje desno. To je isti kod kao pakovani decimalni,
što olakšava pretvaranje između 7-bitnog IRA i 4-bitnog pakovanog decimalnog predstavljanja.
I u udžbenicima se to obično zove binarno kodovan decimalni broj (BCD). Strogo govoreći. BCD se
odnosi na kodovanje svake decimalne cifre jedinstvenim 4-bitnim nizom. Pakovani decimalni broj se
odnosi na skladištenje BCD-kodovanih cifara koristeći jedan bajt za svake dve cifre.
Drugi kod koji se koristi za kodovanje znakova je Extended Binary Coded Decimal Intechange Code
(EBCDIC). EBCDIC se koristi na IBM-ovim glavnim računarima. To je 8-bitni kod. Kao i IRA, EBCDIC je
kompatibilan sa pakovanim decimalnim. U slučaju EBCDIC, kodovi 11110000 do 1111001 predstavljaju
cifre O do 9.
Logički podaci
Naravno, sa svakom reči ili nekom drugom jedinicom koja se može adresirati (bajt, polureč itd.),
postupa se kao sa jednom jedinicom podataka. Međutim, ponekad je korisno da se razmatra n-bitna
jedinica kao da se sastoji od n 1-bitnih podataka, od kojih svaki ima vrednost O ili 1. Kada se podaci
posmatraju na taj način, oni se smatraju !ogičkim podacima.
Ovakav pogled, orijentisan na bitove, ima dve prednosti. Prvo, možemo ponekad poželeti da
skladištimo niz Bulovih ili binarnih podataka, u kome svaki od njih može uzeti samo vrednosti 1 (istinit) i
O (neistinit). Kod logičkih podataka, memorija se najefikasnije koristi za to skladištenje. Drugo, postoje
prilike kada želimo da manipulišemo bitovima u podatku. Na primer, ako se operacije u pokretnom zarezu
implementiraju u softveru, potrebno je da možemo da pomeramo značajne bitove u nekim operacijama.
Drugi primer: da bismo pretvorili IRA u pakovani decimalni kod, treba da izdvojimo 4 bita krajnje desno
iz svakog bajta.
Obratite pažnju na to da se u prethodnim primerima sa istim podacima ponekad postupa kao sa
logičkim podacima, a ponekad kao sa numeričkim podacima ili sa tekstom. "Tip" jedinice podataka
određuje se operacijom koja se na njoj izvodi. Iako to obično nije slučaj kod jezika visokog nivoa, u
mašinskom jeziku skoro uvek se postupa na taj način.
VRSTE OPERACIJA
Broj različitih operacionih kodova znatno se menja od jedne do druge mašine. Međutim, neke opšte
vrste operacija nalaze se na svim mašinama. Korisna i tipična kategorizacija operacija je sledeća:
operacije za prenos podataka;
aritmetičke operacije;
56

Izvršenje aritmetičke instrukcije može da obuhvati operacije prenosa podataka da bi se postavili
operandi za ulaz u aritmetičku i logičku jedinicu (ALU) i da bi se isporučio izlaz iz ALU. Na slici 3.5
i1ustrovana su pomeranja obuhvaćena i uprenosu podataka i u aritmetičkim operacijama. Pored toga, deo
procesora za ALU izvodi
Logičke operacije
Većina mašina takođe obezbeđuje niz raznih operacija za manipulisanje pojedinačnim bitovima reči ili
neke druge jedinice koja se može adresirati, što se često zove "poigravanje sa bitovima". One su
zasnovane na Bulovim operacijama (pročitajte dodatak B).
Neke od osnovnih logičkih operacija koje mogu da se izvedu na Bulovim ili binarnim podacima,
prikazane su u tabeli 10.6. Operacija NE invertuje bit.
I, ILI
i ekskluzivno-ILI su najčešće logičke
funkcije sa dva operanda. JEDNAKO je koristan binarni test.
Te logičke operacije mogu da se primene po bitovima na n-bitne logičke jedinice podataka. Prema
tome, ako dva registra sadrže podatke
(RI) = 10100101
(R2) = 00001111
onda je
(R) I (R2) = 00000101
gde notacija (X) znači sadržaj u lokaciji X. Prema tome, operacija I može da se koristi kao maska
pomoću koje se biraju izvesni bitovi u reči i postavljaju na nulu preostali bitovi. Kao drugi primer, ako
dva registra sadrže
(RI) = 10100101
(R2) = 11111111
onda je
(R) ekskluzivno-ILI (R2) = 01011010
Kada je jedna reč postavljena tako da sve binarne cifre budu 1, operacija ekskluzivno-ILI
invertuje sve
bitove druge reči (komplement jedinice).
Pored logičkih operacija sa bitovima, većina mašina obezbeđuje razne funkcije pomeranja i rotiranja.
Većina osnovnih operacija ilustrovana je na slici 10.5. Kod
logičkog pomeranja,
bitovi reči se pomeraju
ulevo ili udesno. Na jednom kraju, gubi se bit koji se pomeri napolje. Na drugom kraju, unutra se pomera
0. Logička pomeranja se koriste prvenstveno za izdvajanja polja unutar reči. Binarne cifre 0 koje se
pomeraju li reč, izbacuju neželjene informacije koje se pomeraju napolje na drugom kraju.
Kao primer, pretpostavite da želimo da prenosimo znakove podataka na U/I uređaj, po 1 znak
odjednom. Ako je svaka memorijska reč dužine 16 bitova i sadrži dva znaka, moramo da raspakujemo
znakove pre nego što oni mogu da se šalju. Da bi dva
znaka u reči mogli da se pošalju:
reč se učitava u registar;
vrši se logička operacija I sa vrednošću 1111111100000000; to maskira znak desno;
pomera se udesno osam puta; to pomera preostali znak u desnu polovinu registra;
izvodi se U/I operacija; U/I modul čita 8 manje značajnih bitova sa magistrale podataka.
Prethodni postupci rezu1tuju slanjem znaka na levoj strani. Da bi se poslao znak na desnoj strani:
reč se opet učitava u registar;
vrši se logička operacija I sa 0000000011111111;
izvodi se U/I operacija.
Operacija
aritmetičkog pomeranja
postupa sa podatkom kao sa označenim celim brojem i ne pomera
58
bit predznaka. Kod aritmetičkog pomeranja udesno, bit predznaka se replicira u poziciju bita sa njegove
desne strane. Kod aritmetičkog pomeranja ulevo, logičko pomeranje ulevo izvodi se na svim bitovima,
izuzev na bitu predznaka, koji se zadržava. Te operacije mogu da ubrzaju neke aritmetičke operacije.
Kod brojeva u notaciji komplementa dvojke, aritmetičko pomeranje udesno odgovora deljenju sa 2, uz
skraćivanje neparnih brojeva. I aritmetičko pomeranje ulevo i logičko pomeranje ulevo odgovaraju
množenju sa 2 gde nema prekoračenja. Ako dodje do prekoračenja, aritmetičko i logičko pomeranje
ulevo daju različite rezultate, ali aritmetičko pomeranje ulevo zadržava predznak broja. Zbog
mogućnosti prekoračenja, mnogi procesori nemaju tu instrukciju, uključujući PowerPC i Itanium. Ostali,
kao što je IBM 8/390, nude tu instrukciju. Zanimljivo je da arhitektura Pentiuma uključuje aritmetičko
pomeranje ulevo, ali ga definiše da bude identično logičkom pomeranju ulevo.
Operacije
rotiranja,
ili cikličkog pomeranja, zadržavaju sve bitove na kojima se radi. Jedna od
upotreba rotiranjaje da se svaki od bitova redom dovede na krajnju levu poziciju, gde može da se
identifikuje ispitivanjem znaka podatka (sa kojim se postupa kao sa brojem).
Kao kod aritmetičkih operacija, logičke operacije obuhvataju aktivnost ALU i mogu da uključe
operacije prenosa podataka. U tabeli 10.7 dati su primeri svih operacija pomeranja i rotiranja o kojima
se govori u ovom pododeljku.
Pretvaranje
Instrukcije za pretvaranje su one koje menjaju format ili rade na formatu podatka. Primer je
pretvaranje iz decimalnog u binarni oblik. Primer složenije instrukcije za editovanje je instrukcija
Translate (TR) procesora S/390. Ta instrukcija može da se upotrebi da bi se pretvaralo iz jednog 8-
bitnog koda u drugi i ima tri operanda:
TR RI, R2, L
Operand R2 sadrži adresu početka tabele 8-bitnih kodova. Bajtovi L, koji počinju na adresi određenoj u
Rl, prevode se, zamenjujući svaki bajt sadržajem stavke tabele indeksirane tim bajtom. Na primer, da
bismo preveli iz koda EBCDIC u kod IRA, prvo pravimo 256-bajtnu tabelu u lokacijama memorije,
recimo, od 1000 do 10FF heksadecimalno. Tabela sadrži znakove koda IRA uredosledu binarnih
predstavljanja koda EBCDIC; odnosno, kod IRA se stavlja u tabelu na relativnu lokaciju jednaku
binarnoj vrednosti koda EBCDIC za isti znak. Prema tome, lokacije 10F0 do 10F9 će sadržati vrednosti
30 do 39, zato što je F0 kod EBCDIC za cifru 0, a 30 je kod IRA za cifru 0, i tako redom, do cifre 9.
Sad pretpostavite da imamo kod EBCDIC za cifre 1984 koji počinje na lokaciji 2100 i želimo da
prevedemo u kod IRA. Pretpostavite sledeće:
lokacije 2100 do 2103 sadrže Fl F9 F8 F4; . R1 sadrži 2100;
R2 sadrži 1000.
Tada, ako izvršimo
TR R1, R2, 4
lokacije 2100 do 2103 će sadržati 31 39 38 34.
Ulaz/izlaz
O instrukcijama za ulaz/izlaz smo do izvesne detljnosti govorili u poglavlju 7. Kao što smo videli, postoje
razni pristupi, uključujući programirani U/I, memorijski preslikan programirani U/I, D MA i upotreba
U/I procesora. Mnoge implementacije obezbeđuju samo nekoliko U/I instrukcija, gde se specifične
aktivnosti određuju parametrima, kodovima, ili komandnim rečima.
Upravljanje sistemom
59

BROX Skok na lokaciju X ako dođe do prekoračenja.
U svim tim slučajevima, rezultat na koji se poziva je rezultat poslednje operacije koja postavlja kod
uslova.
Drugi pristup, koji može da se preduzme kod troadresnog formata instrukcija, je da se izvede
poređenje i odredi grananje u istoj instrukciji. Na primer,
BRE Rl, R2, X Skok na X ako je sadržaj R1 = sadržaju R2.
Na slici 10.6 prikazani su primeri tih operacija. Zapazite da grananje može da bude unapred (na
instrukciju sa višom adresom) ili unazad (niža adresa). U primeru se pokazuje kako mogu da se upotrebe
bezuslovna i uslovna grananje da bi se napravila petlja instrukcija. Instrukcije u lokacijama 202 do 210
će se ponovno izvršavati sve dok rezultat oduzimanja Y od X ne bude 0.
Instrukcije preskoka
Drugi uobičajen oblik instrukcije za prenošenje upravljanja je instrukcija za
preskok. Instrukcija za preskok obuhvata implicitnu adresu. Tipično, preskok ukazuje na to da
instrukcija treba da se preskoči; prema tome, implicitna adresa je jednaka adresi sledeće instrukcije
plus dužina jedne instrukcije.
Zbog toga što instrukcija za preskok ne zahteva polje za adresu odredišta, ona može da radi druge
stvari. Tipičan primer je instrukcija za povećavanje i preskok ako je rezultat nula (ISZ). Razmotrite
sledeći odlomak iz programa:
U tom odlomku, upotrebljene su dve instrukcije za prenos upravljanja da bi se napravila iterativna
petlja. U R1 se postavlja negativan broj iteracija koje treba da se izvedu. Na kraju petlje, R1 se
povećava. Ako nije jednak 0, program se grana unazad na početak petlje. U suprotnom, grananje se
preskače i program nastavlja sa sledećom instrukcijom posle kraja petlje.
Instrukcije za poziv procedure
Procedura je možda najznačajnija inovacija u razvoju jezika za
programiranje. Procedura je samostalan računarski program koji se ugrađuje u veći program. U svakoj
tački programa može da se pozove procedura. Procesoru se kaže da ide i izvrši celu proceduru, a zatim
vrati u tačku iz koje je došlo do poziva.
Dva glavna razloga za upotrebu procedura su ekonomičnost i modularnost. Procedura dozvoljava da
se isti deo koda koristi mnogo puta. To je značajno za ekonomičnost u programiranju i za najefikasnije
iskorišćenje memorijskog prostora u sistemu (program mora da se skladišti). Procedure takođe
dozvoljavaju da se veliki zadaci programiranja podele na manje jedinice. Ta upotreba modularnosti u
velikoj meri olakšava zadatak programiranja.
Mehanizam procedure obuhvata dve osnovne instrukcije: instrukciju poziva, koja vrši grananje od
trenutne lokacije na proceduru, i instrukciju povratka, kojom se vraća iz procedure na mesto sa koga je
ona bila pozvana. Obe instrukcije su oblici instrukcija grananja.
Na slici 10.7a ilustrovana je upotreba procedura da bi se konstruisao program. U tom primeru,
postoji glavni program koji počinje na lokaciji 4000. Taj program uključuje poziv procedure PROC1, koja
počinje na lokaciji 4500. Kada naiđe na tu instrukciju poziva, procesor suspenduje izvršenje glavnog
programa i počinje izvršenje PROC1
,
donoseći sledeću instrukciju iz lokacije 4500. Unutar PROC1
postoje dva poziva procedure PROC2 na lokaciji 4800. U oba slučaja, izvršenje PROC1 se suspenduje i
izvršava se PROC2. Iskaz RETURN prouzrokuje da se procesor vraća u program koji je pozvao
proceduru i nastavlja izvršenje instrukcije posle odgovarajuće instrukcije CALL. Takvo ponašanje
ilustrovano je na slici 10.7b.
Vredi zapaziti nekoliko činjenica:
1.
Procedura može da se poziva sa više od jednog mesta.
2.
Poziv procedure može da se pojavi unutar procedure. To dozvoljava ugneždavanje procedura do
61
proizvoljne dubine.
3.
Svaki poziv procedure je uparen sa povratkom u program koji je napravio taj poziv.
Zbog toga što bi nam se sviđalo da možemo da pozivamo proceduru sa raznih mesta, procesor mora
na neki način da sačuva adresu povratka, tako da povratak može ispravno da se obavi. Postoje tri
uobičajena mesta za skladištenje adrese povratka:
registar;
početak pozvane procedure;
vrh steka.
Zamislite instrukciju mašinskog jezika CALL X, koja znači poziv procedure na lokaciji X. Ako se
preduzme registarski pristup, CALL X prouzrokuje sledeće akcije:
RN PC +
Δ
PC X
gde je RN registar koji se uvek koristi za tu namenu, PC je programski brojač, a Δ je dužina
instrukcije. Pozvana procedura sada može da sačuva sadržaj RN da bi bio iskorišćen za kasniji povratak.
Druga mogućnost je da se adresa povratka uskladišti na početku procedure. U tom slučaju, CALL X
prouzrokuje
X PC + Δ
PC X + I
To je baš zgodno. Adresa povratka je bezbedno sačuvana.
Oba prethodna pristupa rade i bili su primenjivani. Jedino ograničenje tih pristupa je što oni
sprečavaju upotrebu višestruko ulaznih procedura. Višestruko ulazna procedura je ona koja može da ima
više poziva otvorenih u isto vreme. Rekurzivna procedura (ona koja samu sebe poziva) je primer
upotrebe tog svojstva.
Opštiji i moćniji pristup je da se koristi stek (za raspravu o steku pročitajte dodatak IOA). Kada
procesor izvršava poziv, on postavlja adresu povratka na stek. Kada izvršava povratak, on koristi adresu
sa steka. Na slici 10.8 ilustrovana je upotreba steka.
Pored obezbeđenja adrese povratka, često je potrebno da se uz poziv procedure proslede i
parametri. Oni mogu da se proslede u registre. Druga mogućnost je da se parametri skladište u
memoriji, odmah posle instrukcije CALL. U tom slučaju, povratak mora da bude na lokaciju koja sledi
parametre. I u ovim slučajevima, oba pomenuta pristupa imaju nedostatke. Ako se koriste registri,
pozvani program i program koji poziva moraju da budu tako napisani da osiguraju pravilno korišćenje
registara. Skladištenje parametara u memoriji otežava razmenu promenljivog broja parametara. Oba
pristupa sprečavaju upotrebu višestruko ulaznih procedura.
Fleksibilniji pristup je da se parametri proslede na stek. Kada procesor izvršava poziv, on na stek ne
stavlja samo adresu povratka, nego i parametre koji treba da se proslede pozvanoj proceduri. Pozvana
procedura može da pristupi parametrima sa steka. Parametri povratka takođe mogu da se stave na stek.
Ceo skup parametara, uključujući i adresu povratka, koji je uskladišten za poziv procedure, zove se
okvir steka.
Primer je dat na slici 10.9. Odnosi se na proceduru P u kojoj se deklarišu lokalne promenljive x1 i x2 i
proceduru Q, koju P može da pozove i u kojoj se deklarišu lokalne promenljive y1 i y2. Na toj slici, tačka
povratka za svaku proceduru je prva stavka koja se skladišti u odgovarajućem okviru steka. Zatim se
skladišti pokazivač na početak prethodnog okvira. To je potrebno ako su broj ili dužina parametara koji
treba da se skladište promenljivi.
Asemblerski jezik
62

Razvoj asemblerskog jezika predstavljao je glavnu prekretnicu u razvoju računarske tehnologije. To
je bio prvi korak ka jezicima visokog nivoa koji se danas koriste. Iako malo programera koristi
asemblerski jezik, skoro sve mašine imaju jedan od njih. Oni se koriste, ako ni za šta drugo, za
sistemske programe, kao što su kompajleri i U/I rutine.
Poglavlje 11
SKUPOVI INSTRUKCIJA: NACINI I FORMATI ADRESIRANJA
ADRESIRANJE
Adresno polje, ili polja, u tipičnom formatu instrukcije relativno su mala. Voleli bismo da možemo da
referenciramo širok opseg lokacija u glavnoj memoriji ili u nekim sistemima, virtuelnoj memoriji. Da bi
se postigao taj cilj, primenjuju se razne tehnike adresiranja. Sve one uključuju neki kompromis između
opsega adresa sa jedne strane i/ili fleksibilnosti izračunavanja adrese, sa druge strane. U ovom odeljku,
ispitujemo najzastupljenije tehnike adresiranja:
neposredno,
direktno,
indirektno,
registarsko,
registarsko indirektno,
sa pomerajem,
pomoću steka.
Ti načini adresiranja ilustrovani su na slici 11.1. U ovom odeljku koristimo sledeću notaciju:
A
= sadržaj polja adrese u instrukciji.
R
= sadržaj polja adrese u instrukciji koje referencira registar.
EA
= stvarna (efektivna) adresa lokacije koja sadrži referencirani operand.
(X)
= sadržaj memorijske lokacije X ili registra X.
U tabeli 11.1 prikazana su izračunavanja adresa za svaki način adresiranja.
Pre nego što započnemo ovu raspravu, treba da damo dva komentara. Prvo, skoro sve arhitekture
računara obezbeđuju više od jednog od tih načina adresiranja. Postavlja se pitanje kako procesor može
da odredi koji način adresiranja se koristi u određenoj instrukciji. Preduzima se više pristupa. Često će
različiti kodovi operacije koristiti različite načina adresiranja. Takođe, jedan ili više bitova u formatu
instrukcije mogu da se upotrebe kao
polje za način adresiranja. Vrednost polja za način adresiranja
određuje koji se način koristi.
Drugi komentar se odnosi na tumačenje efektivne adrese (EA). U sistemu bez virtueine memorije,
efektivna adresa će biti ili adresa u glavnoj memoriji ili registar. Stvarno preslikavanje na fizičku
adresu je funkcija mehanizma straničenja i nevidljivo je za programera.
Neposredno adresiranje
Najjednostavniji oblik adresiranja je neposredno adresiranje, u kome je vrednost operanda prisutna u
instrukciji
Operand = A
Taj način može da se upotrebi da definiše i koristi konstante ili da postavlja početne vrednosti
promenijivih. Tipično, broj će biti uskladišten u obliku komplementa dvojke; krajnji levi bit polja za
operand se koristi kao bit predznaka. Kada se operand učita u registar za podatke, bit predznaka se
proširuje nalevo do potpune veličine reči podatka.
Prednost neposrednog adresiranja je što nema drugih referenci memorije sem donošenja instrukcije
64
koje se zahteva da bi se dobio operand, pa se prema tome štedi jedan ciklus memorije ili keša u ciklusu
instrukcije. Nedostatak je što je veličina broja ograničena dimenzijom polja za adresu, koja je, u većini
skupova instrukcija, mala u poređenju sa dužinom reči.
Direktno adresiranje
Direktno adresiranje je veoma jednostavan oblik adresiranja, u kome polje za adresu sadrži efektivnu
adresu operanda:
EA=A
Ta tehnika je bila uobičajena u ranijim generacijama računara, ali se ne sreće često u savremenim
arhitekturama. Zahteva samo jednu referencu memorije i nema posebnih izračunavanja. Očigledno
ograničenje je to što obezbeđuje samo ograničen adresni prostor.
Indirektno adresiranje
Kod direktnog adresiranja, dužina polja za adrese je obično manja od dužine reči, što ograničava
adresni opseg. Jedno rešenje je da se u adresnom polju referencira na adresu reči u memoriji, koja sa
svoje strane sadrži adresu operanda potpune dužine. To je poznato kao
indirektno adresiranje:
EA = (A)
Kao što je ranije definisano, zagrade se tumače kao značenje
sadržaja. Očigledna prednost tog
pristupa je da je sada, za dužinu reči od
N, na raspolaganju prostor od 2N. Nedostatak je što izvršenje
instrukcije zahteva dve reference memorije da bi se doneo operand: jednu da se dobije njegova adresa
i drugu da se dobije njegova vrednost.
Mada je broj reči koje mogu da se adresiraju sada jednak
2N, broj različitih efektivnih adresa koje
mogu da se referenciraju u bilo kom trenutku je ograničen na
2K, gde je K dužina polja za adrese.
Tipično, to nije toliko neugodno ograničenje kao što bi se moglo pomisliti i čak može da bude prednost.
U okruženju virtueine memorije, efektivne adrese lokacija mogu da se zatvore u stranici O svakog
procesa. Zbog toga što je polje za adresu u instrukciji malo, ono će prirodno proizvesti direktne adrese
malih brojčanih vrednosti koje će se pojaviti na stranici O. (Jedino ograničenje je to što veličina
stranice mora da bude veća ili jednaka
2K.) Kada je proces aktivan, biće višestrukih referenciranja na
stranicu O, što prouzrokuje da ona ostaje u glavnoj memoriji. Prema tome, indirektno adresiranje će
obuhvatiti, najviše, jednu grešku straničenja umesto dve.
Retko korišćena varijanta indirektnog adresiranja je adresiranje u više nivoa ili kaskadno indirektno
adresiranje:
EA=(….(A)…)
U tom slučaju, jedan od bitova adrese pune reči je indirektni marker (I). Ako je bit I jednak 0, onda
reč sadrži EA. Ako je bit I jednak 1, onda se poziva drugi nivo indirektnosti. Izgleda da nema neke
naročite prednosti tog pristupa, a njegov nedostatak je to što bi se zahtevalo tri ili više memorijskih
referenci da bi se doneo operand.
Registarsko adresiranje
Registarsko adresiranje je slično direktnom adresiranju. Jedina razlika je to što adresno polje
referencira registar, a ne adresu u glavnoj memoriji:
EA=R
Da bismo to razjasnili, ako je sadržaj registarskog adresnog polja u instrukciji 5, onda je registar
R5 nameravana adresa, a vrednost operanda se nalazi u R5. Tipično, adresno polje koje referencira
65

se adresnom polju da bi se proizvela EA. Tipično, sa adresnim poljem se za ovu operaciju postupa kao sa
brojem u komplementu dvojke. Prema tome, efektivna adresa je pomeraj relativan u odnosu na adresu
instrukcije.
Relativno adresiranje koristi koncept lokalnosti o kome se govorilo u poglavljima 4 i 8. Ako je većina
referenci memorije relativno bliska instrukciji koja se izvršava, onda upotreba relativnog adresiranja
štedi adresne bitove u instrukciji.
Adresiranje sa osnovnim registrom
Za adresiranje sa osnovnim registrom postoji slede će tumačenje:
referencirani registar sadrži adresu u glavnoj memoriji, a adresno polje sadrži pomeraj (obično u
predstavljanju neoznačenog celog broja) od te adrese. Referenca registra može biti eksplicitna ili
implicitna.
Adresiranje sa osnovnim registrom takođe koristi lokalnost memorijskih referenci. To je pogodno
sredstvo za implementiranje segmentacije, o čemu je bilo reči u poglavlju 8. U nekim implementacijama,
koristi se jedan segmentni osnovni registar da drži osnovnu adresu segmenta, a instrukcije moraju
eksplicitno da ga referenciraju. U tom poslednjem slučaju, ako je dužina adresnog polja
K, a broj
mogućih registara
N, onda jedna instrukcija može da referencira bilo koju od N oblasti od po 2K reči.
Indeksiranje
Za indeksiranje, tipično tumačenje je sledeće: adresno polje referencira adresu u glavnoj
memoriji, a referencirani registar sadrži pozitivan pomeraj od te adrese. Obratite pažnju na to da je
ta upotreba upravo suprotna od tumačenja za adresiranje sa osnovnim registrom. Naravno, to je više
nego samo stvar korisnikovog tumačenja. Zbog toga što se adresno polje smatra memorijskom adresom
u indeksiranju, ono obično sadrži više bitova od adresnog polja u uporedivoj instrukciji sa osnovnim
registrom. Takođe, videćemo da postoje neka usavršavanja indeksiranja koja ne bi bila tako korisna u
kontekstu osnovnog registra. Svejedno, metoda proračuna EA je ista i za adresiranje sa osnovnim
registrom i za indeksiranje, a u oba slučaja referenca registra je ponekad eksplicitna, a ponekad
implicitna (za različite vrste procesora).
Značajna upotreba indeksiranja je da obezbedi efikasan mehanizam za izvođenje iterativnih
operacija. Razmotrite, na primer, listu brojeva koji su uskladišteni počevši od lokacije A. Pretpostavite
da bismo želeli da dodamo 1 svakom elementu na listi. Treba da donesemo svaku vrednost, dodamo joj 1 i
opet je uskladištimo nazad. Sekvenca efektivnih adresa koje su nam potrebne je A, A + 1, A + 2, ... , sve
do poslednje lokacije na listi. Sa indeksiranjem, to se lako uradi. Vrednost A se uskladišti u adresno
polje instrukcije, a izabrani registar, koji se zove
indeksni registar, inicijalizuje se na 0. Posle svake
operacije, indeks ni registar se povećava za 1.
Zbog toga što se indeksni registar obično koristi za takve iterativne zadatke, tipično je da postoji
potreba za povećavanjem ili smanjivanjem indeksnog registra posle svake reference na njega. Imajući u
vidu da je to česta operacija, neki sistemi je rade automatski, kao deo istog instrukcijskog ciklusa. To
je poznato kao
autoindeksiranje. Ako su izvesni registri posvećeni isključivo indeksiranju, onda se
autoindeksiranje može pozvati implicitno i automatski. Ako se koriste registri opšte namene, može biti
potrebno da se operacija autoindeksiranja signalizira pomoću jednog bita u instrukciji. Autoindeksiranje
koje koristi povećavanje može da se opiše na sledeći način:
EA = A + (R)
(R)
←
(R) + I
U nekim mašinama, obezbeđeni su i indirektno adresiranje i indeksiranje, a moguće je primeniti i oba
u istoj instrukciji. Postoje dve mogućnosti: indeksiranje se izvodi pre ili posle indirekcije.
Ako se indeksiranje izvodi posle indirekcije, to se zove p
ostindeksiranje:
EA = (A) + (R)
Prvo se koristi sadržaj adresnog polja da bi se pristupilo memorijskoj lokaciji koja sadrži direktnu
67
adresu. Ta adresa se onda indeksira vrednošću registra. Ta tehnika je korisna za pristupanje jednom od
izvesnog broja blokova podataka fiksnog formata. Na primer, u poglavlju 8 opisano je da operativni
sistem treba da upotrebi blok za upravljanje procesom za svaki proces. Operacije koje se izvode su
iste, bez obzira na to kojim blokom se manipuliše. Prema tome, adrese instrukcija koje referenciraju
blok bi mogle da pokažu na lokaciju (vrednost = A) koja sadrži promenljivi pokazivač na početak bloka za
upravljanje procesom. Indeksni registar sadrži pomeraj unutar bloka.
Kod
preindeksiranja, indeksiranje se izvodi pre indirekcije:
EA = (A + (R))
Adresa se proračunava kao kod jednostavnog indeksiranja. Međutim, u ovom slučaju, izračunata adresa
ne sadrži operand, nego adresu operanda. Primer upotrebe te tehnike je kada se konstruiše tabela
grananja na više putanja. U određenoj tački u programu, može postojati grananje na jednu od nekoliko
lokacija, zavisno od uslova. Može da se uspostavi tabela koja počinje na lokaciji A. Indeksiranjem u toj
tabeli, može da se pronađe zahtevana lokacija.
Skup instrukcija tipično ne sadrži i preindeksiranje i postindeksiranje.
Adresiranje pomoću steka
Poslednji način adresiranja koji razmatramo je adresiranje pomoću steka. Kao što je definisano u
dodatku 9A, stek je linearni niz lokacija. On se ponekad zove i
lista potiska naniže, ili red poslednji
unutra - prvi napolje. Stek je rezervisan blok lokacija. Stavke se dodaju na vrh steka tako da je, u
svakom datom trenutku, blok delimično popunjen. Steku je pridružen pokazivač, čija vrednost je adresa
vrha steka. Alternativno, dva gornja elementa steka mogu da budu u registrima procesora, u kom slu-
čaju pokazivač steka referencira treći element steka (slika 10.14b). Pokazivač steka se održava u
registru. Prema tome, reference na lokacije steka u memoriji su, u stvari, registarske indirektne
adrese.
Način adresiranja pomoću steak je oblik implicitnog adresiranja. Mašinske instrukcije ne uključuju
memorijsku referencu, nego implicitno rade na vrhu steka.
FORMATI INSTRUKCIJA
Format instrukcije definiše raspored bitova jedne instrukcije, u vidu polja od kojih se sastoji. Format
instrukcije mora da uključi kod operacije i, implicitno ili eksplicitno, nula ili više operanada. Svaki
eksplicitni operand referencira se koristeći jedan od načina adresiranja opisanih u odeljku
11.1.
Format mora, implicitno ili eksplicitno, da pokaže način adresiranja za svaki operand. U većini skupova
instrukcija, koristi se više od jednog formata instrukcija.
Dužina instrukcije
Najosnovnije pitanje sa kojim se suočava projektant je dužina formata instrukcije. Ta odluka utiče, a i
na nju utiču, veličina memorije, organizacija, struktura magistrale, složenost procesora i brzina
procesora. Ta odluka određuje bogatstvo i fleksibilnost mašine kako je vidi programer u asemblerskom
jeziku.
Ovde je najočigledniji kompromis između želje za moćnim repertoarom instrukcija i potrebom da se
uštedi prostor. Programeri žele više operacionih kodova, više operanada, više načina adresiranja i veći
opseg adresa. Više operacionih kodova i operanada olakšava život programeru zato što mogu da se pišu
kraći programi da bi se izvršili postavljeni zadaci. Slično tome, više načina adresiranja pruža program
eru veću fleksibilnost u implementiranju izvesnih funkcija, kao što su rad sa tabelama i grananje po više
putanja. I,
naravno, sa povećanjem glavne memorije i sve većom upotrebom virtuelne memorije,
68

upotrebi za referenciranje operanada, manje bitova je potrebno. Veliki broj studija ukazuje da
je poželjno ukupno od 8 do 32 registra vidljivih za korisnika. Većina savremenih arhitektura ima
najmanje 32 registra.
Broj skupova registara
Većina savremenih mašina ima jedan skup registara opšte namene, sa
tipično 32 ili više registara u skupu. Ti registri mogu da se koriste za skladištenje podataka i za
adrese kod adresiranja sa pomenijem. Neke arhitekture, uključujući i onu Pentiumovu, imaju
zbirku od dva ili više specijalizovanih skupova (kao što su registri za podatke i za pomeraje).
Jedna od prednosti tog poslednjeg pristupa je što, za fiksan broj registara, funkcionalno
razdvajanje zahteva da se koristi manje bitova u instrukciji. Na primer, sa dva skupa od po osam
registara, potrebna su samo tri bita da se identifikuje registar; operacioni kOd će implicitno
odrediti koji skup registara se referencira.
Opseg adresa
Za adrese koje referenciraju memoriju, opseg adresa koje mogu da se
referenciraju povezan je sa brojem adresnih bitova. Zbog toga što to nameće ozbiljno
ograničenje, direktno adresiranje se retko koristi. Kod adresiranja sa pomerajem, opseg se
otvara do dužine adresnog registra. Čak i tada, još uvek je pogodno dozvoliti prilično velike
pomeraje od registarske adrese, što zahteva relativno veliki broj adresnih bitova u instrukciji.
Granularnost adresiranja
Za adrese koje referenciraju memoriju, a ne registre, drugi činilac je
granularnost adresiranja. U sistemu sa 16- ili 32-bitnim rečima, adresa može da referencira reč
ili bajt, po projektantovom izboru. Adresiranje bajtova je pogodno za rad sa znakovima, ali
zahteva više bitova za memoriju fiksne veličine.
Prema tome, projektant se suočava sa mnoštvom činilaca koje treba da razmatra i usklađuje. Nije
jasno koliko su razni izbori kritični. Uz dosledan skup pretpostavki nije primećena nikakva značajna
razlika u prostoru koda ili vremenu izvršenja.
Hajde da kratko razmotrimo kako su se u konstrukcijama dve istorijske mašine uravnotežavali ti
razni činioci.
Instrukcije promenljive dužine
Primeri koje smo do sada razmatrali koristili su jednu fiksnu dužinu instrukcija i mi smo implicitno
raspravljali o kompromisima u tom kontekstu. Ali projektant može umesto toga da izabere razne
formate instrukcija različitih dužina. Ta taktika olakšava da se obezbedi veliki repertoar kodova
operacija, sa različitim dužinama tih kodova. Adresiranje može da bude fleksibilni je, sa raznim
kombinacijama registarskih i memorijskih referenci i načina adresiranja. Kod instrukcija promenIjivih
dužina, te mnogobrojne varijacije mogu da se obezbede na efikasan i kompaktan način.
Najveća cena koju treba platiti za instrukcije promenljive dužine je povećanje složenosti procesora.
Stalni pad cena hardvera, upotreba mikroprogramiranja (o čemu se govori u četvrtom delu ove knjige) i
opšte povećanje razumevanja principa projektovanja procesora su doprineli da je ta cena mala.
Međutim, videćemo da RISC i superskalarne mašine mogu da iskoriste instrukcije fiksne dužine da bi
pružile poboljšanu performansu.
Upotreba instrukcija promenljive dužine ne uklanja poželjnost pravljenja svih dužina instrukcija da
budu integralno povezane sa dužinom reči. Zbog toga što procesor ne zna dužinu sledeće instrukcije
koja treba da se donese, tipična strategija je da se donese izvestan broj bajtova ili reči koji je jednak
najmanje naj dužoj mogućoj instrukciji. To znači da se ponekad donese više instrukcija odjednom.
Međutim, kao što ćemo videti u poglavlju 12, to je strategija koju je dobro primenjivati u svakom
slučaju.
70
Poglavlje 12
STRUKTURA I FUNKCIJA PROCESORA
ORGANIZACIJA PROCESOR
Da bi vam organizacija procesora bila jasnija, razmotrimo najpre zahteve koji se ovoj komponenti
ispostavljaju, odnosno zadatke koje on treba da izvrši:
Donošenje instrukcija:
procesor čita instrukcije iz memorije (registra, keša ili glavne
memorije).
Interpretiranje instrukcija:
dekodovanjem instrukcija ustanovljuje se koju je akciju
potrebno preduzeti.
Donošenje podataka:
izvršavanje instrukcije može da zahteva čitanje podataka iz memorije
ili nekog U/I
modula.
Obrada podataka:
izvršavanje instrukcije može da zahteva izvršavanje neke aritmetičke ili
logičke operacije nad podacima.
Upisivanje podataka:
rezultati izvršavanja mogu zahtevati upisivanje podataka u memoriju ili
U/I modul.
Očigledno je da procesor mora privremeno da uskladišti neke podatke kako bi mogao da izvrši
navedene zadatke. On mora da zapamti lokaciju poslednje instrukcije kako bi znao gde da potraži
narednu. Za vreme izvršavanja instrukcije procesor mora da skladišti druge instrukcije i podatke. Dakle,
procesoru je neophodna mala unutrašnja memorija.
Slika 12.1 predstavlja pojednostavljeni prikaz procesora u kome je istaknuta njegova veza sa
ostatkom sistema putem sistemske magistrale. Sličan interfejs bio bi neophodan za bilo koju od
struktura međusobnog povezivanja o kojima smo govorili u poglavlju 3. Verovatno se sećate da su
osnovne komponente procesora
aritmetička i logička jedinica (ALU) i upravljačka jedinica (CU). ALU
jedinica zadužena je za izračunavanja i obradu podataka, dok upravljačka jedinica upravlja ulaskom
podataka i instrukcija u procesor i njihovim izlaskom iz njega, kao i radom jedinice ALU. Osim toga, na
ovoj slici možete da vidite i minimalnu internu memoriju koju čini skup skladišnih lokacija po imenu
registri.
Slika 12.2 predstavlja nešto detaljniji prikaz procesora. Na ovoj slici istaknute su putanje prenosa
podataka i logičke kontrole, kojima pripada i element po imenu
interna magistrala procesora. Ovaj
element neophodan je za prenos podataka između različitih registara i jedinice ALU zato što ALU, u
stvari, operiše samo podacima koji se nalaze u internoj memoriji procesora. Osim toga, na ovoj slici
prikazani su i tipični osnovni elementi jedinice ALU. Verovatno i sami zapažate sličnost između interne
strukture računara, kao celine i interne strukture procesora. U oba slučaja postoji mali skup glavnih
elemenata (računar: procesor, U/I, memorija; procesor: upravljačka jedinica, ALU, registri) koji su
povezani putanjama podataka.
ORGANIZACIJA REGISTARA
Kao što smo već napomenuli u poglavlju 4, u računarskom sistemu postoji hijerarhija memorije. Na višim
nivoima hijerarhije memorija je brža, manja i skuplja (po bitu). U okviru procesora postoji skup
registara koji funkcionišu kao memorijski nivo koji se u hijerarhiji nalazi iznad glavne memorije i keš
memorije. Registri u procesoru izvršavaju dve uloge:
Registri vidljivi za korisnike:
omogućavaju programeru mašinskog ili asemblerskog jezika da,
optimalnim korišćenjem registara, svede na najmanju moguću meru referenciranje glavne
71

je imati između 8 i 32 registra. Manji broj registara povlači veće referenciranje memorije, dok ga
njihov veći broj ne smanjuje u nekoj značajnijoj meri. i o njemu ćemo govoriti u poglavlju 13.
Konačno, tu je i aspekt dužine registra. Jasno je da registri u kojima se nalaze adrese treba da budu
dugački najmanje da mogu da drže najveću adresu. Registri podataka treba da budu u stanju da prime
većinu tipova podataka. Na nekim računarima moguće je koristiti dva susedna registra za čuvanje
vrednosti dvostruke dužine.
Poslednja kategorija registra, koja je bar delimično vidljiva za korisnika, čuva
uslovne kodove
(pominju se i pod terminom
oznake). Uslovni kodovi predstavljaju bitove koje procesor dobija kao
rezultat operacija. Na primer, aritmetičkom operacijom mogao bi da se dobije pozitivan ili negativan
rezultat, nula ili prekoračenje. Osim samog rezultata koji se skladišti u registru ili memoriji, definiše se
i uslovni kOd. Ovaj kod naknadno može da se proveri kao deo operacije uslovnog grananja.
Bitovi uslovnog koda grupišu se u jedan ili više registara. Oni obično formiraju deo upravljačkog
registra. Uopšteno govoreći, mašinske instrukcije omogućavaju čitanje ovih bitova od strane implicitnih
referenci, s tim što programer ne može da ih menja.
Mnogi procesori, uključujući tu i one koji su bazirani na arhitekturi IA-64, kao i MIPS procesore,
uopšte ne koriste uslovne kodove. Kod njih se instrukcijama uslovnog grananja, bez skladištenja uslovnog
koda, naznačavaju poređenje koje treba da se izvrši i akcija koja je rezultat datog poređenja. U tabeli
12.1, koja je bazirana na dokumentu, navedene su prednosti i nedostaci uslovnih kodova.
U nekim računarima poziv potprograma rezultuje automatskim čuvanjem svih za korisnika vidljivih
registara koji se zatim obnavljaju prilikom povratka u pozivajući program. Procesor izvršava čuvanje i
obnavljanje kao deo izvršenja instrukcija poziva i povratka. To svakom potprogramu omogućava
nezavisno korišćenje registara koji su vidljivi za korisnika. Kod nekih drugih računara programer,
dodavanjem konkretnih instrukcija u program, mora da razmišlja o čuvanju sadržaja relevantnih
registara vidljivih za korisnika koje prethodi pozivu potprograma.
Upravljački i statusni registri
Postoji mnogo procesorskih registara koji se koriste za upravljanje radom procesora. Oni, u većini
slučajeva, nisu vidljivi za korisnika. Neki od ovih registara mogu biti vidljivi za mašinske instrukcije koje
se izvršavaju u upravljačkom režimu ili režimu operativnog sistema.
Naravno, različiti računari imaće i različite organizacije registara i drugačiju terminologiju. U
produžetku smo naveli relativno kompletnu listu tipova registara i dali kratak opis svakog od njih.
Za izvršavanje instrukcija, ključni značaj imaju četiri registra:
Programski brojač (PC):
sadrži adrese instrukcija koje treba doneti.
Instrukcijski registar (IR):
sadrži instrukciju koja je poslednja donesena.
Memorijski adresni registar (MAR):
sadrži adresu lokacije u memoriji.
Memorijski bafer registar (MBR):
sadrži reč ili podatke koji će se zapisati u memoriju ili
poslednju pročitanu reč.
Interni registri označeni kao MAR i MBR ne postoje kod svih procesora, ali je, u tom slučaju,
neophodan neki alternativni mehanizam za baferovanje koji omogućava prihvatanje bitova koji se
prenose na magistralu sistema i privremeno skladištenje bitova koji treba da se pročitaju sa magistrale
podataka.
Procesor obično ažurira programski brojač (PC) nakon svakog novog donošenja instrukcija, tako da
on uvek pokazuje na instrukciju koja treba da bude izvršena sledeća. Instrukcija za grananje ili
preskakanje takođe menja sadržaj programskog brajača. Prihvaćena instrukcija učitava se u
instrukcijski registar u kome se analiziraju operacioni kod i specifikatori operanada. Razmena podataka
73
sa memorijom odvija se putem memorijskog adresnog registra i memorijskog bafer registra. U sistemu
organizovanom oko magistrale, memorijski adresni registar direktno se povezuje sa magistralom adrese,
a memorijski bafer registar sa magistralom podataka. Registri vidljivi za korisnike razmenjuju podatke
sa memorijskim bafer registrom.
Četiri registra, koje smo upravo pomenuli, koriste se za pomeranje podataka između procesora i
memorije. Unutar procesora podaci se moraju ispostaviti aritmetičkoj i logičkoj jedinici (ALU) na
obradu. ALU jedinica može imati direktan pristup memorijskom bafer registru i registrima koje
korisnik može da vidi. Isto tako, na granici sa ALU jedinicom mogu da postoje dodatni registri za
baferovanje. Ovi registri imaju ulogu ulaznih i izlaznih registara za ALU jedinicu i razmenjuju podatke
sa registrom memorijskog bafera i registrima vidljivim za korisnike.
U dizajnu mnogih procesora, postoji registar ili skup registara po imenu
statusna reč instrukcija
(PSW) koja sadrži statusne informacije. U PSW reči obično se nalaze uslovni kod ovi, kao i neke druge
statusne informacije. U uobičajena polja ili oznake ove reči spadaju:
Znak:
sadrži bit sa znakom rezultata poslednje aritmetičke operacije.
Nula:
postavlja se kada je rezultat nula.
Prenos:
postavlja se ukoliko je rezultat operacije prenos (dodavanje) u bit višeg reda ili
pozajmljivanje (oduzimanje) iz njega. Koristi se za aritmetičke operacije od više reči.
Jednako:
postavlja se ukoliko je rezultat logičkog poređenja jednakost.
Prekoračenje:
koristi se za naznačavanje aritmetičkog prekoračenja.
Prekid omogućen/onemogućen
: koristi se za omogućavanje ili onemogućavanje prekida.
Supervizor:
naznačava da li procesor radi u režimu supervizora ili u korisničkom režimu.
Određene privilegovane instrukcije mogu da se izvršavaju samo u režimu supervizora. Isto
tako, nekim oblastima memorije moguće je pristupiti samo iz režima supervizora.
U dizajnima konkretnih procesora, moguće je pronaći mnogo različitih registara koji su povezani sa
statusom i upravljanjem. U nekim od njih postoji pokazivač koji pokazuje na blok memorije u kome se
nalaze dodatne statusne informacije (na primer, blokovi upravljanja procesom). Kod računara sa
vektorskim prekidima, nekada postoji registar vektora prekida. Ukoliko se za implementiranje
određenih funkcija (recimo, za pozive potprograma) koristi stek, neophodan je pokazivač sistemskog
steka. U sistemima sa virtueInom memorijom, primenjuje se pokazivač tabele stranica. Konačno,
registri mogu da se koriste za upravljanje U/I operacijama.
Dizajn organizacije upravljačkih i statusnih registara zavisi od mnoštva različitih faktora. Jedan od
ključnih aspekata predstavlja podrška operativnog sistema. Određeni tipovi upravljačkih informacija
imaju konkretnu upotrebljivost za operativni sistem. Ako dizajner procesora u osnovi dobro razume
ciljni operativni sistem, organizacija registara se može, u izvesnoj meri, prilagoditi potrebama
operativnog sistema.
Sledeću bitnu odluku u dizajnu procesora predstavlja raspodela upravljačkih informacija na registre
i memoriju. Uobičajeno je da se prvih (najnižih) nekoliko stotina ili hiljada reči memorije nameni
potrebama upravljanja. Dizajner mora da odluči koliko će upravljačkih informacija biti u registrirna, a
koliko u memoriji. Ovde se obično traži ravnoteža između cene i brzine.
INSTRUKCIJSKI CIKLUS
U odeljku 3.2 opisali smo instrukcijski ciklus procesora (slika 3.9). Podsećamo vas da instrukcijski ciklus
obuhvata sledeće potcikluse:
1 S obzirom na to da procesor MC68000 već koristi 32-bitne registre. kod procesora MC68020
[MACG84] koji ima punu 32-bitnu strukturu upotrebljena je identična organizacija registara.
74

programskog brojača prebacuje u memorijski bafer registar kako bi bio upisan u memoriju. Iz
upravljačke jedinice se u memorijski adresni registar učitava posebna memorijska lokacija rezervisana
upravo za ovu situaciju. To bi, primera radi, mogao da bude pokazivač steka. U programski brojač se
učitava adresa rutine prekida. Kao rezultat toga, sledeći instrukcijski ciklus počinje donošenjem
odgovarajuće instrukcije.
PROTOCNA OBRADA INSTRUKCIJA
Razvoj računarskih sistema omogućio je da se, korišćenjem pogodnosti koje pružaju poboljšanja
tehnologije kao što su, primera radi, brža elektronska kola, postignu bolje performanse. Pored toga,
poboljšanja procesora u smislu njegove organizacije takođe mogu da dovedu do boljih performansi. Do
sada smo se već upoznali sa nekim primerima ove vrste kao što je, na primer, korišćenje većeg broja
registara nasuprot jednom akumulatoru, ili korišćenje keš memorije. Sledeći, veoma uobičajen, primer
tog organizacionog pristupa predstavlja protočna obrada instrukcija.
Strategija protočne obrade
Protočna obrada instrukcija ima mnogo sličnosti sa fabričkim proizvodnim trakama. Fabričke
proizvodne trake zasnivaju se na činjenici da proizvod mora da prođe kroz nekoliko proizvodnih etapa.
Raščlanjivanje proizvodnog procesa na proizvodnu traku omogućava istovremeni rad u različitim
etapama proizvodnje. Za ovaj proces se takođe koristi i termin
protočna obrada (engl. pipelining) zato
što se, kao i u protoku cevovoda, novi ulazni elementi na jednom kraju prihvataju pre nego što se
prethodno prihvaćeni elementi pojave kao izlazi na drugom kraju.
Da bismo ovaj koncept mogli da primenimo na izvršavanje instrukcija, najpre nam mora biti jasno da
se instrukcija, zapravo, sastoji od više faza. Primera radi, na slici 12.5 instrukcijski ciklus je podeljen na
10 zadataka koji se nadovezuju jedan na drugi. Jasno je da to otvara vrata za primenu protočne obrade.
U pojednostav1jenom obliku pretpostavićemo da u procesu obrade instrukcija postoje dve etape:
donošenje instrukcija i njihovo izvršenje. Za vreme izvršenja instrukcije postoje trenuci u kojima se ne
pristupa glavnoj memoriji. Ovi trenuci su, stoga, pogodni za donošenje sledeće instrukcije koje će se
odvijati paralelno sa izvršenjem one koja je u toku. Na slici 12.9a ilustrovali smo ovaj pristup. Protočna
obrada sastoji se od dve nezavisne etape. U prvoj fazi odvija se donošenje i baferovanje instrukcije.
Čim druga etapa postane slobodna, prva joj prosleđuje baferovane instrukcije. Tokom izvršavanja
instrukcije u drugoj etapi, prva etapa koristi sve neiskorišćene memorijske cikluse za donošenje i
baferovanje sledeće instrukcije. Ovakav način rada naziva se
preddonošenje instrukcija (engl.
instruction prefttch) ili preklapanje donošenja (eng!. fetch overlap).
Već na prvi pogled jasno je da ovaj proces ubrzava izvršavanje instrukcija. Kada bi etape donošenja i
izvršavanja bile jednake po trajanju, instrukcijski ciklus trajao bi upola kraće. Međutim, ako se nešto
detaljnije pozabavimo ovom protočnom obradom (slika12.9b), videćemo da ovo udvostručavanje brzine
izvršenja nije verovatno iz dva razloga:
Izvršenje u osnovi traje duže od donošenja. Ono podrazumeva čitanje i skladištenje
operanada i oslanja se na performanse nekih operacija. To znači da će etapa donošenja možda
morati da sačeka sa pražnjenjem svog bafera.
Uslovno grananje instrukcija čini adresu sledeće instrukcije za preuzimanje nepoznatom. To
znači da etapa donošenja mora čekati na prijem adrese sledeće instrukcije od etape
izvršenja. Etapa izvršenja će, nakon toga, možda morati da čeka na donošenje sledeće
instrukcije.
Predviđanjem možemo skratiti gubitak vremena usled ovog drugog razloga. Postoji jednostavno
76
pravilo: kada se instrukcija za uslovno grananje prosleđuje iz etape donošenja u etapu izvršenja, etapa
donošenja donosi sledeću instrukciju iz memorije nakon instrukcije o grananju. U tom slučaju, ukoliko
nema grananja, nema ni gubljenja vremena. Međutim, ako postoji grananje, donesena instrukcija mora da
se odbaci, a donosi se nova.
Mada ovi faktori umanjuju potencijalnu efikasnost dvofazne protočne obrade, postoje i neke uštede
na vremenu. Dodatno ubrzanje protočne obrade postiže se povećanjem broja etapa. Razmotrimo sada
obradu instrukcija koja je razložena na sledeći način:
Donošenje instrukcija (FI): učitavanje sledeće očekivane instrukcije u bafer. Dekodiranje
instrukcija (DI): određivanje operacionog koda i specifikatora operanada.
Izračunavanje operanada (CO): izračunavanje efektivne adrese svakog izvornog
operanda.
Ova etapa može da podrazumeva pomeraj, registarsko indirektno,
indirektno ili neko drugo
izračunavanje adrese.
Donošenje operanada (FO): donošenje svakog operanda iz memorije. Operandi u registrima ne
moraju da se preuzimaju.
Izvršavanje instrukcije (El): izvršavanje naznačene operacije i skladištenje rezultata (ako
postoji) na naznačenoj lokaciji odredišnog operanda.
Zapisivanje operanda (WO): skladištenje rezultata u memoriji.
Ovako razložene, različite etape imaće približno jednako trajanje. Za potrebe ilustracije
pretpostavićemo da traju identično. Oslanjajući se na ovu pretpostavku, na slici 12.10 pokušali smo da
vam pokažemo kako šestofazna protočna obrada može da skrati trajanje izvršenja 9 instrukcija sa 54
na 14 vremenskih jedinica.
Na dijagramu se pretpostavlja da svaka instrukcija prolazi kroz svih šest etapa protočne obrade, što
u stvarnosti neće uvek biti slučaj. Primera radi, instrukciji učitavanja faza WO (zapisivanje operanada)
nije neophodna. Međutim, da bismo pojednostavili hardver protočne obrade, u trajanju se pretpostavlja
da svaka instrukcija mora da prođe kroz svih šest etapa. Isto tako, ovde je pretpostavljeno da svih šest
etapa mogu da se odvijaju simultano. Da budemo sasvim precizni, ovde je pretpostavljeno da ne postoje
nikakvi konflikti u vezi sa memorijom. Konkretno, etape PI (preuzimanje instrukcija), FO (preuzimanje
operanada) i WO (zapisivanje operanada) podrazumevaju pristup memoriji.
Iz našeg dijagrama sledi da svi ovi pristupi mogu da se odigraju istovremeno. Međutim, većina
memorijskih sistema to jednostavno ne bi dozvolila. Sa druge strane, željena vrednost se može nalaziti
u kešu, ili etape FO i WO mogu biti prazne. Prema tome, u većini slučajeva memorijski konflikti ne
usporavaju protočnu obradu.
Postoji još nekoliko faktora koji ograničavaju poboljšanje performansi. Ukoliko šest pomenutih etapa
nemaju isto trajanje, u određenim etapama protočne obrade biće čekanja, sličnog onom koje smo
pomenuli u dvofaznoj protočnoj obradi. Sledeću smetnju predstavlja instrukcija o uslovnom grananju
koja može da poništi nekoliko preuzetih instrukcija. Prekidi takođe predstavljaju na sličan način
nepredvidive događaje. Na slici 12.11, na primeru istog programa kao na slici 12.10, ilustrovane su posle-
dice uslovnog grananja. Pretpostavimo da instrukcija 3 predstavlja uslovno grananje ka instrukciji 15.
Sve dok se ova instrukcija ne izvrši, ne postoji način da se sazna koja će instrukcija biti sledeća.
Protočna obrada u ovom prim eru jednostavno učitava sledeću instrukciju iz sekvence (instrukcija 4) i
nastavlja. Na slici 12.10 nema grananja, tako da imamo maksimalno poboljšanje performansi. Međutim, na
slici 12.11 postoji grananje koje postaje očigledno tek nakon isteka vremenske jedinice 7. U ovoj fazi iz
protočne obrade moraju da se izbace sve beskorisne instrukcije. Za vreme osme vremenske jedinice, u
protočnu obradu ulazi jedinica 15. Između etapa 9 i 12 nema kompletiranja instrukcija; ovo se negativno
odražava na performanse zato što nismo mogli da predvidimo grananje. Na slici 12.12 naznačili smo
77

U osnovi, vremensko kašnjenje
d jednako je impulsnom signalu generatora takta, a Tm» d.
Pretpostavimo sada da se
n instrukcija obrađuje bez ikakvog grananja. Neka Tk,n bude ukupno vreme
koje je protočnoj obradi sa
k etapa potrebno za izvršavanje n instrukcija.
Tk,n = [k + (n -1)]7
(12.1)
Za kompletno izvršavanje prve instrukcije potrebno je ukupno
k ciklusa, dok preostalih n-I
instrukcija zahteva
n-I ciklusa2. Ovajednačina može lako da se proveri pomoću slike 12.10. Deveta
instrukcija se završava u vremenskoj fazi 14:
14=[6+(9-1)]
Razmotrimo sada procesor sa ekvivalentnim funkcijama, ali bez protočne obrade, i pretpostavimo da
je trajanje instrukcijskog ciklusa
kr. Faktor ubrzanja koje donosi protočna obrada definiše se na
sledeći način:
1;
n
nkT
S = --'-- =
k Tk,n [k + (n -1)]7
nk k+(n-l)
(12.2)
Na slici 12.14a faktor ubrzanja prikazan je kao funkcija broja instrukcija koje se izvršavaju bez
grananja. Kao što se može i očekivati, na granici
(n --> 00) imamo kstruko ubrzanje. Na slici 12.14b
faktor ubrzanja predstavlja funkciju broja etapa u protočnoj obradi instrukcija3. U ovom slučaju,
vrednost faktora ubrzanja približava se broju instrukcija koji je 11loguće ubaciti u protočnu obradu bez
grananja. Prema tome, što je veći broj etapa protočne obrade, veća je i mogućnost ubrzanja. Međutim,
u praksi potencijalne uštede koje donosi povećanje etapa protočne obrade prate i pove
2 Ovde nismo bili previše precizni. Vremenski ciklus može da se izjednači sa maksimalnom vrednošću r
samo kada se sve etape završe, Na početku, vreme ovog ciklusa može biti kraće za prvu ili nekoliko prvih
etapa,
3 Skrećemo vam pažnju na to da je osa X na slici l2J4a logaritamska, a na slici l2J4b linearna, ćanje
troškova, kašnjenja između etapa, kao i činjenica da grananje prati neophodnost izbacivanja iz protočne
obrade.
Grananje
Jedan od najvećih problema u dizajniranju protočne obrade instrukcija predstavlja obezbeđivanje
postojanog toka instrukcija u inicijalnim fazama protočne obrade. Kao što ste već videli, osnovnu
smetnju predstavlja instrukcija o uslovnom grananju. Sve dok se ona zaista i ne izvrši, nemoguće je reći
da li će biti grananja ili ne.
Izlaženju na kraj sa uslovnim grananjima može se pristupiti na više načina:
višestrukim tokovima,
preddonošenjem cilja grananja, . baferom petlje,
predviđanjem grananja,
odložen im grananjem.
Višestruki tokovi
Jednostavna protočna obrada plaća danak grananju instrukcija u tom smislu što ovde moraju da se
preuzmu jedna ili dve naredne instrukcije, a ovaj izbor može biti pogrešan. Nimalo sofisticirano rešenje
ove situacije predstavlja kopiranje inicijalnih delova protočne obrade što joj, kroz korišćenje dva toka,
omogućava da preuzme obe instrukcije. U ovakvom pristupu javljaju se dva problema:
Kod višestrukih protočnih obrada javlja se dodatno kašnjenje sadržaja vezano
za pristup
79
registrima i memoriji.
Instrukcije o dodatnom grananju mogu da uđu u protočnu obradu (svejedno u koji njen niz) pre
razrešenja prvobitnog grananja. U tom slučaju svakoj instrukciji potreban je dodatni tok.
Uprkos pomenutim nedostacima, ova strategija može da popravi performanse. U primere procesora sa
dva ili više tokova protočne obrade spadaju IBM 370/168 i IBM 3033.
Preddonošenje cilja grananja
Kod ovog pristupa, čim se ustanovi uslovno grananje, osim instrukcije
koja sledi grananje, unapred se donosi i cilj grananja. Ovaj cilj se skladišti i zatim čeka na izvršenje
instrukcije o grananju. Ukoliko se krene u grananje, njegov cilj je već unapred preuzet. Kod procesora
IBM 360/91, upotrebljen je upravo ovaj pristup.
Bafer petlje
Bafer petlje predstavlja malu i veoma brzu memoriju koju održava faza donošenja
instrukcija protočne obrade, a koja sadrži
n najskorije preuzetih instrukcija po redu. Ukoliko dođe do
grananja, hardver naj pre proverava da li je njegov cilj već u baferu. Ako jeste, to znači da se sledeća
instrukcija preuzima iz bafera. Bafer petlje donosi tri pogodnosti:
Kod preddonošenja u baferu petlje, nalaziće se neke instrukcije koje se u redosledu nalaze ispred
adrese preuzimanja aktuelne instrukcije. To znači da će instrukcije preuzete u sekvenci biti
dostupne bez uobičajenog vremena potrebnog za pristup memoriji.
Ukoliko se ispostavi da je cilj grananja samo nekoliko lokacija ispred adrese instrukcije o
grananju, on će se već nalaziti u baferu. Ova činjenica je veoma korisna za veoma uobičajenu
sekvencu IF-TREN i IF-THEN-ELSE.
Ova strategija je naročito pogodna za petlje ili ponavljanja; otuda i ime
bajer petlje. Ako je
bafer petlje dovoljno veliki za skladištenje svih instrukcija petlje, to znači da će ove instrukcije
morati da se preuzmu iz memorije samo jednom - za prvo ponavljanje. Za sva naknadna
ponavljanja, sve neophodne instrukcije su već u baferu.
Po svojim karakteristikama, bafer petlje veoma podseća na keš memoriju koja je dodeljena
instrukcijama. Osnovne razlike su te da bafer zadržava samo instrukcije u sekvenci i da je mnogo manji
po veličini, pa stoga i jeftiniji.
Na slici 12.15 dali smo primer bafera petlje. Ukoliko bafer sadrži 256 bajtova, a koristi se bajtno
adresiranje, onda se 8 najmanje značajnih bitova koriste za indeksiranje bafera. Proveravanjem
preostalih značajnijih bitova, ustanovljuje se da li se cilj grananja nalazi unutar okruženja koje je
obuhvatio bafer.
Među računarima koji koriste bafer petlje nalaze se neki CDC računari (Star-lOO, 6600, 7600) i
CRAY-l. Kod procesora Motorola 68010, postoji posebna forma bafera petlje u kojoj se izvršava petlja
sa tri instrukcije koja obuhvata DBcc (smanjenje i grananje pod uslovom) instrukcije (pročitajte
problem 12.14). Sve dok se uslov petlje ne zadovolji, ova petlja od tri reči se održava, a procesor iznova
izvršava njene instrukcije.
nanje pod uslovom) instrukcije (pročitajte problem 12.14). Sve dok se uslov petlje ne zadovolji, ova
petlja od tri reči se održava, a procesor iznova izvršava njene instrukcije.
Predviđanje grananja
Postoje različite tehnike za predviđanje grananja, a najčešće se koriste:
predviđanje da se nikada neće dogoditi;
predviđanje da će se uvek dogoditi;
predviđanje od strane operacionog koda;
prekidač postoji/ne postoji;
tabela istorije grananja.
Prva tri pristupa su statička. Na njih istorija izvršenja do trenutka kada se pojavi prva instrukcija o
grananju ne utiče ni na koji način. Poslednja dva pristupa su dinamička, što znači da se oslanjaju na
80

12.17). Ova vrsta predstavljanja veoma je uobičajena u literaturi.
Korišćenje bitova za evidentiranje istorije koje smo upravo opisali ima i jedan nedostatak. Ukoliko se
donese odluka o grananju, ciljna instrukcija ne može da se preuzme sve dok se ciljna adresa, koja
predstavlja operand u okviru instrukcije o uslovnom grananju, ne dekodira. Bilo bi efikasnije kada bi se
preuzimanje instrukcije iniciralo onog trenutka kada se donese odluka o grananju. Međutim, za to je
potrebno više uskladištenih informacija koje se čuvaju u nečemu što se naziva bafer cilja grananja ili
tabela istorije grananja.
Tabela istorije grananja jeste mala keš memorija koja je povezana sa fazom donošenja instrukcija
protočne obrade. Svaki unos ove tabele sastoji se od tri elementa: adrese instrukcije o grananju, nekog
broja bltova za evidentiranje istorije kojima se beleži status korišćenja date instrukcije i informacije o
cilj noj instrukciji. U većini predloga i implementacija, u ovom trećem polju nalazi se adresa ciljne
instrukcije.
Drugo rešenje je da se u ovom trećem polju nalazi sama ciljna instrukcija. Dilema je u ovom slučaju
sasvim jasna: skladištenje ciljne adrese povlači manju tabelu, ali i duže trajanje preuzimanja od
skladištenja ciljne instrukcije [RECH98].
Na slici 12.18 možete da vidite kako izgleda šema suprotne strategije - predviđanja da grananja
nikada neće biti. U prethodno opisanom pristupu, faza preuzimanja instrukcija uvek preuzima adresu
koja je sledeća na redu. Ukoliko dođe do grananja, neka logika u procesoru to ustanovljuje i naređuje da
se sledeća instrukcija donese sa cilj ne adrese (pored oslobađanja protočne obrade).
Tabela istorije grananja tretira se kao keš. Svako preddonošenje inicira pretragu tabele istorije
grananja. Ukoliko se ne pronađe poklapanje, za donošenje se koristi sledeća adresa po redu. U slučaju
pronalaženja preklapanja, predviđanje će se bazirati na statusu instrukcije: logika izbora rukovodi se ili
sledećom adresom po redu ili adresom cilja grananja.
Nakon izvršenja instrukcije o grananju, faza izvršenja javlja rezultat logici tabele sa istorijom gra-!
1anja. Status instrukcije se ažurira u skladu sa tačnim ili netačnim predviđanjem. Ukoliko predviđanje
nije tačno, logika izbora se preusmerava ka pravoj adresi sledećeg preuzimanja. Prilikom suočavanja sa
instrukcijom o uslovnom grananju koja ne postoji u tabeli, nova instrukcija se upisuje u tabelu, a jedan
od postojećih upisa odbacuje korišćenjem nekog od algoritama za zamenu keša o kojima smo govorili u
poglavlju 4.
Jedan od primera implementacije tabele istorije grananja predstavlja procesor Advanced Micro
Device AMD29000.
Odloženo grananje Performanse protočne obrade mogu se poboljšati i automatskim preraspoređivanjem
instrukcija u okviru programa tako da se instrukcije o grananju pojave kasnije nego što ih zaista želimo.
O ovom interesantnom pristupu govorićemo u poglavlju 13.
Postojanje dve faze dekodiranja omogućava protočnoj obradi da podrži opterećenje od skoro jedne
instrukcije po ciklusu generatora takta. Složene instrukcije i uslovno grananje mogu da usp ore ovu
brzinu.
Na slici 12.19 možete da vidite primere načina rada protočne obrade. U delu (a) vidi se da
neophodnost pristupa memoriji ne dovodi do kašnjenja u protočnoj obradi. Međutim, kao što možete da
vidite u delu (b), kašnjenja su moguća za vrednosti koje se koriste za izračunavanje adresa u memoriji.
Odnosno, ukoliko se vrednost učitava iz memorije u registar, i taj registar se zatim koristi kao bazni
registar za narednu instrukciju, procesor će stati jedan ciklus. U ovom primeru, procesor pristupa kešu
u EX fazi prve instrukcije i skladišti dobijenu vrednost u registru tokom faze WB. Međutim, sledećoj
instrukciji je ovaj registar neophodan u njegovoj fazi D2. Odnosno, ukoliko se vrednost učitava iz
memorije u registar, i taj registar se zatim koristi kao bazni registar za narednu instrukciju, procesor
82
će stati jedan ciklus. U ovom primeru, procesor pristupa kešu u EX fazi prve instrukcije i skladišti
dobijenu vrednost u registru tokom faze WB. Međutim, sledećoj instrukciji je ovaj registar neophodan
u njegovoj fazi D2. I
Na slici 12.19c ilustrovan je vremenski raspored instrukcije o grananju, pod pretpostavkom da je
došlo do grananja. Poređenjem instrukcija ažurira ju se uslovni kodovi faze WB, a putanje preskakanja
ih istovremeno čine dostupnim za fazu EX instrukcije o skoku. Procesor tokom EX faze instrukcije o
skoku paralelno vodi spekulativni ciklus preuzimanja sa cilja datog skoka. Ukoliko ustanovi pogrešan uslov
grananja, procesor odbacuje ovo preddonošenje i nastavlja sa izvršenjem sledeće instrukcije po redu
(već donesene I dekodirane).
Poglavlje 13
KLJUČNE TEZE
Proučavanja ponašanja izvršenja programa napisanih u jezicima visokog niovoa, obezbedila su
smernice za dizajniranje novog tipa arhitekture procesora: računara sa smanjenim skupom
instrukcija
(Reduced lnstruction Set Computer, RISC). Ovde dominiraju iskazi dodeljivanja, iz
čega se može zaključiti da jednostavno premeštanje podataka treba još optimizirati. Osim toga,
postojanje velikog broja IF i LOOP instrukcija govori da i kontrolni mehanizam sekvence, koji se
nalazi u osnovi, takođe treba optimizirati kako bi se dobila efikasna protočna obrada. Na osnovu
proučavanja šablona referenciranja operanada, može se zaključiti da je poboljšanje performansi
uz očuvanje umerenog broja operanada u registrima sasvim izvodljivo.
Iz pomenutih proučavanja proistekle su ključne karakteristike RISC mašina: (1) ograničen skup
instrukcija fiksiranog formata, (2) veliki broj registara ili korišćenje kompajlera koji optirnizira
njihovo korišćenje i (3) naglasak na optimiziranju protočne obrade instrukcija.
Jednostavan skup instrukcija RISC procesora omogućava efikasnu protočnu obradu budući da se
za svaku instrukciju izvršava manji broj operacija koje su predvidljive. Arhitektura RISC skupa
instrukcija isto tako omogućava primenu tehnike odloženog grananja u kojoj se instrukcije o
grananju preureduju zajedno sa ostalim instrukcijama radi poboljšanja efikasnosti protočne
obrade.
Od razvoja računara sa internim programima iz 1950-ih, bilo je zapravo samo nekoliko istinskih
inovacija u oblastima organizacije i arhitekture računara. Evo nekih od najznačajnijih inovacija koje su
se dogodile nakon pojave računara:
Koncept porodice: ovaj koncept je uveo IBM svojim računarom System/360 iz 1964. godine,
nakon koga su se pojavili DEC i PDP-8. Koncept porodice odvaja mašinu od njene implementacije.
Korisnicima se nudi nekoliko računara različite cene i karakteristika koji prema korisnicima
pokazuju istu arhitekturu. Razlike u ceni i karakteristikama potiču od različitih implementacija
iste arhitekture.
Mikroprogramirana upravljačka jedinica: ovu inovaciju predložio je Vilks 1954. godine, a
realizovao 1964. godine IBM svojom linijom S/360. Mikroprogramiranje olakšava posao
dizajniranja i implementiranja upravljačke jedinice i istovremeno obezbeđuje podršku za koncept
porodice.
Keš memorija: keš memorija se 1968. godine prvi put komercijalno pojavila na račun aru IBM
S/360 Model 85. Dodavanjem ovog elementa u hijerarhiju memorije, performanse su drastično
poboljšane.
83

inspirisali su neke istraživače da potraže drugačiji pristup da arhitekturu koja podržava
HLL
pokušaju
da učine što je moguće jednostavnijom.
Da biste u potpunosti razumeli argumente zagovornika RiSC računara, naj prećemo vam ukratko
prikazati karakteristike izvršenja instrukcija. Ovde su posebno zanimljivi sledeći računski aspekti:
Izvršene operacije:
ove operacije određuju funkcije koje će procesor izvršiti,
kao
i
njegovu interakciju sa memorijom.
Upotrebljeni operandi:
od tipova operanada, kao i učestalosti njihovog korišće
nja, zavisi
način organizacije memorije prilikom njihovog skladištenja, kao i
načini
adresiranja
prilikom njihovog preuzimanja.
Redosled izvršenja:
ovaj aspekt određuje organizaciju upravljanja i protočne obrade.
U nastavku ovog odeljka rezimiraćemo rezultate brojnih istraživanja
HLL
programa. Svi ovi rezultati
zasnivaju se na dinamičkim merenjima. To znači da su merenja prikupljena kroz izvršenje programa
registrovanjem broja pojavljivanja određene funkcije, ili istinitosti nekog svojstva. Nasuprot tome,
statička merenja odnose se samo na izvorni tekst programa. Ona nam ne mogu pružiti upotrebljive
podatke o performansama zato što se kod njih ne registruje broj izvršenja svakog iskaza.
Operacije
Postoji mnogo studija u kojima je analizirano ponašanje
HLL
programa. U tabeli 4.8, koju smo razmatrali
u poglavlju
4,
navedeni su ključni rezultati iz nekoliko različitih studija. U pogledu dobijenih rezultata,
iz mnoštva različitih jezika i aplikacija postoji sasvim solidan konsenzus. Iz dominacije iskaza
dodeljivanja može se zaključiti da je prosto premeštanje podataka veoma značajno. Isto tako mnogo
ima i uslovnih iskaza (IF, LOOP). Ovi iskazi implementirani su u mašinski jezik nekim vidom poređenja i
instrukcijom o grananju. Iz toga se može zaključiti da je mehanizam za upravljanje redosledom skupa
instrukcija takođe veoma bitan.
Dobijeni rezultati predstavljaju smernice za dizajnere skupova mašinskih instrukcija, u tom smislu
da one tipove iskaza koji se najčešće pojavljuju treba podržati na «optimalan» način. Međutim, iz ovih
rezultata ne može se zaključiti na koje iskaze odlazi najviše vremena prilikom izvršavanja tipičnih
programa. Odnosno, u domenu kompajliranih programa u mašinskom jeziku - koje instrukcije izvornog
jezika prouzrokuju izvršenje najvećeg broja instrukcija mašinskog jezika?
Da bi se razjasnio ovaj fenomen, programi Patterson [PATT82aJ, opisani u dodatku 4A, kompajlirani
su na procesorima VAX,
PDP-ll
i Motorola 68000, kako bi se odredio prosečan broj mašinskih
instrukcija i referenciranja memorije po tipovima iskaza. U drugoj i trećoj koloni tabele 13.2 navedena
je relativna učestalost pojavljivanja raznih
HLL
instrukcija u najrazličitijim programima; podaci su
dobijeni posmatranjem pojavljivanja u aktivnim programima, a ne evidentiranjem njihovog pojavljivanja u
izvornom kodu. Prema tome, u pitanju su dinamički pokazatelji učestalosti pojavljivanja.
Da bi se dobili podaci za četvrtu i petu kolonu (udeo mašinskih instrukcija), svaka vrednost iz druge i
treće kolone morala je da se pomnoži brojem mašinskih instrukcija koje je proizveo kompajler. Ovi
rezultati su zatim normalizovani, tako da kolone četiri i pet pokazuju relativnu učestalost pojavljivanja
merenu brojem mašinskih instrukcija
po HLL
iskazu. Slično tome, vrednosti šeste i sedme kolone
dobijene su množenjem učestalosti pojavljivanja svakog tipa iskaza relativnim brojem referenciranja
memorije prouzrokovanog svakim iskazom. Podaci u kolonama od četiri do sedam predstavljaju
alternativne mere stvarnog vremena provedenog u izvršenju raznih tipova iskaza. Dobijeni rezultati
govore da poziv/povratak procedure u tipičnim
HLL
predstavlja operaciju sa najvećim utroškom
vremena.
Ovde želimo da vam skrenemo pažnju na značaj tabele 13.2. Ova tabela pokazuje relativni značaj
raznih tipova iskaza u
HLL
jeziku kada je dati
HLL
jezik kompajliran za savremenu arhitekturu sa
85
tipičnim skupom instrukcija. Na nekim drugim arhitekturama dobili bismo i drugačije rezultate.
Međutim, ovim proučavanjem dobijeni su rezultati koji su reprezentativni za savremene arhitekture
računara sa složenim skupom instrukcija (CISC). Stoga ovi rezultati mogu da obezbede smernice onima
koji traže efikasnije načine podrške
HLL
jezika.
Operandi
Uprkos njihovoj važnosti, pojavljivanju pojedinih tipova operanada posvećena je mnogo manja pažnja.
Ovde postoji nekoliko značajnih aspekata.
U istraživanju na koje smo se već pozivali [PATT82a], Paterson se bavio i dinamičkom učestalošću
pojavljivanja klasa promenljivih (tabela 13.3). Rezultati, koji su bili dosledni za Pascal i C programe,
pokazali su da većina referenci vodi ka jednostavnim skalarnim promenljivim.
Ustanovljeno je i to da su u više od 80% slučajeva skalarne promenljive bile lokalne (za proceduru).
Osim toga, reference ka nizovima i strukturama zahtevaju prethodno referenciranje njihovog indeksa
ili pokazivača, koji je obično opet lokalna skalarna promenljiva. Prema tome, uočava se dominantno
referenciranje skalarnih promenIjivih koje su u visokom procentu lokalizovane.
U svom proučavanju Paterson je ispitao dinamičko ponašanje HLL programa, nezavisno od
arhitekture na kojoj se oni zasnivaju. Međutim, kao što smo već napomenuli, detaljnija proučavanja
programa podrazumevaju i ispitivanje same arhitekture. U jednoj studiji [LUND77] dinamički su
ispitane DEC-1O instrukcije i ustanovljeno je da svaka instrukcija u proseku referencira 0,5 operanada
u memoriji i 1,4 registara. Slični rezultati dobijeni su i u studiji [HUCK83] za C, Pascal i FORTRAN
programe na računarima Sj370, POP-lI i VAX. Naravno, ovi rezultati u velikoj meri zavise i od
arhitekture i od kompajlera, ali se može reći da ilustruju učestalost pristupa operandima.
Iz ove poslednje dve studije može se zaključiti da je arhitektura veoma značajna za brz pristup
operandima, posebno ako se ima u vidu učestalost ove operacije. Na osnovu rezultata Patersonovog
proučavanja, mogli bismo zaključiti da najpre treba optimizirati mehanizam za skladištenje i pristup
lokalnim skalarnim promenljivama.
Pozivi procedure
Videli smo da pozivi i ishodi procedure predstavljaju važan aspekt HLL programa. Činjenice (tabela 13.2)
pokazuju da je reč o operacijama na koje se u HLL programima utroši najviše vremena. Zbog toga je
veoma značajno razmotriti načine njihove što je moguće efikasnije implementacije. U tom smislu dva
aspekta su posebno značajna: broj parametara i promenljivih sa kojima procedura treba da se nosi i
dubina ugnežđivanja.
U svom proučavanju Tanebaum [TANE78] je ustanovio da 98% dinamički pozvanih procedura dobije
manje od šest argumenata, a da je 92% njih koristilo manje od šest lokalnih skalarnih promenljivih.
Slične rezultate dobio je i RISC tim Univerziteta Berkli [KATE83], što možete da vidite u tabeli 13.4.
Ovi rezultati pokazuju da broj reči koji je neophodan za aktiviranje procedure nije veliki. U rezultatima
istraživanja, koja smo već pominjali, videli smo da se visok procenat referenciranja operanada vezuje za
lokalne skalarne promenljive. Ova istraživanja pokazuju nam i to da su ove reference u stvari svedene na
relativno mali broj promenijivih.
Pomenuta grupa sa Berklija bavila se i šablonima poziva i ishoda procedure u okviru HLL programa.
Ustanovili su da se veoma retko događa da nakon dugog i neprekidnog niza poziva procedura sledi i
odgovarajući niz ishoda, a program ostaje ograničen na prilično uske okvire dubine poziva procedura.
Ovo je ilustrovano i na slici 4.16 koju smo razmatrali u poglavlju 4. Ovi rezultati samo potvrđuju
zaključak da su reference operanada visoko lokalizovane.
Implikacije
Razni istraživački timovi došli su do sličnih rezultata, tako da je opšti zaključak da pokušaj pravljenja
86

roditeljskog programa moraju da se obnove (učitaju nazad u registre) i rezultati se moraju proslediti
natrag do roditeljskog programa.
Rešenje ovog problema bazira se na dva zaključka koji su izvedeni iz istraživanja pominjanih u
odeljku 13.1. Najpre, tipičan poziv procedure primenjuje samo nekoliko predatih parametara i lokalnih
promenijivih (tabela 13.4). Zatim, dubina aktiviranja procedure koleba se u relativno uskim okvirima
(slika 4.16). Radi iskorišćavanja ovih karakteristika, koristi se više malih skupova registara od kojih je
svaki dodeljen različitoj proceduri. Poziv procedure, umesto skladištenja registara u memoriji,
automatski prebacuje procesor na korišćenje različitog prozora registara fiksirane veličine. Prozori
susednih procedura se poklapaju, što omogućava predavanje parametara.
Ovaj koncept ilustrovali smo na slici 13.1. U bilo kom trenutku vidljiv je samo jedan prozor sa
registrirna; jedino njega je moguće adresirati zato što izgleda kao da je to jedini skup sa registrima (na
primer, adrese od O do
N - 1). Prozor je podeljen na tri oblasti fiksirane veličine. Registri parametara
čuvaju parametre koje je predala naniže procedura koja je pozvala aktuelnu proceduru, kao i vrednosti
koje će biti predate naviše. Lokalni registri koriste se za lokalne promenljive, onako kako ih dodeljuje
kompajler. Privremeni registri koriste se za razmenu parametara i rezultata sa sledećim nižim nivo om
(procedurom koju je pozvala aktuelna procedura).
Privremeni registri jednog nivoa su fizički isti kao registri parametara sledećeg nižeg nivoa. Ovo
preklapanje omogućava predavanje parametara bez stvarnog premeštanja podataka.
Da bi se moglo rukovati svim mogućim kombinacijama poziva i povrataka, broj prozora sa registrima
trebalo bi da bude neograničen. Međutim, prozori registara mogu da se koriste za čuvanje nekoliko
najskorije aktiviranih procedura. Starija aktiviranja moraju se sačuvati u memoriji odakle se obnavljaju
kada se dubina ugnežđivanja smanji. Stoga stvarna organizacija datoteke registra podseća na kružni
bafer od preklapajućih prozora. Dva očigledna primera ovog pristupa su arhitektura SPARC kompanije
Sun koju smo opisali u odeljku 13.7 i arhitektura IA-64 Intelovog procesora Itanium koji je opisan u
poglavlju 15.
Na slici 13.2 prikazana je kružna organizacija sa baferom od šest prozora. Bafer se popunjava do
dubine 4 (A poziva B; B poziva C; C poziva D) i proceduraD je aktivna. Pokazivač aktuelnog prozora
(current-window pointer, CWP) pokazuje na prozor trenutno aktivne procedure. Ovaj pokazivač pomera
referenciranja registra od strane mašinskih instrukcija kako bi se odredio stvarni fizički registar.
Pokazivač sačuvanog prozora identifikuje prozor koji je poslednji sačuvan u memoriji. Ukoliko
procedura D sada pozove proceduru E, argumenti za E se smeštaju u privremene registre procedure D
(preklapanje između w3 i w4), a CWP prelazi jedan prozor unapred.
Ukoliko procedura E zatim pozive proceduru F, ovaj poziv neće biti moguć sa trenutnim stanjem
bafera. To je zato što se prozor procedure F preklapa sa prozorom procedure A. Ako procedura F,
pripremajući se za poziv, počne da učitava svoje privremene registre, ona će ih zapisati preko registara
parametara procedure A (A.in). Prema tome, kada se vrednost pokazivača CWP poveća (modulo 6) i
izjednači sa pokazivačem SWP, događa se prekid i prozor procedure A se snima. Potrebno je snimiti
samo prva dva dela (A.in i A.loc) ovog prozora. Zatim se vrednost pokazivača SWP povećava, a poziv
procedure F nastavlja. Sličan prekid može da se dogodi i kod povratka. Na primer, nakon aktiviranja
procedure F, kada se procedura B vrati do A, vrednost pokazivača CWP se smanjuje i izjednačava sa
vrednošću pokazivača SWP. Ovo takođe dovodi do prekida i obnavljanja prozora procedure A.
Iz svega prethodno rečenog možete videti da datoteka registara sa
N prozora može da čuva samo
N-I aktivacija procedura. Vrednost
N ne mora da bude velika. Kao što je rečeno u dodatku 4A, u jednom
istraživanju [TAMI83] ustanovljeno je daje, uz 8 prozora, snimanje ili obnavljanje neophodno u samo 1
% poziva ili povrataka. Berkli RISC računari koriste 8 prozora sa po 16 registara, a računari Pyramid 16
88
prozora sa po 32 registra.
Globalne promenljive
Šema prozora koju smo upravo opisali predstavlja efikasnu organizaciju za skladištenje lokalnih
skalarnih promenIjivih u registrirna. Ipak, ova šema ne rešava problem skladištenja globalnih
promenIjivih kojima pristupa veći broj procedura. Dve opcije nameću se same od sebe. Najpre,
promenIjivama koje su u HLL jeziku deklarisane kao globalne, kompajler može da dodeli memorijske
lokacije, a sve mašinske instrukcije koje referenciraju ove promenljive koristiće operande za
referenciranje memorije. Ovaj pristup je jednostavan i iz perspektive hardvera i iz perspektive
softvera (kompajlera). Međutim, za globalne promenljive kojima se često pristupa, ova šema nije
efikasna.
Alternativno rešenje bilo bi inkorporisanje skupa globalnih registara u procesor. Broj ovih registara
bio bi fiksiran i oni bi bili dostupni za sve procedure. Objedinjenom šemom numerisanja, format
instrukcija može da se pojednostavi. Na primer, reference ka registrima od O do 7 mogu da se odnose
na jedinstvene globalne registre, dok se reference ka registrima od 8 do 31 mogu pomeriti kako bi se
odnosili na fizičke registre u aktuelnom prozoru. Ova podela u adresiranju registara stavlja veće
zahteve pred hardver. Osim toga, kompajler mora da odluči koje globalne promenljive treba do de liti
registrirna.
Velika registarska datoteka ili keš
Registarska datoteka organizovana u prozore ponaša se kao mali i brz bafer za čuvanje podskupa
promenIjivih za koje se pretpostavlja da će najviše biti korišćene. Iz ove perspektive registarska
datoteka ponaša se veoma slično keš memoriji, od koje je ipak mnogo brža. Ovde se postavlja pitanje da
li bi bilo jednostavnije i bolje koristiti keš i malu tradicionalnu registarsku datoteku.
U tabeli 13.5 uporedili smo karakteristike ova dva pristupa. Registarska datoteka bazirana na
prozorima čuva sve lokalne skalarne promenljive (osim u retkom slučaju prekoračenja prozora)
najskorijih N-I aktivacija procedure. U kešu se nalazi izbor nedavno korišćenih skalarnih promenIjivih.
Registarska datoteka bi trebalo da donese uštedu vremena budući da se sve lokalne skalarne
promenljive zadržavaju. Sa druge strane, keš bi, zahvaljujući svom dinamičkom načinu reagovanja na
novonastale situacije, mogao da doprinese efikasnijem korišćenju prostora.
Osim toga, keš praktično sva referenciranja memorije, uključujući tu instrukcije i ostale tipove
podataka, tretira na isti način. To znači da uštede u ovim ostalim oblastima donosi keš, a ne registarska
datoteka.
Može se dogoditi da registarska datoteka ne koristi prostor na ekonomičan način zato što mnogim
procedurama neće biti potreban celokupan dodeljeni prostor prozora. Nasuprot tome, keš pogađa drugi
oblik neefikasnosti: u njega se podaci keš učitavaju u blokovima. Dok registarska datoteka sadrži samo
one promenljive koje se koriste, keš prima blokove podataka od kojih dobar deo uopšte neće biti
upotrebljen.
Keš može da rukuje i globalnim i lokalnim promenljivim. Obično postoji mnogo različitih globalnih
skalara, ali se samo nekoliko njih koristi u većoj meri [KATE83]. Keš dinamički otkriva ove promenljive i
zadržava ih. Ukoliko su u registarsku datoteku koja je bazirana na prozorima dodati i globalni registri,
ona takođe može da čuva i neke globalne skalarne promenljive. Međutim, izdvajanje globalnih
promenljivih koje će se koristiti u većoj meri predstavlja prilično težak posao za kompajler.
Kod registarske datoteke, pomeranje podataka od registra do memorije određuje se dubinom
ugnežđivanja procedure. S obzirom na to da izmene ove dubine obično nisu velike, memorija se retko
koristi. Keš memorije su, u većini slučajeva, asocijativne sa malom veličinom skupa. Zbog toga postoji
opasnost da se ostali podaci ili instrukcije upišu preko često korišćenih promenljivih.
89

Uopšteno govoreći, uvek treba stremiti ravnoteži između velikog skupa registara i optimiziranja
baziranog na kompajleru. Na primer, u radu [BRAD9la] analizirano je istraživanje koje je u RISe
arhitekturu uvelo funkcije slične onim koje imaju procesori Motorola 88000 i MIPS R2000. Istraživači
su, menjajući broj registara (od 12 do 128), razmatrali i korišćenje samo registara opšte namene i
njihovu podelu na deo za cele brojeve i deo namenjen pokretnom zarezu. Njihovo proučavanje pokazalo
je da, čak i uz jednostavnu optimizaciju, više od 64 registra ne donosi nikakvu korist. Primena relativno
sofisticiranih tehnika optimizacije registara donosi minimalno poboljšanje performansi ukoliko je broj
registara veći od 32. Konačno, ovi istraživači ustanovili su i to da je, ukoliko je broj registara mali
(recimo, 16), izvršenje brže na računarima sa organizacijom zajedničkih registara, nego kod onih kod
kojih su registri podeljeni.
Slični zaključci mogu se izvesti i iz rada [HUGU91] u kome je prikazano istraživanje čiji su se autori
više bavili optimiziranjem korišćenja malog broja registara nego dovođenjem u vezu velikih skupova i
nastojanja da se oni optimiziraju.
13.4 ARHITEKTURA SMANJENOG SKUPA INSTRUKCIJA
U ovom odeljku bavićemo se nekim opštim karakteristikama arhitekture sa smanjenim skupom
instrukcija, kao i razlozima njene primene. U nastavku ovog poglavlja videćete i neke konkretne primere
ove arhitekture. Ali, pre svega toga, razmotrimo najpre kojim se karakteristikama odlikuju savremene
arhitekture sa složenim skupovima instrukcija.
Zašto CISC?
Već smo vam ukazali na trend sve obimnijih skupova instrukcija u koje se ubacuje veliki broj sve
složenijih instrukcija. Ovaj trend motivisala su dva osnovna razloga: želja da se kompajleri pojednostave
i stremljenje boljim performansama. U pozadini ovih razloga nalazio se prelaz programera na HLL
jezike; dizajneri su jednostavno pokušali da naprave sisteme koji bolje podržavaju HLL jezike.
U ovom poglavlju nam nije bila nam era da kritikujemo smer kojim su krenuli CISC dizajneri.
Naprotiv. Imajući u vidu neprekidan razvoj tehnologije i postojanje čitavog spektra različitih
arhitektura (a ne samo dve jasno suprotstavljene), za isključivost jednostavno nema mesta.
Komentarima koji slede želeli smo da istaknemo neke od mogućih nedostataka u ClSC pristupu, kao i da
vam približimo pozicije pristalica RISC arhitekture.
Prvi od dva navedena razloga - pojednostavljenje kompajlera - nameće se sam po sebi. Zadatak pisca
kompajlera jeste generisanje sleda mašinskih instrukcija za svaki HLL iskaz. Ukoliko postoje mašinske
instrukcije koje su bliske HLL iskazima, ovaj posao biće jednostavniji. Međutim, zagovornici i istraživači
RISe arhitekture suprotstavili su se ovoj koncepciji ([HENN82], [RADI83], [PATI82b]). Oni su
ustanovili da je složene mašinske instrukcije često teško iskoristiti zato što kompajler mora da pronađe
one slučajeve koji se uklapaju u konstrukciju. Posao optimiziranja generisanog koda u smislu minimizova-
nja njegove veličine, smanjenja broja izvršenja instrukcija i poboljšanja protočne obrade, mnogo je teži
u složenom skupu instrukcija. Kao dokaz ove tvrdnje u istraživanjima na koja smo se pozivali na početku
ovog poglavlja, naznačeno je da većinu instrukcija u kompajliranom programu čine one koje su relativno
jednostavne.
Drugi bitan razlog koji smo naveli odnosio se na očekivanje da će Cl SC arhitektura dovesti do
manjih i bržih programa. Ispitajmo sada oba aspekta ove tvrdnje - da će programi biti manji i da će se
brže izvršavati.
Manji programi imaju dve prednosti. Najpre, oni zauzimaju manje memorije, tako da donose uštedu
ovog resursa. Međutim, današnje veoma niske cene memorije učinile su ovu potencijalnu prednost
praktično nebitnom. Mnogo je značajnije to da mali programi donose poboljšanje performansi, i to na
dva načina. Najpre, manji broj instrukcija znači i preuzimanje manjeg broja bajtova. Zatim, u okruženju
91
sa straničenjem manji programi zauzimaju manji broj stranica, što povlači i manju verovatnoću grešaka
u straničenju.
Ovoj koncepciji moglo bi da se zameri samo to što CISC program uopšte ne mora biti manji od
odgovarajućeg RISe programa. U velikom broju slučajeva CISC program, izražen simboličkim mašinskim
jezikom, može biti
kraći (imaće manji broj instrukcija), ali to ne mora značiti da je i broj zauzetih
bitova memorije mnogo
manji. U tabeli 13.6 prikazani su rezultati tri istraživanja u kojima je poređena
veličina kompajliranih C programa na nekoliko različitih računara, uključujući tu i RISC I koji ima
arhitekturu sa smanjenim skupom instrukcija. Skrećem o vam pažnju na to da Cl SC ne donosi praktično
nikakvu uštedu u odnosu na RISe. Veoma je zanimljivo i to da računar VAX donosi veoma malu uštedu u
odnosu na PDP-l1 od koga se razlikuje mnogo složenijim skupom instrukcija. Ove rezultate potvrdili su i
istraživači IBM-a [RADI83] koji su ustanovili da računar IBM 801 (RISC računar) generiše kod koji ima
0.9 veličine koda računara IBM S/370. U ovom istraživanju korišćenje skup PL/I programa. arhitekturu
sa smanjenim skupom instrukcija. Skrećemo vam pažnju na to da Cl SC ne donosi praktično nikakvu
uštedu u odnosu na RISe. Veoma je zanimljivo i to da računar VAX donosi veoma malu uštedu u odnosu
na PDP-l1 od koga se razlikuje mnogo složenijim skupom instrukcija. Ove rezultate potvrdili su i
istraživači IBM-a [RADI83] koji su ustanovili da računar IBM 801 (RISC računar) generiše kod koji ima
0.9 veličine koda računara IBM S/370. U ovom istraživanju korišćenje skup PL/I programa.
Postoji nekoliko razloga za ove prilično iznenađujuće rezultate. Već smo napomenuli da kompajleri na
CISC računarima teže favorizovanju jednostavnijih instrukcija tako da konciznost složenih instrukcija
retko dolazi do izražaja. Isto tako, zbog većeg broja instrukcija, Cl SC računari zahtevaju duže
operacione kodove koji daju i duže instrukcije. Konačno, kod RISC računara referenciranje registara je
češće nego referenciranje memorije, za šta je neophodno manje bitova. Uskoro ćemo vam ponuditi i
primer koji ilustruje ovu poslednju konstataciju.
Dakle, očekivanje da će Cl SC računari generisati manje programe i doneti prednost u smislu
servisiranja, ne mora uvek da se ostvari. Drugi razlog zbog koga su napravljeni veoma složeni skupovi
instrukcija bilo je očekivanje da će se instrukcije brže izvršavati. Na prvi pogled je sasvim logično
očekivati da će se složena
HLL
operacija izvršavati brže kao jedna složena mašinska instrukcija nego
kao serija mnogo jednostavnijih instrukcija. Međutim, pomenuta sklonost jednostavnijim instrukcijama
dovodi ovu koncepciju u pitanje. Obimniji skup instrukcija zahteva da ce1a upravljačka jedinica bude
složenija i/ili upravljačka memorija mikroprograma veća.
U stvari, neki istraživači su ustanovili da je ubrzanje koje donose složene instrukcije pre povezano
sa njihovim stalnim prisustvom u upravljačkom skladištu velike brzine, nego što je to posledica njihovog
kvaliteta [RADI83]. Zbog toga se upravljačko skladište ponaša kao keš za instrukcije. Prema tome,
posao dizajnera hardvera je da pokuša da definiše potprograme ili funkcije koje će se najčešće koristiti
i da ih, implementiranjem u mikrok6d, dodeli upravljačkom skladištu. Međutim, dobijeni rezultati bili su
više nego skromni. Na sistemima Sj390 instrukcije kao što su Translate i Extended-Precision-Floating-
Point-Divide rezidentne su u skladištu velike brzine, dok se sekvenca koja u'čestvuje u pripremi poziva
procedure ili iniciranju opsluživanja prekida nalazi u sporijoj glavnoj memoriji.
Zbog svega ovoga ne bi se moglo reći da je trend ka sve složenijim skupovima instrukcija sasvim
opravdan. Upravo zato, veliki broj istraživača krenuo je sasvim suprotnim putem.
Karakteristike arhitekture sa smanjenim skupom instrukcija
lako postoji mnogo različitih pristupa u dobijanju arhitekture sa smanjenim skupom instrukcija, za sve
njih zajedničke su sledeće karakteristike:
jedna instrukcija po ciklusu;
direktne operacije između registara;
92

kompajlere. Kod jednostavnijih instrukcija postoje mogućnosti za vađenje funkcija iz petlji,
reorganizovanje koda u cilju povećanja njegove efikasnosti, maksimizovanje korišćenja registara itd.
Čak je moguće izračunavati delove složenih instrukcija u vremenu kompajliranja. Primera radi,
instrukcija Move Characters (MVC) računara Sj390 premešta niz znakova sa jedne lokacije na drugu.
Prilikom svakog njenog izvršenja, premeštanje će zavisiti od dužine niza, toga da li se lokacije preklapaju
i u kom pravcu i toga kakvo je poravnanje ovih znakova. U većini slučajeva, sve ovo biće poznato u
vremenu kompajliranja. Prema tome, kompajler može da generiše optimiziran sled jednostavnih
instrukcija za ovu funkciju.
Drugi aspekt o kome smo već govorili jeste to da su instrukcije koje generiše kompajler u velikoj
većini ionako relativno jednostavne. Zvuči sasvim realno da upravljačka jedinica koja je napravljena baš
za ove instrukcije i koja koristi jako malo mikrokoda može da ih izvršava brže od odgovarajućeg CISC
sistema.
Treći aspekt povezan je sa korišćenjem protočne obrade instrukcija. Istraživači RISC sistema misle
da tehnika protočne obrade instrukcija može da se primeni mnogo efIkasnije kada imamo smanjeni skup
instrukcija. Uskoro ćemo veoma detaljno ispitati i ovaj koncept.
Poslednji aspekt za koji se može reći da je nešto manje značajan jeste to da RISC procesori brže
reaguju na prekide zato što se ti prekidi proveravaju između veoma jednostavnih operacija. Arhitekture
sa složenim instrukcijama ili ograničavaju prekide na granice instrukcija ili se u njima moraju definisati
konkretne tačke prekida i implementirati mehanizmi za ponovno pokretanje instrukcija.
Argumenti koji govore o poboljšanju performansi i idu u prilog arhitekturi sa smanjenim skupom
instrukcija prilično su ubedljivi, ali ipak ne bi trebalo da budemo nepravedni prema ClSC sistemima.
Tačno je da o rezultatima govore mnogobrojna istraživanja, ali ona nisu izvedena na računarima sa
uporedivom tehnologijom i snagom. Osim toga, u većini ovih istraživanja nije bilo pokušaja da se efekti
smanjenog skupa instrukcija odvoje od efekata velike registarske datoteke. «Posredni dokazni
materijal» ipak zvuči veoma ubedljivo.
Poređenje Karakteristika CISC i RISC sistema
Nakon početnog entuzijazma koji je pratio RISC računare, sve je prisutnije uverenje da (1) RISC
sistemi mogu imati koristi od uvođenja nekih Cl SC funkcija i da (2) CISC sistemi mogu imati koristi od
uvođenja nekih RISC karakteristika. Zahvaljujući tome, za neke savremenije RISC računare kao što je,
na primer, PowerPC ne može se reći da su «čisti» RISC dizajn. Isto tako, CISC sistemi kao što su
Pentium II i aktuelniji Pentium modeli imaju neke karakteristike RISC sistema.
Jedno veoma interesantno poređenje [MASH95] pomoći će nam u rasvetljavanju ove teme. U tabeli
13.7 navedeno je nekoliko procesora i upoređene neke njihove karakteristike. Evo šta se, za potrebe
poređenja, smatra tipičnim RISC sistem om:
1. Jedna veličina instrukcija.
2. Veličina instrukcija obično je 4 bajta.
3. Mali broj načina za adresiranje podataka - obično manje od pet. U ovom zahtevu, međutim, nije
lako istrajati. U tabeli registri i literalni načini se ne računaju, dok se različiti formati sa
različitim veličinama pomeraja računaju posebno.
4. Nema indirektnog adresiranja koje podrazumeva da se adresa drugog operanda u memoriji
pribavlja pristupom memoriji.
5. Nema operacija koje kombinuju operacije učitavanja/skladištenja sa aritmetičkim operacijama
(na primer, saberi iz memorije ili saberi u memoriju).
6. Nema više od jednog memorijski adresiranog operanda po instrukciji.
7. Ne podržavaju proizvoljno poravnanje podataka za operacije učitavanja/skladištenja.
94
8. Maksimalan broj korišćenja jedinice za upravljanje memorijom (MMU) za adresu podataka u
instrukciji.
9. Broj bitova specifikatora celobrojnog registra ima vrednost pet ili više. To znači da u istom
trenutku može eksplicitno da se referencira najmanje 32 celobrojna registra.
10. Broj bitova specifikatora registra u pokretnom zarezu ima vrednost četiri ili više. To znači da
u istom trenutku može eksplicitno da se referencira najmanje 16 registara u pokretnom zarezu.
Stavke od 1 do 3 predstavljaju pokazatelj složenosti dekodiranja instrukcija. Stavke od 4 do 8
govore o lakoj ili teškoj protočnoj obradi, naročito u prisustvu zahteva virtueine memorije. Stavke 9 i
10 povezane su sa mogućnošću iskorišćavanja kompajlera.
Prvih osam procesora u tabeli očigledno imaju R1SC arhitekturu, sledećih pet su Cl SC procesori, dok
se na poslednja dva gleda kao na R1SC procesore, ali oni zapravo imaju mnogo osobina CISC sistema.
Protočna obrada sa regularnirn instrukcijama
Kao što smo rekli u odeljku 12.4, poboljšanje performansi često se postiže primenom protočne obrade
instrukcija. Sada ćemo se na ovu temu vratiti, ali u kontekstu RISe arhitekture. Većinu instrukcija čine
instrukcije tipa registar ka registru, a instrukcijski ciklus ima sledeće dve etape:
I: donošenje instrukcije.
E: izvršavanje - izvođenje svih ALU operacija sa ulazom i izlazom registra.
Kod operacija učitavanja i skladištenja neophodne su tri etape:
I: donošenje instrukcija.
E: izvršenje - izračunavanje memorijske adrese.
D: memorija - operacije tipa registar ka registru ili memorija ka registru.
Na slici l3.6a možete da vidite vremenski raspored sleda instrukcija bez protočne obrade.
Očigledno je da ovde nije postignuto optimalno korišćenje resursa. Čak i sasvim jednostavna protočna
obrada može značajno da poboljša performanse. Na slici l3.6b prikazana je šema dvofazne protočne
obrade u kojoj se faze I i E dve različite instrukcije izvršavaju istovremeno. Primenom ove šeme može
se dobiti i do dva puta brže izvršenje od serijske šeme. Međutim, postizanje maksimalne brzine
sprečavaju dva problema. Najpre, pretpostavili smo da je korišćena memorija sa jednim portom i da je u
jednoj etapi moguć samo jedan pristup memoriji. Zbog toga se u neke instrukcije mora ubaciti stanje
čekanja.
Zatim, instrukcija o grananju prekida redni tok izvršenja. Ubacivanjem NOOP instrukcije u niz
instrukcija od strane kompajlera ili asemblera postiže se prilagođavanje ovoj karakteristici uz minimum
elektronskih kola.
Efikasnost protočne obrade može se poboljšati i dozvoljavanjem dva pristupa memoriji u jednoj
etapi. Ovim se dobija s1ed koji je prikazan na slici 13.6c. Sada je moguće preklapanje tri instrukcije, a
obrada je i do tri puta brža. Međutim, i u ovom slučaju instrukcije o grananju sprečavaju maksimalno
moguće ubrzanje. Skrećemo vam pažnju na to da i međuzavisnosti podataka ovde takođe imaju bitnu
ulogu. Ukoliko je instrukciji potreban operand koga je izmenila prethodna operacija, zadržavanje je
neizbežno. Ovo se takođe može postići instrukcijom NOOP.
Onako kako smo o njoj do sada pričati, protočna obrada najbolje funkcioniše ako njene tri etape
imaju približno jednako trajanje. S obzirom na to da obično podrazumeva i ALU operaciju, faza E može
biti i duža. U ovom slučaju ovu fazu možemo podeliti na dve potfaze:
E1: čitanje registarske datoteke i
E2: ALU operacija i zapisivanje registra.
I zahvaljujući jednostavnosti i regularnosti RISe skupa instrukcija, podela na tri ili četiri etape
obično se lako postiže. Na slici 13.6d možete da vidite kako izgleda četvorofazna protočna obrada.
95

registara.
KONTRAVERZA – RISC ILI CISC
Godinama unazad, opšti trend u organizaciji i arhitekturi računara bilo je povećanje složenosti
procesora - više instrukcija, više režima adresiranja, više specijalizovanih registara itd. Pojavljivanje
RISC arhitekture predstavlja fundamentalan raskid sa filozofijom koja je motivisala ovaj trend.
Naravno, pojava RISC sistema i objavljivanje radova u kojima su zagovornici ove arhitekture veličali
njene prednosti, isprovocirali su reakciju stručnjaka koji su stajali iza CISC arhitekture.
Nastojanja da se procene vrednosti RISC arhitekture mogu da se grupišu u dve kategorije:
Kvantitativni:
reč je o pokušajima poređenja veličine programa i brzine izvrše
nja RISC i
CISC računara koji koriste sličnu tehnologiju.
Kvalitativni:
u pitanju su ispitivanja aspekata kao što su podrška jezika visokog
nivoa ili
optimalno korišćenje raspoloživog prostora na VLSI čipu.
Najveći doprinos kvantitativnoj proceni RISC sistema dali su stručnjaci koji su radili na njima
[PATI82, HEAT84, PATT84] i njihovi rezultati su u velikoj meri naginjali RISC filozofiji. Međutim,
postoje i radovi čiji su autori praktično bili neodlučni [COLW85a, FLYN87, DAVI87]. U pokušajima da
se naprave paralele između ova dva sistema, javljale su se sledeće teškoće [SERL86]:
Ne postoji par RISC i CISC sistema koji bi mogli da se porede prema ceni životnog veka, nivou
tehnologije, složenosti logičkih kola, sofisticiranosti kompajlera, nivou podrške operativnog
sistema itd.
Ne postoji definitivan probni skup programa. Performanse se menjaju od programa do programa.
Teško je izolovati uticaj hardvera na performanse od uticaja koji se vezuju za
umešnost
pisaca kompajlera.
Najveći deo komparativnih analiza RISC sistema izvršen je na računarima «igračkama», a ne na
komercijalnim proizvodima. Osim toga, većina za javnost dostupnih računara, koji se reklamiraju
kao RISC sistemi, u stvari predstavlja mešavinu RISC i ClSC karakteristika. Stoga je veoma
teško izvesti njihovo valjano poređenje sa komercijalnim "čistim" CISC računarima (recimo, VAX
ili Pentium).
Kvalitativne procene su, praktično prema svojoj definiciji, subjektivne. Više istraživača bavilo se
ovom vrstom procena [COLW85a, WALL85], ali su njihovi rezultati, u najboljem slučaju, nedorečeni.
Ovi rezultati izazvali su brojne reakcije protivnika [PATT85b], a zatim i pravu polemiku [COLW85b].
U novije vreme ova suprotstavljenost RISC i ClSC sistema u najvećoj meri je zamrla, pre svega zbog
postupnog približavanja ovih tehnologija. Kako su se gustina čipova i sirova snaga hardvera povećavali,
RISC sistemi su postajali sve složeniji. Istovremeno, u nastojanjima da se iz CISC sistema izvuku
maksimalne performanse, njihovi dizajneri su se usredsredili na aspekte koji su tradicionalno dovođeni u
vezu sa RISC sistemima. U pitanju su aspekti kao što je, na primer, povećanje broja registara opšte
namene ili posvećivanje veće pažnje dizajnu protočne obrade instrukcija.
Poglavlje 14
PARALELIZAM NA NIVOU
INSTRUKCUA I SUPERSKALARNI PROCESORI
SuperskaIarni procesor
je onaj kod koga se koristi više nezavisnih protočnih obrada instrukcija. Sve
protočne obrade imaju više etapa, što znači da svaka od njih može u istom trenutkuda se bavi većim
brojem instrukcija. Višestrukim protočnim obradamadobijen je novi nivo paralelizma koji omogućava
istovremenu obradu većeg broja nizova instrukcija. Na superskalarnim procesorima primenjuje se
pa
ralelizam nivoa instrukcija,
pod kojim se podrazumeva stepen u kome instrukcije nekog programa
mogu da se izvršavaju paralelno.
97
….
Nasuprot tome, na većini superskalarnih procesora do poboljšanja efikasnosti protočne obrade stiže se
korišćenjem tradicionalnih metoda predviđanja grananja.
Superskalarna implementracija arhitekture procesora jeste ona u kojoj česte instrukcije -
aritmetika celih brojeva i brojeva u pokretnom zarezu, operacije učitavanja, skladištenja ili uslovnog
grananja - mogu da se iniciraju istovremeno i izvršavaju nezavisno. Najsloženiji aspekti dizajna ovakvih
implementacija povezani su sa protočnom obradom instrukcija.
Superskalarni dizajn pojavio se odmah nakon RISC arhitekture. Iako pojednostavljeni skup
instrukcija RISC računara predstavlja pogodnu osnovu za primenu superskalarnih tehnika, ovaj pristup
može da se koristi i na CISC arhitekturama.
Od početka istraživanja RISC arhitekture i računara IBM 801 i Berkeley RISC I, pa do pojave prvih
komercijalnih RISC računara, prošlo je između sedam i osam godina. Nasuprot tome, prvi komercijalni
superskalrani računari pojavili su se samo godinu ili dve nakon što je prvi put upotrebljen termin
superskalarni. Danas superskalarni pristup predstavlja standardnu metodu za implementiranje
mikroprocesora visokih performansi.
Ovo poglavlje započećemo prikazom superskalarnog pristupa i njegovim poređenjem sa
superprotočnošću. Nakon toga, pozabavićemo se nekim ključnim aspektima dizajna koji su
karakteristični za superskalarne implementacije. Osim toga, prikazaćemo vam i neke prim ere
superskalarne arhitekture.
14.1 PREGLED
Termin
superskalarni koji je prvi put upotrebljen 1987. [AGER87] odnosi se na procesor koji je
dizajniran tako da poboljša izvršenje skalarnih instrukcija. U većini aplikacija najveći broj operacija
izvodi se na skalarnim kvantitetima. Iz toga proističe da superskalarni pristup predstavlja sledeći korak
u evoluciji opštenamenskih procesora visokih performansi.
Suštinu superskalarnog pristupa predstavlja mogućnost nezavisnog i istovremenog izvršavanja
instrukcija u različitim protočnim obradama. Ovaj koncept može jošbolje da se iskoristi ukoliko se
omogući promena redosleda (u odnosu na originalni program) kojim se instrukcije izvršavaju. Slika 14.1
predstavlja uopštenu ilustraciju ovog pristupa. Višestruke funkcionalne jedinice, od kojih je svaka
implementirana kao protočna obrada, podržavaju paralelno izvršenje više instrukcija. U našem primeru
istovremeno mogu da se izvršavaju dve operacije sa celim brojevima, dve u pokretnom zarezu ijedna
memorijska operacija (učitavanje ili skladištenje).
Iz mnogobrojnih istraživanja procesora koji imaju superskalarne karakteristike možemo da
zaključimo da oni donose poboljšanje performansi. U tabeli 14.1 navedena su dokumentovana poboljšanja
performansi. Razlike u rezultatima povezane su sa razlikama u hardveru i softveru računara na kojima
su provere izvršene.
Poređenje superskalarnih i superprotočnih procesora
Drugi način za poboljšanje performansi procesora jeste superprotočnost - termin koji je prvi put
upotrebljen 1988. godine [JOUP88]. Superprotočnost se zasniva na činjenici da mnoge etape protočne
obrade izvršavaju zadatke za koje je potrebno manje od pola ciklusa generatora takta. Prema tome,
udvostručena interna brzina generatora takta omogućava izvršavanje dva zadatka u jednom eksternom
ciklusu generatora takta. Kao primer ovakvog pristupa naveli smo računar MIPS R4000.
Na slici 14.2 uporedili smo ova dva pristupa. U gornjem delu dijagrama ilustrovana je obična protočna
obrada koja je upotrebljena kao osnov za poređenje.
98

Tipičnom RISC procesoru su, zbog kašnjenja prilikom pristupa memoriji koja nije na čipu ili usled
pristupa kešu, za izvršavanje učitavanja iz memorije potrebna dva (ili više) ciklusa. Ovo kašnjenje može
da se kompenzuje time što će kompajler da preuredi instrukcije i u protočnu obradu ubaci jednu ili više
naknadnih instrukcija koje nisu uslovljene učitavanjem iz memorije. Ovakva šema je manje efikasna u
slučaju superskalarne protočne obrade: nezavisne instrukcije koje se izvršavaju tokom učitavanja
najverovatnije će se izvršiti u prvom ciklusu učitavanja, što znači da procesor neće imati posla sve do
završetka učitavanja.
Proceduralne zavisnosti Kao što smo rekli u poglavlju 12, postojanje grananja u nizu instrukcija u velikoj
meri komplikuje protočnu obradu. Instrukcije koje slede nakon grananja (svejedno da li se ono dogodi ili
ne) proceduralno zavise od njega i mogu da se izvrše tek nakon što se grananje izvrši. Na slici 14.3
ilustrovali smo efekat grananja na superskalarnu protočnu obradu drugog stepena.
Kao što ste videli, ovaj tip proceduralne zavisnosti pogađa i skalarnu protočnu obradu. Pri tom,
posledice su kod superskalarne protočne obrade teže zato što se sva. kim kašnjenjem mnogo više gubi.
Prilikom korišćenja instrukcija promenljive dužine, pojavljuje se novi oblik proceduralne zavisnosti. S
obzirom na to da dužina bilo koje od ovakvih instrukcija nije poznata, one se, bar delimično, moraju
dekodirati kako bi mogla da se preuzme sle. deća instrukcija. Ovim se sprečava istovremeno donošenje
koje je u superskalarnoj protočnoj obradi neophodno. Upravo zato su superskalarne tehnike podesnije
za RISe i slične arhitekture u kojima je dužina instrukcija fiksirana.
Konflikt resursa Konflikt resursa jeste situacija u kojoj se dve ili više instrukcija istovremeno nadrneću
za isti resurs. Pod resursima se podrazumevaju memorije, keš, magistrale, portovi registarske datoteke
i funkcionalne jedinice (na primer, ALU sabirač).
U kontekstu protočne obrade, konflikt resursa ispoljava se slično kao i zavisnost podataka (slika
14.3). Naravno, između njih postoje i određene razlike. Najpre, konflikti resursa mogu da se prevaziđu
dupliranjem resursa, dok prava zavisnost podataka nikako ne može da se izbegne. Isto tako, kod
operacija koje dugo traju, konflikti resursa mogu da se minimizuju protočnom obradom odgovarajuće
funkcionalne jedinice.
14.2 ASPEKTI DIZAJNA
Paralelizam nivoa instrukcija i maši nsk i paralelizam
U [JOUP89a] je napravljena razlika između dva povezana koncepta - paralelizrna nivoa instrukcija
imašinskog paralelizrna. Paralelizam nivoa instrukcija postoji kada su instrukcije nekog niza nezavisne
tako da se preklapanjem mogu izvršavati paralelno.
Kao primer koncepta paralelizrna nivoa instrukcija, razmotrimo sada sledeća dva fragmenta koda
[JOUP89b]:
Laad R1 +- R2
Add R3 +- R3, "1" Add R4 +- R4, R2
Add R3 +- R3, "1" Add R4 +- R3, R2 Stare [R4] +- RO
Tri instrukcije sa leve strane su nezavisne i sve tri bi mogle da se izvršavaju paralelno. Nasuprot tome,
tri instrukcije sa desne strane ne mogu da se izvršavaju paralelno zato što druga instrukcija koristi
rezultat prve, a treća rezultat druge.
Stepen paralelizrna nivoa instrukcija određen je učestalošću istinskih zavisnosti podataka i
proceduralnih zavisnosti u kodu. Ovi faktori, dalje, zavise od arhitekture skupa instrukcija i od
aplikacije. Na paralelizam nivoa instrukcija značajno utiče parametar koji je [JOUP89b] nazvao vreme
kašnjenja operacije. U pitanju je dužina čekanja da rezultat jedne instrukcije postane dostupan za
operande sledeće instrukcije. Od ovog vremena kašnjenja zavisi koliko će ukupno kašnjenje
100
prouzrokovati zavisnost podataka ili proceduralna zavisnost.
Mašinski paralelizam
predstavlja merilo sposobnosti procesora da iskoristi paralelizam nivoa
instrukcija. Mašinski paralelizam zavisi od broja instrukcija koje se mogu preuzeti i izvršiti istovremeno
(broj paralelnih protočnih obrada), kao i od brzine i savršenosti mehanizama pomoću kojih procesor
pronalazi nezavisne instrukcije.
Oba pomenuta paralelizrna imaju veoma važnu ulogu u poboljšanju performansi. Događa se da u
programu nema dovoljno paralelizrna nivoa instrukcija, tako da ne može optimalno da iskoristi mašinski
paralelizam. Korišćenje arhitekture sa skupom instrukcija fiksirane dužine (recimo, RISe arhitektura),
pozitivno se odražava na paralelizam nivoa instrukcija. Sa druge strane, mali mašinski paralelizam
ograničava performanse bez obzira na prirodu programa.
Politika izdavanja instrukcija
Kao što smo već rekli, mašinski paralelizam ne može da se svede samo na pitanje postojanja višestrukih
primeraka svake etape protočne obrade. Procesor takođe mora biti u stanju da identifikuje paralelizam
nivoa instrukcija i koordinira paralelnim donošenjem, dekodiranjem i izvršenjem instrukcija. Termin
izdavanje instrukcija
odnosi se na iniciranje izvršenja instrukcija u procesorovim funckionalnim
jedinicama, atermin
politika izdavanja instrukcija
na protokol koji se koristi prilikom izdavanja ovih
instrukcija [JOHN91]. Uopšteno govoreći, izdavanje instrukcija događa se kada se instrukcija premešta
iz etape za dekodiranje u prvu etapu za izvršenje protočne obrade.
U osnovi, procesor pokušava da "gleda" ispred aktuelne tačke izvršenja kako bi locirao instrukcije
koje mogu da se dovedu u protočnu obradu i izvrše. U ovom kontekstu bitne su tri vrste redosleda:
redosled donošenja instrukcija;
redosled izvršenja instrukcija i
redosled kojim instrukcije ažuriraju sadržaj registara i memorijskih lokacija.
Što je procesor savršeniji, manje će ga ograničavati striktni odnosi između ovih redosleda. Da bi
optimizirao iskorišćavanje različitih elemenata protočne obrade, procesor mora da izmeni jedan ili više
ovih redosleda u odnosu na redosled koji postoji u striktnom rednom izvršenju. Jedini zahtev koji se
pred njega stavlja je da krajnji rezultat bude tačan. Prema tome, procesor mora da uvaži različite
zavisnosti i konflikte o kojima smo već govorili.
Uopšteno govoreći, politike izdavanja instrukcija superskalarnih procesora mogu da se grupišu u
sledeće tri kategorije:
izdavanje u redosledu sa završavanjem uredosledu;
izdavanje u redosledu sa završavanjem van redosleda;
izdavanje van redosleda sa završavanjem van redosleda.
Izdavanje u redosledu sa završenjem uredosledu Najjednostavnija politika izdavanja instrukcija jeste
ona u kojoj se instrukcije izdaju onim redom kojim bi se to događalo u rednom izvršenju (izdavanje u
redosledu). Rezultati se takođe zapisuju istim redom (završavanje u redosledu). Čak ni u skalarnim
protočnim obradama ne primenjuje se ovako jednostavan pristup. Ipak, korisno je obratiti pažnju i na
ovu politiku zato što će nam ona biti osnova sa kojom ćemo porediti savršenije pristupe.
Slika 14.4 predstavlja primer ove politike. Zamislićemo superskalarnu protočnu obradu koja u istom
trenutku može da donosi i dekodira dve instrukcije, a ima tri posebne funkcionalne jedinice (na primer,
dve za aritmetičke operacije u pokretnom zarezu i jednu za aritmetičke operacije sa celim brojevima) i
dva primerka etape za upisivanje rezultata. U prim eru su pretpostavljena sledeća ograničenja
fragmenta koda sa šest instrukcija:
za izvršenje Il potrebna su dva ciklusa;
101

postane dostupna u etapi izvršenja, instrukcija se iz instrukcijskog okvira može izdati etapi izvršenja.
Na ovaj način može da se izda svaka instrukcija pod uslovom (I) da joj je potrebna neka funkcija koja je
raspoloživa i (2) da je ne blokiraju nikakvi konflikti ili zavisnosti.
Ovakva organizacija pruža procesoru mogućnost gledanja unapred i identifikovanja nezavisnih
instrukcija koje se mogu ubaciti u etapu izvršenja. Instrukcije se izdaju iz instrukcijskog prozora bez
mnogo poštovanja njihovog prvobitnog redosleda u programu. Kao i ranije, jedini zahtev je da se
program ponaša korektno.
Na slici 14.4c ilustrovali smo ovu politiku. Tokom svakog od prva tri ciklusa, po dve instrukcije se
donose u etapi za dekodiranje. U svakom ciklusu, a u skladu sa veličinom bafera, dve instrukcije se iz
etape za dekodiranje premeštaju u instrukcijski okvir. U ovom primeru moguće je izdati instrukciju 16
pre instrukcije 15 (podsećamo vas da 15 zavisi od 14, ali 16 ne zavisi). To znači da se u etapama
izvršenja i upisivanja štedi po jedan ciklus. U odnosu na sliku 14.4b, krajnja ušteda je jedan ciklus.
Na slici 14.4c nacrtali smo i instrukcijski okvir kako bismo vam ilustrovali njegovu ulogu. Ovaj prozor,
međutim, ne predstavlja novu etapu protočne obrade. Kada kažemo da se instrukcija nalazi u okviru, to
u stvari znači da procesor ima dovoljno informacija o njoj kako bi mogao da odluči kada da je izda.
Na politiku izdavanja i završetka van redosleda utiču ograničenja koja smo već pomenuli. Instrukcija
ne može da se izda ukoliko krši zavisnost ili dovodi do konflikta. Razlika je u tome što u ovoj politici
imamo veći broj raspoloživih instrukcija za izdavanje, čime se smanjuje verovatnoća da se protočna
obrada zaustavi. Međutim, ovde se pojavljuje i nova vrsta zavisnosti koju smo već nazvali antizavisnost
(ili zavisnost čitanja-upisivanja). KOd kojim smo se već bavili ilustrovaće nam ovu novu zavisnost:
11: R3 +- R3 op RS 12: R4 +- R3 + 1 13: R3 +- RS + 1 14: R7 +- R3 op R4
Izvršenje instrukcije 13 ne može da se završi pre nego što instrukcija 12 počne sa izvršenjem i
preuzme svoje operande. To je zato što instrukcija I3 ažurira registar R3 koji predstavlja izvorni
operand instrukcije 12. Termin
antizavisnost koristi se zato što ovo ograničenje podseća na istinsku
zavisnost podataka, ali je obrnuto: umesto da prva instrukcija generiše vrednost koju druga instrukcija
treba da koristi, ovde druga instrukcija uništava vrednost koju prva instrukcija koristi.
Preimenovanje registara
Kada su izdavanje instrukcija preko reda i njihovo završavanje preko reda dozvoljeni, povećava se
verovatnoća javljanja izlaznih zavisnosti i antizavisnosti. Ove zavisnosti se razlikuju od istinskih
zavisnosti podataka i konflikata oko resursa koji odražavaju tok podataka kroz program i sekvencu
izvršenja. Sa druge strane, izlazne zavisnosti i antizavisnosti javljaju se zato što registri više nisu u
skladu sa sledom vrednosti koji diktira tok programa.
Kada se instrukcije izdaju i kompletiraju u redosledu, sadržaj svakog registra može da se precizira
u svakoj tački izvršenja. Kod tehnika van redosleda, vrednosti registara ne mogu biti sasvim poznate u
svakoj vremenskoj tački samo na osnovu razmatranja sleda instrukcija koje diktira program. Zbog toga,
vrednosti dolaze u konflikt oko korišćenja registara, a procesor, da bi rešio ove konflikte, povremeno
mora da zaustavi protočnu obradu.
Antizavisnosti i izlazne zavisnosti predstavljaju primere konflikata oko skladištenja. Više instrukcija
konkuriše za korišćenje istih registarskih lokacija, što dovodi do ograničenja protočne obrade koja se
negativno odražavaju na performanse. Ovaj problem još više dolazi do izražaja prilikom korišćenja
tehnika za optimiziranje registara (poglavlje 13) zato što ove tehnike pokušavaju da maksimalno
poboljšaju korišćenje registara i samim tim povećavaju i broj konflikata oko skladištenja.
Jedna od metoda za prevazi1aženje ovih konflikata oko skladištenja bazira se na tradicionalnom
rešenju za konflikte oko resursa - njihovom dupliranju. U ovom kontekstu, ova tehnika naziva se
103
preimenovanje registara.
U osnovi, hardver procesora dinamički raspodeljuje registre i oni se
povezuju sa vrednostima koje su instrukcijama neophodne u različitim vremenskim tačkama. Kada se
generiše nova registarska vrednost (odnosno, kada se izvrši instrukcija koja ima registar kao odredišni
operand), njoj se dodeljuje novi registar. Sve naknadne instrukcije koje pristupaju toj vrednosti u vidu
odredišnog operanda, u datom registru moraju da prođu kroz postupak preimenovanja: reference
registra u ovim instrukcijama moraju se izmeniti kako bi se odnosile na registar koji sadrži potrebnu
vrednost. To znači da se ista originalna referenca registra u više različitih instrukcija može odnositi na
različite stvarne registre ukoliko je namera bila dobijanje različitih vrednosti.
Pogledajmo sada kako se preimenovanje registara može primeniti u našem probnom fragmentu koda: .
I1: R3b E- R3a op R5a
I2: R4b E- R3b + 1
I3: R3c E- R5a + 1
I4: R7b E- R3c op R4b
Referenca registra bez indeksa odnosi se na logičku referencu registra koja se nalazi u instrukciji,
dok se referenca sa indeks om odnosi na dodeljeni hardverski registar u kome se čuva nova vrednost.
Kada se za određeni logički registar izvrši novo dodeljivanje, to povlači menjanje referenci instrukcija
kojima se u tom registru nalazi odredišni operand i njihovo upućivanje na nedavno dodeljeni hardverski
registar (nedavno u smislu sleda instrukcija datog programa).
U ovom prim eru, pravljenjem registra R3c u instrukciji 13, izbegava se antizavisnost kod druge
instrukcije i izlazna zavisnost kod prve. Sa druge strane, instrukcija 14 i dalje može da pristupi tačnoj
vrednosti. Zahvaljujući tome, instrukcija 13 može da se izda odmah; bez preimenovanja instrukcija 13
mogla bi da se izda tek nakon završetka prve i izdavanja druge instrukcije.
U prethodnim odeljcima videli ste da se za poboljšanje performansi superskalarnih procesora mogu
koristiti tri tehnike - dupliranje resursa, izdavanje instrukcija van redosleda i preimenovanje. Postoji
istraživanje [SMIT89] u kome je rasvetljen odnos između ovih tehnika. U istraživanju je napravljena
simulacija proces ora sa karakteristikama modela MIPS R2000 koji je obogaćen raznim superskalarnim
funkcijama, a simulirano je više različitih programskih sekvenci.
Na slici 14.5 možete da vidite rezultate ovog istraživanja. Na svakom od ovih grafikona, vertikalna
osa odnosi se na srednje poboljšanje performansi superskalarnih procesora u odnosu na skalarne. Na
horizontalnim osama prikazani su rezultatu za četiri alternativne organizacije procesora.
Na računaru koji je poslužio kao osnova poređenja nema dupliranja bilo kakvih funkcionalnih jedinica,
ali postoji izdavanje instrukcija van redosleda. U drugoj konfiguraciji duplirana je funkcionalna jedinica
za učitavanje/sk1adištenje koja pristupa podacima u keš memoriji. U trećoj konfiguraciji duplirana je
ALU jedinica, a u četvrtoj i jedinica za učitavanje/sk1adištenje i ALU. Na svakom grafikonu postoje
rezultati za okvire veličine 8, 16 i 32 instrukcije, od kojih zavisi u kojoj će meri procesor moći da gleda
unapred. Ova dva grafikona razlikuju se po tome što je u drugom dozvoljeno preimenovanje. Drugim
rečima, na prvom grafikonu prikazan je procesor koji je ograničen svim zavisnostima, dok procesor na
drugom grafikonu pogađaju samo prave zavisnosti.
Ova dva grafikona pomoći će nam da formulišemo neke važne zaključke. Prvi bi bio taj da se
dodavanje funkcionalnih jedinica bez preimenovanja registara najverovatnije ne isplati. Njime se dobija
izvesno poboljšanje performansi, ali po cenu veće složenosti hardvera. Kada se primeni preimenovanje
registara kojim se eliminišu antizavisnosti i izlazne zavisnosti, dodavanjem funkcionalnih jedinica stiže
se do značajnog poboljšanja performansi. Ipak, skrećemo vam pažnju i na to da je stepen ovog
poboljšanja bitno različit kod prozora veličine 8 instrukcija i onih većih. Iz ovoga se može zaključiti da
kod previše malih instrukcijskih okvira zavisnosti podataka sprečavaju efikasno iskorišćavanje dodatnih
104

uslovnom grananju i donošenjem iza njega, istovremeno donosi više instrukcija. Ove funkcije
zahtevaju da se u protočnoj obradi koriste višestruke etapa za donošenje i dekodiranje
instrukcija, kao i logika za predviđanje grananja.
Logika za ustanovljavanje istinskih zavisnosti između vrednosti registara i mehanizmi za
komunikaciju ovih vrednosti sa etapama u kojima su neophodne tokom izvršenja.
Mehanizmi za paralelno iniciranje ili izdavanje više instrukcija.
Resursi za paralelno izvršavanje više instrukcija, uključujući tu i višestruke funkcionalne
jedinice protočne obrade i memorijske hijerarhije koje omogućavaju istovremeno
servisiranje više memorijskih referenciranja.
Mehanizmi za predaju stanja procesa u pravilnom redosledu.
RAD UPRAVLJAČKE JEDINICE
KLJUČNE TEZE
Izvršavanje instrukcije obuhvata izvršavanje niza potkoraka, koji se uopšteno nazivaju ciklusi. Na
primer, izvršavanje se može sastojati od ciklusa donašenja, indirektnag ciklusa, izvršnog ciklusa i
ciklusa prekida. Sa druge strane, svaki ad ovih ciklusa sačinjen je od niza još osnovnijih
operacija, koje se nazivaju mikrooperacije. Jedna mikrooperacija uopšteno obuhvata prenos
između registara, prenos između registra i spoljne magistrale ili jednastavnu operaciju
aritmetičko-Iogičke jedinice.
Upravljačka jedinica procesora obavlja dva zadatka: (I) dovodi da toga da procesar izvršava
mikrooperacije po pravilnom redosledu koji je određen programam koji se izvršava i (2) generiše
upravljačke signale koji dovode do toga da se sve mikrooperacije izvrše.
Upravljački signali koje generiše upravljačka jedinica izazivaju otvaranje I zatvaranje logičkih
kola, što za posledicu ima prenos podataka u registre i iz registara, kao i rad aritmetičko-
Iogičke jedinice.
Jedna od tehnika za implementiranje upravljačke jedinice poznata je kao ožičena
implementacija, u kojoj je upravljačka jedinica kombinatorno kolo. Njeni ulazni signali, određeni
tekucom mašinskom instrukcijom, pretvaraju se u skup izlaznih upravljačkih signala.
U poglavlju 10 istakli smo da skup mašinskih instrukcija prolazi dug put prema procesoru. Ukoliko znamo
skup mašinskih instrukcija, što znači da razumemo šta operativni kodovi rade i razumemo režime
adresiranja i ukaliko znamo skup registara vidljivih korisniku, tada znamo koje funkcije procesor mora
da izvrši. To nije sve. Moramo poznavati spoljni interfejs, što je najčešće magistrala, i to kako se
upravlja prekidima. Kada nam je to jasno, pojavljuje se sledeći spisak elemenata neophodnih da bi
se .odredilo funkcionisanje procesora:
1. operacije (operativni kodovi),
2. režimi adresiranja,
3. registri,
4. interfejs U/I modula,
5. interfejs memorijskag modula, struktura
6. obrade prekida.
laka uopšten, ovaj spisak je prilično potpun. Stavke od 1 do 3 definisane su skupom instrukcija.
Stavke 4 i 5 obično su definisane određivanjem sistemske magistrale. Stavka 6 delimično je definisana
sistemskam magistralom, a delimično tipom podrške koju procesor nudi operativnom sistemu.
106
Ovaj spisak od šest stavki magao bi se nazvati funkcionalni zahtevi za procesoar. Oni određuju šta
procesor mora da radi. Time sma se najviše bavili u drugom i trećem delu. Sada nas zanima to kako se
ove funkcije izvršavaju ili, još tačnije, kako se upravlja različitim delovima procesora da bi se te
funkcije obavile. Stoga, našu pažnju usmeravamo ka upravljačkoj jedinici, koja upravlja radom
procesora.
Već smo videli da se rad računara, prilikom izvršavanja programa, sastoji od niza instrukcijskih ciklusa,
sa jednom mašinskom instrukcijom po ciklusu. Naravno, moramo se podsetiti da redosled instrukcijskih
ciklusa nije obavezno isti kao i
redosled pisanja instrukcija od kojih je program sačinjen, zbog
postojanja instrukcija grananja. Ovde je reč o izvršavanju
vremenskog redosleda instrukcija.
Dalje smo videli da se svaki instrukcijski ciklus sastoji od određenog broja jednostavnijih celina.
Jedna od pogodnih podela je podela na ciklus donošenja, indirektni ciklus, izvršni ciklus i ciklus prekida,
pri čemu se samo ciklus donošenja i izvršni ciklus obavezno dešavaju.
Za projektovanje upravljačke jedinice neophodno je da dodatno raščlanimo ovu podelu. Pri
razmatranju protočne obrade u poglavlju 12, uvideli smo da je dalja dekompozicija moguća. U stvari,
videćemo da svi manji ciklusi obuhvataju niz koraka, od kojih svi obuhvata ju registre procesora. Ove
korake nazvaćemo
mikrooperacije. Prefiks mikro označava činjenicu da je svaki korak veoma
jednostavan i da obavlja malo toga. Na slici 16.1 prikazan je međusobni odnos između različitih pojmova
o kojima smo govorili. Ukratko da ponovimo, izvršavanje programa sastoji se od izvršavanja instrukcija
jedne za drugom. Sve instrukcije izvršavaju se tokom instrukcijskog ciklusa koji se sastoji od kraćih
potciklusa (npr. ciklusa donošenja, indirektnog ciklusa, izvršnog ciklusa, ciklusa prekida). Izvršavanje
svakog od potciklusa obuhvata jednu ili više kraćih operacija, to jest, mikrooperacija.
Mikrooperacije
su najmanje moguće, ili atomske, operacije procesora. U ovom odeljku, istraži ćemo
mikrooperacije kako bismo razumeli to da se događaji u bilo kom instrukcijskom ciklusu mogu opisati kao
niz takvih mikrooperacija. Koristiće se jednostavan primer. U ostatku ovog poglavlja pokazaćemo kako
znanje o mikrooperacijama služi kao smernica za projektovanje upravljačke jedinice.
Ciklus donošenja
Počećemo razmatranjem ciklusa donošenja koji se odvija na početku svakog instrukcijskog ciklusa i
dovodi do toga da se instrukcija preuzme iz memorije. Za potrebe našeg razmatranja, pretpostavićemo
organizaciju opisanu na slici 12.6. Uključena su četiri registra:
memorijski adresni registar
(Memory Address Register, MAR): povezan sa adresnim linijama
sistemske magistrale; određuje adresu u memoriji za operaciju čitanja ili upisivanja;
memorijski bafer registar
(Memory BufJer Registar, MBR): povezan sa linijom podataka
sistemske magistrale; sadrži vrednosti koje treba upisati u memoriju ili poslednju vrednost
učitanu iz memorije;
programski brojač
(Program Counter, PC): drži adresu sledeće instrukcije koju treba doneti;
instrukcijski registar
(Instruction Registar, IR): drži poslednju donetu instrukciju.
Pogledajmo redosled događaja za ciklus donošenja sa tačke gledišta registara procesora i koje
posledice ima na njih. Primer je prikazan na slici 16.2. Na početku ciklusa donošenja, adresa sledeće
instrukcije koja treba da se izvrši nalazi se u programskom brojaču (PC); u ovom slučaju, adresa je
1100100. Prvi korak je da se ta adresa premesti i memorijski adresni registar (MAR) pošto je to jedini
registar povezan sa adresnim linijama sistemske magistrale. Drugi korak je uvođenje instrukcije.
Željena adresa (u MAR registru) smešta se na adresnu magistralu, upravljačka jedinica izdaje komandu
za učitavanje (READ) upravljačkoj magistrali i rezultat se pojavljuje na magistrali podataka i kopira se
u memorijski bafer registar (MBR). Takođe, neophodno je da povećamo vrednost PC registra za 1 da
bismo bili spremni za sledeću instrukciju. Pošto ove dve akcije (učitavanje iz memorije, dodavanje 1 u PC
107

tI: t2: t3:
Polje adrese u instrukciji prenosi se u MAR registar. On se zatim koristi za donošenje adrese
operanda. Konačno, polje adrese IR registra se ažurira iz MBR registra, tako da sada sadrži direktnu
umesto indirektne adrese.
IR registar je sada u istom stanju kao da indirektno adresiranje nije ni korišćeno i spreman je za
izvršni ciklus. Na trenutak ćemo preskočiti ovaj ciklus i razmotrićemo ciklus prekida.
Ciklus prekida
Po završetku izvršnog ciklusa, vrši se provera kako bi se ustanovilo da li se dogodio neki od dozvoljenih
prekida. Ukoliko je tako, događa se ciklus prekida. Priroda ovog ciklusa veoma se razlikuje od jednog do
drugog procesora. Prikazujemo veoma jednostavan niz događaja, onako kako su prikazani na slici 12.8.
Imamo:
tI: t2:
MBR ~ (PC)
MAR ~ adresa_čuvanja PC ~ adresa_rutine
t3:
memorija ~ (MBR)
U prvom koraku, sadržaj PC registra prenosi se u MBR registar, tako da se može sačuvati za
povratak iz prekida. Zatim se u MAR registar učitava adresa na kojoj je sačuvan sadržaj PC registra, a
u PC registar se učitava adresa početka rutine za obradu prekida. Ove dve akcije mogu biti zasebne
mikrooperacije. Međutim, pošto većina procesora nudi više tipova i/ili nivoa prekida, možda će biti
potrebna jedna ili više dodatnih mikrooperacija kako bi se dobile adresa_čuvanja i adresa_rutine pre
nego što se prenesu u MAR i PC registre, respektivno. U svakom slučaju, kada se to obavi, poslednji
korak je skladištenje u memoriju MBR registra, koji sadrži staru vrednost PC registra. Procesor je sada
spreman da otpočne sledeći instrukcijski ciklus.
Izvršni ciklus
Ciklus donošenja, indirektni ciklus i ciklus prekida su jednostavni i predvidivi. Svi oni obuhvataju male,
nepromenljive nizove mikrooperacija i, u svim slučajevima, iste mikrooperacije ponavljaju se svaki put
ispočetka.
Ovo ne važi za izvršni ciklus. Za procesor sa
N različitih operacionih kodova, postoji N različitih
redosleda po kojima se mikroperacije mogu odvijati. Razmotrimo nekoliko hipotetičkih primera.
Prvo, razmatramo instrukciju sabiranja:
ADD RI, X
kojom se sadržaj lokacije X dodaje u registar R1. Moguće je da se desi sledeći niz mikrooperacija:
tI: t2: t3:
MAR <E- (IR (adresa)) MBR <E- memorija
RI <E- (RI) + (MBR)
Počinjemo sa registrom
IR
koji sadrži instrukciju za sabiranje, ADD. U prvom koraku, deo
IR
registra sa adresom unosi se u MAR registar. Zatim se učitava memorijska lokacija na koju se ta adresa
poziva. Konačno, aritmetičko logička jedinica sabira sadržaje registara RI i MBR. Ponavljamo, ovo je
pojednostavljen primer. Moguće je da budu potrebne dodatne mikrooperacije za izvlačenje reference
registra iz
IR
i možda za smeštanje ulaza i izlaza aritmetičko logičke jedinice u neke međuregistre.
Razmotrimo dva složenija primera. Uobičajena instrukcija je povećanje vrednosti i preskakanje
ukoliko je vrednost nula:
ISZ X
Sadržaj lokacije X povećava se za 1. Ukoliko je rezultat O, preskače se sledeća instrukcija. Mogući
109
redosled mikrooperacija je:
tI: t2: t3: t4:
MAR <E- (IR (adresa) )
MBR <E- memorija
MBR <E- (MBR) + 1
memorija <E- (MBR)
Ukoliko ((MBR) = O) tada (PC <E- (PC) + I)
Ovde je uvedeno nešto novo, a to je uslovna akcija. Registar PC se povećava ukoliko je (MBR) = O.
Ova provera i akcija mogu se izvesti u jednoj mikrooperaciji. Primećujete takođe da se ova
mikrooperacija može izvršiti tokom iste jedinice vremena tokom koje se ažurirana vrednost u MBR
registru ponovo skladišti u memoriju.
Na kraju, razmotrimo instrukciju za pozivanje potprograma. Kao primer, razmotrimo instrukciju za
grananje i čuvanje adrese:
BSA X
Adresa instrukcije, koja sledi posle instrukcije BSA, čuva se u lokaciji X, a izvršavanje se nastavlja
na lokaciji X + I. Sačuvana adresa kasnije će biti iskorišćena za povratak. Ovo je jednostavna tehnika za
pozivanje potprograma. Dovoljne su sledeće mikrooperacije:
tl:
MAR ~ (IR (adresa) ) MBR ~ (PC)
PC ~ (IR (adresa) ) memorija ~ (MBR)
PC ~ (PC) + I
t2:
t3:
Adresa u PC registru na početku instrukcije je adresa sledeće instrukcije u nizu. Ona se čuva u
adresi naznačenoj u
IR
registru. Ova druga adresa se takođe povećava da bi se obezbedila adresa
instrukcije za sledeći instrukcijski ciklus.
Instrukcijski ciklus
Već smo videli da se svaka faza instrukcijskog ciklusa može dekomponovati u niz elementarnih
mikrooperacija. U našem prim eru, postoji po jedan niz mikrooperacija za ciklus donošenja, indirektni
ciklus i ciklus prekida, a za izvršni ciklus postoji jedan niz mikrooperacija za svaki operacioni kod.
Da bismo upotpuni1i sliku, potrebno je da povežemo niz mikrooperacija, i to je učinjeno na slici 16.3.
Uvodimo novi 2-bitni registar pod nazivom
kOd instrukeijskog ciklusa (Instruetion Cycle Code, ICC).
Registar ICC označava stanje procesora u smislu u kom delu ciklusa se procesor nalazi:
00: ciklus donošenja, 01: indirektni ciklus, 10: izvršni ciklus,
11:
ciklus prekida.
Na kraju svakog od ova četiri ciklusa, vrednost ICC registra postavlja se na odgovarajuću vrednost.
Posle indirektnog ciklusa uvek sledi izvršni ciklus. Posle ciklusa prekida uvek sledi ciklus donošenja
(videti sliku 12.4). Što se tiče ciklusa donošenja i izvršnog ciklusa, sledeći ciklus zavisi od stanja
sistema.
Prema tome, dijagram toka na slici 16.3 definiše potpuni niz mikrooperacija, koji zavisi samo od
redosleda instrukcija i vrste i načina pojavljivanja prekida. Naravno, ovo je pojednostavljeni primer.
Dijagram toka stvarnog procesora bio bi mnogo složeniji. U svakom slučaju, stigli smo do one tačke u
našoj raspravi u kojoj se rad procesora definiše kao obavljanje niza mikrooperacija. Razmotrićemo kako
upravljačka jedinica dovodi do izvršavanja tog niza.
Funkcionaini zahtevi
Rezultat naše analize u prethodnom odeljku je da smo dekomponovali ponašanje ili funkcionisanje
110

upravlja ponašanjem sistema. Njima se spolja opisuje upravljačka jedinica. Iznutra, upravljačka jedinica
mora da ima logička kola neophodna da bi obavila svoje funkcije sekvenciranja i izvršavanja. Raspravu o
tome kako upravljačka jedinica radi iznutra ostavljamo za odeljak 16.3 i poglavlje 17. U preostalom delu
ovog odeljka govorićemo o međusobnom delovanju između upravljačke jedinice i ostalih elemenata
procesora.
Na slici 16.4 dat je opšti model upravljačke jedinice, na kome su prikazani svi ulazi i izlazi. Ulazi su
sledeći:
Generator takta: pomoću njega upravljačka jedinica "vodi računa o vremenu"; upravljačka
jedinica izaziva izvršavanje jedne mikrooperacije (ili skup istovremenih mikrooperacija) za svaki
impuls generatora takta; ovo se ponekad naziva vreme ciklusa procesora ili vreme ciklusa
generatora takta;
instrukcijski registar: operacioni kod tekuće instrukcije koristi se za određivanje koje
mikrooperacije se obavljaju tokom izvršnog ciklusa;
markeri: neophodni su upravljačkoj jedinici da bi odredila status procesora i izlaz prethodnih
operacija aritmetičko-Iogičke jedinice; na primer, za instrukciju povećanja i preskoka ukoliko je
vrednost nula (ISZ) upravljačka jedinica će povećati PC registar ako je postavljen nu1ti marker;
upravljački signali sa upravljačke magistrale: upravljački deo sistemske magistrale obezbeđuje
signale za upravljačku jedinicu. kao što su signali prekida ili potvrda.
Izlazi su:
upravljački signali unutar procesora: postoje dva tipa - oni koji izazivaju premeštanje podataka
iz jednog registra u drugi i oni koji aktiviraju određene funkcije aritmetičko-Iogičke jedinice;
upravljački signali ka upravljačkoj magistrali: takođe postoje dva tipa - upravljački signali ka
memoriji i upravljački signali ka U/I modulima.
Novi element koji je uveden na ovoj slici je upravljački signal. Koriste se tri tipa upravljačkih
signala: oni koji aktiviraju neku funkciju aritmetičko-Iogičke jedinice, oni koji aktiviraju putanju
podataka i oni koji su signali na spoljnoj sistemskoj magistrali ili drugim spoljnim interfejsima. Svi ovi
signali se u krajnjoj liniji primenjuju neposredno kao binarni ulazi na pojedinačna logička kola.
Razmotrimo još jednom ciklus donošenja da bismo videli kako upravljačka jedinica održava
upravljanje. Upravljačka jedinica vodi računa o tome gde se nalazi u instrukcijskom ciklusu. Udatoj
tački, ona zna da će posle toga biti izvršen ciklus donošenja. Prvi korak je prenošenje sadržaja PC
registra u MAR registar. Upravljačka jedinica to radi aktiviranjem upravljačkog signala koji otvara
logička kola između bitova registara PC i MAR. Sledeći korak je učitavanje reči iz memorije u MBR
regstar i povećanje PC registra. Upravljačka jedinica to radi slanjem sledećih upravljačkih signala
istovremeno:
upravljački signal koji otvara logička kola, omogućavajući da se sadržaj MAR registra smesti
na magistralu adresa;
upravljački signal učitavanja memorije na upravljačkoj magistrali;
upravljački signal koji otvara logička kola, omogućavajući da se sadržaj magistrale podataka
sačuva u
MBR
registru;
upravljački signal u logičko kolo koje dodaje 1 sadržaju PC registra i rezultat ponovo unosi u
PC registar.
Posle toga, upravljačka jedinica šalje upravljački signal koji otvara logička kola između registara
MBR i IR.
Time se okončava ciklus donošenja, osim u jednoj stvari: upravljačka jedinica mora da odluči da li da
posle toga izvrši indirektni ciklus ili izvršni ciklus. Da bi to odlučila, ona ispituje
IR
registar kako bi
112
videla da li je napravljena indirektna referenca na memoriju.
Indirektni ciklus i ciklus prekida rade na sličan način. Za izvršni ciklus, upravljačka jedinica počinje
ispitivanjem operacionog koda i, na osnovu toga, odlučuje kojim redosledom će biti izvršene
mikrooperacije izvršnog ciklusa.
Primer upravljačkih signala
Da bismo ilustrovali funkcionisanje upravljačke jedinice, razmotrimo jednostavan primer (slika 16.5). To
je jednostavan procesor sa jednim akumulatorom. Naznačene su putanje podataka između elemenata.
Upravljačke putanje za signale koji potiču iz upravljačke jedinice nisu prikazane, ali završeci
upravljačkih signala obeleženi su kao Ci i naznačeni kružićem. Upravljačka jedinica prima ulaze iz
generatora takta, instrukcijskog registra i markera. Sa svakim ciklusom generatora takta, upravljačka
jedinica očitava sve svoje ulaze i emituje skup upravljačkih signala. Upravljački signali odlaze do tri
različita odredišta:
putanje
podataka: upravljačka jedinica kontroliše unutrašnji tok podataka; na primer,
prilikom donošenja instrukcije, sadržaj memorijskog bafer registra prenosi se u instrukcijski
registar; za sve putanje koje se kontrolišu postoji logičko kolo (naznačeno kružićem na slici);
upravljački signal iz upravljačke jedinice privremeno otvara logičko kolo da dozvoli prolazak
podataka;
aritInetičko-logička jedinica: upravljačka jedinica kontroliše rad aritmetičkologičke jedinice
pomoću skupa upravljačkih signala; ovi signali aktiviraju različite logičke uređaje i kola
unutar aritmetičko-logičke jedinice;
sistemska magistrala: upravljačka jedinica šalje upravljačke signale na upravljačke linije
sistemske magistrale (npr. učitavanje memorije).
Upravljačka jedinica mora uvek da zna gde se nalazi u instrukcijskom ciklusu. Koristeći to znanje, i
čitajući svoje ulaze, upravljačka jedinica emituje niz upravljačkih signala koji izazivaju dešavanje
mikrooperacija. Ona koristi impulse generatora takta da bi odredila vremenski redosled događaja,
ostavljajući vreme između događaja da bi se nivoi signala stabilizovali. U tabeli 16.1 navedeni su
upravljački signali koji su potrebni za neke od nizova mikrooperacija opisanih ranije. Zbog
jednostavnosti putanje podataka i kontrole za povećanje PC registra i za učitavanje nepromenljivih
adresa u registre PC i MAR nisu prikazane.
Vredi podrobnije proučiti osnovnu prirodu upravljačke jedinice. Upravljačka jedinica je mehanizam
koji pokreće čitav računar. Ona to radi samo na osnovu znanja o tome koje se instrukcije izvršavaju i
prirodi rezultata aritemtičkih i logičkih operacija (npr. pozitivno, prekoračenje itd.). Ona nikada ne vidi
podatke koji se obrađuju ili stvarno dobijene rezultate. Uz to, ona kontroliše sve sa samo nekoliko
upravljačkih signala ka određenim tačkama u procesom i nekoliko upravljačkih signala ka sistemskoj
magistrali.
Unutrašnja organizacija procesora
Na slici 16.5 naznačena je upotreba različitih putanja podataka. Potrebno je razjasniti složenost ovog
tipa organizacije. Za to će se obično koristiti neka vrsta unutrašnjeg rasporeda magistrala, kakva je
predložena na slici 12.2.
Korišćenjem unutrašnje magistrale procesora, slika 16.5 može se preurediti onako kako je prikazano
na slici 16.6. Jedna unutrašnja magistrala povezuje aritmetičkologičku jedinicu i sve registre procesora.
Za premeštanje podataka iz svakog registra na magistralu i sa magistrale obezbeđena su logička kola
i upravljački signali. Dodatni upravljački signali kontrolišu prenos podataka na i sa sistemske (spoljne)
113

pristupa od datog procesora do reči u memoriji menja u zavisnosti od memorijske lokacije.
Vrsta paralelne orgapizacije sa posebnom namenom je vektorska obrada, prilagođena obradi
vektora ili nizova podataka.
Uobičajeno je da se na računar gleda kao na sekvencijalnu mašinu. Većina računarskih programskih
jezika od programera zahteva da algoritme određuje kao niz instrukcija. Procesori izvršavaju programe
izvršavanjem mašinskih instrukcija sekvencijalno, jednu po jednu. Sve instrukcije izvršavaju se kao niz
operacija (donošenje instrukcije, donošenje operanda, izvršavanje operacije, skladištenje rezultata).
Ovakav pogled na računar nije nikad bio u potpunosti tačan. Na nivou mikrooperacija, istovremeno se
generiše više upravljačkih signala. Protočna obrada instrukcija, bar u meri takvoj da dolazi do
preklapanja operacija donošenja i izvršavanja, postoji odavno. Oba navedena slučaja su primeri
paralelnog izvršavanja funkcija. Ovaj pristup je dodatno proširen superskalarnom organizacijom, u kojoj
se iskorišćava paralelizam na nivou instrukcija. U superskalarnim računarima postoji više izvršnih celina
unutar jednog procesora koje mogu paralelno izvršavati više instrukcija iz istog programa.
Razvojem računarske tehnologije i padom cena hardvera računara, projektanti računara istraživali
su sve veći i veći broj mogućnosti za paralelizam, obično da bi poboljšali performanse i, u nekim
slučajevima, da bi povećali raspoloživost. Posle uvoda, u ovom poglavlju razmatramo neka od
najistaknutijih rešenja paralelne organizacije. Prvo istražujemo simetrične multiprocesore (SMP), jednu
od prvih, ali još uvek najčešćih primera paralelne organizacije procesora. U SMP organizaciji više proce-
sora deli zajedničku memoriju. U ovoj organizaciji najvažniji problem je koherentnost keš memorije,
čemu je posvećen poseban odeljak. Potom opisujemo klastere, koji se sastoje od više nezavisnih
računara organizovanih tako da rade zajedno. Iza toga sledi istraživanje procesora sa višenitnom
obradom i čipa sa više procesora. Klasteri su u znatnoj meri postali uobičajen način za obavljanje
poslova koji prevazi1aze mogućnosti SMP obrade. Sledeći način za korišćenje više procesora koji
istražujemo su sistemi sa neuniformnim pristupom memoriji (NUMA). NUMA sistemi su relativno novi i
nisu još dokazani na tržištu, ali se često razmatraju kao alternativa rešenjima sa SMP obradom ili
klasterom računara. Konačno, u ovom poglavlju se razmatra hardversko rešenje organizacije za
vektorsko računarstvo. Ovim rešenjima optimizuje se aritmetičko logička jedinica za obradu vektora ili
nizova brojeva u pokretnom zarezu. Ona su uobičajena u klasi računara poznatih pod nazivom
superračunari.
Vrste sistema sa procesorima
Razvrstavanje koje je prvi uveo Flynn [FLYN72] i dalje je najčešći način za kategorizaciju sistema sa
mogućnošću paralelne obrade. Flynn je predložio sledeće kategorije računarskih sistema:
Jedna instrukcija, jedan tok podataka
(single instruction, single data, SISD) Jedan procesor
izvršava jedan tok instrukcija kojima se utiče na podatke uskladištene u jednoj memoriji.
Računari sa jednim procesorom spadaju u ovu kategoriju.
Jedna instrukcija, više tokova podataka
(single instruction, multiple data, SIMD) Jedna mašinska
instrukcija upravlja istovremenim izvršavanjem većeg broja elemenata obrade uporedo. Svakom
elementu obrade pridruženi su podaci u memoriji tako da različiti procesori izvršavaju sve te
instrukcije na različitim skupovima podataka. Procesori za rad sa vektorima i nizovima spadaju u
ovu kategoriju.
Više instrukcija, jedan tok podataka
(multiple instruction, single data, MISD) Niz podataka
prenosi se do skupa procesora od kojih svaki izvršava drugačiji niz instrukcija. Ovakva struktura
nije komercijalno implementirana.
Više instrukcija, više tokova podataka
(multiple instruction, multiple data, MIMD) Skup
115
procesora istovremeno izvršava različite sekvence instrukcija na različitim skupovima podataka.
SMP, klasteri i NUMA sistemi spadaju u ovu kategoriju.
U MIMD organizaciji procesori su opšte namene; svaki od njih može da obradi sve instrukcije
neophodne da bi se izvršila odgovarajuća transformacija podataka. MIMD organizacija može se dalje
podeliti po tome na koji način procesori međusobno komuniciraju (slika 18.1). Ukoliko procesori dele
zajedničku memoriju, tada svaki procesor pristupa programima i podacima uskladištenim u deljenoj
memoriji i procesori komuniciraju jedan sa drugim preko te memorije. Najčešći oblik ovakvog sistema
poznat je kao simetrični
multiprocesor
(SMP) koji istražujemo u odeljku 18.2. U SMP sistemima, više
procesora deli jednu memoriju ili združenu memoriju pomoću zajedničke magistrale ili drugog
mehanizma za međusobno povezivanje; ovi sistemi odlikuju se time da je vreme pristupa memoriji za bilo
koju oblast memorije približno isto za sve procesore. Noviji pronalazak je organizacija sa
neuniformnim
pristupom memoriji
(NUMA), koja je opisana u odeljku 18.5. Kao što i samo ime kaže, vreme pristupa
memoriji različitim oblastima u memoriji može biti različito za NUMA procesor.
Grupa nezavisnih samostalnih procesora, ili SMP procesora, može se međusobno povezati kako bi
formirali
klaster
računara. Komunikacija između ovih računara ostvaruje se ili putem stalnih putanja ili
preko neke mreže.
Paralelne organizacije
Na slici 18.2 prikazana je opšta organizacija kategorija sa slike 18.1. Na slici l8.2a prikazana je
struktura SISD računarskih sistema. Postoji neka vrsta upravljačke jedinice (VJ) koja obezbeđuje tok
instrukcija (TI) do procesorske jedinice (PJ). Procesorska jedinica operiše jednim tokom podataka (TP)
iz memorijske jedinice (MJ). Kod SIMD računarskih sistema, i dalje imamo jednu upravljačku jedinicu
koja u ovom slučaju jednim tokom instrukcija napaja više procesorskih jedinica. Procesorske jedinice
mogu imati sopstvenu samo njima namenjenu memoriju (kao što je prikazno na slici l8.2b) ili može
postojati zajednička, deljena memorija. Konačno, u MIMD računarskim sistemima postoji više
upravljačkih jedinica, od kojih svaka zasebnim tokom instrukcija napaja sopstvenu procesorsku jedinicu.
MIMD računarski sistem može biti sastavljen od više procesora sa zajedničkom memorijom (slika
18.2.c) ili od više računara sa raspodeljenom memorijom (slika 18.2.d).
Problemi koji se tiču projektovanja SMP, klastera i NUMA organizacije računara su složeni,
uključujući pitanja koja se odnose na fizičku organizaciju, strukture za međusobno povezivanje,
komunikaciju između procesora, projektovanje operativnog sistema i tehnike aplikativnog softvera. Mi
ćemo se prvenstveno baviti organizacijom mada ćemo ukratko pomenuti i pitanja projektovanja
operativnog sistema za paralelni rad procesora.
Poglavlje 15
PARALELIZAM NA NIVOU
INSTRUKCUA I SUPERSKALARNI PROCESORI
SuperskaIarni procesor
je onaj kod koga se koristi više nezavisnih protočnih obrada instrukcija. Sve
protočne obrade imaju više etapa, što znači da svaka od njih može u istom trenutkuda se bavi većim
brojem instrukcija. Višestrukim protočnim obradamadobijen je novi nivo paralelizma koji omogućava
istovremenu obradu većeg broja nizova instrukcija. Na superskalarnim procesorima primenjuje se
pa
ralelizam nivoa instrukcija,
pod kojim se podrazumeva stepen u kome instrukcije nekog programa
mogu da se izvršavaju paralelno.
….
Nasuprot tome, na većini superskalarnih procesora do poboljšanja efikasnosti protočne obrade stiže se
korišćenjem tradicionalnih metoda predviđanja grananja.
Superskalarna implementracija arhitekture procesora jeste ona u kojoj česte instrukcije -
116

trenutku se samo jedna instrukcija nalazi u svojoj etapi izvršenja protočne obrade.
U sledećem delu dijagrama ilustrovana je superprotočna implementacija koja u jednom ciklusu
generatora takta može da izvršava dve etape protočne obrade. Drugim rečima, funkcije koje se
izvršavaju u svakoj etapi protočne obrade mogu da se podele na dva nepreklapajuća dela za čije je
izvršenje potrebno po pola ciklusa generatora takta. Za superprotočnu obradu koja se ponaša na ovaj
način kaže se da predstavlja superprotočnost drugog stepena. Konačno, u donjem delu dijagrama
ilustrovanaje superskalarna implementacija kod koje paralelno mogu da se izvršavaju dve etape.
Naravno, moguće je postići i viši stepen efikasnosti superprotočnih i superskalarnih implementacija.
U superprotočnom i superskalarnom procesoru sa slike 14.2, istovremeno se izvršava isti broj
instrukcija u spremnom stanju. Međutim, superprotočni procesor zaostaje za superskalarnim na
početku programa i na svakom cilju grananja.
Ograničenja
Superskalarni pristup zasniva se na mogućnosti paralelnog izvršenja više instrukcija. Termin paralelizam
na nivou instrukcija odnosi se na prosečnu vrednost stepena u kome instrukcije programa mogu da se
izvršavaju paralelno. Paralelizam nivoa instrukcija može se maksimalno iskoristiti kombinacijom
optimiziranja kompajlera i hardverskih tehnika. Pre nego što ispitamo tehnike dizajna kojima se
povećava paralelizam nivoa instrukcija superskalarnih procesora, razmotrimo koja su to ograničenja
paralelizrna sa kojima sistem mora da se izbori. U [JOHN91] navedeno je pet ograničenja:
prava zavisnost podataka,
proceduralna zavisnost,
konflikti resursa,
zavisnost izlaza,
antizavisnost.
Prva tri ograničenja ispitaćemo u nastavku ovog odeljka, dok će poslednja dva morati da sačekaju
sledeći odeljak, kada ćete biti sasvim spremni za njih.
Prava zavisnost podataka
Pažljivo pogledajte sledeći kod:
Druga instrukcija može da se donese i dekodira, ali njeno izvršenje mora da sačeka na izvršenje prve
instrukcije. To je zato što su ovoj drugoj instrukciji potrebni
U asemblerskom jeziku za lntel 80x86 i Pentium procesore, komentar je naznačen znakom tačka-zarez.
Asembler zanemaruje ovaj znak i sve one koji se nalaze iza njega.
Na slici 14.3 ilustrovana je ova zavisnost kod superskalarnih procesora drugog stepena. Kada nema
zavisnosti, dve instrukcije mogu paralelno da se donose i izvršavaju. Ukoliko između prve i druge
instrukcije postoji zavisnost, druga instrukcija će biti zadržana onoliko ciklusa generatora takta koliko
je potrebno da se ta zavisnost ukloni. Uopšteno govoreći, svaka instrukcija mora da se zadrži sve dok se
ne generišu sve njene ulazne vrednosti.
U jednostavnoj protočnoj obradi, kakvu smo imali u gornjem delu slike 14.2, prethodno pomenuti sled
instrukcija ne bi doveo do bilo kakvog odlaganja. Međutim, obratite sada pažnju na sledeći kod u kome
jedno od učitavanja nije iz registra nego iz memorije:
Tipičnom RISC procesoru su, zbog kašnjenja prilikom pristupa memoriji koja nije na čipu ili usled
pristupa kešu, za izvršavanje učitavanja iz memorije potrebna dva (ili više) ciklusa. Ovo kašnjenje može
da se kompenzuje time što će kompajler da preuredi instrukcije i u protočnu obradu ubaci jednu ili više
naknadnih instrukcija koje nisu uslovljene učitavanjem iz memorije. Ovakva šema je manje efikasna u
118
slučaju superskalarne protočne obrade: nezavisne instrukcije koje se izvršavaju tokom učitavanja
najverovatnije će se izvršiti u prvom ciklusu učitavanja, što znači da procesor neće imati posla sve do
završetka učitavanja.
Proceduralne zavisnosti Kao što smo rekli u poglavlju 12, postojanje grananja u nizu instrukcija u velikoj
meri komplikuje protočnu obradu. Instrukcije koje slede nakon grananja (svejedno da li se ono dogodi ili
ne) proceduralno zavise od njega i mogu da se izvrše tek nakon što se grananje izvrši. Na slici 14.3
ilustrovali smo efekat grananja na superskalarnu protočnu obradu drugog stepena.
Kao što ste videli, ovaj tip proceduralne zavisnosti pogađa i skalarnu protočnu obradu. Pri tom,
posledice su kod superskalarne protočne obrade teže zato što se sva. kim kašnjenjem mnogo više gubi.
Prilikom korišćenja instrukcija promenljive dužine, pojavljuje se novi oblik proceduralne zavisnosti. S
obzirom na to da dužina bilo koje od ovakvih instrukcija nije poznata, one se, bar delimično, moraju
dekodirati kako bi mogla da se preuzme sle. deća instrukcija. Ovim se sprečava istovremeno donošenje
koje je u superskalarnoj protočnoj obradi neophodno. Upravo zato su superskalarne tehnike podesnije
za RISe i slične arhitekture u kojima je dužina instrukcija fiksirana.
Konflikt resursa Konflikt resursa jeste situacija u kojoj se dve ili više instrukcija istovremeno nadrneću
za isti resurs. Pod resursima se podrazumevaju memorije, keš, magistrale, portovi registarske datoteke
i funkcionalne jedinice (na primer, ALU sabirač).
U kontekstu protočne obrade, konflikt resursa ispoljava se slično kao i zavisnost podataka (slika
14.3). Naravno, između njih postoje i određene razlike. Najpre, konflikti resursa mogu da se prevaziđu
dupliranjem resursa, dok prava zavisnost podataka nikako ne može da se izbegne. Isto tako, kod
operacija koje dugo traju, konflikti resursa mogu da se minimizuju protočnom obradom odgovarajuće
funkcionalne jedinice.
14.2 ASPEKTI DIZAJNA
Paralelizam nivoa instrukcija i maši nsk i paralelizam
U [JOUP89a] je napravljena razlika između dva povezana koncepta - paralelizrna nivoa instrukcija
imašinskog paralelizrna. Paralelizam nivoa instrukcija postoji kada su instrukcije nekog niza nezavisne
tako da se preklapanjem mogu izvršavati paralelno.
Kao primer koncepta paralelizrna nivoa instrukcija, razmotrimo sada sledeća dva fragmenta koda
[JOUP89b]:
Laad R1 +- R2
Add R3 +- R3, "1" Add R4 +- R4, R2
Add R3 +- R3, "1" Add R4 +- R3, R2 Stare [R4] +- RO
Tri instrukcije sa leve strane su nezavisne i sve tri bi mogle da se izvršavaju paralelno. Nasuprot tome,
tri instrukcije sa desne strane ne mogu da se izvršavaju paralelno zato što druga instrukcija koristi
rezultat prve, a treća rezultat druge.
Stepen paralelizrna nivoa instrukcija određen je učestalošću istinskih zavisnosti podataka i
proceduralnih zavisnosti u kodu. Ovi faktori, dalje, zavise od arhitekture skupa instrukcija i od
aplikacije. Na paralelizam nivoa instrukcija značajno utiče parametar koji je [JOUP89b] nazvao vreme
kašnjenja operacije. U pitanju je dužina čekanja da rezultat jedne instrukcije postane dostupan za
operande sledeće instrukcije. Od ovog vremena kašnjenja zavisi koliko će ukupno kašnjenje
prouzrokovati zavisnost podataka ili proceduralna zavisnost.
Mašinski paralelizam
predstavlja merilo sposobnosti procesora da iskoristi paralelizam nivoa
instrukcija. Mašinski paralelizam zavisi od broja instrukcija koje se mogu preuzeti i izvršiti istovremeno
(broj paralelnih protočnih obrada), kao i od brzine i savršenosti mehanizama pomoću kojih procesor
119

što se instrukcije donose u parovima, sledeći par mora da čeka sve dok se par etapa za dekodiranje ne
oslobodi. Da bi se garantovalo završavanje po redu, ukoliko dođe do konflikta oko funkcionalne jedinice
ili ako je funkcionalnoj jedinici za generisanje rezultata potrebno više od jednog ciklusa, izdavanje
instrukcija se privremeno obustavlja.
U ovom primeru, od dekodiranja prve instrukcije, pa do zapisivanja poslednjih rezultata protekne
osam ciklusa.
Izdavanje u redosledu sa završavanjem preko reda Završavanjem preko reda kod skalarnih Rise
procesora poboljšavaju se performanse instrukcija za koje je potrebno više ciklusa. Na slici 14.4b
ilustrovano je korišćenje ove tehnike na superskalarnim procesorima. Instrukciji 12 dozvoljava se da se
izvrši pre instrukcije Il. To, dalje, omogućava raniji završetak instrukcije 13, čime se, u krajnjem
ishodu, uštedi jedan ciklus.
Završavanje preko reda omogućava da se u svakom trenutku u fazi izvršenja nalazi onoliko
instrukcija koliko maksimalno dozvoljava mašinski paralelizam svih funkcionalnih jedinica. Izdavanje
instrukcija obustaVlja se u slučaju konflikta oko resursa, zavisnosti podataka ili proceduralne
zavisnosti.
Pored već pomenutih ograničenja, postoji još jedna zavisnost koju smo ranije nazvali izlazna
zavisnost (ili zavisnost upisivanje-upisivanje). Ilustrovaćemo vam je pomoću sledećeg koda
(op se odnosi
na bilo koju operaciju):
Instrukcija 12 ne može da se izvrši pre instrukcije Il zato što joj je potreban rezultat koji Il
generiše u registru R3. Ovo je primer prave zavisnosti podataka, onakve kakvu smo opisali u odeljku 14.1.
Slično tome, instrukcija 14 mora da čeka instrukciju 13 zato što koristi njen rezultat. U kakvom su
odnosu instrukcije Ili I3? Ovde ne postoji zavisnost podataka, bar ne onakva kakvu smo pominjali.
Medutim, ukoliko se instrukcija 13 izvrši pre instrukcije
Il,
onda će iz registra R3 biti preuzeta
pogrešna vrednost za izvršenje instrukcije 14. Iz ovoga sledi da instrukcija 13 mora da se izvrši nakon
instrukcije Il kako bismo dobili valjane izlazne vrednosti. Da bi se ovo osiguralo, izdavanje treće
instrukcije se obustavlja ukoliko bi njen rezultat naknadno mogao da bude zamenjen nekom starijom
instrukcijom za čije je izvršenje potrebno više vremena.
Završavanje van redosleda zahteva složeniju logiku izdavanja instrukcija nego što je to slučaj kod
završavanja u redosledu. Pored toga, rukovanje prekidima i izuzecima ovde je komplikovanije. Kada se
dogodi prekid, izvršenje instrukcije se obustavlja u aktuelnoj tački kako bi se nastavilo kasnije.
Procesoru su neophodne garancije da će se u trenutku nastavka uzeti u obzir činjenica da su se
instrukcije koje su prouzrokovale prekid do tada možda već izvršile.
Izdavanje van redosleda sa završavanjem van redosleda Kod izdavanja uredosledu procesor će
dekodirati instrukcije samo do tačke u kojoj se pojavljuju zavisnost ili konflikt. Prekid u dekodiranju
instrukcija traje sve dok se konflikt ne razreši. Zbog toga procesor ne može da gleda ispred tačke
konflikta i potraži instrukcije koje su nezavisne od onih koje su već u protočnoj obradi i koje bi bilo
poželjno uvesti u protočnu obradu.
Da bi izdavanje van redosleda bilo moguće, neophodno je razdvojiti etape dekodiranja i izvršenja
protočne obrade. Ovo se postiže baferom koji se naziva instrukcijski okvir. Čim završi dekodiranje
instrukcije, procesor, u ovom slučaju, može da je smesti u instrukcijski okvir. Dok god ima mesta u ovom
baferu, procesor može da nastavi da preuzima i dekodira nove instrukcije. Kada funkcionalna jedinica
postane dostupna u etapi izvršenja, instrukcija se iz instrukcijskog okvira može izdati etapi izvršenja.
Na ovaj način može da se izda svaka instrukcija pod uslovom (I) da joj je potrebna neka funkcija koja je
raspoloživa i (2) da je ne blokiraju nikakvi konflikti ili zavisnosti.
Ovakva organizacija pruža procesoru mogućnost gledanja unapred i identifikovanja nezavisnih
121
instrukcija koje se mogu ubaciti u etapu izvršenja. Instrukcije se izdaju iz instrukcijskog prozora bez
mnogo poštovanja njihovog prvobitnog redosleda u programu. Kao i ranije, jedini zahtev je da se
program ponaša korektno.
Na slici 14.4c ilustrovali smo ovu politiku. Tokom svakog od prva tri ciklusa, po dve instrukcije se
donose u etapi za dekodiranje. U svakom ciklusu, a u skladu sa veličinom bafera, dve instrukcije se iz
etape za dekodiranje premeštaju u instrukcijski okvir. U ovom primeru moguće je izdati instrukciju 16
pre instrukcije 15 (podsećamo vas da 15 zavisi od 14, ali 16 ne zavisi). To znači da se u etapama
izvršenja i upisivanja štedi po jedan ciklus. U odnosu na sliku 14.4b, krajnja ušteda je jedan ciklus.
Na slici 14.4c nacrtali smo i instrukcijski okvir kako bismo vam ilustrovali njegovu ulogu. Ovaj prozor,
međutim, ne predstavlja novu etapu protočne obrade. Kada kažemo da se instrukcija nalazi u okviru, to
u stvari znači da procesor ima dovoljno informacija o njoj kako bi mogao da odluči kada da je izda.
Na politiku izdavanja i završetka van redosleda utiču ograničenja koja smo već pomenuli. Instrukcija
ne može da se izda ukoliko krši zavisnost ili dovodi do konflikta. Razlika je u tome što u ovoj politici
imamo veći broj raspoloživih instrukcija za izdavanje, čime se smanjuje verovatnoća da se protočna
obrada zaustavi. Međutim, ovde se pojavljuje i nova vrsta zavisnosti koju smo već nazvali antizavisnost
(ili zavisnost čitanja-upisivanja). KOd kojim smo se već bavili ilustrovaće nam ovu novu zavisnost:
11: R3 +- R3 op RS 12: R4 +- R3 + 1 13: R3 +- RS + 1 14: R7 +- R3 op R4
Izvršenje instrukcije 13 ne može da se završi pre nego što instrukcija 12 počne sa izvršenjem i
preuzme svoje operande. To je zato što instrukcija I3 ažurira registar R3 koji predstavlja izvorni
operand instrukcije 12. Termin
antizavisnost koristi se zato što ovo ograničenje podseća na istinsku
zavisnost podataka, ali je obrnuto: umesto da prva instrukcija generiše vrednost koju druga instrukcija
treba da koristi, ovde druga instrukcija uništava vrednost koju prva instrukcija koristi.
Preimenovanje registara
Kada su izdavanje instrukcija preko reda i njihovo završavanje preko reda dozvoljeni, povećava se
verovatnoća javljanja izlaznih zavisnosti i antizavisnosti. Ove zavisnosti se razlikuju od istinskih
zavisnosti podataka i konflikata oko resursa koji odražavaju tok podataka kroz program i sekvencu
izvršenja. Sa druge strane, izlazne zavisnosti i antizavisnosti javljaju se zato što registri više nisu u
skladu sa sledom vrednosti koji diktira tok programa.
Kada se instrukcije izdaju i kompletiraju u redosledu, sadržaj svakog registra može da se precizira
u svakoj tački izvršenja. Kod tehnika van redosleda, vrednosti registara ne mogu biti sasvim poznate u
svakoj vremenskoj tački samo na osnovu razmatranja sleda instrukcija koje diktira program. Zbog toga,
vrednosti dolaze u konflikt oko korišćenja registara, a procesor, da bi rešio ove konflikte, povremeno
mora da zaustavi protočnu obradu.
Antizavisnosti i izlazne zavisnosti predstavljaju primere konflikata oko skladištenja. Više instrukcija
konkuriše za korišćenje istih registarskih lokacija, što dovodi do ograničenja protočne obrade koja se
negativno odražavaju na performanse. Ovaj problem još više dolazi do izražaja prilikom korišćenja
tehnika za optimiziranje registara (poglavlje 13) zato što ove tehnike pokušavaju da maksimalno
poboljšaju korišćenje registara i samim tim povećavaju i broj konflikata oko skladištenja.
Jedna od metoda za prevazi1aženje ovih konflikata oko skladištenja bazira se na tradicionalnom
rešenju za konflikte oko resursa - njihovom dupliranju. U ovom kontekstu, ova tehnika naziva se
preimenovanje registara.
U osnovi, hardver procesora dinamički raspodeljuje registre i oni se
povezuju sa vrednostima koje su instrukcijama neophodne u različitim vremenskim tačkama. Kada se
generiše nova registarska vrednost (odnosno, kada se izvrši instrukcija koja ima registar kao odredišni
operand), njoj se dodeljuje novi registar. Sve naknadne instrukcije koje pristupaju toj vrednosti u vidu
122

Svaki procesor visokih performansi sa protočnom obradom mora na određeni način da se izbori sa
aspektom grananja. Primera radi, kod procesora Intel 80486, problem grananja rešava se donošenjem
instrukcije koja sledi odmah nakon grananja i spekulativnim donošenjem ciljne instrukcije grananja.
Međutim, zbog toga što između donošenja unapred i izvršenja postoje dva ciklusa protočne obrade, ova
strategija prilikom grananja pravi kašnjenje od dva ciklusa.
Pronalaskom RISC računara počela je da se primenjuje strategija odloženog grananja. Ona
procesoru omogućava da izračuna rezultat instrukcija o uslovnom grananju pre nego što unapred donese
bilo kakve upotrebljive instrukcije. Procesor tako uvek izvršava instrukciju koja sledi odmah nakon
grananja. Protočna obrada, zahvaljujući tome, ostaje puna dok procesor donosi novi niz instrukcija.
Kod superskalarnih računara strategija odloženog grananja nije toliko atraktivna, pre svega zato što
u slotu za kašnjenje treba da se izvrši više instrukcija, što prouzrokuje nekoliko problema povezanih sa
zavisnostima instrukcija. Stoga su se superskalarni procesori vratili tehnikama predviđanja grananja
koje su prethodile RISC procesorima. Kod nekih procesora kao što je, na primer, PowerPC 601,
primenjuje se jednostavna tehnika statičkog predviđanja grananja. Nešto savršeniji procesori, kao što
su PowerPC 620 ili Pentium 4, koriste dinamičko predviđanje grananja koje se bazira na analizi istorije
grananja.
Superskalarno izvršenje
Sada je pravi trenutak da vam pokažemo kako izgleda superskalarno izvršenje programa (slika 14.6).
Program koji treba da se izvrši sastoji se od linearne sekvence instrukcija. U pitanju je statički
program koji je napisao program er ili generisao kompajler. Proces donošenja instrukcija, u koji spada i
predviđanje grananja, formira dinamički niz instrukcija. Prilikom ispitivanja ovog niza u pogledu
zavisnosti, procesor može da ukloni sve veštačke zavisnosti. Procesor zatim upućuje instrukcije u okvir
za izvršenje. U ovom okviru instrukcije više nisu u rednom nizu, već se grupišu u skladu sa pravim
zavisnostima podataka koje između njih postoje. Nakon toga, procesor prelazi u fazu izvršenja svake
instrukcije, redosledom koji diktiraju prave zavisnosti podataka i dostupnost hardverskih resursa.
Konačno, instrukcije se konceptualno vraćaju u prvobitni redosled, a njihovi rezultati se zapisuju.
Poslednji korak na prethodnoj slici nazvali smo
predaja ili povlačenje
instrukcija. Ovaj korak
neophodan je iz sledećeg razloga. Zbog korišćenja više paralelnih protočnih obrada, instrukcije se mogu
izvršiti različitim redom u odnosu na statički program. Osim toga, primena predviđanja grananja i
spekulativnog izvršenja znači da neke kompletno izvršene instrukcije moraju da se napuste zato što nije
došlo do grananja na koje se one odnose. Prema tome, trajno skladištenje i registri vidljivi za program
ne mogu da se ažuriraju odmah nakon što se kompletira izvršenje instrukcija. Rezultati moraju da se
sačuvaju u nekoj formi privremenog skladišta koje će moći da koriste zavisne instrukcije. Tek kada se
ustanovi da bi redni model izvršio datu instrukciju, rezultati se pretvaraju u trajne.
Superskalarna implementacija
Na osnovu svega do sada rečenog, mogli bismo da izvedemo i nekoliko komentara koji se odnose na
hardver procesora koji je neophodan za primenu superskalarnog pristupa. [SMIT95] je naveo sledeće
ključne elemente:
Strategije donošenja instrukcija u kojima se, često predviđanjem ishoda instrukcija o
uslovnom grananju i donošenjem iza njega, istovremeno donosi više instrukcija. Ove funkcije
zahtevaju da se u protočnoj obradi koriste višestruke etapa za donošenje i dekodiranje
instrukcija, kao i logika za predviđanje grananja.
Logika za ustanovljavanje istinskih zavisnosti između vrednosti registara i mehanizmi za
124
komunikaciju ovih vrednosti sa etapama u kojima su neophodne tokom izvršenja.
Mehanizmi za paralelno iniciranje ili izdavanje više instrukcija.
Resursi za paralelno izvršavanje više instrukcija, uključujući tu i višestruke funkcionalne
jedinice protočne obrade i memorijske hijerarhije koje omogućavaju istovremeno
servisiranje više memorijskih referenciranja.
Mehanizmi za predaju stanja procesa u pravilnom redosledu.
Poglavlje 18
18.2 SIMETRIČNI MULTIPROCESORI
Sve donedavno, praktično svi personaini računari pojedinačnih korisnika i većina radnih stanica u sebi su
imali jedan mikroprocesor opšte namene. Porastom zahteva za bržim obavljanjem posla i stalnim padom
cena rnikroprocesora, isporučioci su ponudili sisteme sa SMP organizacijom. Izraz
SMP istovremeno
označava hardversku arhitekturu računara i ponašanje operativnog sistema koje odražava tu
arhitekturu. SMP sistem može se deftnisati kao samostalni računarski sistem sa sledećim
karakteristikama:
1. postoje dva ili više sličnih procesora uporedivih mogućnosti;
2. ovi procesori dele istu glavnu memoriju i U/I uređaje i međusobno su povezani magistralom ili
nekim drugim internim vezama, tako da je vreme pristupa memoriji približno isto za sve
procesore;
3. svi procesori dele pristup do U/I uređaja, ili preko istih kanala ili preko različitih kanala koji
obezbeđuju putanje do istih uređaja;
4. svi procesori mogu da izvršavaju iste funkcije (otuda potiče izraz
simetrično;
5. sistemom upravlja integrisani operativni sistem koji obezbeđuje međusobnu vezu između
procesora i njihovih programa na nivoima posla, zadatka, datoteke i elementa podataka.
Tačke od 1 do 4 trebalo bi da su jasne same po sebi. Tačka 5 ilustruje jednu od razlika u odnosu na
labavo spregnute sisteme sa više procesora, kao što je klaster. U ovom drugom, najmanja fizička celina
kojom su račun ari međusobno povezani obično je poruka ili kompletna datoteka. U SMP sistemu,
međusobne veza može se ostvariti na nivou pojedinačnih elementa podataka, pa stoga je moguć visok
stepen međusobne saradnje između procesora.
Operativni sistem SMP sistema raspoređuje procese ili niti između svih pro cesora. SMP
organizacija ima brojne potencijalne prednosti u odnosu na samostalni procesor, između ostalog:
performansa:
ukoliko bi se posao koji računar treba da obavi mogao organizovati tako da se isti
delovi posla mogu uraditi paralelno, tada će sistem sa više procesora pokazati bolju performansu
u odnosu na jedan procesor iste vrste (slika 18.3);
raspoloživost:
u simetričnom multiprocesoru, pošto svi procesori mogu da obave iste funkcije,
otkaz jednog od procesora neće zakočiti računar; umesto toga, sistem može nastaviti da radi sa
umanjenim performansama;
proširivost:
korisnik može da poboljša performanse sistema dodavanjem procesora;
prilagodljivost:
isporučioci mogu da ponude čitav niz proizvoda po različitim cenama i sa
drugačijim performansama na osnovu broja procesora ugrađenih u sistem.
Važno je napomenuti da su ovo samo potencijalne, ne uvek i sigurne prednosti. Operativni sistem mora
da obezbedi alate i funkcije kojima će se iskoristiti paralelizam u SMP sistemima.
Privlačnost SMP sistema je u tome da korisnik ne primećuje postojanje više procesora. Operativni
125

hardverski, a ne operativnim sistemom. Ovim pitanjem bavićemo se u odeljku 18.4.
Razmatranja projektovanja višeprocesorskog operativnog
sistema
SMP operativni sistem upravlja procesorima i ostalim resursima računara tako da korisnik ima utisak da
sistemskim resursima upravlja običan operativni sistem. U stvari, takva konfiguracija bi trebalo da
izgleda kao višeprogramski jednoprocesorski sistem. I u slučaju SMP sistema i sistema sa jednim
procesorom, više poslova ili procesa može biti istovremeno pokrenuto, a odgovornost je na operativnom
sistemu da raspoređuje njihovo izvršavanje i raspodeljuje resurse. Korisnik može da konstruiše
aplikaciju koja koristi više procesa ili više niti unutar procesa bez obzira na to da li na raspolaganju ima
jedan ili više procesora. Prema tome, višeprocesorski operativni sistem mora da obezbedi svu
funkcionalnost višeprogramskog sistema, a pored toga i dodatne mogućnosti kako bi se usaglasio rad više
procesora. Između ostalih, ključna pitanja prilikom njegovog projektovanja su sledeća:
istovremeni konkurentni procesi: potrebno je da rutine operativnog sistema budu sa višestrukim
ulazima (deljive) kako bi se omogućilo da nekoliko procesora istovremeno izvršava isti tok
instrukcija; kada više procesora izvršava iste ili različite del ove operativnog sistema, mora se
prikladno upravljati tabelama i upravljačkim strukturama operativnog sistema kako bi se izbeglo
uzajamno blokiranje ili nevažeće operacije;
rasporedivanje: bilo koji procesor može da obavlja raspoređivanje pa se moraju izbeći sukobi;
procesor koji obavlja raspoređivanje mora da spremne procese pridruži raspoloživim
procesorima;
sinhronizacija: kada više pokrenutih procesa ima potencijalni pristup do deljenih adresnih
prostora ili zajedničkih U/I resursa, mora se voditi računa o tome da se obezbedi efikasna
sinhronizacija; sinhronizacija je način na koji se prinudno sprovodi uzajamno izuzimanje i ređanje
događaja;
127
upravljanje memorijom: upravljanje memorijom na multiprocesoru mora se izboriti sa svim onim
problemima koji već postoje na računarima sa jednim procesorom, o kojima smo govorili u
poglavlju 8; pored toga, operativni sistem treba da iskoristi raspoloživi hardverski paralelizam,
kao što je memorija sa više pristupa, kako bi se postigle najbolje performanse; mehanizam
straničenja na različitim procesorima mora se koordinirati kako bi se postigla konzistentnost
kada nekoliko procesora dele stranicu ili segment i da bi se odlučilo o zameni stranice;
pouzdanost i otpornost na greške: operativni sistem treba da, u slučaju otkaza nekog procesora,
obezbedi postepeno opadanje performansi; deo operativnog sistema koji upravlja
raspoređivanjem procesa, kao i drugi delovi, moraju da prepoznaju gubitak procesora i da
saglasno tome preurede upravljačke tabele.
SMP organizacija velikih centraInih računara
Većina personalnih računara i radnih stanica organizovanih u SMP sisteme koriste strategiju
međusobnog povezivanja putem magistrale, kao što je prikazano na slici 18.5. Korisno je proučiti nešto
drugačiji pristup, koji se koristi u najnovijoj implementaciji IBM-ove familije velikih centrainih
računara serije z [SIEG04, MAK04] pod nazivom z990. Ova familija računara obuhvata čitav niz
računara, od jednoprocesorskih sa jednom glavnom memorijskom karticom do sistema visoke klase sa
48 procesora i 8 memorijskih kartica. Ključne komponente konfiguracije prikazane su na slici 18.6:
procesorski čip sa dva jezgra: na svim procesorskim čipovima nalaze se dva identična centralna
procesora (CP); centralni procesor je Cl SC superskalarni mikroprocesor, u kome je većina
instrukcija sa ožičenom implementacijom, a ostatak se izvršava vertikalnim mikrokodom; svi
centralni procesori obuhvata ju 256 KB LI instrukcione keš memorije i 256 KB LI keš memorije
za podatke;
L2 keš memorija: sve L2 keš memorije obuhvataju 32 MB; L2 keš memorija spakovana je u
klasterima od po pet, pri čemu svi klasteri podržavaju svih osam procesorskih čipova i
obezbeđuju pristup do celokupnog prostora glavne memorije;
sistemski upravljački element
(system control element, SCE): SCE upravlja komunikacijom
unutar sistema i ima centrainu ulogu u održavanju koherentnosti kešmemorije;
glavno upravljanje skaladištenjem
(main store control, MSC): MSC međusobno povezuje L2 keš
memorije i glavnu memoriju;
memorijske kartice: sve kartice sadrže 32 GB memorije; maksimalna memorija koju je moguće
konfigurisati sastoji se od 8 memorijskih kartica sa ukupno 256 GB; memorijske kartice
povezane su sa MSC preko sinhronih memorijskih interfejsa (SMI);
adapter memorijske magistrale
(memory bus adapter, MBA): MBA obezbeđuje interfejs za
različite tipove U/I kanala, saobraćaj koji se odvija ovim kanalima odlazi direktno do L2 keš
memorije.
Mikroprocesor u z990 je relativno neuobičajen u poređenju sa ostalim savremenim procesorima.
Mada je superskalarni, on instrukcije izvršava po strogom arhitek
128

A.1 Decimalni sistem
U svakodnevnom životu, za predstavljanje brojeva koristimo sistem zasnovan na decimalnim ciframa (0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 0) i taj sistem nazivamo decimalni sistem. Uzmite na primer šta broj 83 znači. On
znači osam desetica plus tri:
83 = (8 x 10) + 3
Broj 4728 znači četiri hiljade, sedam stotina, dve desetice, plus osam:
4728 = (4 x 1000) + (7 x 100) + (2 x 10) + 8
Za decimalni sistem se kaže da ima bazu, ili osnovu, od 10. To znači da se svaka cifra u broju množi
sa 10 podignutim na stepen koji odgovara položaju te cifre:
83 = (8 x 10 ) + (3 x 10 )
4728 = (4 X 10 ) + (7 x 10 ) + (2 x10 ) + (8 x 10 )
Isti princip važi i za decimalne razlomke, samo što se koristi 10 podignut na negativni stepen. Prema
tome, decimalni razlomak 0,256 znači 2 desetih plus 5 stotih plus 6 hiljaditih.
0,256 = (2 X 10 ) + (5 X 10 ) + (6 X 10 )
Broj koji ima celobrojni i razlomijeni deo ima cifre sa pozitivnim i negativnim stepenima broja 10:
472,256 = (4 X10 ) + (7 X10 ) + (2 X10 ) + (2 X 10 ) +
(5 X 10 ) + (6 X 10 )
U opštem slučaju, za decimalno predstavljanje broja
X = {. . . d2d1d0,d-1d-2d-3. .} ,
njegova vrednost je:
X =
x 10
i
)
A.2 BINARNI SISTEM
U decimalnom sistemu koristi se 10 različitih cifara za predstavljanje brojeva sa osnovom 10. U
binarnom sistemu imamo samo dve cifre, 1 i 0. Znači, brojevi u binarnom sistemu predstavljeni su sa
osnovom 2.
Da bismo se bolje razumeli, ponekad ćemo na broj staviti indeks kako bismo naznačili njegovu
osnovu. Na primer, 83 i 4728
su brojevi predstavljeni decimalnim načinom pisanja ili, kraće,
decimalni brojevi. Cifre 1 i 0 u binarnom načinu pisanja imaju isto značenje kao i u decimalnom načinu
pisanja:
0 = 0
1 = 1
Za predstavljanje većih brojeva, kao i sa decimalnim načinom pisanja, vrednostsvake cifre u binarnom
broju zavisi od njenog položaja:
10 = (1 X 2 ) + (0 x 2°) = 2
11 = (1 X 2 ) + (1 x 2°) = 3
100 = (1 X 2 ) + (0 x 2 ) + (0 x 2°) = 4
i tako dalje. I u binarnom sistemu, razlomijene vrednosti predstavljaju se stepenima osnove:
1001,101 = 2 + 2° + 2 + 2 =9,625
U opštem slučaju, za binarno predstavljanje broja
Y = {. . . b b b b b …}
njegova vrednost je:
130
y = ∑ (b x2 )
A.3 PRETVARANJE BINARNIH U DECIMALNE BROJEVE
Jednostavno je pretvoriti broj napisan binarnom notacijom u decimalni. U stvari, već smo pokazali
nekoliko primera u prethodnom pododeljku. Potrebno je samo pomnožiti sve binarne cifre odgovarajućim
stepenom broja 2 i sabrati rezultate.
Za pretvaranje decimalnih brojeva u binarne brojeve, celobrojni i razlomljeni delovi posebno se
preračunavaju.
Celobrojni delovi
Za celobrojni deo, prisećate se binarne notacije, celi brojevi predstavljeni kao
Pretpostavimo da je potrebno pretvoriti decimalni ceo broj
N u binarni o liko N podelimo sa 2, u
decimalnom sistemu, dobili bismo količnik NI i osta1 možemo napisati kao:
Posle toga, delimo količnik NI sa 2. Dobićemo novi količnik
N2 i novi o~
Prema tome:
(osim za decimalne cele brojeve O i
1,
kojima odgovaraju binarni brojevi O i
1,
respektivno) i ostatak
Rm-2' koji je O ili 1. Prema tome:
što je binarni oblik broja
N. Dakle, pretvaranje sa osnove 10 na osnovu 2 vršimo ponavljajući deljenje
brojem 2. Ostaci i poslednji količnik, 1, daju nam, po opadajućem redosledu važnosti, binarne cifre
broja
N. Na slici A.1 prikazana su dva primera.
Razlomci
Za razlomački deo, prisećate se binarne notacije, broj sa vrednošću između 0 i 1 prikazuje se kao:
i ima vrednost
Ovaj izraz nagoveštava tehniku za pretvaranje. Pretpostavimo da želimo da pretvorimo broj
F (O < F
< 1) sa decimalne na binarnu notaciju. Znamo da se broj
F može izraziti u obliku:
Ukoliko bismo
F pomnožili sa 2, dobili bismo:
Iz ove jednačine vidimo da je celobrojni deo (2 x
F), koji mora biti ili O ili 1, pošto je 0< F < 1,
jednostavno b_I. Tako da možemo reći (2 x
F) = b-I + FI' gde je 0< FI < I i gde je:
Da bismo pronašli b
ponavljamo postupak. Prema tome, algoritam za pretvaranje obuhvata ponavljanje
množenjem brojem 2. Pri svakom koraku, razlomljeni deo broja iz prethodnog koraka množi se brojem 2.
Cifre levo od decimalnog zareza u proizvodu biće 0 ili 1 i daju binarni prikaz, počevši najznačajnijom
cifrom. Razlomijeni deo proizvoda koristi se kao množilac u narednom koraku. Na slici A.2 prikazana su
dva primera.
Postupak nije obavezno tačan; to jest, za decimalni razlomak sa konačnim brojem cifara možda će
biti potreban binarni razlomak sa beskonačnim brojem cifara. U takvim slučajevima, algoritam za
pretvaranje se zaustavlja posle unapred određenog broja koraka, zavisno od željene tačnosti.
A.4 HEKSADECIMALNA NOTACIJA
131

BULOVA ALGEBRA
Digitalna elektronska kola u digitalnim računarima i drugim digitalnim sistemima su projektovana, a
njihovo ponašanje se analizira, korišćenjem matematičke discipline poznate kao
Bulova algebra. Ovaj
naziv dat je u čast engleskog matematičara Džordža Bula (George Boole), koji je 1854. godine u svojoj
raspravi
Istraživanje zakonitosti mišljenja na kojima se zasnivaju matematičke teorije logike i
verovatnoće predložio osnovne principe ove algebre. Godine 1938., Klod Šenon (Claude Shannon),
istraživač u Elektrotehničkom odseku Univerziteta M.I.T., predložio je da se Bulova algebra koristi za
rešavanje problema u električnim kolima sa relejnim prekidačima [SHAN38]. Od tada se Šenonova
tehnika koristi za analizu i projektovanje elektronskih digitalnih kola. Pokazalo se da je Bulova algebra
pogodan alat u dve oblasti:
analiza:
to je ekonomičan način za opisivanje funkcionisanja digitalnih kola;
projektovanje:
može se primeniti za razvoj pojednostavljene implementacije date
matematičke funkcije.
Kao bilo koja algebra, i Bulova algebra koristi promenljive i operacije, samo što su u ovom slučaju te
promenljive i operacije logičke promenljive i logičke operacije. PromenIjive mogu imati vrednost
1
(TAČNO)
ili
0 (NETAČNO).
Osnovne logičke operacije su
I, ILI i NE
, koje se simbolično
predstavljaju tačkom, znakom plus i nadvlačenjem:
A I B = A B
A ILI B = A+B
NE A =
Operacija
I
proizvodi vrednost tačno (binarnu vrednost 1) ako i samo ako je vrednost oba njena
operanda tačno. Operator ILI proizvodi vrednost tačno ako bilo koji ili oba njegova operanda imaju
vrednost tačno. Unarna operacija NE preinačuje vrednost svog operanda. Uzmimo, na primer,
sledećujednačinu:
D = A + (B ∙ C)
D je jednako 1 ako je A jednako 1 ili ako su istovremeno B = 0 i C = 1. Inače, D je jednako O.
Neophodno je skrenuti pažnju na nekoliko stvari koje se tiču ovog načina obeležavanja. Bez zagrada,
operacija I ima prednost u odnosu na operaciju ILI. Takođe, kada je jasno o čemu se radi, operacija I
jednostavno se piše bez tačke. Prema tome, sve jednačine:
A + B C = A + (B C) = A + BC
znače: izračunaj logičko I od B i C, a zatim izračunaj logičko
ILI
od tog rezultata i A.
U tabeli B.1 definisane su osnovne logičke operacije u obliku poznatom kao
tablica istinitosti, u kojoj
su jednostavno navedene vrednosti operacija za sve moguće kombinacije vrednosti operanada. U ovoj
tabeli takođe su navedena tri korisna operatora: XOR, NI i NILI. Ekskluzivno ILI (XOR) od dva logička
operanda je I ako i samo ako jedan od tih operanda ima vrednost 1. Funkcija NI je komplement (NE)
funkcije I, a NILI je komplement ILI:
A NI B = NE(A I B) =
A NILI B = NE(A ILI B)
Kao što ćemo videti, ove tri nove operacije mogu biti veoma korisne za implementaciju izvesnih
digitalnih kola.
U tabeli B.2 navedeni su ključni identiteti Bulove algebre. Jednačine su poređane u dve kolone kako
bi se prikazala komplementarna, ili dvostruka, priroda operacija I i ILI. Postoje dve klase identiteta:
osnovna pravila (ili
postulati), koji se daju bez dokazivanja, i ostali identiteti koje se mogu izvesti iz
133
osnovnih postulata. Postulati definišu način na koji se Bulovi izrazi tumače. Skrećemo pažnju na jedan
od dva zakona distributivnosti pošto se razlikuje od onoga što možemo pronaći u običnoj algebri:
A + (B C) = (A + B) (A + C)
Dva poslednja izraza nazivaju se De Morganove teoreme. Možemo ih napisati na drugačiji
način:
A NILI B = A I B
A NI B = A ILI B
Pozivamo čitaoce da dokažu tačnost izraza iz tabele B.2 zamenjujući promenljive A, B i C stvarnim
vrednostima (jedinicama i nulama).
ELEKTRONSKA PREKIDAČKA KOLA
Osnovni element za gradnju svih digitalnih logičkih kola jeste
elektronsko prekidačko kolo.
Logičke
funkcije se implementiraju međusobnim povezivanjem prekidačkih kola.
Elektronsko prekidačko kolo je elektronsko kolo koje proizvodi izlazni signal koji je jednostavna
Bulova operacija njegovih ulaznih signala. Osnovna prekidačka kola koja se koriste u digitalnim logičkim
kolima su I, ILI, NE, NI i NILI kola. Na slici B.1 prikazano je tih pet prekidačkih kola. Prekidačka kola
definišu se na tri načina: grafičkim simbolima, algebarskim obeležavanjem i tablicom istinitosti. Simboli
koji se koriste na ovoj slici i u celom dodatku su prema IEEE standardu, IEEE Std. 91. Obratite pažnju
na to da se operacija inverzije (NE) naznačava kružićem.
Svako prekidačko kolo ima dva ulaza i jedan izlaz. Kada se vrednosti na ulazu promene, ispravan
izlazni signal pojavljuje se gotovo trenutno, sa kašnjenjem samo za vreme prostiranja signala kroz
prekidačko kolo (ovo vreme poznato je kao
kašnjenje prekidačkog kola). Njegov značaj razmatra se u
odeljku B.3.
Pored prekidačkih kola prikazanih na slici B.1, mogu se koristiti prekidačka kola sa tri, četiri ili više
ulaza. Prema tome, X + Y + Z može se implementirati sa samo jednim ILI kolom sa tri ulaza.
Obično, pri implementaciji se ne koriste sve vrste prekidačkih kola. Projektovanje i proizvodnja su
jednostavniji ukoliko se koriste samo jedna ili dve vrste prekidačkih kola. Prema tome, veoma je važno
utvrditi
funkcionalno kompletan skup prekidačkih kola. To znači da se bilo koja Bulova funkcija može
implementirati korišćenjem samo prekidačkih kola iz određenog skupa. Funkcionalno kompletni skupovi
su sledeći:
I, ILI, NE;
I, NE;
ILI, NE;
NI;
NILI.
Jasno je da I, ILI i NE kola sačinjavaju funkcionalno kompletan skup pošto predstavljaju tri
operacije Bulove algebre. Da bi I i NE kola formirala funkcionalno kompletan skup, mora postojati način
kojim bi se operacija ILI sintetizovala od I i NE operacija. Ovo se može učiniti primenom De Morganove
teoreme:
A+B=
A ILI B = NE((NE A) I (NE B))
Slično, operacije
ILI
i NE su funkcionalno kompletne pošto se mogu iskoristiti za sintetizovanje I
134

Ovaj izraz napisan je u obliku
proizvoda suma (product od sums, POS) i prikazan je na slici B.5. Jasnoće
radi, nisu prikazana NE kola. Umesto toga, pretpostavlja se da postoje svi ulazni signali i njihovi
komplementi. Ovim se pojednostavljuje šema logičkih kola, a ulazi u prekidačka kola mnogo su
očigledniji.
Prema tome, Bulove funkcije mogu se realizovati u obliku sume proizvoda ili proizvoda suma. Na
osnovu do sada rečenog, izgleda kao da izbor zavisi od toga da li tablica istinitosti sadrži više jedinica ili
više nula: u sumi proizvoda postoji jedan element izraza za svaku 1, a proizvod suma ima po jedan
element izraza za svaku 0. Međutim, u obzir se moraju uzeti i druge činjenice:
često je iz tablice istinitosti moguće razviti jednostavniji Bulov izraz nego što su
suma proizvoda ili proizvod suma;
ponekad je za implementaciju određene funkcije bolje iskoristiti samo jednu
vrstu prekidačkih kola (NI ili NILI).
Značaj prvog stava je u tome da je, sa jednostavnijim Bulovim izrazima, potrebno manje prekidačkih
kola za implementaciju određene funkcije. Uprošćavanje funkcija može se postići na tri načina:
algebarskim uprošćavanjem,
Karnoovim mapama,
Kvin - Mek Klaskijevim tabelama.
Algebarsko uprošćavanje
Algebarsko uprošćavanje vrši se primenom identiteta iz tabele B.2 kako bi se
dobio Bulov izraz sa manje elemenata.
Na primer, razmotrimo ponovo jednačinu (B.1). Uz malo razmišljanja, čitalac se može uveriti da joj
je ekvivalentan izraz:
F = AD + BC
(B.3)
Ili, još jednostavnije:
F = B ( + C)
Ovaj izraz može se implementirati kao što je prikazano na slici B.6. Uprošćavanje jednačine (B.1)
obavljeno je prostim posmatranjem. Za složenije izraze neophodan je mnogo sistematičniji pristup.
Karnoove mape
Karnoove mape su zgodan način za prikazivanje, u cilju uprošćavanja, Bulovih funkcija sa
manjim brojem (najviše četiri) promenIjivih. Mapa je niz od 2 kvadrata, koji predstavljaju sve moguće
kombinacije vrednosti
n binarnih promenljivih. Na slici B. 7 a prikazana je mapa od četiri kvadrata za
funkciju sa dve promenljive. Zato što nam je to kasnije potrebno, vrlo je važno poređati kombinacije po
redosledu 00, 01, 11, 10. Pošto se kvadrati koji odgovaraju određenim kombinacijama koriste za
zapisivanje informacija, ove kombinacije se obično pišu iznad kvadrata. U slučaju tri promenljive, prikaz
je dat u obliku od osam kvadrata (slika B. 7b), pri čemu je vrednost jedne od promenIjivih upisana levo
od kvadrata, a vrednosti ostale dve promenIjive iznad kvadrata. Za četiri promenljive potrebno je 16
kvadrata, poređanih onako kako je prikazano na slici B. 7 c.
Mapa se za predstavljanje Bulove funkcije koristi na sledeći način. Svaki kvadrat odgovara
jedinstvenom proizvodu u obrascu sume proizvoda, pri čemu vrednost 1 odgovara određenoj
promenljivoj, a vrednost 0 odgovara logičkom NE te promenljive. Prema tome, proizvod A odgovara
četvrtom kvadratu sa slike B.7a. Za sve takve proizvode u funkciji, u govarajući kvadrat smešta se 1.
Prema tome, za primer sa dve promenljive, ova mapa odgovara A + AB. Za datu tablicu istinitosti neke
Bulove funkcije, pravljenje mape vrlo je jednostavno: za sve kombinacije vrednosti promenljivih, koje u
136
tablici istinitosti proizvode vrednost 1, u odgovarajuće polje na mapi upisuje se 1. Na slici B. 7b prikazan
je rezultat za tablicu istinitosti iz tabele B. 3. Da bi se Bulov izraz pretvorio u mapu, neophodno je prvo
taj izraz prevesti u ono što se naziva
kanonički oblik: svaki element izraza mora da sadrži sve
promenljive. Tako, na primer, ukoliko imamo jednačinu (B.3), prvo je moramo proširiti u puni oblik
jednačine (B. 1 ), a zatim je pretvoriti u odgovarajuću mapu.
Obeležavanje koje se koristi na slici B.7d ističe međusobni odnos između promenljivih i redova i
kolona mape. Ovde imamo dva reda obuhvaćenih oznakom A, i to onih u kojima promenljiva A ima
vrednost 1; redovi koji nisu obuhvaćeni oznakom A su oni u kojima je A jednako 0; slično je za B, C i D.
Pošto se mapa funkcije napravi, možemo napisati jednostavan algebarski izraz za nju, vodeći računa
o rasporedu jedinica na mapi. Princip je sledeći. Bilo koja dva susedna kvadrata razlikuju se samo po
jednoj promenljivoj. Ukoliko oba susedna kvadrata imaju ulaznu vrednost 1, tada se odgovarajući
element proizvoda razlikuje samo po jednoj promenljivoj. U takvom slučaju, ta dva elementa mogu se
spojiti uklanjanjem te promenljive. Na primer, na slici B.8a, za dva susedna kvadrata odgovarajuća su
dva elementa ABCD i ABCD. Prema tome, funkcija koju izražavaju je:
ABCD + ABCD = ABD
Ovaj postupak može se proširiti na nekoliko načina. Prvo, princip susednih kvadrata može se proširiti
tako da obuhvati kvadrate koji se nalaze na ivici mape. Prema tome, kvadrat na vrhu neke kolone
susedan je kvadratu na dnu te kolone, a krajnje levi kvadrat u nekom redu susedan je odgovarajućem
kvadratu krajnje desno. Ovi uslovi prikazani su na slikama B.8b i c. Drugo, možemo grupisati ne samo 2
kvadrata, nego
2 susednih kvadrata (to jest, 4, 8 itd.). Sledeća tri primera na slici B.8 prikazuju
grupisanje po 4 kvadrata. Obratite pažnju na to da se u ovom slučaju mogu odstraniti dve promenljive.
Poslednja tri primera prikazuju grupisanje od 8 kvadrata, koje omogućava da se odstrane tri
promenljive.
Ova pravila možemo ukratko svesti na sledeće:
Između označenih kvadrata (kvadrata sa 1), pronađite one koji pripadaju najvećem jedinstvenom
bloku od 1, 2, 4 ili 8 i zaokružite te blokove.
Izaberite dodatne blokove sa označenim kvadratima tako da budu što je moguće veći, a da ih ima
što je moguće manje, ali tako da obuhvatite svaki obeleženi kvadrat najmanje jednom. Rezultat u
nekim slučajevima možda neće biti jedinstven. Na primer, ukoliko neki obeleženi kvadrat može
da se pripoji sa dva druga kvadrata, a nema četvrtog obeleženog kvadrata kako bi se upotpunila
veća grupa, tada treba napraviti izbor između dva moguća načina za grupisanje od dva obeležena
kvadrata. Kada zaokružujete grupe, možete koristiti istu vrednost 1 više puta.
Nastavite da crtate kružiće oko pojedinačnih obeleženih kvadrata ili parova susednih obeleženih
kvadrata ili grupa od četiri, osam i tako dalje, a tako da svi obeleženi kvadrati pripadaju bar
jednom krugu; tada koristite što je manje moguće tih blokova kojima su obuhvaćeni svi obeleženi
kvadrati.
Na slici B.9a, na osnovu tabele B.3, prikazan je postupak uprošćavanja. Ukoliko bilo koja izdvojena
jedinica ostane posle grupisanja, tada se sve one zaokružuju kao grupe jedinica. Konačno, pre nego što
mapa postane uprošćen Bulov izraz, sve grupe jedinica koje su potpuno preklopljene ostalim grupama
mogu se ukloniti. To je prikazano na slici B.9b. U ovom slučaju, horizontalna grupa je suvišna i ne mora
se uzeti u obzir prilikom pravljenja Bulovog izraza.
Potrebno je pomenuti još jednu osobinu Karnoovih mapa. U nekim slučajevima, izvesne kombinacije
vrednosti promenljivih se nikada ne javljaju, pa se prema tome odgovarajući izlazi nikada ne dešavaju.
Za njih se kaže da su to stanja o kojima "ne treba brinuti". Za takva stanja se u odgovarajući kvadrat
137

tabela. Potom se druga tabela obrađuje na isti način kao i prva. To jest, elementi koji se razlikuju po
samo jednoj promenljivoj se obeležavaju i pravi se novi element za treću tabelu. U ovom primeru, treća
tabela koja se dobija sadrži samo jedan element: BD.
U opštem slučaju, ovaj postupak bi se nastavio sve dok se ne dobije tabela u kojoj nema preklapanja.
U ovom slučaju, za to su nam bile potrebne tri tabele.
Po završetku postupka koji smo upravo opisali, odstrani ćemo većinu mogućih elemenata određenog
izraza. Elementi koji nisu odstranjeni koriste se za konstruisanje matrice, kao što je prikazano u tabeli
B.6. Svaki red u ovoj matrici odgovara jednom od elemenata koji nisu odstranjeni (nisu imali znak
potvrde) u svim tabelama koje smo do sada koristili. Kolone odgovaraju elementima u prvobitnom izrazu.
Znak X smešten je u svim presecima redova i kolona u kojima je element iz reda "usaglašen" sa
elementom iz kolone. To jest, promenljive koje postoje u elementu iz reda imaju istu vrednost kao i
promenljive koje postoje u elementu iz odgovarajuće kolone. Posle toga, zaokružite sve znakove X koji
su jedini u pojedinim kolonama. A zatim naertajte kvadratić oko svakog znaka X u svim redovima u kojim
postoji zaokruženo X. Ako u svim kolonama imamo po jedan zaokružen znak X ili znak X u kružiću,
završili smo posao, a oni elementi u redovima čiji je znak X označen sačinjavaju sveden izraz. Prema
tome, u našem primeru, konačni izraz je:
ABC + ACD + ABC + A CD
U slučajevima kada u nekim kolonama nema ni kružnica ni kvadratića, potrebno je uraditi još nešto. U
suštini, dodajemo elemente u redove dok sve kolone ne budu obuhvaćene.
Ponovimo ukratko način na koji Kvin - Mek Klaskijeva metoda radi kako bismo se uverili da time
postižemo ono što nam treba. Prva faza ovog postupka je sama po sebi jasna. Njome se uklanjaju
nepotrebne promenljive u elementima proizvoda. Prema tome, izraz ABC + ABC- je ekvivalentan izrazu
AB pošto:
ABC + ABC = AB(C + C) = AB
Posle uklanjanja promenijivih, ostaje nam izraz koji je očigledno ekvivalentan prvo bitnom izrazu.
Međutim, u tom izrazu mogu postojati suvišni elementi, baš kao što smo tražili suvišne grupe u Karnoovoj
mapi. Pakovanjem u obliku matrice obezbeđujemo da su svi elementi iz prvobitnog izraza obuhvaćeni i da
je to urađeno na takav način da se što je više moguće smanji broj elemenata u konačnom izrazu.
Implementacija NI i NILI kola
Još nešto o čemu treba voditi računa prilikom implementacije
Bulovih funkcija tiče se toga koja će se prekidačka kola koristiti. Često je poželjno implementirati
Bulovu funkciju samo
NI
kolima ili samo NIU kolima. Mada to nisu implementacije sa najmanjim mogućim
brojem prekidačkih kola, prednost im je što se koristi samo jedna vrsta prekidačkih kola, čime se
pojednostavljuje proces proizvodnje. Razmotrimo još jednom jednačinu (B.3):
F = B (A + C)
Pošto je komplement komplementarne vrednosti ta originalna vrednost,
F = B(A + C) = (AB) + (BC)
Primenom De Morganove teoreme, dobijamo izraz
F = (AB) (BC)
koji se sastoji od tri NI kola, kao što je prikazano na slici B.ll.
Multiplekseri
Multiplekser povezuje više ulaza sa jednim izlazom. U pojedinim trenucima bira se neki od ulaza i
propušta na izlaz. Opšti prikaz u obliku blok dijagrama dat je na slici B.12 i predstavlja multiplekser sa 4
ulaza i jednim izlazom. Imamo četiri ulazne linije, označene D0, D1, D2 i D3. Bira se jedna od tih linija,
139
čime se obezbeđuje izlazni signal F. Za biranje jednog od četiri moguća izlaza, neophodan je 2-bitni kod
za biranje koji se implementira u obliku dve linije za biranje, obeležene S 1 i S2.
Primer multipleksera sa četiri ulaza i jednim izlazom definisan je tablicom istinitosti u tabeli B. 7.
Ovo je pojednostavljeni oblik tablice istinitosti. Umesto prikazivanja svih mogućih kombinacija ulaznih
promenijivih, u njoj su prikazani izlazi kao podaci iz linija DO, Dl, D2 ili D3. Na slici B.13 prikazana je
implementacija korišćenjem I, ILI i NE kola. S1 i S2 su povezani sa I kolima na takav način da će, za
bilo koju kombinaciju S1 i S2, tri I kola imati izlaz 0. Četvrto I kolo imaće izlaz jednak vrednosti iza-
brane linije, koja može biti ili 0 ili 1. Prema tome, tri ulaza u ILI kolo su uvek 0, a izlaz iz ILI
kola biće
jednak vrednosti ulaza izabranog prekidačkog kola. Koristeći ovakvu organizaciju, jednostavno je
konstruisati multipleksere sa 8 ulaza i jednim izlazom, 16 ulaza i jednim izlazom i tako redom.
Multiplekseri se koriste u digitalnim kolima za upravljačke signale i usmeravanje podataka. Primer je
učitavanje programskog brojača (PC). Vrednost koja se učitava u programski brojač može da potiče iz
jednog od nekoliko različitih izvora:
binarni brojač ako programski brojač treba uvećati za sledeću instrukciju;
instrukcijski registar ukoliko je upravo izvršena instrukcija grananja sa direktnom adresom;
izlaz iz aritmetičko-logičke jedinice ukoliko instrukcija grananja adresu određuje koristeći
pomeraj.
Ovi različiti ulazi mogli bi se povezati sa ulaznim linijama multipleksera, sa programskim brojačem
povezanim sa izlaznom linijom. Linija za biranje određuje koja se vrednost učitava u programski brojač.
Pošto programski brojač sadrži više bitova, koristi se više multipleksera, jedan po bitu. Na slici B.14 to
je prikazano za 16-bitnu adresu.
Dekoderi
Dekoder je kombinatorno kolo sa više izlaznih linija, pri čemu u jednom trenutku postoji signal samo na
jednoj od njih, u zavisnosti od oblika signala ulaznih linija. U opštem slučaju, dekoder ima
n ulaza i 2
izlaza. Na slici B.15 prikazan je dekoder sa tri ulaza i osam izlaza.
Dekoderi se mnogo koriste u digitalnim računarima. Jedan primer je dekodiranje adresa. Pretpostavimo da
želimo da konstruišemo memoriju od 1 K-bajta koristeći četiri 256 x 8-bitnih RAM čipova. Želimo jedinstven
adresni prostor, koji se može raspodeliti na sledeći način:
Adresa
Čip
0000-00FF
o
0100-01FF
1
0200-02FF
2
0300-03FF
3
Svaki čip zahteva 8 adresnih linija i njih obezbeđuje 8 bitova nižeg reda adrese. Dva bita višeg reda
10-bitne adrese koristi se za biranje jednog od četiri RAM čipova. U tu svrhu koristi se dekoder sa 2
ulaza i 4 izlaza, čiji izlazi uključuju pojedine čipove, kao što je prikazano na slici B.16. .
Sa dodatnom ulaznom linijom dekoder se može koristiti kao demultiplekser. Demultiplekser vrši
inverznu funkciju u odnosu na multiplekser; on povezuje jedan ulaz sa jednim od nekoliko izlaza. Ovo je
prikazano na slici B.17. Kao i ranije,
n ulaza se dekoduju kako bi se proizveo jedan od 2 izlaza. Sve 2
izlazne linije su preko I kola povezane sa podatko na ulaznj liniji. Na taj način, n ulayi delujukao adresa
za biranje određene izlazne linije, a vrednost podatke na ulaznoj liniji (1 ili 0) preusmerava se na tu
izlaznu liniju.
140

ulaz u ROM memoriju (adresne linije) uvek proizvode isti izlaz (linije podataka). Pošto izlazi zavise samo
od postojanja ulaza, ROM je u suštini kombinatorno kolo.
ROM memorija se može implementirati dekoderom i skupom
ILI
kola. Za primer ćemo uzeti tabelu
B.8. Ona se može posmatrati kao tablica istinitosti sa četiri ulaza i četiri izlaza. ~a svaku od 16 mogućih
ulaznih vrednosti, prikazan je skup odgovarajućih vrednosti na izlazu. Takođe, možemo je posmatrati
kao definiciju sadržaja 64-bitne ROM memorije koja se sastoji od 16 reči od po 4 bita. Četiri ulaza
određuju adresu, a četiri izlaza određuju sadržaj lokacije utvrđene tom adresom. Na slici B.20
prikazano
je kako bi se ova memorija mogla implementirati korišćenjem dekodera sa četiri-ulaza i 16 izlaza i četiri
ILI
kola. Kao i u slučaju PLA čipova, koristi se uobičajena organizacija, a pravljenjem međusobnih veza
postiže se željeni rezultat.
Sabirači
Do sada smo videli kako se međusobnim povezivanjem prekidačkih kola implementiraju funkcije kao što
su usmeravanje signala, dekodovanje i ROM memorija. Jedna
vrlo važna oblast koju dosad nismo spomenuli je aritmetika. Ukratko ćemo obraditi i tu oblast
razmatrajući funkciju sabiranja.
Binarno sabiranje se razlikuje od Bulove algebre po tome što rezultat obuhvata i element prenosa.
Dakle:
Međutim, sabiranje se može obaviti Bulovim izrazima. U tabeli B.9a prikazali smo logiku za sabiranje
dva ulazna bita kojim se proizvodi I-bitna suma i prenosni bit. Ova tablica istinitosti može se
jednostavno implementirati digitalnom logikom. Međutim, ne zanima nas sabiranje samo jednog para
bitova. Umesto toga želeli bismo da sabiramo dva n-bitna broja. Ovo se može obaviti postavljanjem
skupa sabirača tako da se prenosni bit iz jednog sabirača dostavi kao ulaz sledećem. Na slici B.21
prikazan
je 4-bitni sabirač........................................................................................»HO.
Da bi više bitni sabirač radio, svi jednobitni sabirači moraju imati tri ulaza, u koje spada i prenosni
bit iz sabirača koji je sledeći po opadajućoj važnosti. Prilagođena tablica istinitosti data je u tabeli
B.9b. Dva izlaza mogu se izraziti kao:
Na slici B.22 prikazana je implementacija u kojoj se koriste I,
ILI
i NE kola.
Sada imamo neophodnu logiku za implementaciju višebitnog sabirača, kao što je prikazano na slici
B.23. Pošto izlaz iz svakog sabirača zavisi od prenosnog bita iz prethodnog sabirača, postoji značajno
kašnjenje od bita najmanjeg značaja do bita najvećeg značaja i to morate imati na umu Svi jednobitni
sabirači pored toga imaju i izvesno kašnjenje svojih prekidačkih kola, pa se sva ta kašnjenja
akumuliraju. Za veće sabirače, tako akumulirano kašnjenje može postati neprihvatljivo veliko.
Ukoliko bi se vrednosti prenosa mogle odrediti bez potrebe da se prolazi kroz sva prethodna stanja,
tada bi svi jednobitni sabirači mogli da rade nezavisno, pa se kašnjenje ne bi akumuliralo. Ovo se može
postići pristupom poznatim kao
predvidanje prenosa. Razmotrimo još jednom 4-bitni sabirač kako bismo
objasnili ovaj pristup.
Želeli bismo da dobijemo izraz kojim bismo odredili prenos na izlazu sabirača na bilo kojem nivou,
142
bez obzira na prethodne vrednosti prenosa. Imamo:
Ovaj postupak se može ponoviti za proizvoljno dug sabirač. Svaki element prenosa može se izraziti u
obliku sume proizvoda kao funkcija samo prvobitnih ulaza, nezavisno od prenesene vrednosti. Na taj
način se javlja samo kašnjenje dva nivoa prekidačkih kola, bez obzira na dužinu sabirača.
Za veće brojeve, ovakav pristup postaje izuzetno složen. Za izračunavanje izraza za najznačajniji
bit n-bitnog sabirača potrebno je
ILI
kolo sa
n - I ulazom i n I kola sa 2 do n + I ulazom. Zbog toga se
potpuno predviđanje prenosa obično obavlja samo za 4 do 8 bitova istovremeno. Na slici B.23 prikazano
je kako se 32-bitni sabirač može konstruisati od četiri 8-bitna sabirača. U ovom slučaju, prenosni bit
mora da prođe kroz četiri 8-bitna sabirača, ali će kroz njih proći mnogo brže nego kroz trideset i dva
I-bitna sabirača.
Sekvencijalna kola
143

Primećujete da ulazi S = 1 i R = 1 nisu dozvoljeni pošto bi proizveli protivurečan izlaz (izlazi Q i
Q jednaki O). Ova tabela može se prikazati u sažetijem obliku kao što je dato u tabeli B.lOb.
Ilustracija ponašanja S-R elektronskog prekidača prikazana je u tabeli B.lOc.
S-R bistabilni multivibrator pobuđen generatorom takta
Izlaz S-R elektronskog prekidača se
menja, posle kraćeg kašnjenja, kao odgovor na promenu na ulazu. Ovo se naziva asinhroni rad.
Češće se dešava da se događaji u digitalnom račun aru sinhronizuju impulsima generatora takta,
tako da se promene dešavaju samo kada se pojavi impuls generatora takta. Na slici B.26
prikazana je takva šema. Ovaj uređaj se naziva
S-R bistabilni multivibrator pobuden
generatorom takta. Obratite pažnju na to da se ulazi R i S prenose na
NIU
kola samo tokom
impulsa generatora takta.
D
bistabiIni multivibrator
Problem sa S-R bistabilnim mu1tivibratorom je u tome da se stanje R
= 1, S = 1 mora izbegavati. Jedan od načina da se to postigne je omogućiti samo jedan ulaz. To se
postiže D bistabilnim mu1tivibratorom. Na slici B.27 prikazana je implementacija prekidačkim
kolima i karakteristična tabela D bistabilnog mu1tivibratora. Korišćenjem invertora, obezbeđuje
se da ulazi koji ne potiču iz generatora takta u dva I kola budu međusobno suprotni.
D bistabilni multivibrator se ponekad naziva bistabilni mu1tivibrator podataka pošto, u
suštini, čuva jedan bit podataka. Izlaz D bistabilnog multivibratora uvek je jednak poslednjoj
vrednosti koja je bila uneta na njegov ulaz. Stoga, on pamti i proizvodi poslednji ulaz. Takođe se
naziva bistabilni multivibrator sa kašnjenjem pošto se O ili 1, uneti na njegov ulaz, pojavljuju na
izlazu jedan impuls generatora takta kasnije.
J-K bistabiIni multivibrator
Još jedan koristan bistabilni mu1tivibrator je J-K bistabilni
mu1tivibrator. Poput S-R bistabilnog mu1tivibratora, ima dva ulaza. Međutim, u ovom slučaju
dopuštene su sve moguće kombinacije ulaznih vrednosti. Na slici B.28 prikazanaje
implementacija J-K bistabilnog mulltivibratora korišćenjem prekidačkih kola, a na slici B.29
prikazana je njegova karakteristična tabela (uporedo sa ovim tabelama za S-R i D bistabilne
mu1tivibratore). Primećujete da su prve tri kombinacije iste kao i za S-R bistabilni
mu1tivibrator. Bez ulaza, izlaz se ne menja. Kada je sam, ulaz J obavija funkciju postavljanja
vrednosti, dovodeći do toga da izlaz bude 1; kada je sam, izlaz K obavlja funkciju resetovanja
vrednosti, dovodeći do toga da izlaz bude o. Kada su J i K jednaki 1, funkcija koja se obavlja
naziva se prebacivanje: izlaz se preokreće.
Prema tome, ako je Q jednako 1 i 1 se unese na ulaze J i K, tada Q postaje O. Čitalac bi
trebalo da proveri da li implementacija sa slike B.28 proizvodi ovu karakterističnu funkciju.
Registri
Pre primera upotrebe bistabilnih multivibratora, istražićemo jedan od najvažnijih elemenata
procesora: registar. Kao što znamo, registar je digitalno kolo koje se koristi unutar procesora za
čuvanje jednog ili više bitova podataka. Dva osnovna tipa registara koji se najčešće koriste su
paralelni registri i pomerački registri.
Paralelni registri
Paralelni registar sastoji se od skupa I-bitnih memorija koje se mogu
istovremeno čitati ili upisivati u njih. Koriste se za skladištenje podataka. Registri o kojima smo
govorili u ovoj knjizi su paralelni registri.
Na slici B.30 prikazan je 8-bitni registar koji ilustruje rad paralelnog registra koji koristi D
bistabilne multivibratore. Upravljački signal, obeležen kao
učitavanje, upravlja upisivanjem
145
signalnih linija D 11 do D 18 unutar registra. Ove linije mogu biti izlaz multipleksera, tako da se u
registar mogu učitavati podaci iz različitih izvora.
Pomerački registar
Pomerački registar prihvata i/ili serijski premešta informacije. Razmotrimo,
na primer, sliku B.31, na kojoj je prikazan S-bitni pomerački registar konstruisan od D
bistabilnih multivibratora pobuđenih generatorom takta. Podaci se unose samo u krajnje levi
bistabilni multivibrator. Sa svakim impulsom generatora takta podaci se pomeraju udesno za
jedno mesto, a krajnje desni bit se izbacuje napolje.
Pomerački registri mogu se koristiti kao interfejs za serijske U/I uređaje. Pored toga, mogu
se koristiti sa aritmetičko-Iogičkom jedinicom za obavljanje logičkih funkcija pomeraja i
rotiranja. Za ovo drugo, potrebno ih je opremiti paralelnim i serijskim vezama za
čitanje/upisivanje.
Brojači
Još jedna korisna kategorija sekvencijalnih kola jesu broj ači. Brojač je registar čija se
vrednost lako povećava za 1 modulo kapaciteta registra. Prema tome, registar sačinjen od
n
bistabilnih mu1tivibratora može da broji do najviše
2n - l. Kada se vrednost brojača poveća
iznad njegove maksimalne vrednosti, vraća se na O. Primer brojača u procesoru je programski
brojač.
Brojači se mogu projektovati kao asinhroni ili sinhroni, zavisno od načina na koji rade.
Asinhroni broj ači su relativno spori pošto izlaz iz jednog bistabilnog mu1tivibratora pokreće
prornenu stanja narednog bistabilnog multivibratora. U sinhronom brojaču, svi bistabilni
mu1tivibratori istovremeno menjaju stanje. Pošto je ovaj drugi tip mnogo brži, on je taj koji se
koristi u procesorima. Međutim, koristiće nam da raspravu počnemo opisom asinhronog brojača.
Talasasti brojač
Asinhroni brojač se takođe naziva i talasasti brojač pošto se promena koja
dovodi do povećanja brojača započinje najednom kraju i "talasasto" se širi prema drugom kraju.
Na slici B.32, prikazana je irnplementacija 4-bitnog brojača u kojoj se koriste
J-K
bistabilni
multivibratori, zajedno sa vremenskim dijagramom koji ilustruje njegovo ponašanje. Vremenski
dijagram je idealizovan tako da ne prikazuje kašnjenje prostiranja koje nastaje prolaskom
signala kroz niz bistabilnih multivibratora. Izlaz krajnje levog bistabilnog multivibratora (Qo) je
bit najmanjeg značaja. Prikazano rešenje moguće je lako proširiti do proizvoljnog broja bitova
dodatnim bistabilnirn multivibratorirna.
Na prikazanoj implementaciji, vrednost brojača povećava se svakim impulsom generatora
takta. Ulazi J i K svih bistabilnih multivibratora drže se sa konstantnom vrednošću 1. To znači
da će, kada se pojavi impuls generatora takta, izlaz Q biti preokrenut (1 u O; O u 1). Obratite
pažnju na to da je pro mena prikazana tako kao da se dešava sa opadajućom ivicom impulsa
generatora takta; ovo je poznato pod imenom bistabilni multivibrator sa ivičnim okidanjem.
Korišćenjem bi stabilnog multivibratora koji se odaziva tokom prelaznog perioda impulsa
generatora takta, umesto da ga pobuđuje sam impuls, obezbeđuje se bolje vremensko
upravljanje u složenim kolima. Razmatranjem šablona po kome se pojavljuju izlazi iz ovog brojača
uočavamo da se ciklično ponavljaju 0000,0001, ..., I Il O, IIll, 0000 i tako redom.
Sinhroni brojači Talasasti brojač ima nedostatak zbog kašnjenja zbog menjanja vrednosti, koje
je srazmerno dužini brojača. Da bi prevazišli ovaj nedostatak, procesori koriste sinhrone
brojače u kojima se vrednost svih bistabilnih multivibratora brojača menja istovremeno. U ovom
146

Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti