<Macro: (,)>

Bookmark and Share

Mikro Islemci Nasil Çalisir?


 
Internet, iletisim ve bilgi kaynagi olarak hayatimizda önemli bir yere sahip. Peki bu dev iletisim aginin altyapisinin nasil isledigini hiç merak ettiniz mi?

Bu yazinin dizilmesi sirasinda kullandigimiz bilgisayar bu isi yapabilmek için bir mikroislemci kullandi. Mikroislemci dedigimiz sey, bir masaüstü, bir sunucu ya da bir dizüstü olabilir hiç fark etmez, herhangi bir bilgisayarin kalbidir. Kullandiginiz mikroislemci bir Pentium, bir K6, bir PowerPC, bir Sparc ya da herhangi bir marka olabilir, fakat hepsi de ayni isi hemen hemen ayni yolla yaparlar.

Bilgisayarinizdaki mikroislemcinin ne yaptigini ya da mikroislemci tiplerinin arasindaki farklari merak ediyorsaniz bu yaziyi okuyun. Bu bölümde ister bir belgenin yazim denetimi isterse bir oyun olsun, bilgisayarin bu isleri yapmasini saglayan en basit dijital mantik tekniklerini ögreneceksiniz.



Mikroislemcinin tarihi
Merkezi islem birimi (CPU/Central Processing Unit) olarak da bilinen mikroislemci, tek bir chip üzerine islenmis tastamam bir hesap makinesidir. Ilk mikroislemci 1971 yilinda üretilen Intel 4004'dü. 4004 çok güçlü degildi -bütün yapabildigi toplama ve çikarmaydi ve bunu bir kerede yalnizca 4 bit ile yapabiliyordu. Fakat sasirtici olan her seyin tek bir chip üzerinde olmasiydi. 4004'ten önce, mühendisler ya çok sayida chip'i bir araya getirerek ya da ayri ayri parçalari (o zamanlar kablo ile birbirlerine baglanan transistörler) birbirlerine baglayarak bilgisayar yapiyorlardi. 4004 ilk portatif elektronik hesap makinelerine güç verdi.

Chip Nedir?
Tümlesik devre ye da entegre devre olarak da adlandirilan chip, küçük ve ince bir silikon parçasidir. Bu silikon parçasina mikroislemciyi olusturan transistörler yerlestirilmistir. Bir inç büyüklükteki bir chip on milyonlarca transistörü içerebilir. Basit islemciler birkaç milimetre karelik bir chip üzerinde birkaç bin transistörü içerebilirler.

Ev bilgisayarini yaratan mikroislemci Intel 8080'dir. 1974 yilinda yapimi gerçeklestirilen bu bilgisayar 8 bit'likti. Pazarda gerçek bir siçrama yapan ilk mikroislemci ise, 1979'da üretilip IBM PC içersine yerlestirilen Intel 8088'dir. Bu bilgisayarin pazara çikisi 1982'yi buldu. Eger PC pazari ve tarihini az çok izlemisseniz, PC pazarinin 8088'den 80286'ya, ardindan 80386'ya, sonra 80486'ya, derken Pentium'a, Pentium'dan Pentium II'ye, Pentium III'e ve Pentium 4'e dogru yol aldigini bilirsiniz. Bu mikroislemcilerin hepsi Intel tarafindan yapildi ve 8088'in temel tasarimi üzerine gelistirildi. Pentium 4 orijinal 8088 üzerinde çalisan herhangi bir kod parçasini çalistirir; fakat bes bin kat daha hizli olarak!..

Asagidaki tablo Intel'in yillar boyunca ürettigi çesitli islemcilerin aralarindaki farklari anlamaniza yardimci olacaktir.

 

 

 

 

 

 

 

Isim

Tarih

Transistörler

Mikron

Saat hizi

Veri genisligi

MIPS

8080

1974

6,000

6

2 MHz

8 bits

0.64

8088

1979

29,000

3

5 MHz

16 bits

 

 

 

 

 

 

8-bit bus

0.33

80286

1982

134,000

1.5

6 MHz

16 bits

1

80386

1985

275,000

1.5

16 MHz

32 bits

5

80486

1989

1,200,000

1

25 MHz

32 bits

20

Pentium

1993

3,100,000

0.8

60 MHz

32 bits

 

 

 

 

 

 

64-bit bus

100

Pentium II

1997

7,500,000

0.35

233 MHz

32 bits

 

 

 

 

 

 

64-bit bus

~300

Pentium III

1999

9,500,000

0.25

450 MHz

32 bits

 

 

 

 

 

 

64-bit bus

~510

Pentium 4

2000

42,000,000

0.18

1.5 GHz

32 bits

 

 

 

 

 

 

64-bit bus

~1,700

Tablo hakkinda bilgi:
?Tarih, islemcinin ilk üretildigi yili gösterir. Birçok islemci orijinal üretim tarihinden daha sonra daha hizli saat hiziyla yeniden üretilebilir.
? Transistörler, chip üzerindeki transistör sayisini gösterir. Bir chip üzerindeki transistör sayisinin her geçen yil hizla arttigini görüyorsunuz.
?Mikron, chip içindeki en ince telin kalinligini mikron cinsinden gösterir. Mikronun büyüklügü hakkinda bir fikir vermek için bir insan saçinin 100 mikron kadar oldugunu söyleyelim. Chip üzerinde yer alan elemanlari n boyutlari küçüldükçe, buraya sigdirilabilecek transistor sayisi da artacaktir.
?Saat hizi, chip'in bir saat ritmi verebilecegi en yüksek orandir. Saat hizi ileride ayrintilariyla açiklanacak.
? Veri Genisligi ALU'nun (Arithmetic/Logic Unit: Matematik/Mantik Birimi) genisligini gösterir. 32 bit'lik bir ALU 32 bit sayiyi isleyebilirken, bir 8 bit ALU iki adet 8 bit sayiyi toplayabilir, çikarabilir, çarpabilir... Bir 8 bit ALU 32 bit'lik iki sayiyi toplamak için 4 komutu yerine getirirken, 32 bit ALU ayni seyi sadece bir komutla yerine getirir. Birçok durumda, dis veri yolu ALU ile ayni genisliktedir, ama bu her durum için geçerli degildir. 8088'in 16 bit'lik bir ALU'su ve 8 bit'lik bir yolu vardi. Oysa modern Pentium'lar, üzerinde bulundurduklari 32 bit ALU'lar için bir defada 64 bit veri tasirlar.
? MIPS (Millions of Instructions per Second/ saniyede islenen milyon cinsinden komut) CPU'nun performansinin ölçüsünü kabaca gösterir. Modern CPU'lar birbirlerinden farkli öylesine çok is yaparlar ki, MIPS degerleri büyük ölçüde anlamlarini kaybetmektedir. Fakat siz yine de bu sütundan CPU'larin göreli güçleri hakkinda genel bir bilgi edinebilirsiniz. Bu tablodan genel olarak, saat hizi ile MIPS arasinda bir iliskinin oldugunu görebilirsiniz. Maksimum saat hizi üretim sürecinin bir sonucudur. MIPS ile transistör sayisi arasinda da bir iliski vardir. Örnegin, 8088 5 MHz saat hizindaydi, fakat sadece 0.33 MIPS'te islem görüyordu (her 15 saat döngüsünde bir komut). Modern islemciler bir saat döngüsüne iki komut oraninda islem görebilirler. Bu gelisme dogrudan chip üzerindeki transistorlarin sayisiyla ilgidir.

Mikroislemcinin Içi
Bir mikroislemcinin nasil çalistigini anlamak için, içine bakmak ve üretilisinde kullanilan mantigi ögrenmek gerek. Bu süreçte mühendislerin bir islemcinin hizini artirmak için yapabildikleri seylerin birçogunu ve bir mikroislemcinin anadili olarak adlandirilan assembly dilini de ögrenebilirsiniz.

Bir mikroislemci, islemciye ne yapmasi gerektigini söyleyen bir dizi makine komutunu yerine getirir. Mikroislemci komutlara göre baslica üç islem yapar:
Bir mikroislemci ALU'sunu kullanarak toplama, çikarma, çarpma ve bölme gibi matematiksel islemleri yapar. Modern mikroislemciler, son derece karmasik islemleri gerçeklestirebilen kayan nokta islemcileri (Floating point processor) içeriyorlar.

?Bir mikroislemci verileri bir bellek alanindan digerine hareket ettirir.
?Bir mikroislemci karar verir ve bu verilmis kararlar uyarinca yeni bir komut setine siçrar. Mikroislemcinin yaptigi çok karmasik seyler olabilir, fakat bunlarin hepsi aslinda üç baslik altinda toplanabilecek faaliyetleridir.

Asagidaki sema, bu üç faaliyeti yürütebilecek kapasitesi olan bir hayli basit bir mikroislemciyi gösteriyor.

003

 
Bu mümkün olabildigince basit bir mikroislemcinin yaptiklaridir. Bu mikroislemcide sunlar vardir:
? Bir adres yolu (8, 16 ya da 32 bit genisliginde olabilir): Bellege bir adres gönderir.
?Bir veri yolu (8, 16 ya da 32 bit genisliginde olabilir): Bellege veri gönderir ya da bellekten veri alir.
? Bir okuma (RD/read) ve yazma (WR/write) hatti: Bellege, adreslenmis alandan veri
almak ya da bu alana veri aktarmak isteyip istemedigini bildirir.
? Bir saat hatti: Islemciye bir saat ritmi verir.
?Bir reset (sifirlama) hatti: Program sayacini sifira (ya da belirtilen bir degere) yeniden yerlestirir (reset eder) ve uygulamayi yeniden baslatir. Örnegimizde hem adres hem de veri yolunun 8 bit genisliginde oldugunu farz edelim. Bu basit mikroislemcinin bilesenleri asagida siralandigi gibidir:
? A, B ve C register'leri (saklayici, yazmaç)
Flip-Flop'lardan (ikidurumlu) olusan basit açma kapama (mandal, latch) devreleridir.
? Adres mandal devresi (latch) aynen A, B ve C register'lari gibidir.
?Program sayaci kendisinden istendiginde birer birer artis gösterme ve kendisinden istendiginde sifira reset olma yetenegine sahip bir mandal devresidir.
? ALU 8 bit toplayici kadar basit olabilir ya da baska bir deyisle 8 bit'lik degerleri toplar, çikarir, çarpar ve böler.
? Test register'i özel bir latch'dir (mandal). ALU içinde gerçeklestirilmis karsilastirmalardan çikan degerleri tutar. Bir ALU normal olarak iki sayiyi karsilastirir ve bunlarin esit olup olmadiklarini, hangisinin digerinden büyük oldugunu tespit eder. Test register'i ayrica normal olarak toplayicinin son asamasindan bir tasima bit'i tutar. Bu degerleri Flip-Flop'lar içinde depolar ve komut çözücü (instruction decoder) karar vermek için bu degerleri kullanabilir.
?Semada "3 durum" olarak isaretlenen alti kutu var. Bunlar tri-state (üç-durum) tamponlari dir. Bir tri-state tampon bir adet 1 ya da bir adet 0 geçmesine izin verir, baska bir deyisle devreyi açar ya da kapatir. Bir tri-state tampon çok sayida çiktinin bir kabloya baglanmasina izin verir. Fakat bunlardan sadece bir tanesi hat üzerinde bir adet 1 veya bir adet 0 tasir.
? Komut register'i (instruction register) ve komut çözücüsü (instruction decoder) diger bütün parçalari kontrol etmekle yükümlüdür. Bu semada gösterilmemis de olsa, komut çözücüden asagidaki islemleri yapan kontrol hatlari çikabilir:
A register'ina veri yolundaki mevcut degeri mandallamasini/tutmasini söyler.
B register'ina veri yolundaki mevcut degeri mandallamasini/tutmasini söyler.
C register'ina veri yolundaki mevcut degeri mandallamasini/tutmasini söyler.
Program sayaci yazmacina (register) veri yolu üzerindeki halihazirdaki degeri mandallamasini/ tutmasini söyler.
?Adres register'ina veri yolu üzerindeki halihazirdaki degeri mandallamasini/tutmasini söyler.
? Komut register'ina veri yolu üzerindeki mevcut degeri mandallamasini/tutmasini söyler.
?Program sayacina artmasini söyler.
? Program sayacina sifira reset olmasini söyler.
? Alti tri-state tamponundan (alti ayri hat) herhangi birini etkinlestirir.
? ALU'ya yerine getirmesi gereken uygulamayi söyler.
? Test register'ina ALU'nun test bit'lerini mandallamasini/tutmasini söyler.
?Okuma hattini etkinlestirir.
?Yazma hattini etkinlestirir.
Komut çözücüsüne gelenler, test register'i ve saat hatlarindan (clock line) gelen bit'lerin yani sira komut register'inden gelen bit'lerdir.

RAM ve ROM
Önceki bölümde adres ve veri yolu kadar Okuma ve Yazma hattindan da söz ettik. Bu yollar ve hatlar RAM'i ya da ROM'u -genellikle her ikisini- birlestirir. Bizim örnek mikroislemcimizde 8 bit genisliginde adres yolu ve 8 bit genisliginde veri yolu var. Bu demektir ki, mikroislemci bellekte 256 byte (28) veri adresleyebilir ve bellekten bir keresinde 8 bit'lik veri okuyup ya da yazabilir. Bizim basit mikroislemcimizde ROM'un 0 adreste baslayan 128 byte ve 128 adreste baslayan RAM'inin 128 byte'a sahip oldugunu farz edelim. ROM salt okunur (read-only) bellegin adidir. Bir ROM chip, önceden yerlestirilmis kalici byte'larla programlanmistir. Adres yolu ROM chip'e veri yolu üzerinde hangi byte'i alacagini ve yerlestirecegini söyler. Okuma hatti durum degistirdiginde, ROM chip'i veri yolu üzerinde seçilmis byte'i gösterir. RAM rasgele erisimli (randomaccess) bellek anlaminda kullanilir. RAM bilgi byte'larini kapsar ve mikroislemci isaretlenmis okuma hattindan mi yoksa yazma hattindan mi sinyal geldigine bagli olarak bu byte'lari okuyabilir ya da yazabilir. Günümüz RAM chip'lerinin problemi, bilgisayar bir kez kapandiginda her seyi unutmalaridir. Iste bu nedenledir ki bilgisayarin ROM'a ihtiyaci vardir.

Hazir sirasi gelmisken sunu da ekleyelim. Hemen hemen bütün bilgisayarlar belli miktarda ROM içerirler (RAM içermeyen basit bilgisayarlar üretmek mümkündür -birçok mikrokontrolör bir miktar RAM byte'ini islemci üzerinde koyarak yapar- ama genel olarak konusursak, ROM'u olmayan bir bilgisayar üretmek mümkün degildir). PC'deki ROM'lara BIOS (Basic Input/Output System) denir. Mikroislemci çalismaya basladiginda, BIOS içerisinde bulunan komutlari yürürlüge koymaya baslar. BIOS komutlari, bilgisayar içindeki donanimlari test etmek gibi isler yapar ve ardindan sabitdiske giderek boot (açilis) sektörü saptar. Bu boot sektör de bir diger küçük programdir ve BIOS bu programi diskten okuduktan sonra RAM'e yerlestirir.

Mikroislemci ardindan RAM'den aldigi boot sektör komutlarini yerine getirmeye baslar. Boot sektör programi, mikroislemciye sabitdiskten RAM'e baska bir sey alip getirmesini söyler, mikroislemci ardindan bunu yerine getirir ve bu böyle sürer gider. Mikroislemci bütün isletim sistemini iste böyle yükleyip çalistirir.

Mikroislemci Komutlari
Inanilmaz derecede basit olan ilk örnegimizde gösterilen mikroislemci bile çok sayida komut dizisini alip isleyebilir. Bir komut yigini, bit modelleri olarak çalistirilir. Bu bit modelleri ise komut register'ina yüklendiklerinde farkli anlamlara sahip olurlar. Insan hafizasi bit modellerini hatirlamakta pek iyi degildir, bu yüzden bir dizi kisa kelime farkli bit modellerini temsil etmek için tanimlanir. Bu kelimelerin toplami islemcinin assembly dili olarak adlandirilir. Bir assembler, bit modellerinin içindeki kelimeleri kolaylikla çevirir ve ardindan assembler'in çiktisi mikroislemcinin çalismasi için bellege yerlestirilir. Iste tasarimcisinin bizim örnegimizdeki basit mikroislemci için olusturdugu assembly dilinin bazi komutlari:
LOADA mem - Load register A from memory address (A register'ini bellek adresinden yükle)
LOADB mem - Load register B from memory address (B register'ini bellek adresinden yükle)
CONB con - Load a constant value into register B (B register'ina sabit deger yükle)? SAVEB mem - Save register B to memory address (B register'ini bellek adresine kaydet) SAVEC mem - Save register C to memory address (C register'ini bellek adresine kaydet)
ADD - Add A and B and store the result in C (A ile B'yi topla, sonucu C'de sakla)
SUB - Subtract A and B and store the result in C (A ile B'yi çikar, sonucu C'de sakla)
MUL - Multiply A and B and store the result in C (A ile B'yi çarp, sonucu C'de sakla)
DIV - Divide A and B and store the result in C (A ile B'yi böl, sonucu C'de sakla)
COM - Compare A and B and store the result in test (A ile B'yi karsilastir, sonucu C'de sakla)
JUMP addr - Jump to an address (Bir adrese siçra)
JEQ addr - Jump, if equal, to address (Eger esitse, adrese siçra)
JNEQ addr - Jump, if not equal, to address (Eger esit degilse, adrese siçra)
JG addr - Jump, if greater than, to address (Eger büyükse, adrese siçra)
JGE addr - Jump, if greater than or equal, to address (Eger büyükse ya da esitse, adrese siçra)
JL addr - Jump, if less than, to address (Eger küçükse, adrese siçra)
JLE addr - Jump, if less than or equal, to address (Eger küçükse ya da esitse, adrese
siçra)
STOP - Stop execution (Islemi durdur)
C programlama dilinin nasil çalistigi hakkinda biraz fikri olanlar, bu basit C kodunun (5=5!=5*4*3*2*1=120) 5 faktöryeli hesaplayacagini bilirler.
a=1;
f=1;
while (a <= 5)
{
f = f * a;
a = a + 1;
}
Programin isletilmesinin sonunda, f degiskeni 5 faktöryeli içerir. Bir C derleyicisi bu C kodunu assembly diline çevirir. RAM'in bu islemci içerisinde adres 128'de ve ROM'un (assembly dili programini kapsar) adres 0'da çalismaya basladigini farz edelim. Bu durumda bizim basit mikroislemci için assembly dili asagidakine benzer:
/ Assume a is at address 128
(adres 128'deki a'yi al)
// Assume F is at address 129
(adres 129'daki F'yi al)
0 CONB 1 // a=1;
1 SAVEB 128
2 CONB 1 // f=1;
3 SAVEB 129
4 LOADA 128 // if a > 5 the jump to 17
(eger a>5 ise 17'ye atla)
5 CONB 5
6 COM
7 JG 17
8 LOADA 129 // f=f*a;
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128 // a=a+1;
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4 // loop back to if
(4. satirdaki eger kosuluna geri dönüs)
17 STOP
Simdi su soruyu sorabiliriz: "Bu komutlari n hepsi ROM'da nasil görünüyor?" Bu assembly dili komutlarinin her biri bir ikili sayi tarafindan temsil edilmeli. Basitlik için, asagida göreceginiz gibi her assembly dili komutuna bir tek sayi verildigini farz edelim:
? LOADA - 1
? LOADB - 2
? CONB - 3
? SAVEB - 4
? SAVEC mem - 5
? ADD - 6
? SUB - 7
? MUL - 8
? DIV - 9
? COM - 10
? JUMP addr - 11
? JEQ addr - 12
? JNEQ addr - 13
? JG addr - 14
? JGE addr - 15
? JL addr - 16
? JLE addr - 17
? STOP - 18
Rakamlar opcode (opcode/islem kodu) olarak adlandirilir denir. Bizim küçük programimiz ROM'da böyle görünecektir:
// Assume a is at address 128
128'deki a'yi al)
// Assume F is at address 129
(adres 129'daki f'yi al)
Addr opcode/value
0 3 // CONB 1
1 1
2 4 // SAVEB 128
3 128
4 3 // CONB 1
5 1
6 4 // SAVEB 129
7 129
8 1 // LOADA 128
9 128
10 3 // CONB 5
11 5
12 10 // COM
13 14 // JG 17
14 31
15 1 // LOADA 129
16 129
17 2 // LOADB 128
18 128
19 8 // MUL
20 5 // SAVEC 129
21 129
22 1 // LOADA 128
23 128
24 3 // CONB 1
25 1
26 6 // ADD
27 5 // SAVEC 128
28 128
29 11 // JUMP 4
30 8
31 18 // STOP
C kodunda yedi satirda islenen komutlar, assembly dilinde 17'ye çikiyor ve bunun da ROM içinde 31 byte tuttugunu görebilirsiniz. Komut çözücü, her islem kodunu mikroislemci içindeki farkli parçalari çalistiran bir dizi sinyale dönüstürür. ADD (topla) komutunu örnek alip nelere ihtiyaç duyacagina bakalim:

1. Birinci saat döngüsü sirasinda, komutun güncel yüklenmesine ihtiyaç duyariz. Bundan dolayi komut çözücü sunlara ihtiyaç duyar:
? program sayaci için tri-state tamponunu etkinlestirmek
? Okuma hattini etkinlestirmek
? tri-state tampon içindeki veriyi etkinlestirmek
? komutu komut register'ina aktarmak

2. Ikinci saat döngüsü sirasinda, ADD komutu çözülür. Bu komutun simdi yapacak fazla isi yoktur:
? ALU'nun islemini toplamaya kurmak
?ALU'nun çiktisini C register'ina aktarmak.

3. Üçüncü saat döngüsü sirasinda, program sayaci yükseltilir (teorik olarak, ikinci saat döngüsüyle çakisabilir bu). Her komut, bu sekilde birer islem dizi seklinde parçalara ayrilabilir. Bu Mikroislemcinin parçalarinin düzgün bir sekilde çalismasini saglar. Bazi komutlar ise, yukarida örnek verdigimiz ADD komutu gibi, iki ya da üç saat döngüsü alabilirken, bes ya da alti saat döngüsü alabilen komutlar da vardir.

Mikroislemcinin Performansi
Mevcut transistörlerin sayisi islemcinin performansini önemli ölçüde etkiler. Yukarida da gördügümüz gibi, 8088'e benzeyen bir islemcideki tipik bir komutun yürürlüge sokulmasi 15 saat döngüsü alacaktir. Çarpma islemi komutunun tasarimindan dolayi, 8088'de 16 bit'lik bir çarpma islemini yapmak için yaklasik olarak 80 döngüye ihtiyaç vardir. Daha fazla transistör ile tek bir döngüde çok daha fazla çarpma islemi yapilabilir. Daha çok transistor ayrica ardisik düzen (pipelining) denen teknolojiye de izin veriyor. Bir ardisik düzen mimarisinde, komut isletimi çakistirilabilir, yani ayni anda birden fazla komutun farkli asamalari islenebilir. Böylece her bir komutu yerine getirmek için bes saat döngüsüne ihtiyaç duyulmasina ragmen bazen komutlarin yerine getirilmesi sirasinda ayni anda bes komut isleniyor olabilir. Her saat döngüsünde bir komutun tamamlanmasi gibi.

Birçok modern islemcide, her biri kendi ardisik düzenine sahip çoklu komut çözücüleri vardir. Bu durum çoklu komut akisina izin verir. Bu da birden fazla komutun bir saat döngüsünde yerine getirilmesini saglar. Bu teknigi uygulamak çok karmasik olabilir, bu nedenle çok fazla transistöre ihtiyaç duyulur. Islemci tasariminda, çoklu komut akisiyla ardisik düzen isletimli ve hizli kayan nokta islemcisi içeren 32-bit ALU'ya dogru bir egilim var. Belli islemleri etkin bir biçimde gerçeklestiren özel komutlara (MMX komutlari gibi) dogru bir yönelim de buna eslik ediyor. Islemci chip'ine L1 önbellegi ve donanim haline getirilmis sanal bellek eklemek de bir egilim olarak görünüyor. Tüm bu egilimler, transistörün önemini daha da artiriyor. Bu islemciler bir saniyede bir milyar kadar komutu yerine getirebilecekler!
    
 
Marshall Brain
Copyright 2000 HowStuffWorks.com

Rönesans Hukuk Bürosu

Avukat Nilay ERGÜN