Mikroişlemciler · Ders Notu

Bölüm 1.1: Giriş

Bir çamaşır makinesinin kartında, bir otomobilin motor denetiminde ya da bir dizüstü bilgisayarda aynı düşünce çalışır: bellekteki komutları sırayla okuyup uygulayan, programlanabilir bir yonga. Bu not o yongayı, mikroişlemciyi, dışarıdan içeriye doğru tanıtır. Önce mikroişlemcinin bir bilgisayar sistemindeki yerini, onu belleğe ve giriş/çıkış birimlerine bağlayan yolları ve mikrodenetleyiciden farkını ele alır. Ardından her komut için yinelenen getir–çöz–yürüt döngüsünü 8086 makine kodu üzerinde adım adım izler. İşlemcinin iç yapısı, saat sinyali ve bir programın süresini belirleyen üç büyüklük (komut sayısı, komut başına tur, saat frekansı) sayısal örneklerle verilir. Sonraki kesimler komut kümesi mimarilerini (CISC, RISC, EPIC), özel amaçlı işlemci türlerini ve Intel x86 ailesinin 4004'ten Core i7'ye uzanan gelişimini anlatır. Not, modern işlemcilerde performansı belirleyen önbellek, çok çekirdek ve güç yönetimi gibi özelliklerle biter. Kod örneklerinin hepsi 8086 assembly ile yazılmıştır ve her birinde yazmaçların, bayrakların ve belleğin nasıl değiştiği tablo hâlinde izlenir.

Öğrenme çıktıları

Temel kavramları tanımlamak
Mikroişlemciyi, mikrodenetleyiciyi ve bir bilgisayar sisteminin adres, veri ve kontrol yollarını tanımlamak; n hatlı bir adres yolunun kaç bayt adreslediğini hesaplamak.
Komut döngüsünü izlemek
Getir–çöz–yürüt döngüsünü makine kodu üzerinde adım adım izlemek; komut işaretçisinin (IP) sıralı akışta ve atlamada nasıl değiştiğini göstermek.
Performansı hesaplamak
Saat frekansı, periyot, yol döngüsü, komut başına tur (CPI) ve çalışma süresi arasındaki ilişkiyi kullanmak; küçük bir 8086 döngüsünün kaç saat turu sürdüğünü saymak.
Mimari türlerini karşılaştırmak
CISC, RISC ve EPIC yaklaşımlarını ve vektör, SIMD, DSP, GPU, sembolik işlemci türlerini temel fikirleri, güçlü yanları ve örnekleriyle karşılaştırmak; boru hattının bitiş turunu hesaplamak.
x86 ailesini açıklamak
4004'ten Core i7'ye Intel işlemcilerinin veri ve adres yolu genişliklerini, getirdikleri yenilikleri ve 8086'nın bu ailedeki yerini açıklamak.
Modern özellikleri tanımak
Önbellek ve bellek hiyerarşisi, çok çekirdek, sanallaştırma ve güç yönetimi gibi kavramları tanımak; saat hızının tek başına performans ölçüsü olmadığını sayısal örnekle göstermek.

1.1.1Mikroişlemci ve bilgisayar sistemi

Mikroişlemciyi anlamanın en kısa yolu, onun bir bilgisayarda hangi işi üstlendiğine bakmaktır. Bu kesim mikroişlemciyi tanımlar, onu bellek ve giriş/çıkış birimleriyle birleştiren yolları açıklar ve aynı işlemcinin bir mikrodenetleyicide nasıl başka bir biçim aldığını gösterir.

1.1.1.1Mikroişlemci nedir?

Her bilgisayarın merkezinde komutları yürüten bir birim bulunur. Bu birime merkezî işlem birimi (central processing unit, CPU) denir. İlk bilgisayarlarda CPU dolaplar dolusu lamba, röle ya da ayrık transistörden kurulurdu. Tümleşik devre teknolojisi geliştikçe aynı devreler önce birkaç kart üzerine, sonra tek bir silisyum parçası üzerine sığdı. Mikroişlemci bu son adımın ürünüdür.

Tanım 1.1.1

Mikroişlemci (microprocessor), bir bilgisayarın merkezî işlem biriminin tek bir yonga (chip) üzerinde gerçeklenmiş hâlidir. Programlanabilir bir aygıttır: ne yapacağını bellekte duran makine dili komutları belirler. Bu komutları sırayla okur ve uygular.

Tanımdaki “programlanabilir” sözcüğü mikroişlemciyi sayısal tasarım derslerinde kurulan devrelerden ayırır. Bir toplayıcı devresi yalnız toplar; bir sayıcı yalnız sayar. Devrenin ne yaptığı bağlantılarla sabitlenmiştir ve işlevi değiştirmek için devreyi yeniden kurmak gerekir. Mikroişlemcinin bağlantıları ise hiç değişmez. Değişen, bellekteki komutlardır. Aynı yonga bir programla metin düzenler, başka bir programla motor sürer. Bu esneklik mikroişlemciyi bugün hemen her elektronik ürünün parçası yapmıştır.

Mikroişlemcinin iş akışı üç adımla özetlenir. İşlemci önce girdi alır: klavyeden basılan bir tuş, bir sensörün ölçtüğü sıcaklık ya da diskten okunan bir dosya. Sonra bu veri üzerinde aritmetik ve mantıksal işlemler yapar: toplar, çıkarır, karşılaştırır, bitleri maskeler. En sonunda istenen çıktıyı üretir: ekrana bir karakter yazar, bir motoru döndürür ya da bir LED'i yakar. Bu üç adımın arasında işlemci sürekli bellekle konuşur. Hem yürüteceği komutları hem de üzerinde çalışacağı verileri bellekten okur, ara sonuçları da belleğe yazar. Şekil 1.1.1 bu ilişkiyi gösterir.

Girdi Mikro-işlemci Çıktı Bellek komut + veri klavye, sensörekran, motor
Şekil 1.1.1: Mikroişlemcinin iş akışı. Girdi (klavye, sensör) işlemciye girer, işlenir ve çıktı (ekran, motor) olarak dışarı verilir. İşlemci komutları ve verileri bellekten alır, sonuçları belleğe yazar.

Basit bir hesap makinesi bu akışın gündelik bir örneğidir. Tuşlar girdidir; toplama işlemi işlemdir; ekranda beliren sonuç çıktıdır. Hesap makinesinin içindeki küçük işlemci de tuşları okuyan, sayıları toplayan ve rakamları ekrana yazan bir programı yürütür. Bu programı değiştirmek, aynı yongaya başka bir iş yaptırmak demektir.

Mikroişlemcinin anladığı tek dil makine dilidir. Makine dilinde her komut bir bayt dizisidir. Örneğin 8086'da B0 05 baytları “AL yazmacına 5 yükle” anlamına gelir. İnsanın bu sayıları ezberlemesi zor olduğu için programlar çoğunlukla assembly diliyle yazılır. Assembly, makine komutlarına MOV, ADD, JMP gibi kısa adlar, yani anımsatıcılar (mnemonic) verir. Bir çevirici program, assembler, bu metni makine koduna çevirir. Bu notta komutlar assembly ile yazılır; gerektiğinde karşılık gelen makine kodu baytları da verilir.

1.1.1.2Bilgisayar sistemi ve yollar

Mikroişlemci tek başına çalışamaz. Komutların ve verilerin durduğu bir belleğe ve dış dünyayla bağlantı kuran giriş/çıkış (G/Ç) birimlerine gerek duyar. Bu üç parça, yani CPU, bellek ve G/Ç birimleri, ortak bir kablo demetiyle birbirine bağlanır. Bu demete yol (bus) denir. Sistemin bütün parçalarını bağlayan yol ise sistem yolu adını alır.

Tanım 1.1.2

Yol, birimler arasında aynı türden bilgiyi taşıyan paralel iletken hatların topluluğudur. Bir bilgisayar sisteminde üç yol bulunur:

  • Adres yolu (address bus): işlemcinin hangi bellek gözüne ya da hangi G/Ç portuna erişeceğini seçer. Tek yönlüdür; adresi yalnız işlemci üretir.
  • Veri yolu (data bus): okunan ya da yazılan veriyi taşır. Çift yönlüdür; veri okumada bellekten işlemciye, yazmada işlemciden belleğe akar.
  • Kontrol yolu (control bus): okuma, yazma, bellek ya da G/Ç seçimi, saat ve kesme gibi zamanlama ve kontrol sinyallerini taşır.
CPU(mikroişlemci) BellekRAM / ROM G/Ç birimleriklavye, ekran, disk Adres yolu → (tek yönlü) Veri yolu ↔ (çift yönlü) Kontrol yolu (RD, WR, …)
Şekil 1.1.2: CPU, bellek ve G/Ç birimleri üç yolla birbirine bağlıdır. Adres yolu tek yönlüdür (CPU'dan dışarı), veri yolu çift yönlüdür, kontrol yolu RD (okuma) ve WR (yazma) gibi sinyalleri taşır.

Bir bellek okumasının nasıl yürüdüğü üç yolun görev paylaşımını açıkça gösterir. İşlemci okumak istediği gözün adresini adres yoluna koyar. Ardından kontrol yolundaki okuma sinyalini (8086'da RD ucunu) etkin yapar. Bellek, adres hatlarındaki deseni çözer, ilgili gözü seçer ve içindeki veriyi veri yoluna sürer. İşlemci veri yolundaki değeri yakalar ve okuma sinyalini bırakır. Yazma da benzer biçimde yürür; yalnız bu kez veriyi veri yoluna işlemci sürer ve kontrol yolunda yazma sinyali (WR) etkin olur. Bu adımların her biri saat sinyaline bağlı olarak belirli bir sırayla olur. Bir okuma ya da yazmanın baştan sona sürdüğü zamana yol döngüsü (bus cycle) denir.

Yolların genişliği, yani kaç hattan oluştuğu, sistemin sınırlarını belirler. Adres yolunda her hat 0 ya da 1 taşır. n hatla 2n farklı desen kurulur ve her desen bir bellek gözünü seçer. Bu yüzden n hatlı bir adres yolu 2n bayt belleği adresler. 8086'nın adres yolu 20 hattır: 220 = 1.048.576 bayt, yani 1 MB bellek. Veri yolunun genişliği ise bir yol döngüsünde aktarılan bit sayısıdır. 8086'nın veri yolu 16 bittir; bir yol döngüsünde 2 bayt, yani bir sözcük (word) taşır.

Örnek 1.1.1

16, 20 ve 24 hatlı adres yolları kaç bayt bellek adresler?

  • 16 hat: 216 = 65.536 bayt = 64 KB (1 KB = 1024 bayt; 65.536 / 1024 = 64). 8080 ve 8085 böyledir.
  • 20 hat: 220 = 1.048.576 bayt = 1024 KB = 1 MB. 8086 ve 8088 böyledir.
  • 24 hat: 224 = 16.777.216 bayt = 16 MB. 80286 böyledir.

Tersten bakıldığında 1 MB'ın her baytını ayrı ayrı seçmek için log2(220) = 20 hat gerekir. Her ek hat adreslenebilir belleği iki katına çıkarır.

8086'nın yapısında ilginç bir ayrıntı vardır: işlemci 16 bitliktir, ama adres yolu 20 bittir. 16 bitlik yazmaçlarla 20 bitlik adres doğrudan tutulamaz. 8086 bu sorunu iki 16 bitlik değeri, kesim (segment) ve bağıl konum (offset) değerlerini birleştirerek çözer. Fiziksel adres, kesim değerinin 16 ile çarpılıp bağıl konuma eklenmesiyle bulunur. Bu not boyunca adresler çoğunlukla yalnız bağıl konumla, örneğin 0100h diye yazılır; kesim değeri sabit kabul edilir.

Sık yapılan hata

Veri yolunun genişliği ile adreslenebilir bellek karıştırılır. “8086 16 bitlik olduğu için 64 KB bellek adresler” sonucu yanlıştır. Adreslenebilir belleği veri yolu değil, adres yolu belirler: 8086'nın 20 adres hattı 1 MB'a ulaşır. 16 bitlik yazmaçlar yalnız bir kesim içindeki 64 KB'lık pencereyi doğrudan gösterebilir; kesim yazmacı bu pencereyi 1 MB içinde kaydırır.

1.1.1.3Mikroişlemci ve mikrodenetleyici

Bir mikroişlemciyle kurulan bilgisayarda bellek ve G/Ç birimleri ayrı yongalardır. 8086'lı bir kartta işlemcinin yanında RAM yongaları, programın durduğu ROM yongası, G/Ç için bir arayüz yongası ve zamanlayıcı yongası yan yana dizilir. Yongalar kart üzerindeki yollarla birbirine bağlanır. Bu düzen esnektir: bellek miktarı ve çevre birimleri ihtiyaca göre seçilir. Bedeli ise kart alanı, maliyet ve güç tüketimidir.

Pek çok uygulama bu esnekliğe gerek duymaz. Bir çamaşır makinesinin kartı yıllarca tek bir programı çalıştırır, birkaç kilobayt bellekle yetinir ve birkaç düğmeyle birkaç motoru yönetir. Bu tür işler için CPU, bellek ve çevre birimlerini tek yongada toplayan aygıtlar geliştirilmiştir.

Tanım 1.1.3

Mikrodenetleyici (microcontroller, MCU), CPU ile birlikte RAM, Flash/ROM program belleği, G/Ç portları, zamanlayıcılar ve analog-sayısal çevirici (ADC) gibi çevre birimlerini aynı yongada toplar. Bu yüzden “yonga üstü bilgisayar” diye de anılır. Mikroişlemci (MPU) ise yalnız CPU'yu içerir; bellek ve çevre birimleri dışarıdan eklenir.

Mikroişlemci (MPU) tabanlı sistem CPU RAM ROM G/Ç Zamanlayıcı ayrı yongalar Mikrodenetleyici (MCU) CPU RAM Flash/ROM G/Ç portları Zamanlayıcı ADC · UART hepsi tek yongada (“yonga üstü bilgisayar”)
Şekil 1.1.3: Solda mikroişlemci tabanlı sistem: CPU, RAM, ROM, G/Ç ve zamanlayıcı ayrı yongalardır. Sağda mikrodenetleyici: CPU, RAM, Flash/ROM, G/Ç portları, zamanlayıcı, ADC ve UART tek yongadadır.

Mikroişlemci örnekleri arasında 8086, Intel Core i7 ve AMD Ryzen sayılabilir. Mikrodenetleyici örnekleri ise 8051, PIC, Arduino kartlarındaki AVR ve STM32 ailesidir. Tablo 1.1.1 iki türü sekiz ölçütle karşılaştırır.

Tablo 1.1.1: Mikroişlemci ile mikrodenetleyicinin karşılaştırılması.
ÖlçütMikroişlemci (MPU)Mikrodenetleyici (MCU)
İçerikCPU (ALU, kontrol birimi, yazmaçlar)CPU + RAM + Flash + G/Ç + zamanlayıcı + ADC…
Bellekdışarıda, büyük (GB)yonga içinde, küçük (KB–MB)
Saat hızıyüksek (GHz)düşük–orta (MHz)
Güçyüksek (W–100 W)çok düşük (mW, uyku modunda µW)
Maliyetyüksek; ek yongalar gerekirdüşük; tek yonga yeterli
Yazılımgenelde işletim sistemi + çok sayıda uygulamatek, sabit bir program (gömülü yazılım)
KullanımPC, sunucu, dizüstüçamaşır makinesi, kumanda, otomobil ECU, IoT

Tablodaki farkların çoğu tek bir tasarım kararından doğar: belleğin nerede durduğu. MPU'da bellek dışarıda olduğu için gigabaytlarca RAM bağlanabilir. Bu da işletim sistemini ve aynı anda çalışan pek çok uygulamayı mümkün kılar. MCU'da bellek yonganın içindedir ve yonga alanı sınırlıdır. Kilobaytlarla ölçülen bellek, sabit ve küçük bir programa yeter. Saat hızı ve güç de bu ayrımı izler. Yüksek frekansta çalışan bir MPU onlarca watt harcar ve soğutucu ister. Düşük frekanslı bir MCU miliwatt düzeyinde kalır ve uyku modunda mikrowatta iner; bir pil onu yıllarca besleyebilir.

Örnek 1.1.2

Bir çamaşır makinesi kontrol kartı ve bir dizüstü bilgisayar için hangi tür seçilir?

Çamaşır makinesinin işi tektir ve değişmez: düğmeleri okumak, su seviyesini ve sıcaklığı izlemek, motoru ve vanaları sürmek. Program küçüktür; maliyet ve güç önemlidir. Bu iş için mikrodenetleyici seçilir. Dizüstü bilgisayar ise işletim sistemi çalıştırır, gigabaytlarca bellek ister ve kullanıcı her an yeni bir uygulama açabilir. Yüksek performans ve büyük bellek gerektiği için mikroişlemci seçilir.

Mikroişlemci ile mikrodenetleyici arasındaki fark yongaya nelerin sığdırıldığıyla ilgilidir; içerideki CPU'nun çalışma ilkesi aynıdır. Her ikisi de komutları bellekten getirir, çözer ve yürütür. Her ikisinde de yazmaçlar, bir aritmetik-mantık birimi ve bayraklar bulunur. Bu ders 8086 mikroişlemcisini inceler. 8086'nın yolları, yazmaçları ve komutları üzerinde öğrenilen kavramlar bir mikrodenetleyiciye geçildiğinde de aynı mantıkla kullanılır.

1.1.2Komut döngüsü

Mikroişlemcinin yaptığı her şey tek bir döngünün tekrarından ibarettir. İşlemci bir komutu bellekten alır, ne istendiğini anlar, istenen işi yapar ve sonucu yerine koyar. Sonra aynı işi bir sonraki komut için yineler. Bu kesim döngünün aşamalarını tanımlar, döngüyü üç komutluk bir 8086 programının makine kodu üzerinde izler ve program sayacının akışı nasıl yönettiğini gösterir.

1.1.2.1Getir, çöz, yürüt

Tanım 1.1.4

Komut döngüsü (instruction cycle), işlemcinin her komut için yinelediği aşamalar dizisidir:

  1. Getir (fetch): komutu, program sayacının gösterdiği adresten bellekten çeker.
  2. Çöz (decode): işlem kodunu (opcode) çözer; hangi işlemin hangi işlenenlerle (operand) yapılacağını belirler.
  3. Yürüt (execute): çözülen komutu uygular; ALU'da hesap yapar, veri taşır ya da atlar.
  4. Sonuç (result): sonucu yazmaca ya da belleğe yazar ve bayrakları günceller.

Bazı kitaplar dördüncü aşamayı yürütmenin içinde sayar ve döngüye kısaca “getir–çöz–yürüt” der. Hangi adlandırma seçilirse seçilsin, sıra aynıdır. İşlemci açık olduğu sürece bu döngü hiç durmadan döner. Şekildeki ok, son aşamadan ilk aşamaya geri döner; döngünün bittiği tek durum işlemcinin durdurulmasıdır.

Getir Çöz Yürüt Sonuç her komutiçin tekrar
Şekil 1.1.4: Getir, çöz, yürüt ve sonuç aşamaları bir döngü oluşturur. Döngü her komut için yeniden başlar.

Her aşamayı işlemcinin farklı bir parçası üstlenir. Getirmeyi yol arayüzü yapar: program sayacındaki adresi adres yoluna koyar, okuma sinyalini verir ve veri yolundan gelen baytları alır. Çözmeyi kontrol birimi yapar: işlem kodu baytını bir tabloya bakar gibi yorumlar ve hangi birimlerin çalışacağını belirleyen kontrol sinyallerini üretir. Yürütmede ALU devreye girer ya da veri bir yazmaçtan başkasına aktarılır. Sonuç aşamasında yazmaç dosyasına veya belleğe yazılır.

Aşamalar sırayla yürüdüğü için birim zamanda yürütülen komut sayısı sınırlıdır: getirme sürerken ALU boş bekler, yürütme sürerken yol boş bekler. Hızlı işlemciler bu boşluğu aşamaları üst üste bindirerek kapatır. Bir komut yürütülürken bir sonraki çözülür, ondan sonraki de getirilir. Bu düzene boru hattı (pipeline) denir; RISC işlemcilerin temel tekniğidir. 8086 bu fikrin basit bir biçimini kullanır: yol arayüz birimi, yürütme birimi çalışırken sıradaki komut baytlarını önceden getirir ve 6 baytlık bir kuyrukta bekletir.

1.1.2.2Makine kodu üzerinde izleme

Döngüyü somut görmek için üç komutluk bir program ele alalım:

mov al, 5     ; B0 05
add al, 3     ; 04 03
hlt           ; F4

Assembler bu metni beş baytlık makine koduna çevirir. Program belleğe 0100h adresinden başlayarak yüklenmiştir: 0100h'de B0, 0101h'de 05, 0102h'de 04, 0103h'te 03, 0104h'te F4 durur. İlk bayt işlem kodudur. B0, “AL yazmacına 8 bitlik sabit yükle” demektir ve sabit, işlem kodunun hemen arkasındaki baytta bulunur. Böyle komutun içine gömülü sabite anlık değer (immediate value) denir. 04 işlem kodu “AL'ye 8 bitlik anlık değer ekle” anlamına gelir. F4 ise HLT komutudur ve işlenen almaz; tek bayttır.

8086'da program sayacının adı komut işaretçisidir (instruction pointer, IP). IP her zaman bir sonraki getirilecek baytın bağıl konumunu tutar. Başlangıçta IP = 0100h'dir. Şekil 1.1.5 döngünün dört anını gösterir.

Bellek0100hB00101h050102h040103h030104hF4makine koduadresveriMikroişlemci1 · GETİRIP (PC) = 0102hKomut: B0 05Kontrol birimi—ALUAL??BayraklarZF=?CF=?
Bellek0100hB00101h050102h040103h030104hF4makine koduadresveriMikroişlemci2 · ÇÖZIP (PC) = 0102hKomut: B0 05Kontrol birimiB0 → MOV AL, sabit8sabit = 05hALUAL??BayraklarZF=?CF=?
Bellek0100hB00101h050102h040103h030104hF4makine koduadresveriMikroişlemci3 · YÜRÜTIP (PC) = 0104hKomut: 04 03Kontrol birimi04 → ADD AL, sabit8sabit = 03hALU05h + 03h = 08hAL08hBayraklarZF=0CF=0
Bellek0100hB00101h050102h040103h030104hF4makine koduadresveriMikroişlemciGETİR → ÇÖZIP (PC) = 0105hKomut: F4Kontrol birimiF4 → HLTişlemciyi durdurALUAL08hBayraklarZF=0CF=0
Şekil 1.1.5: MOV AL,5 · ADD AL,3 · HLT programında komut döngüsü. Yukarıdan aşağı: ilk komut getirilmiş (IP = 0102h); B0 çözülmüş; ikinci komut yürütülmüş (AL = 08h, ZF = 0, CF = 0); F4 getirilip çözülmüş (IP = 0105h).

İzlemenin adımları şöyledir:

  1. Getir. IP'deki 0100h adres yoluna konur. Bellek B0 baytını döndürür. Kontrol birimi işlem kodundan komutun 2 bayt olduğunu anlar ve 05 baytını da getirir. IP komut uzunluğu kadar artar: 0100h + 2 = 0102h.
  2. Çöz. Kontrol birimi B0'ı “AL'ye 8 bitlik sabit yükle” diye çözer; sabit 05h'dir.
  3. Yürüt ve sonuç. 05h, AL yazmacına yazılır. ALU kullanılmaz. MOV komutu hiçbir bayrağı değiştirmez; bayraklar önceki değerlerinde kalır.
  4. Getir. Döngü yeniden başlar. 0102h'deki 04 03 getirilir; IP = 0104h olur.
  5. Çöz. 04 = “AL'ye 8 bitlik sabit ekle”. İşlenenler AL'deki 05h ve sabit 03h'tir.
  6. Yürüt ve sonuç. ALU 05h + 03h = 08h hesaplar ve sonucu AL'ye yazar. Sonuç sıfır olmadığı için sıfır bayrağı ZF = 0'dır. En üst bitten taşan elde olmadığı için elde bayrağı CF = 0'dır.
  7. Getir ve çöz. 0104h'teki F4 getirilir; IP = 0105h olur. F4, HLT diye çözülür ve işlemci bir kesme ya da sıfırlama gelene kadar durur.
Tablo 1.1.2: MOV AL,5 · ADD AL,3 · HLT programının izlemesi. Her satır o komutun yürütülmesinden sonraki durumu verir.
AdresMakine koduKomutIP (sonra)ALZFCF
——başlangıç0100h????
0100hB0 05mov al, 50102h05h??
0102h04 03add al, 30104h08h00
0104hF4hlt0105h08h00

ADD yalnız ZF ile CF'yi değil, 8086'nın altı durum bayrağının hepsini günceller. 08h = 0000 1000b sonucunda en üst bit 0 olduğu için işaret bayrağı SF = 0'dır. İki pozitif sayının toplamı pozitif kaldığı için taşma bayrağı OF = 0'dır. Düşük dört bitte 5 + 3 = 8 4 bite sığdığı için yardımcı elde bayrağı AF = 0'dır. Sonucun düşük baytında tek sayıda (bir tane) 1 biti olduğu için eşlik bayrağı PF = 0'dır. Tabloda yalnız ZF ve CF gösterilmiştir.

Bu izlemede iki ayrıntı önemlidir. Birincisi, IP komut getirilir getirilmez artar; komut yürütülürken IP zaten bir sonraki komutu gösterir. Atlama komutları bu değeri değiştirerek akışı yönlendirir. İkincisi, işlemci baytların “komut” mu “veri” mi olduğunu bilmez. 0101h'deki 05 işlem kodu olarak değil sabit olarak okunur, çünkü kontrol birimi B0'ı çözdüğünde arkasından bir sabit geleceğini bilir. IP yanlışlıkla 0101h'e gitseydi işlemci 05'i işlem kodu sayar ve bambaşka bir komut yürütürdü.

Gerçek 8086'da getirme bu anlatımdan biraz farklı yürür. Yol arayüz birimi (BIU), yürütme birimi (EU) bir komutla uğraşırken sıradaki baytları önceden getirir ve 6 baytlık önden getirme kuyruğuna yazar. EU bir komutu bitirdiğinde sıradaki komutun baytları çoğunlukla kuyrukta hazırdır; getirme için belleği beklemek gerekmez. Programcı açısından sonuç değişmez: komutlar yine sırayla ve aynı etkilerle yürür.

Sık yapılan hata

IP'nin her komutta 1 arttığı sanılır. IP komut sayısını değil bayt adresini tutar ve komut uzunluğu kadar artar. 8086 komutları 1 ile 6 bayt arasındadır: hlt 1, mov al, 5 2, mov cx, 3 3 bayttır. Bir komutun adresini bulmak için önceki komutların uzunlukları toplanır.

1.1.2.3Üç temel işlev

Bir işlemcinin komut kümesi yüzlerce komut içerse de bu komutlar üç işlevden birine hizmet eder.

Aritmetik ve mantıksal işlemler. Toplama, çıkarma, karşılaştırma, AND, OR, XOR ve kaydırma bu gruptadır. Bu işlemleri aritmetik-mantık birimi (arithmetic logic unit, ALU) yapar. Yeni işlemciler kayan noktalı sayılarla da çalışır; bu iş için ayrı bir kayan nokta birimi (floating-point unit, FPU) bulunur. 8086'da örnekler: ADD AX, BX (AX'e BX'i ekle), CMP AL, 10 (AL'yi 10 ile karşılaştır), AND AL, 0Fh (AL'nin üst dört bitini sıfırla).

Veri taşıma. Veri yazmaçlar, bellek ve G/Ç arasında bir yerden başka bir yere kopyalanır. Programlarda en sık görülen işlem budur; derleyicilerin ürettiği kodun büyük kısmı taşıma komutlarıdır. Örnekler: MOV AX, [1234h] (bellekteki sözcüğü AX'e oku), MOV [BX], AL (AL'yi BX'in gösterdiği adrese yaz), IN AL, 60h (60h numaralı G/Ç portundan bir bayt oku).

Program sayacını değiştirme. Program sayacı sıradaki komutun adresini tutar. Ona yeni bir değer yazmak, akışı başka bir yere atlatmak demektir. Koşullu atlamalar, bayraklara bakarak atlayıp atlamamaya karar verir; programdaki her if ve her döngü bu yolla kurulur. Örnekler: JMP etiket (koşulsuz atla), JZ sifirsa (ZF = 1 ise atla), CALL alt_program (dönüş adresini saklayıp alt programa atla).

Her program bu üç işlevin, yani hesaplamanın, taşımanın ve sırayı değiştirmenin birleşimidir. Bir sıralama programı sayıları okur (taşıma), karşılaştırır (hesap), sonuca göre yer değiştirir ya da geçer (sırayı değiştirme).

1.1.2.4Program sayacı ve döngü

Sıralı akışta IP kendiliğinden artar. Döngü kurmak için IP'ye geriye doğru bir adres yazılması gerekir. Aşağıdaki program 3 + 2 + 1 toplamını hesaplar. Soldaki sayılar komutların bellekteki bağıl konumlarıdır (onaltılık).

0100  mov  cx, 3     ; sayaç = 3
0103  mov  ax, 0     ; toplam = 0
0106  dongu: add ax, cx
0108  loop dongu     ; CX--, CX≠0 ise atla
010A  hlt            ; dur

mov cx, 3 CX'e sayaç değerini koyar; 16 bitlik yazmaca 16 bitlik sabit yükleyen bu komut 3 bayttır (B9 03 00). mov ax, 0 toplamı sıfırlar; o da 3 bayttır. add ax, cx iki yazmacı toplar ve 2 bayttır. loop dongu önce CX'i 1 azaltır; CX sıfır değilse dongu etiketine atlar, sıfırsa sıradaki komuta geçer. loop 2 bayttır ve hiçbir bayrağı değiştirmez. hlt işlemciyi durdurur.

Tablo 1.1.3: IP izlemesi. Her satır o komutun yürütülmesinden sonraki durumu verir.
AdımYürütülenIPCXAXAçıklama
1mov cx, 30103h0003h????3 bayt ilerler
2mov ax, 00106h0003h0000htoplam sıfırlandı
3add ax, cx0108h0003h0003h0 + 3
4loop dongu0106h0002h0003hCX = 2 ≠ 0, atla
5add ax, cx0108h0002h0005h3 + 2
6loop dongu0106h0001h0005hCX = 1 ≠ 0, atla
7add ax, cx0108h0001h0006h5 + 1
8loop dongu010Ah0000h0006hCX = 0, atlama yok
9hlt010Bh0000h0006hişlemci durur

Tablonun dördüncü satırı sıralı akışın nasıl bozulduğunu gösterir. loop getirildiğinde IP 010Ah olmuştu. CX sıfır olmadığı için loop IP'ye 0106h yazar ve bir sonraki getirme add ax, cx'ten yapılır. Makine kodunda hedef adres doğrudan yazılmaz. loop komutunun ikinci baytı, sıradaki komutun adresine eklenecek işaretli bir uzaklıktır: 0106h − 010Ah = −4, yani FCh. Böylece komut E2 FC diye kodlanır ve program bellekte başka bir adrese taşınsa da doğru çalışır.

Döngü gövdesi üç kez çalışır, çünkü CX başta 3'tür ve her loop onu bir azaltır. Toplam dokuz komut yürütülür ve sonuç AX = 3 + 2 + 1 = 6 olur. Döngü sayacı olarak CX'in seçilmesi bir alışkanlık değil zorunluluktur: loop komutu sayaç olarak her zaman CX'i kullanır.

Sık yapılan hata

loop komutunun önce CX'i sınayıp sonra azalttığı sanılır. Sıra terstir: önce CX bir azalır, sonra yeni değer sınanır. Bu yüzden CX = 0 iken döngüye girilirse ilk loop CX'i FFFFh yapar ve gövde 65.536 kez çalışır.

1.1.3Mikroişlemcinin yapısı

Komut döngüsünün aşamalarını işlemcinin farklı birimleri üstlenir. Bu kesim bu birimleri tanıtır, hepsini aynı adımda yürüten saat sinyalini açıklar ve bir programın süresini hesaplamayı gösterir. Kesim, işlemcinin bit genişliğinin ne anlama geldiğiyle ve 16 bitlik bir işlemcinin 32 bitlik sayıları nasıl topladığıyla biter.

1.1.3.1Yapı bileşenleri

Bir mikroişlemcinin içi dört ana birimden oluşur: kontrol birimi, yazmaçlar, ALU ve yol arayüzü. Bu birimler yonganın içindeki bir iç veri yoluyla birbirine bağlıdır. Yol arayüzü ise iç dünyayı dış yollara, yani belleğe ve G/Ç birimlerine bağlar. Şekil 1.1.6 bu düzeni gösterir.

Mikroişlemci (CPU) Kontrol Birimi (CU)komut çözücü · zamanlamakontrol sinyalleri YazmaçlarAX BX CX DX · SP BP SI DIIP · bayraklar · kesim iç veri yoluALU+ − × ÷ · AND OR XOR Yol Arayüz Birimiadres/veri tamponları(8086: BIU + komut kuyruğu) Bellek G/Ç adresverikontrol Saat (CLK)
Şekil 1.1.6: Mikroişlemcinin iç yapısı. Kontrol birimi, yazmaçlar, ALU ve yol arayüz birimi iç veri yoluyla bağlıdır. Kontrol birimi öbür birimlere kontrol sinyalleri gönderir. Yol arayüzü dış adres, veri ve kontrol yollarını sürer. Bütün birimler saat sinyaliyle (CLK) eşzamanlı çalışır.

Aritmetik-mantık birimi (ALU). İkili sayılar üzerinde aritmetik (+, −) ve mantıksal (AND, OR, NOT, XOR) işlemleri, karşılaştırmayı ve kaydırmayı yapar. Sayısal tasarımda kurulan tam toplayıcılar, çoklayıcılar ve kaydırıcılar ALU'nun yapı taşlarıdır. ALU iki girişini alır, kontrol biriminden gelen işlem seçme sinyallerine göre bir sonuç üretir ve sonucun özelliklerini bayraklara (flag) yazar. Sonuç sıfırsa sıfır bayrağı (ZF) 1 olur. En üst bitten elde taştıysa elde bayrağı (CF), sonucun en üst biti 1 ise işaret bayrağı (SF) 1 olur. İşaretli sonuç sığmadıysa taşma bayrağı (OF) 1 olur. Koşullu atlamalar bu bayraklara bakar.

Kontrol birimi (control unit, CU). İşlemcinin orkestra şefidir. Komutu çözer; hangi yazmacın iç yola bağlanacağını, ALU'nun hangi işlemi yapacağını ve bellek okuma/yazma sinyallerinin ne zaman verileceğini belirler. Kontrol birimi iki yolla kurulabilir. Donanımsal (hardwired) kontrol biriminde her komutun sinyalleri doğrudan mantık kapılarıyla üretilir; bu yol hızlıdır ama karmaşık komut kümelerinde tasarımı zorlaşır. Mikroprogramlı kontrol biriminde her komut, yonga içindeki küçük bir ROM'da duran adımlar dizisine, yani mikrokoda (microcode), çevrilir. 8086 mikroprogramlı bir işlemcidir.

Yazmaçlar (register). İşlemci içindeki küçük ve çok hızlı bellek gözleridir. Her yazmaç flip-floplardan kurulmuş bir kaydedicidir ve bir saat turunda okunup yazılabilir. Belleğe gitmek ise bir yol döngüsü, yani birkaç saat turu ister. Bu yüzden programlar sık kullandıkları değerleri yazmaçlarda tutar. Yazmaçlar görevlerine göre gruplanır: genel amaçlı (veri) yazmaçları, adres ve işaretçi yazmaçları, durum (bayrak) yazmacı ve program sayacı. 8086'da genel amaçlı yazmaçlar AX, BX, CX ve DX'tir. SP, BP, SI ve DI işaretçi ve indis yazmaçlarıdır. IP program sayacı, FLAGS bayrak yazmacıdır; CS, DS, SS ve ES de kesim yazmaçlarıdır.

Yol arayüzü. Adres, veri ve kontrol yollarını sürer. Bellekten okunacak ya da belleğe yazılacak her bayt bu birimden geçer. 8086'da bu birimin adı yol arayüz birimidir (bus interface unit, BIU). BIU fiziksel adresi hesaplar, yol döngülerini yürütür ve komut baytlarını önden getirip 6 baytlık bir kuyrukta bekletir. Komutları çözüp yürüten bölüm ise yürütme birimidir (execution unit, EU). İki birim aynı anda çalıştığı için getirme ile yürütme üst üste biner.

Saat ve zamanlama. İşlemcinin bütün birimleri saat sinyalinin vuruşlarıyla eşzamanlı ilerler. Bir yazmaç ancak saat kenarında yeni değerini alır; bir yol döngüsünün her adımı belirli bir saat turuna düşer. Bir vuruşun süresi T = 1/f'dir.

Önbellek, FPU ve çekirdekler. 8086'da bu birimler yonganın içinde yoktur. Modern işlemcilerde ise aynı yongada önbellek, kayan nokta birimi, birden çok çekirdek ve grafik birimi de bulunur. Bu birimler, 8086'dan bugüne işlemcilere eklenen özelliklerin başında gelir.

Örnek 1.1.3

add ax, bx komutu yürütülürken hangi birim ne yapar?

BIU, IP'nin gösterdiği adresten 03 C3 baytlarını getirip kuyruğa koyar (büyük olasılıkla önceki komut yürütülürken). EU kuyruktan baytları alır; kontrol birimi 03 işlem kodunu “bir yazmaca sözcük ekle” diye, C3 baytını da “hedef AX, kaynak BX” diye çözer. Kontrol birimi AX'i ve BX'i iç yol üzerinden ALU'nun girişlerine bağlar ve ALU'ya toplama işlemini seçtirir. ALU toplamı hesaplar; sonuç AX'e yazılır, bayraklar güncellenir. Bellek erişimi olmadığı için yol arayüzü bu sırada boştadır ve sıradaki komut baytlarını getirebilir.

1.1.3.2Saat sinyali ve periyot

Saat sinyali, belirli bir frekansta 0 ile 1 arasında gidip gelen kare dalgadır. 8086'da bu sinyali 8284A saat üreteci yongası üretir ve işlemcinin CLK ucuna verir. Saat sinyali sayısal tasarımdaki eşzamanlı devrelerin saatiyle aynı işi görür: bütün flip-flopların aynı anda durum değiştirmesini sağlar.

Tanım 1.1.5

Saat frekansı f, saat sinyalinin saniyedeki vuruş sayısıdır ve hertz (Hz) ile ölçülür. Bir vuruşa saat turu (clock cycle) ya da kısaca tur denir. Turun süresi periyottur:

T = 1 / f

Bir komut çoğunlukla birkaç saat turu sürer. 8086'da bir bellek erişimi, yani bir yol döngüsü, en az dört saat turudur. Bu turlara T durumu (T state) denir ve T1, T2, T3, T4 diye adlandırılır. Kabaca T1'de adres yola konur ve T2'de okuma ya da yazma sinyali etkin olur. T3'te veri yolda geçerli hâle gelir, T4'te yol döngüsü kapanır. Bellek yavaşsa T3 ile T4 arasına bekleme durumları (wait state, Tw) eklenir.

10CLKT1T2T3T4T1T = 1 / f8086 yol (bus) döngüsü = 4 T → 5 MHz'de 4 × 200 ns = 800 nssonraki tur
Şekil 1.1.7: Kare dalga saat sinyali. Bir periyot T'dir; 8086'nın bir yol döngüsü T1–T4 olmak üzere dört T durumundan oluşur. 5 MHz'de bir yol döngüsü 4 × 200 ns = 800 ns sürer.
Tablo 1.1.4: Üç saat frekansı için periyot ve dört turluk yol döngüsünün süresi.
fT = 1/f4T
5 MHz (8086)200 ns800 ns
10 MHz (8086-1)100 ns400 ns
3 GHz0,333 ns1,33 ns
Örnek 1.1.4

5 MHz'lik bir 8086'da saat periyodu ve dört turluk bir yol döngüsünün süresi nedir?

f = 5 MHz = 5 × 106 Hz. Periyot T = 1 / (5 × 106) s = 0,2 × 10−6 s = 200 ns. Yol döngüsü dört tur sürdüğü için 4 × 200 ns = 800 ns'dir. Bu, 5 MHz'lik bir 8086'nın belleğe saniyede en çok 1 / 800 ns = 1,25 milyon kez erişebileceği anlamına gelir. 16 bitlik veri yoluyla her erişimde 2 bayt geldiği için bu, saniyede 2,5 MB'lık bir üst sınırdır.

1.1.3.3Saat hızı, CPI ve çalışma süresi

Saat periyodu bir turun süresini verir, ama bir programın ne kadar süreceğini tek başına söylemez. Bunun için iki büyüklük daha gerekir: programın yürüttüğü komut sayısı N ve bir komutun ortalama kaç tur sürdüğü.

Tanım 1.1.6

Komut başına tur (cycles per instruction, CPI), bir programda komut başına harcanan ortalama saat turu sayısıdır. N komutluk bir programın CPU süresi:

CPU süresi = N × CPI × T = N × CPI / f

Saniyede yürütülen komut sayısı f / CPI'dır. Bu sayı milyon olarak verildiğinde birimi MIPS'tir (million instructions per second, saniyede milyon komut).

Formülün üç çarpanı üç ayrı tasarım düzeyine karşılık gelir. N'yi program ve derleyici belirler. CPI işlemcinin mimarisine bağlıdır: boru hattı, önbellek ve paralel yürütme birimleri CPI'yı düşürür. f ise üretim teknolojisine ve devre tasarımına bağlıdır. Birini iyileştirmek çoğu zaman ötekini kötüleştirir. Örneğin komutları basitleştirmek CPI'yı düşürür ama N'yi artırır.

Sunumdaki etkileşimli hesaplayıcı dört tarihî işlemci için bu formülü uygular. CPI değerleri kabaca örnektir. 8086 komutları ortalama 10 tur civarında sürer. Modern işlemciler ise bir turda birden çok komut bitirebilir; CPI'ları 1'in altına iner. Tablo 1.1.5 1 milyon komutluk bir program için hesaplayıcının verdiği sonuçları toplar.

Tablo 1.1.5: N = 1 milyon komut için periyot, yol döngüsü, hız ve çalışma süresi. Değerler hesaplayıcının hazır ayarlarıyla bulunmuştur.
İşlemcifCPIT4TMIPSSüre
80865 MHz10200 ns800 ns0,52 s
8038633 MHz430,3 ns121 ns8,25121 ms
Pentium66 MHz1,515,2 ns60,6 ns4422,7 ms
Core i73,33 GHz0,50,30 ns1,20 ns66600,15 ms

Tablonun son sütununda 8086 ile Core i7 arasında yaklaşık 13.000 katlık bir fark vardır. Bu farkın yalnız yaklaşık 670 katı saat frekansından gelir (3330 / 5 = 666). Geri kalan 20 kat CPI'daki düşüşün, yani mimarideki gelişmelerin ürünüdür (10 / 0,5 = 20). 4T sütunu yalnız karşılaştırma içindir; modern işlemcilerin yolları 8086'nınki gibi dört turluk döngülerle çalışmaz.

Örnek 1.1.5

N = 2 × 109 komutluk bir program, CPI = 1,5 olan 3 GHz'lik bir işlemcide kaç saniye sürer?

süre = N × CPI / f = 2 × 109 × 1,5 / (3 × 109) = 3 × 109 / (3 × 109) = 1 s

İşlemci saniyede f / CPI = 3 × 109 / 1,5 = 2 × 109 komut, yani 2000 MIPS yürütür; 2 milyar komut bu yüzden tam 1 saniye sürer.

1.1.3.4Bir döngünün saat turu sayımı

CPI bir ortalamadır. Gerçek bir programın süresini bulmak için her komutun tur sayısı ayrı ayrı toplanır. Intel'in 8086 veri sayfası her komut için bir tur sayısı verir. Aşağıdaki döngü 4 + 3 + 2 + 1 toplamını hesaplar; açıklamalarda her komutun tur sayısı yazılıdır.

org 100h
mov cx, 4        ; 4 tur
mov ax, 0        ; 4 tur
dongu: add ax, cx ; 3 tur
loop dongu       ; 17 / 5 tur
hlt              ; 2 tur

Tur sayıları komutun türüne göre değişir. Yazmaca anlık değer yükleyen mov 4 tur sürer. Yazmaçtan yazmaca add 3 tur sürer; bellek erişimi olmadığı için kısadır. loop komutunun iki süresi vardır: atlayan loop 17, atlamayan loop 5 tur. Fark, atlamanın önden getirme kuyruğunu boşaltmasından gelir. Kuyrukta duran baytlar artık geçersizdir, çünkü akış başka bir adrese gitmiştir; BIU hedef adresten yeniden getirmeye başlamak zorundadır. hlt 2 tur sürer.

Tablo 1.1.6: Döngünün saat turu sayımı (5 MHz, 1 tur = 200 ns). Her satır o komuttan sonraki durumu verir.
AdımKomutTurToplam turSüreCXAX
1mov cx, 4440,8 µs4?
2mov ax, 0481,6 µs40
3add ax, cx3112,2 µs44
4loop (atlar)17285,6 µs34
5add ax, cx3316,2 µs37
6loop (atlar)17489,6 µs27
7add ax, cx35110,2 µs29
8loop (atlar)176813,6 µs19
9add ax, cx37114,2 µs110
10loop (atlamaz)57615,2 µs010
11hlt27815,6 µs010
saat turları (5 MHz → 1 tur = 200 ns)010203040506070441717175şimdiye kadar:78 tur × 200 ns = 15,6 µsbu komut: HLT → 2 turCX = 0 · AX = 10
Şekil 1.1.8: Döngünün zaman çubuğu. Her dikdörtgen bir komutun tur sayısıdır: 4, 4, sonra üç kez 3 + 17, en sonda 3 + 5 ve 2. Toplam 78 tur, 5 MHz'de 15,6 µs eder.

Toplam bir formülle de bulunabilir. Gövde dört kez çalışır; loop üç kez atlar, bir kez atlamaz:

4 + 4 + 4 × 3 + 3 × 17 + 5 + 2 = 8 + 12 + 51 + 5 + 2 = 78 tur

78 × 200 ns = 15.600 ns = 15,6 µs

Sonuç dikkat çekicidir: 78 turun 51'i, yani yarıdan fazlası atlayan loop komutlarında harcanmıştır. Asıl iş olan toplama yalnız 12 tur sürer. Döngü yükü küçük gövdeli döngülerde süreyi belirler. Bu yüzden hız gereken yerlerde döngü gövdesi birkaç kez açılarak yazılır ve atlama sayısı azaltılır. Bu programın ortalama CPI'sı da hesaplanabilir: 11 komut 78 tur sürdüğü için CPI = 78 / 11 ≈ 7,1'dir.

Veri sayfasındaki tur sayıları en iyi durum değerleridir. Komut baytlarının kuyrukta hazır beklediği ve belleğin bekleme durumu eklemediği varsayılır. Gerçek sürede kuyruk boşken getirme beklemesi ve yavaş bellek için eklenen Tw durumları da yer alır; ölçülen süre bu yüzden biraz daha uzun çıkabilir. Süre her durumda tur sayısı × T'dir.

Sık yapılan hata

Döngü süresi hesaplanırken loop komutunun bütün geçişleri aynı süreyle sayılır. Atlayan ve atlamayan loop farklı sürer (17 ve 5 tur). n kez dönen bir döngüde loop n − 1 kez atlar, son geçişte atlamaz.

1.1.3.5Saat hızlarının gelişimi

Intel işlemcilerinin saat hızları kırk yılda megahertzden gigahertze çıkmıştır. 16 bitlik dönemde 8086 5, 8 ve 10 MHz sürümleriyle üretildi. 8088 5 ve 8 MHz'de çalıştı; IBM PC'deki 8088'in saat hızı ise 4,77 MHz'dir. 80186/80188 6 MHz'den, 80286 da 6, 8, 10 ve 12,5 MHz sürümleriyle başladı. 32 bitlik dönemde 80386 16–33 MHz, 80486 16–100 MHz aralığında çalıştı. 80486'nın DX2 ve DX4 sürümleri saat çarpanı kullanır: yonga içi saat dış yol saatinin iki ya da üç katıdır. Pentium 60 ve 66 MHz'le başladı. 64 bitlik dönemde Core 2 1,2–3 GHz aralığında çalışır. Birinci nesil Core i7 2,66–3,33 GHz, Core i5 2,4–3,6 GHz, Core i3 2,93–3,33 GHz aralığındadır.

5 MHz'den yaklaşık 3 GHz'e çıkış, otuz yılda yaklaşık 600 katlık bir artıştır. 2005 civarında bu artış durdu. Saat frekansı yükseldikçe her saniyede daha çok transistör anahtarlanır; dinamik güç frekansla ve besleme geriliminin karesiyle orantılı artar. Yonganın ürettiği ısıyı uzaklaştırmanın sınırına dayanıldı. O tarihten sonra performans artışı daha çok çekirdek sayısını artırarak ve bir turda daha fazla komut bitirerek, yani CPI'yı düşürerek sağlandı.

1.1.3.6Bit genişliği

Tanım 1.1.7

Bir işlemcinin bit genişliği (word length), bir seferde işleyebildiği sözcüğün bit sayısıdır: yazmaçların ve ALU'nun boyutu, çoğunlukla da veri yolunun genişliği. “n bitlik işlemci” bu anlama gelir. n bitle işaretsiz olarak 0 … 2n − 1 aralığı temsil edilir.

Tablo 1.1.7: Sözcük genişliğine göre işaretsiz aralık.
Sözcükİşaretsiz aralık
8 bit0 … 255
16 bit0 … 65.535
32 bit0 … 4.294.967.295
64 bit0 … ≈ 1,8 × 1019

Bit genişliği sayıların büyüklüğünü sınırlar ama işlemcinin daha büyük sayılarla çalışmasını engellemez. 8 bitlik bir işlemci de 32 bitlik sayıları toplayabilir; yalnız bunu birkaç adımda yapar. Genişlik arttıkça aynı iş daha az komutla biter.

Adres yolunun genişliği ise ayrı bir büyüklüktür ve erişilebilen bellek miktarını belirler: n hat 2n bayt adresler. Tablo 1.1.8 Intel işlemcilerinden örnekler verir.

Tablo 1.1.8: Adres yolu genişliği ve adreslenebilir bellek.
Adres yoluBellekÖrnek
16 bit64 KB8080, 8085
20 bit1 MB8086, 8088
24 bit16 MB80286
32 bit4 GB80386, 80486
36 bit64 GBPentium Pro (PAE)

Tablodaki işlemcilerde veri genişliği ile adres genişliği her zaman eşit değildir. 8 bitlik 8080'in adres yolu 16 bittir. 16 bitlik 8086'nın adres yolu 20 bittir. 20 bitlik adres, iki 16 bitlik değerin, kesim ve bağıl konumun birleştirilmesiyle üretilir: fiziksel adres = kesim × 16 + bağıl konum. Örneğin kesim 1234h, bağıl konum 0010h ise fiziksel adres 12340h + 0010h = 12350h'dir.

1.1.3.716 bitlik işlemcide 32 bitlik toplama

Bit genişliğinin pratikteki etkisini görmek için iki 32 bitlik sayıyı 16 bitlik 8086 ile toplayalım: a = 0001FFFFh = 131.071 ve b = 00030002h = 196.610. Bu sayılar 16 bitlik bir yazmaca sığmaz. Her biri iki yarıya bölünür ve bir yazmaç çiftinde tutulur. a için yüksek yarı DX'e, düşük yarı AX'e konur; bu çift DX:AX diye yazılır. b de CX:BX çiftine konur.

org 100h
mov ax, 0FFFFh ; a: düşük yarı
mov dx, 0001h  ; a: yüksek yarı
mov bx, 0002h  ; b: düşük yarı
mov cx, 0003h  ; b: yüksek yarı
add ax, bx     ; düşük yarılar
adc dx, cx     ; yüksek + CF
ret

İlk dört komut sayıları yazmaçlara yükler. 0FFFFh yazımındaki baştaki 0, assembler'ın sayıyı bir etiket adı sanmaması içindir; harfle başlayan onaltılık sayılar böyle yazılır. add ax, bx düşük yarıları toplar. adc (add with carry, eldeli topla) yüksek yarıları toplar ve önceki toplamadan gelen eldeyi, yani CF'yi de ekler. Kâğıt üzerinde basamak basamak toplama yapılırken eldenin bir sonraki basamağa eklenmesi neyse, adc da 16 bitlik “basamaklar” için odur.

yüksek 16 bitdüşük 16 bitaDX0001hAX0001h= 65.537bCX0003hBX0002h= 196.610+CF1AX'ten taşan elde → yüksek 16 bitdüşük 16 bitaDX0005hAX0001h= 327.681bCX0003hBX0002h= 196.610+CF00001h + 0003h + 1 = 0005h
Şekil 1.1.9: 32 bitlik toplamanın iki anı. Solda add ax, bx: FFFFh + 0002h toplamının 17. biti AX'e sığmaz; AX = 0001h, CF = 1. Sağda adc dx, cx: 0001h + 0003h + 1 = 0005h; sonuç DX:AX = 00050001h.
Tablo 1.1.9: 32 bitlik toplamanın izlemesi. Her satır o komuttan sonraki durumu verir.
KomutDXAXCXBXCFAçıklama
mov ax, 0FFFFh????FFFFh????????0a'nın düşük yarısı
mov dx, 0001h0001hFFFFh????????0DX:AX = 131.071
mov bx, 0002h0001hFFFFh????0002h0b'nin düşük yarısı
mov cx, 0003h0001hFFFFh0003h0002h0CX:BX = 196.610
add ax, bx0001h0001h0003h0002h1FFFFh + 0002h = 1 0001h
adc dx, cx0005h0001h0003h0002h00001h + 0003h + 1

Kritik adım add ax, bx'tir. FFFFh + 0002h = 10001h sonucu 17 bittir. En üstteki 1 biti 16 bitlik AX'e sığmaz: AX'te 0001h kalır ve taşan bit CF'ye yazılır. Bu komut diğer bayrakları da günceller: sonuç sıfır olmadığı için ZF = 0, en üst bit 0 olduğu için SF = 0'dır. İşaretli yorumda FFFFh −1 olduğundan −1 + 2 = 1 doğru bir sonuçtur ve OF = 0 kalır. Düşük dört bitte Fh + 2h = 11h taştığı için AF = 1'dir. adc dx, cx ise 0001h + 0003h + CF(1) = 0005h hesaplar; yeni bir taşma olmadığı için CF = 0 olur. Sonuç DX:AX = 00050001h'dir. Onluk sağlaması: 5 × 65.536 + 1 = 327.681 = 131.071 + 196.610.

16 bitlik işlemci 32 bitlik toplamayı iki komutta yaptı. 32 bitlik bir işlemci, örneğin 80386, aynı işi tek bir add ile yapar: add eax, ebx. 64 bitlik toplama 8086'da dört komut (add ve üç adc) sürerken 80386'da iki, 64 bitlik bir işlemcide bir komuttur. Bit genişliğinin performansa etkisi budur.

Sık yapılan hata

Yüksek yarılar da add ile toplanır. Bu durumda düşük yarıdan gelen elde kaybolur ve sonuç DX:AX = 00040001h = 262.145 çıkar; doğru sonuçtan tam 65.536 eksiktir. Ayrıca add ile adc arasına CF'yi değiştiren bir komut (örneğin bir cmp) konmamalıdır; mov ise bayrakları değiştirmediği için araya girebilir.

1.1.4Komut kümesi mimarileri

İşlemciler birçok açıdan sınıflanabilir. Üç soru öne çıkar: Komutlar nasıl tasarlanır? Bir komut kaç veriyi işler? İşlemci hangi işe göre eniyilenmiştir? Bu kesim ilk soruyu, yani komut kümesi mimarisini ele alır: CISC, RISC ve EPIC. Aradaki en önemli teknik, boru hattı, adım adım izlenir.

1.1.4.1İşlemci türlerine genel bakış

İşlemciler Komut kümesi mimarisi Veri işleme biçimi Uygulamaya özel CISC RISC EPIC Skalar Vektör Dizi DSP GPU Sembolik komutlar nasıl tasarlanır? bir komut kaç veriyi işler? hangi işe göre optimize?
Şekil 1.1.10: İşlemcilerin üç ölçüte göre sınıflanması. Komut kümesi mimarisine göre CISC, RISC ve EPIC; veri işleme biçimine göre skalar, vektör ve dizi; uygulamaya göre DSP, GPU ve sembolik işlemciler.

Bir işlemcinin komut kümesi (instruction set), yürütebildiği komutların tamamıdır. Komut kümesi mimarisi (instruction set architecture, ISA) ise bu komutların yanında yazmaçları, adresleme modlarını, veri türlerini ve komutların bellekte nasıl kodlandığını da kapsar. ISA, yazılım ile donanım arasındaki sözleşmedir: aynı ISA'yı uygulayan iki işlemci aynı makine kodunu çalıştırır, içerideki devreleri ne kadar farklı olursa olsun. Üç yaklaşımın adları şöyle açılır:

  • CISC: Complex Instruction Set Computer, karmaşık komut kümeli bilgisayar.
  • RISC: Reduced Instruction Set Computer, indirgenmiş (azaltılmış) komut kümeli bilgisayar.
  • EPIC: Explicitly Parallel Instruction Computing, açıkça paralel komut işleme.

1.1.4.2CISC

CISC yaklaşımı karmaşık işlemleri tek bir komutla yapmayı amaçlar. Bu yaklaşımın kökü 1960'lara ve 1970'lere uzanır. O yıllarda bellek pahalı ve yavaştı; programlar çoğunlukla assembly ile elle yazılırdı. Bir işi tek komutla yapmak hem bellekten tasarruf ettiriyor hem de programcının işini kolaylaştırıyordu.

Tanım 1.1.8

CISC mimarisinde bir komut, bellekten yükleme, aritmetik işlem ve belleğe kaydetme gibi birden çok düşük seviyeli işlemi içerebilir. Komutlarda birden çok adresleme modu ve doğrudan bellek işlenenleri bulunur. Komut uzunlukları değişkendir; yazmaç sayısı görece azdır; kontrol birimi çoğunlukla mikroprogramlıdır.

8086 tipik bir CISC işlemcisidir. Komutları 1 ile 6 bayt arasındadır; işlem kodundan sonra gelen baytların sayısı işlenenlere göre değişir. Bu yüzden kontrol birimi bir komutun kaç bayt olduğunu ancak ilk baytları çözdükten sonra öğrenir; çözme karmaşıktır. Genel amaçlı yazmaç sayısı dörttür (AX, BX, CX, DX). Pek çok komut belleği doğrudan işlenen olarak kullanabilir. İki tipik örnek:

ADD [BX], AX   ; bellek = bellek + AX
REP MOVSB      ; CX bayt kopyala

ADD [BX], AX, BX'in gösterdiği bellek sözcüğüne AX'i ekler: tek komutta belleği okur, toplar ve sonucu belleğe yazar. REP MOVSB ise CX bayt uzunluğundaki bir bellek bloğunu SI'nın gösterdiği yerden DI'nin gösterdiği yere kopyalar; tek bir komut, bir döngünün yerini tutar. CISC ailesinin başka örnekleri Intel 80386, 80486 ve Pentium serisi, Motorola 68000, 68020 ve 68040, DEC VAX ve IBM System/360'tır.

1.1.4.3RISC

1970'lerin sonunda yapılan ölçümler ilginç bir sonuç verdi. Derleyicilerin ürettiği kod, CISC komut kümelerindeki karmaşık komutların çok küçük bir kısmını kullanıyordu. Programların büyük bölümü basit yükleme, saklama, toplama ve atlama komutlarından oluşuyordu. Karmaşık komutlar ise kontrol birimini büyütüyor ve basit komutları da yavaşlatıyordu. RISC yaklaşımı bu gözlemden doğdu.

Tanım 1.1.9

RISC mimarisinde az sayıda, basit ve sabit uzunluklu (örneğin hepsi 32 bit) komut bulunur. Belleğe yalnız yükle ve sakla (load/store) komutları erişir; aritmetik ve mantık işlemleri yalnız yazmaçlar arasında yapılır. Bellek erişimini azaltmak için çok sayıda (32 ve üzeri) yazmaç vardır. Kontrol birimi donanımsaldır ve komutlar boru hattıyla yürütülür. Hedef, ideal durumda her saat turunda bir komut tamamlamaktır (CPI ≈ 1).

Komutların sabit uzunlukta olması çözmeyi kolaylaştırır: her komut aynı yerden başlar, işlem kodu ve yazmaç numaraları hep aynı bit alanlarındadır. Belleğe yalnız yükle/sakla komutlarının erişmesi, komutların büyük çoğunluğunun aynı sürede bitmesini sağlar. Bu düzenlilik boru hattının ön koşuludur. Karmaşıklık ortadan kalkmaz, derleyiciye kayar: bir CISC komutunun yaptığı işi RISC'te birkaç komut yapar ve bu komutları uygun sırayla dizmek derleyicinin görevidir.

RISC örnekleri IBM RS/6000 (POWER), Motorola MC88100, DEC Alpha 21064, 21164 ve 21264, MIPS ve SPARC'tır. Bugün en yaygın RISC ailesi ARM'dir: telefonların ve tabletlerin neredeyse hepsinde ve Apple'ın M serisi bilgisayarlarında ARM çekirdekleri bulunur. RISC-V ise lisans ücreti gerektirmeyen açık bir komut kümesidir ve hem akademide hem gömülü sistemlerde hızla yayılıyor.

RISC'in “her turda bir komut” hedefi bir komutun tek turda bittiği anlamına gelmez. Bir komut yine birkaç aşamadan geçer. Boru hattı sayesinde her turda bir komut tamamlanır; komutun tek başına süresi (gecikmesi) değil, birim zamanda biten komut sayısı (verim, throughput) artar.

1.1.4.4Boru hattı

Tanım 1.1.10

Boru hattı (pipeline), komut yürütmeyi ardışık aşamalara bölen ve ardışık komutların farklı aşamalarını aynı turda yürüten tekniktir. Her aşama ayrı bir donanım birimidir ve her turda işini bir sonraki aşamaya devreder.

Klasik RISC boru hattının beş aşaması vardır: IF (instruction fetch, getir), ID (instruction decode, çöz ve yazmaçları oku), EX (execute, yürüt), MEM (memory, belleğe eriş) ve WB (write back, sonucu yazmaca geri yaz). Fabrikadaki bir montaj bandı iyi bir benzetmedir. Bir otomobilin bütün montajı beş saat sürse de bant her saat bir otomobil çıkarır, çünkü beş istasyon aynı anda beş farklı otomobil üzerinde çalışır.

Şekil 1.1.11 dört bağımsız komutun (K1–K4) boru hattından geçişini gösterir. Turlar şöyle ilerler:

  • Tur 1: K1 getirilir (IF). Öbür aşamalar boştur.
  • Tur 2: K1 çözülürken (ID) K2 getirilir. İki komut aynı anda farklı aşamalardadır.
  • Tur 3: K1 yürütülür, K2 çözülür, K3 getirilir: üç komut üç aşamada.
  • Tur 4: dört komut birden boru hattındadır.
  • Tur 5: K1 WB aşamasına gelir ve tamamlanır. Boru hattı dolmuştur; bundan sonra her turda bir komut biter.
  • Tur 6, 7, 8: sırasıyla K2, K3 ve K4 tamamlanır.
12345678tur →K1IFIDEXMEMWBK2IFIDEXMEMK3IFIDEXK4IFIDTamamlanan komut: 1 / 4IF getir · ID çöz · EX yürüt · MEM bellek · WB geri yaz
12345678tur →K1IFIDEXMEMWBK2IFIDEXMEMWBK3IFIDEXMEMWBK4IFIDEXMEMWBTamamlanan komut: 4 / 4IF getir · ID çöz · EX yürüt · MEM bellek · WB geri yaz
Şekil 1.1.11: Beş aşamalı boru hattı. Üstte tur 5: boru hattı dolmuş, K1 tamamlanmıştır. Altta tur 8: dört komutun hepsi bitmiştir.
Teorem 1.1.1 (Boru hattında bitiş turu)

k aşamalı bir boru hattında, aralarında bağımlılık olmayan n komut

k + n − 1

turda biter. Boru hattı olmasaydı her komut k tur sürer ve toplam k × n tur gerekirdi.

Formülün gerekçesi basittir. İlk komut boru hattını k turda baştan sona geçer. Ondan sonra her turda bir komut daha biter; kalan n − 1 komut için n − 1 tur daha gerekir. Toplam k + (n − 1)'dir. Örnekte k = 5, n = 4: 5 + 4 − 1 = 8 tur. Boru hattısız 4 × 5 = 20 tur gerekirdi.

Örnek 1.1.6

5 aşamalı bir boru hattında 100 komut kaç turda biter? Boru hattısız kaç tur gerekir?

Boru hattıyla k + n − 1 = 5 + 100 − 1 = 104 tur. Boru hattısız 5 × 100 = 500 tur. Hızlanma 500 / 104 ≈ 4,8 kattır. Komut sayısı büyüdükçe hızlanma k n / (k + n − 1) ifadesi k'ya, yani aşama sayısına yaklaşır: 1000 komut için 5000 / 1004 ≈ 4,98.

Bu ideal tablo her zaman gerçekleşmez. Bir komut, kendinden hemen önceki komutun henüz yazmadığı bir sonuca gerek duyabilir (veri bağımlılığı). Bir koşullu atlamanın sonucu belli olana kadar hangi komutun getirileceği bilinmez (kontrol bağımlılığı). Bu durumlarda boru hattına boş turlar girer; buna boru hattında bekleme (stall) denir. Modern işlemciler beklemeleri azaltmak için sonuçları aşamalar arasında doğrudan iletir ve atlamaların sonucunu önceden tahmin eder.

8086'nın boru hattı bu beş aşamalı yapıdan çok daha basittir: yalnız iki aşama vardır, getirme (BIU) ve yürütme (EU). Atlayan loop komutunun 17 tur sürmesi de boru hattının bir bedelidir: atlama, önden getirilmiş baytları geçersiz kılar ve kuyruğun yeniden doldurulmasını gerektirir.

Sık yapılan hata

Boru hattının tek bir komutu hızlandırdığı düşünülür. Tek bir komutun süresi (gecikmesi) boru hattıyla kısalmaz, hatta aşamalar arası yazmaçlar yüzünden biraz uzar. Kısalan, çok sayıda komutun toplam süresidir; boru hattı verimi artırır.

1.1.4.5Aynı iş, iki yaklaşım

İki yaklaşımın farkını tek bir görev üzerinde görmek öğreticidir: bellekteki bir sayıya bir yazmacın değerini eklemek, yani bellek[adr] += x. CISC işlemcide (8086) bu iş tek komuttur:

ADD [BX], AX     ; 1 komut
                 ; oku, topla, yaz

RISC işlemcide (ARM) ise üç komut gerekir. r1 adresi, r0 eklenecek değeri tutar; ARM assembly'sinde açıklamalar @ işaretiyle başlar:

LDR r2, [r1]       @ yükle
ADD r2, r2, r0     @ topla
STR r2, [r1]       @ sakla

LDR (load register) bellekteki sözcüğü r2'ye yükler. ADD r2, r2, r0 üç işlenenli bir toplamadır: r2 ← r2 + r0. STR (store register) sonucu belleğe geri yazar. CISC kodu kısadır ve bellekte az yer kaplar, ama komut birçok tur sürer. RISC kodunun üç komutu basittir ve her biri boru hattında akıcı ilerler. Toplanan değer yazmaçta kaldığı için, bu sayı üzerinde başka işlemler de yapılacaksa yeniden belleğe gitmek gerekmez.

İki yaklaşım bugün iç içe geçmiştir. Pentium Pro'dan bu yana x86 işlemciler karmaşık komutları içeride RISC benzeri basit mikro-işlemlere (micro-operation, µop) çevirir ve bu mikro-işlemleri boru hattında yürütür. Dışarıdan bakıldığında komut kümesi CISC'tir; içeride ise yürütme RISC gibidir.

1.1.4.6CISC komutu içeride: kod izleme

Tek bir CISC komutunun içeride kaç iş yaptığını görmek için aşağıdaki programı izleyelim. Program bellekteki sayi değişkenine iki kez 7 ekler.

org 100h
mov bx, offset sayi ; adres
mov ax, 7           ; değer
add [bx], ax        ; oku, topla, yaz
add [bx], ax        ; tekrar
ret
sayi dw 0123h

Program org 100h ile 0100h adresinden başlar. Komut uzunlukları toplanınca sayi değişkeninin adresi bulunur: mov bx, offset sayi 3 bayt (0100h–0102h), mov ax, 7 3 bayt (0103h–0105h), iki add [bx], ax ikişer bayt (0106h–0109h), ret 1 bayt (010Ah). sayi bu yüzden 010Bh'dedir. offset işleci assembler'a değişkenin bağıl konumunu, yani 010Bh'yi yazdırır. dw (define word) bellekte bir sözcük ayırır ve ilk değerini 0123h yapar.

add [bx], ax tek bir komuttur, ama içeride üç iş yapar:

  1. Oku. BIU, BX'in gösterdiği 010Bh adresindeki sözcüğü (0123h) bir bellek okuma yol döngüsüyle getirir ve işlemcinin içindeki geçici bir yazmaca koyar. Bu geçici yazmaç programcıya görünmez.
  2. Topla. ALU 0123h + 0007h = 012Ah hesaplar ve bayrakları günceller.
  3. Yaz. Sonuç ikinci bir yol döngüsüyle belleğe geri yazılır: sayi = 012Ah.
İşlemciBX010BhAX0007hgeçici0123hALUBelleksayi · 010Bh0123h…oku1 · OKU İşlemciBX010BhAX0007hgeçici012AhALU0123h + 7Belleksayi · 010Bh0123h…2 · TOPLA
İşlemciBX010BhAX0007hgeçici012AhALUBelleksayi · 010Bh012Ah…yaz3 · YAZ İşlemciBX010BhAX0007hgeçici0131hALU012Ah + 7Belleksayi · 010Bh0131h…oku/yazOKU · TOPLA · YAZ
Şekil 1.1.12: add [bx], ax komutunun içeride yaptığı üç iş. Üst sırada oku (geçici = 0123h) ve topla (0123h + 7 = 012Ah); alt sırada yaz (sayi = 012Ah) ve aynı komutun ikinci yürütülmesi (sayi = 0131h).
Tablo 1.1.10: add [bx], ax programının izlemesi. Her satır o komuttan sonraki durumu verir.
KomutBXAXsayi (010Bh)Yol döngüsüBayraklar
başlangıç??0123h——
mov bx, offset sayi010Bh?0123h—değişmez
mov ax, 7010Bh0007h0123h—değişmez
add [bx], ax010Bh0007h012Ahoku + yazZF=0 CF=0 SF=0 OF=0 AF=0
add [bx], ax010Bh0007h0131hoku + yazZF=0 CF=0 SF=0 OF=0 AF=1

İkinci toplamada düşük dört bit Ah + 7h = 11h taştığı için AF = 1 olur; birincide 3h + 7h = Ah dört bite sığdığı için AF = 0'dır. Her iki sonuçta da en üst bit 0'dır ve 16 bitten taşma yoktur.

Bu komutun bedeli tur sayısında görülür. 8086 veri sayfasına göre bellek hedefli add 16 tur artı etkin adres hesabı sürer; [bx] için etkin adres hesabı 5 tur olduğundan toplam 21 turdur. Bu 21 turun 8'i iki yol döngüsüdür (okuma ve yazma, dörder tur). Yazmaçtan yazmaca add ise 3 tur sürer. Bir CISC komutu böylece iki bellek erişimini ve bir toplamayı tek komutta gizler. RISC işlemcide aynı iş üç komuttur (LDR, ADD, STR) ve ara değer bir yazmaçta görünür olur.

1.1.4.7RISC ve CISC karşılaştırması

Tablo 1.1.11: RISC ve CISC işlemcilerin karşılaştırılması.
ÖlçütRISCCISC
Komut kümesiaz ve basitgeniş ve karmaşık
Komut uzunluğusabitdeğişken
Komut başına turaz (≈ 1, boru hattıyla)çok (değişken)
Bellek erişimiyalnız yükle/saklaçoğu komut belleğe erişebilir
Yazmaç sayısıçokaz
Program boyutudaha uzundaha kısa
Güç tüketimidüşükgörece yüksek
Esneklikyük derleyicidegeniş komut yelpazesi, esnek kullanım

Tablonun özeti şudur: RISC az çeşit komutu hızlı çalıştırır ve yüksek performansı düşük güçle sunar. CISC çok çeşit komut sunar, ama tek tek komutları daha yavaştır. Karşılaştırmayı CPU süresi formülüyle de okumak mümkündür. CISC N'yi küçültür ama CPI'yı büyütür; RISC CPI'yı küçültür ama N'yi büyütür. Hangisinin kazanacağını çarpım belirler. Bugünkü yüksek performanslı işlemcilerde iki ailenin iç yapıları birbirine çok yaklaşmıştır; fark daha çok kod yoğunluğunda, çözücünün karmaşıklığında ve güç tüketiminde kalmıştır.

1.1.4.8EPIC

Süperskalar işlemciler aynı turda birden çok komut başlatır. Hangi komutların birbirinden bağımsız olduğunu ve birlikte yürütülebileceğini ise yürütme sırasında donanım bulur. Bu donanım büyük ve güç tüketen bir devredir. EPIC yaklaşımı bu kararı donanımdan alıp derleyiciye verir.

Tanım 1.1.11

EPIC mimarisinde hangi komutların paralel çalışabileceğine donanım değil derleyici karar verir ve bunu koda açıkça yazar. Komutlar 128 bitlik paketler (bundle) hâlinde kodlanır: her pakette 41 bitlik üç komut ve 5 bitlik bir şablon bulunur.

komut 2 · 41 bit komut 1 · 41 bit komut 0 · 41 bit 12787|8646|455|40 şablon (5 bit): yuvaların birim türü ve paralel grup sınırı 3 × 41 + 5 = 128
Şekil 1.1.13: 128 bitlik EPIC paketi. Bit 127–87 komut 2, bit 86–46 komut 1, bit 45–5 komut 0, bit 4–0 şablondur. 3 × 41 + 5 = 128.

Şablon alanı, paketteki üç yuvanın hangi tür yürütme birimine (tamsayı, bellek, kayan nokta, dallanma) gideceğini ve paralel yürütülebilecek bir komut grubunun nerede bittiğini söyler. İşlemci bu bilgiyi okuyup komutları doğrudan birimlere dağıtır; bağımlılık aramak için büyük bir devreye gerek kalmaz. Böylece yüksek saat frekansı gerekmeden çok sayıda komut aynı anda yürütülebilir. Bit sınırları da tutarlıdır: her komut 41 bit kapladığı için komut 0 bit 5'ten 45'e, komut 1 bit 46'dan 86'ya, komut 2 bit 87'den 127'ye uzanır.

EPIC'in bilinen tek ticari örneği Intel ile HP'nin ortak mimarisi IA-64 ve bu mimariyi uygulayan Itanium işlemcileridir (2001–2021). Yaklaşım beklenen başarıyı göstermedi. Derleyicinin derleme anında bilmediği durumlar, örneğin bir bellek erişiminin önbellekte bulunup bulunmayacağı, paralelliği sınırladı; iyi kod üretmek derleyiciye çok yük bindirdi. Itanium mevcut x86 yazılımını yavaş çalıştırıyordu. Piyasada AMD'nin x86'yı 64 bite genişleten x86-64 mimarisi kazandı.

1.1.5Veri işleme biçimine ve uygulamaya göre işlemciler

Komut kümesi mimarisi komutların nasıl tasarlandığını anlatır. İşlemcileri ayırmanın ikinci yolu, bir komutun kaç veri öğesini işlediğine bakmaktır: skalar işlemci bir, vektör ve dizi işlemcileri pek çok öğeyi işler. Üçüncü yol ise işlemcinin hangi işe göre eniyilendiğidir: sinyal işleme, sembolik hesap ya da grafik. Bu kesim bu türleri sırayla tanıtır ve iki küçük 8086 programıyla skalar işlemenin bedelini gösterir.

1.1.5.1Skalar ve vektör işleme

İki dizinin öğe öğe toplanması, yani C[i] = A[i] + B[i], bilimsel hesaplarda, ses ve görüntü işlemede sürekli karşılaşılan bir iştir. Skalar (scalar) bir işlemci bu işi her öğe için ayrı bir toplama komutuyla yapar. Vektör (vector) işlemci ise tek bir komutla dizinin bütün öğelerini toplar.

Skalar: 4 ayrı ADD (4 adım) t=1t=2t=3t=4 1+ 10= 11 2+ 20= 22 3+ 30= 33 4+ 40= 44 Vektör: 1 VADD (1 adım) ABC 1 2 3 4 + 10 20 30 40 = (tek komut, t=1) 11 22 33 44
Şekil 1.1.14: Dört öğeli dizilerin toplanması. Skalar işlemci dört ayrı ADD komutuyla dört adımda, vektör işlemci tek bir VADD komutuyla tek adımda hesaplar: C = (11, 22, 33, 44).

Vektör işlemenin kazancı yalnız toplamanın kendisinden gelmez. Skalar işlemcide her öğe için komut yeniden getirilir ve çözülür; döngü sayacı azaltılır ve sınanır; indis artırılır. Vektör işlemcide bu yük bir kez ödenir. Dört öğede kazanç küçük görünür, ama bin öğelik vektörlerde fark çok büyür.

1.1.5.2Skalar döngü: kod izleme

8086 skalar bir işlemcidir. Aşağıdaki program c = a + b toplamını dört öğeli bayt dizileri için hesaplar.

org 100h
mov si, 0
mov cx, 4
dongu: mov al, a[si]  ; bir öğe oku
add al, b[si]         ; bir toplama
mov c[si], al         ; bir öğe yaz
inc si
loop dongu
ret
a db 3, 5, 7, 9
b db 10, 20, 30, 40
c db 4 dup(0)

SI dizilerin ortak indisidir; CX döngü sayacıdır. a[si] yazımı, a dizisinin başlangıç adresine SI'nın eklenmesiyle bulunan adresteki baytı gösterir. Döngü gövdesinde üç komut asıl işi yapar: mov al, a[si] bir öğe okur, add al, b[si] bir toplama yapar, mov c[si], al sonucu yazar. Kalan iki komut, inc si ve loop dongu, döngü yüküdür. 4 dup(0) dört baytlık sıfırlarla dolu bir alan ayırır.

Tablo 1.1.12: Skalar döngünün izlemesi. Her satır bir döngü geçişinin sonundaki durumu verir.
GeçişİşlemALc dizisiSICXYürütülen komut (toplam)
başlangıç—?0, 0, 0, 0042
13 + 101313, 0, 0, 0137
25 + 202513, 25, 0, 02212
37 + 303713, 25, 37, 03117
49 + 404913, 25, 37, 494022
a3579b10203040c13253749skalar22 komutvektör (4 öğe)1 toplama
Şekil 1.1.15: Döngü bittiğinde c = (13, 25, 37, 49). Skalar işlemci 22 komut yürütmüştür; vektör işlemci aynı dört toplamayı tek bir vektör toplama komutuyla yapar.

Sayım şöyle yapılır: döngüden önce iki komut (mov si, 0 ve mov cx, 4), her geçişte beş komut. Dört geçişte 2 + 4 × 5 = 22 komut eder. Bu 22 komutun yalnız dördü toplamadır. Sekizi okuma ve yazma, sekizi döngü yükü, ikisi hazırlıktır. Her öğe için üç komut getirilip çözülür ve döngü yükü her öğe için yeniden ödenir. Vektör işlemcinin ortadan kaldırdığı yük budur.

1.1.5.3Vektör işlemcisi

Tanım 1.1.12

Vektör işlemcisi (vector processor), vektör adı verilen veri dizileri üzerinde tek komutla matematiksel işlem yapan işlemcidir. Birden çok veri öğesini aynı anda ya da derin bir boru hattında art arda işler. Uzun vektör yazmaçları ve vektör yükle/sakla birimleri bulunur.

V112345678V21020304050607080V31122334455667788VADD V3, V1, V2tek komut8 toplama birden
Şekil 1.1.16: Vektör toplama. V1 ve V2 vektör yazmaçlarındaki sekiz öğe tek VADD V3, V1, V2 komutuyla toplanır ve V3 yazmacına yazılır.

Vektör işlemcisi, tek bir veri öğesiyle çalışan skalar işlemcilere göre bu tür işlerde çok daha hızlıdır. Hava tahmini, fizik benzetimleri ve yapay zekâ modelleri gibi büyük dizilerle çalışan uygulamalar bu yüzden vektör işlemeden yararlanır. Tarihteki ünlü örnek Cray-1 süper bilgisayarıdır (1976). Bugün vektör işleme genel amaçlı işlemcilere uzantı olarak girmiştir: x86'da SSE ve AVX, ARM'da NEON ve SVE, RISC-V'de V uzantısı. Örneğin AVX'in 256 bitlik bir yazmacı sekiz adet 32 bitlik sayıyı tutar ve tek komutla sekizini birden toplar.

1.1.5.4Dizi işlemcisi ve Flynn sınıflandırması

Tanım 1.1.13

Dizi işlemcisi (array processor), tek bir kontrol biriminin aynı komutu çok sayıda işlem elemanına (processing element, PE) yayınladığı işlemcidir. Her PE kendi yerel belleğindeki veriyi işler. Bu düzene SIMD (single instruction, multiple data; tek komut, çok veri) de denir.

Kontrol birimi: ADDPE0yerel veri 0PE1yerel veri 1PE2yerel veri 2PE3yerel veri 3
Şekil 1.1.17: Dizi işlemcisi. Kontrol birimi aynı ADD komutunu dört işlem elemanına (PE0–PE3) yayınlar; her işlem elemanı kendi yerel verisini işler.

Vektör işlemcisi ile dizi işlemcisi arasındaki fark daha çok donanımın düzenindedir. Vektör işlemcisi öğeleri tek bir derin boru hattında art arda işleyebilir. Dizi işlemcisinde ise her öğe için ayrı bir işlem elemanı vardır ve öğeler gerçekten aynı anda işlenir. Dizi işlemcileri paralel hesaplamalar için eniyilenmiştir. Süper bilgisayarlarda, sunucularda ve GPU'larda kullanılır; genel amaçlı hesaplamada nadirdir. Tarihteki örnek ILLIAC IV'tür.

Michael Flynn'in 1966'da önerdiği sınıflandırma, işlemcileri komut ve veri akışlarının sayısına göre dört gruba ayırır:

Tablo 1.1.13: Flynn sınıflandırması.
SınıfAnlamıÖrnek
SISDtek komut, tek veriklasik 8086
SIMDtek komut, çok veridizi ve vektör işlemcileri, GPU
MISDçok komut, tek verinadir; hata toleranslı sistemler
MIMDçok komut, çok veriçok çekirdekli işlemciler, kümeler

8086 her komutta tek bir veri öğesini işler ve tek bir komut akışını yürütür; SISD sınıfındadır. Çok çekirdekli bir işlemcide her çekirdek kendi programını kendi verisiyle yürütür; bu da MIMD'dir. Bugünkü bir masaüstü işlemcisi aynı anda birkaç sınıfa girer: her çekirdek AVX komutlarıyla SIMD işlem yapar, çekirdekler birlikte MIMD düzeninde çalışır.

1.1.5.5Sayıl (skalar) işlemci ve süperskalar

Tanım 1.1.14

Sayıl işlemci (scalar processor), sayıl, yani vektör olmayan veriyi, komut başına bir veri öğesi olarak işleyen işlemcidir.

Basit sayıl işlemciler yalnız tamsayılarla çalışır. Güçlü olanlar kayan noktalı sayıları da işler; bunlarda tamsayı birimi (ALU) ve kayan nokta birimi (FPU) aynı yongadadır. Sayıl bir işlemci CISC ya da RISC mimarisinde olabilir; bu iki sınıflama birbirinden bağımsızdır. Genel amaçlı hesaplamada en yaygın tür sayıl işlemcidir.

Sayıl bir işlemci de birden çok komutu aynı anda yürütebilir. Süperskalar (superscalar) işlemci, birden çok boru hattı ya da yürütme birimiyle bir saat turunda birden fazla komut başlatan sayıl işlemcidir. Her komut yine tek bir veri öğesiyle çalışır; paralellik veride değil komut akışındadır. x86'daki ilk süperskalar işlemci Pentium'dur: U ve V adlı iki boru hattı vardır ve uygun iki komut aynı turda birer hatta girer.

saat turu →123456skalarK1K2K3K4K5K6süperskalar UK1K3K5K7K9K11süperskalar VK2K4K6K8K10K12
Şekil 1.1.18: Sayıl işlemcide her saat turunda bir komut başlar (6 turda K1–K6). İki boru hatlı süperskalar Pentium her turda U ve V hatlarına birer komut verir (6 turda K1–K12).

Şekildeki ideal durumda süperskalar işlemci aynı sürede iki kat komut başlatır; CPI 0,5'e iner. Gerçekte bu oran düşer. İki komut ancak birbirinden bağımsızsa aynı turda yürüyebilir: ikinci komut birincinin sonucunu kullanıyorsa beklemek zorundadır. Pentium'da V hattının yürütebildiği komutlar da sınırlıydı.

1.1.5.6Sayısal sinyal işlemcisi (DSP)

Tanım 1.1.15

Sayısal sinyal işlemcisi (digital signal processor, DSP), sayısal sinyaller üzerinde işlem yapmak için eniyilenmiş işlemcidir. Sayısal sinyal, ses ve görüntü gibi duyusal bilgileri temsil eden örnek (sample) dizileridir. DSP'nin sinyal işlemeye özel komut kümesi ve donanımı vardır: tek turda çarp-topla (MAC), dairesel tampon adreslemesi ve sıfır yüklü döngü.

Sunumda “dijital sinyal işlemcisi” adı geçer; ders sözlüğündeki terim “sayısal sinyal işlemcisi”dir. İki ad aynı aygıtı anlatır. DSP'ler ses işleme ve süzgeçleme, görüntü işleme ve telekomünikasyon altyapısında (modemler, baz istasyonları) kullanılır. Tanınmış örnekler Texas Instruments TMS320 ve Analog Devices SHARC aileleridir.

Sinyal işlemenin en temel işlemi sayısal süzgeçtir. FIR süzgeci (finite impulse response, sonlu dürtü yanıtlı süzgeç) her çıktı örneğini son N girdi örneğinin ağırlıklı toplamı olarak hesaplar:

y[n] = Σk=0N−1 h[k] · x[n − k]

Burada h[k] süzgeç katsayıları, x girdi örnekleridir. Her çıktı örneği için N çarpma ve N toplama gerekir. 48 kHz'lik bir ses sinyalinde 100 katsayılı bir süzgeç saniyede 4,8 milyon çarpma ve 4,8 milyon toplama ister. DSP her terimi tek bir MAC (multiply-accumulate, çarp-topla) komutuyla tek turda yapar:

A ← A + h[k] × x[n − k]

Burada A akümülatördür. Dairesel tampon adreslemesi, son N örneği tutan tamponun sonuna gelindiğinde adresi kendiliğinden başa sarar; böylece yazılımda sınır denetimi yapılmaz. Sıfır yüklü döngü ise döngü sayacını donanımda tutar ve döngü sonundaki atlamaya tur harcamaz.

1.1.5.7Çarp-topla: kod izleme

Aynı hesabın 8086'da nasıl yapıldığı, DSP'nin neden ayrı bir tür olduğunu açıkça gösterir. Aşağıdaki program üç katsayılı bir süzgeç toplamını hesaplar: y = h[0]·x[0] + h[1]·x[1] + h[2]·x[2].

org 100h
mov si, 0
mov bx, 0        ; toplam
mov cx, 3        ; terim sayısı
dongu: mov al, h[si]
mul x[si]        ; AX = h × x
add bx, ax       ; toplama ekle
inc si
loop dongu
ret
h db 2, 3, 1
x db 10, 20, 30

BX akümülatör görevini görür ve sıfırla başlar; CX terim sayısıdır. mov al, h[si] katsayıyı AL'ye alır. mul x[si] bayt çarpmasıdır: AL'yi bellekteki bayt ile çarpar ve 16 bitlik sonucu AX'e yazar. mul'un bir işleneni her zaman örtük olarak AL'dir (bayt çarpmasında); komutta yazılmaz. add bx, ax çarpımı toplama ekler.

Tablo 1.1.14: Çarp-topla döngüsünün izlemesi. Her satır o komuttan sonraki durumu verir.
KomutSIAL / AXBX (toplam)CX
hazırlık0?03
mov al, h[0], mul x[0]0AX = 2 × 10 = 2003
add bx, ax, inc si, loop1AX = 20202
mov al, h[1], mul x[1]1AX = 3 × 20 = 60202
add bx, ax, inc si, loop2AX = 60801
mov al, h[2], mul x[2]2AX = 1 × 30 = 30801
add bx, ax, inc si, loop3AX = 301100
h231x102030×AX+BX (toplam)110geri beslemeAX = 30y = 2·10 + 3·20 + 1·30 = 110
Şekil 1.1.19: Döngü bittiğinde toplam BX = 110'dur: 2·10 + 3·20 + 1·30 = 110. Her terim için ayrı bir mul ve add gerekmiştir.

Üç çarpımın hiçbiri 255'i aşmadığı için her mul'dan sonra AH = 0'dır; bu durumda 8086 CF ve OF bayraklarını 0 yapar. Sonuç bir yüksek bayta taşsaydı ikisi de 1 olurdu.

Süre farkı büyüktür. 8086'da bellekten bayt çarpan mul tek başına 76–83 tur artı etkin adres hesabı sürer; yani 70 turdan uzundur. Bir terim için mov, mul, add, inc ve loop birlikte yüz turu aşar. DSP aynı terimi tek MAC komutuyla, tek turda yapar ve sıfır yüklü döngüsü sayesinde döngü yükü de ödemez.

1.1.5.8Sembolik işlemci

Tanım 1.1.16

Sembolik işlemci (symbolic processor), sayılar yerine semboller, listeler ve kurallar üzerinde hesap yapmak için tasarlanmış işlemcidir. PROLOG ya da LISP işlemcisi diye de adlandırılır.

Sembolik işlemciler anlamsal (semantik) hesaplama ve sembolik mantık kuralları üzerine yoğunlaşır. Matematiksel ifadeleri sembol olarak işler; karmaşık ifadeleri sadeleştirebilir ve türev alabilir. Uygulama alanları uzman sistemler, makine zekâsı ve kural tabanlı çıkarımdır. Aşağıdaki Prolog parçası bu tür hesaba bir örnektir:

baba(ali, veli).
dede(X, Z) :- baba(X, Y),
              baba(Y, Z).

İlk satır bir olgudur: Ali, Veli'nin babasıdır. İkinci kural, X'in Z'nin dedesi olması için X'in bir Y'nin babası ve Y'nin de Z'nin babası olmasını şart koşar. Program sayı hesaplamaz; olgular ve kurallar arasında eşleme arayarak sonuç çıkarır. Bu işin donanımda ağırlıklı kısmı liste işleme, eşleme ve geri izlemedir.

1980'lerin LISP makineleri (örneğin Symbolics firmasının makineleri) ve Japonya'nın 5. Nesil Bilgisayar projesi bu türdendi. Genel amaçlı işlemciler hızlandıkça özel donanımın üstünlüğü kayboldu. Bugün bu işler genel amaçlı işlemcilerde yazılımla yapılır.

1.1.5.9Grafik işlem birimi (GPU)

Tanım 1.1.17

Grafik işlem birimi (graphics processing unit, GPU), iki ve üç boyutlu grafiklerin hızlandırılması için tasarlanmış, çok sayıda basit çekirdekten oluşan işlemcidir.

Bir ekran karesi milyonlarca pikselden oluşur ve her pikselin rengi aynı formülle, yalnız farklı verilerle hesaplanır. GPU bu yapıyı kullanır: binlerce basit çekirdek aynı programı farklı piksellerde çalıştırır. Bu düzen SIMD'nin bir biçimidir; GPU üreticileri ona SIMT (single instruction, multiple threads; tek komut, çok iş parçacığı) der. GPU gerçek zamanlı ve yüksek kaliteli grafik üretir; gölgelendirme (shading), dokulama (texturing) ve rasterleştirme gibi görüntü oluşturma görevlerinde etkindir. Grafik kartlarında ve hızlandırıcı kartlarda kullanılır.

CPUçekirdekçekirdekçekirdekçekirdekbüyük önbellek + denetimGPUyüzlerce–binlerce küçük çekirdek
Şekil 1.1.20: CPU birkaç büyük çekirdek ve geniş önbellek ile denetim devresinden, GPU ise yüzlerce ya da binlerce küçük çekirdekten oluşur.

CPU ile GPU farklı hedeflere göre tasarlanır. CPU'nun birkaç güçlü çekirdeği vardır; amaç tek bir iş parçacığının gecikmesini azaltmak ve dallanmalarla dolu karmaşık akışları hızlı yürütmektir. Yonga alanının büyük kısmı önbelleğe ve denetim devrelerine ayrılır. GPU'nun ise binlerce basit çekirdeği vardır; amaç tek bir işin süresini değil toplam verimi artırmaktır. Paralel veri üzerinde çalışan her iş bu yapıdan yararlanır. GPGPU (general-purpose computing on GPU), GPU'nun CUDA ya da OpenCL gibi programlama ortamlarıyla grafik dışı işlerde, örneğin bilimsel hesaplarda ve derin öğrenmede kullanılmasıdır.

1.1.5.10Türlerin özeti

Tablo 1.1.15: İşlemci türlerinin özeti.
TürTemel fikirGüçlü yanıÖrnek
CISCzengin, karmaşık komutlarkısa kod, uyumluluk8086, Pentium, 68000
RISCbasit komut + boru hattıhız, düşük güçARM, MIPS, RISC-V
EPICderleyici paralelliği belirlerkomut düzeyi paralellikIA-64 Itanium
Skalarkomut başına bir verigenel amaçlıçoğu CPU çekirdeği
Vektörkomut başına veri dizisibilimsel hesapCray-1, AVX
Dizi (SIMD)çok PE, aynı komutbüyük paralellikILLIAC IV, GPU
DSPMAC, özel adreslemegerçek zamanlı sinyalTMS320, SHARC
Semboliksembol/kural işlemeyapay zekâ (klasik)LISP makineleri
GPUbinlerce basit çekirdekgrafik, derin öğrenmeNVIDIA, AMD Radeon

Tablodaki sınıflar birbirini dışlamaz. Bir ARM çekirdeği hem RISC hem sayıldır ve NEON uzantısıyla vektör işlemi de yapar. Bir Core i7 dışarıdan CISC, içeriden RISC benzeri, süperskalar, AVX ile vektörel ve çok çekirdekli olarak MIMD'dir. Sınıflar, bir işlemcinin hangi tasarım fikirlerini kullandığını anlatan etiketler gibi okunmalıdır.

1.1.6Intel x86 ailesinin evrimi

8086 bir boşlukta doğmadı. Önünde 4 ve 8 bitlik işlemcilerden oluşan kısa ama hızlı bir tarih, arkasında da bugün hâlâ süren bir aile vardır. Bu kesim bu tarihi transistörden başlayarak izler, her işlemci kuşağının getirdiği yenilikleri sıralar ve x86 mimarisinin güçlü ve zayıf yanlarını tartışır.

1.1.6.1Transistörden mikroişlemciye

Mikroişlemcinin tarihi üç buluşla özetlenir.

  • 1947, transistör. Bell Laboratuvarları'nda John Bardeen, Walter Brattain ve William Shockley transistörü icat etti; buluş 1948'de duyuruldu. Transistör, lambanın yaptığı anahtarlama ve yükseltme işini çok daha küçük, dayanıklı ve az güç harcayan bir yarı iletkenle yaptı. Mikroelektronik devrimi böyle başladı.
  • 1958, tümleşik devre. Texas Instruments'ta Jack Kilby ilk tümleşik devreyi (integrated circuit, IC) gösterdi. Birçok transistör ve bağlantıları tek bir yarı iletken parça üzerinde birlikte üretilebildi. Böylece karmaşık devreler küçük ve ucuz hâle geldi.
  • 1971, ilk mikroişlemci. Intel 4004, bütün bir CPU'yu tek bir yongaya sığdırdı. Mikroişlemci artık bilgisayarın merkezî işlem birimi görevini tek başına üstlenebiliyordu.

Sonuç bugün her yerde görülür. Bilgisayarlar oda büyüklüğünden masaüstüne, oradan da cebe sığdı. Her adımda daha küçük, daha güçlü, daha hızlı ve daha ucuz oldular.

1.1.6.2Zaman çizelgesi

400419718008197280801974808519768086197880881979802861982803861985804861989Pentium1993Pentium Pro1995Pentium II1997Pentium III1999Pentium 42000Core 22006Core i720084-bit8-bit16-bit32-bit64-bit
Şekil 1.1.21: Intel mikroişlemcilerinin zaman çizelgesi: 1971'deki 4004'ten 2008'deki Core i7'ye. Renkler 4, 8, 16, 32 ve 64 bitlik kuşakları ayırır.

x86 adı, 8086'dan sonra gelen 80186, 80286, 80386 ve 80486 adlarının ortak “86” sonekinden gelir. Ailenin bütün üyeleri 8086 kodunu çalıştırabilir. Bu özelliğe geriye uyumluluk denir ve x86'nın kırk yılı aşan başarısının temelidir: her yeni işlemci, kullanıcıların elindeki yazılımı değiştirmeden çalıştırır. Bunun bir sonucu da vardır: bugünkü bir Core i7 açıldığında 8086 gibi davranan gerçek modda (real mode) başlar ve 20 bitlik adreslerle çalışır. Daha geniş özelliklere ancak yazılım işlemciyi başka bir moda geçirdiğinde ulaşılır.

1.1.6.34 ve 8 bitlik işlemciler

Tablo 1.1.16: 4 ve 8 bitlik Intel mikroişlemcileri.
İşlemciYılSaatTransistörKomut hızı / not
4004 (4 bit)1971740 kHz2.300≈ 60.000 komut/s; Ted Hoff, Federico Faggin, Stanley Mazor
4040 (4 bit)1974740 kHz≈ 3.0004004'ün geliştirilmiş sürümü (kesme, daha çok komut)
8008 (8 bit)1972500 kHz3.500≈ 50.000 komut/s; ilk 8 bitlik
8080 (8 bit)19742 MHz6.0008008'in ≈ 10 katı hız; 16 bit adres (64 KB); Altair 8800
8085 (8 bit)19763 MHz6.500tek +5 V besleme; 16 bit adres yolu; ≈ 769.000 komut/s

4004 bir Japon hesap makinesi firması için tasarlanmıştı. 4 bitlik sözcüğü, ondalık rakamları BCD olarak işlemeye yetiyordu: her rakam 4 bite sığar. 8008 ile 8 bite geçildi; bir bayt artık bir karakteri tutabiliyordu. 8080 hem hızıyla hem 64 KB'lık adres alanıyla gerçek bir genel amaçlı işlemciydi ve ilk kişisel bilgisayarlardan Altair 8800'de kullanıldı. 8085 ise 8080'in birden çok besleme gerilimi isteyen tasarımını tek +5 V beslemeye indirdi. 8085'in en kısa komutu 3 MHz'de 1,3 µs sürer; bu da saniyede yaklaşık 1 / 1,3 µs ≈ 769.000 komut eder.

1.1.6.416 bitlik işlemciler

Tablo 1.1.17: 16 bitlik Intel mikroişlemcileri.
İşlemciYılSaatTransistörÖzellik
808619785 · 8 · 10 MHz29.00016 bit veri yolu, 20 bit adres yolu (1 MB); donanımsal çarpma/bölme; ≈ 0,33–0,75 MIPS
808819795 · 8 MHz29.0008086'nın 8 bit dış veri yollu ucuz sürümü; IBM PC (1981, 4,77 MHz)
80186 / 8018819826 MHz'den≈ 55.000yonga üstünde kesme denetleyicisi, saat üreteci, yerel yol denetleyicisi, sayaçlar, DMA; 80188 ucuz (8 bit dış yol) sürüm
8028619826–12,5 MHz134.00016 bit veri, 24 bit adres yolu (16 MB); korumalı mod; ≈ 0,9–2,7 MIPS

8086 komutları ortalama 10 turdan fazla sürer. Bu yüzden 5 MHz'de yaklaşık 0,33 MIPS elde edilir; bu da komut başına ortalama 15 tur demektir (5 / 15 ≈ 0,33). 8088'in iç yapısı ve komut kümesi 8086 ile aynıdır, adres yolu da 20 bittir. Fark dış veri yolundadır: 8088 dışarıya 8 bitlik bir yolla bağlanır ve bir sözcüğü iki yol döngüsünde aktarır. Önden getirme kuyruğu da 6 değil 4 bayttır. IBM, ucuz 8 bitlik çevre yongalarını kullanabilmek için PC'de 8088'i seçti ve x86 bu kararla kişisel bilgisayarların standardı oldu.

80186, 8086'nın çevresinde ayrı yongalarla kurulan birimleri (kesme denetleyicisi, saat üreteci, zamanlayıcılar, DMA) yonganın içine aldı. Bu yönüyle mikrodenetleyiciye yaklaşan bir tasarımdır ve daha çok gömülü sistemlerde kullanıldı. 80286 ise iki yenilik getirdi: 24 bitlik adres yolu ve korumalı mod (protected mode).

1.1.6.532 bitlik işlemciler

Tablo 1.1.18: 32 bitlik Intel mikroişlemcileri.
İşlemciYılSaatTransistörÖzellik
80386198516–33 MHz275.00032 bit veri ve adres yolu (4 GB), sayfalama; sürümler: 386DX, 386SX (1988; 16 bit dış veri, 24 bit adres), 386SL (dizüstü)
80486198916–100 MHz1,2 milyonyonga üstü 8 KB önbellek, tümleşik FPU, 5 aşamalı boru hattı; sürümler: 486DX, 486SX (FPU'suz), DX2, DX4
Pentium199360 · 66 MHz (ilk)3,1 milyonsüperskalar (2 boru hattı); ayrı 8 KB komut + 8 KB veri önbelleği; 64 bit dış veri yolu

Pentium'un dış veri yolu 64 bittir ama Pentium 32 bitlik bir işlemcidir: yazmaçları ve ALU'su 32 bittir. Geniş dış yol, önbelleği bellekten daha hızlı doldurmak içindir. Bu örnek, “n bitlik işlemci” tanımının yazmaç ve ALU genişliğine dayandığını bir kez daha gösterir.

1.1.6.664 bitlik işlemciler

Tablo 1.1.19: 64 bitlik Intel mikroişlemcileri. Saat aralıkları birinci nesil masaüstü ve mobil modellere göredir.
İşlemciYılSaatTransistörÖzellik
Core 220061,2–3 GHz291 milyon (Duo)çekirdek başına 64 KB L1 (32 KB komut + 32 KB veri), 2–4 MB paylaşımlı L2; sürümler: Duo, Quad, Extreme
Core i720082,66–3,33 GHz731 milyon4 çekirdek, Hyper-Threading, tümleşik bellek denetleyicisi, 8 MB L3
Core i520092,4–3,6 GHz—orta sınıf; Turbo Boost
Core i320102,93–3,33 GHz—giriş sınıfı; 2 çekirdek, tümleşik grafik

64 bitlik x86, yani x86-64, ilk kez AMD'nin AMD64 mimarisiyle (Opteron ve Athlon 64, 2003) ortaya çıktı. Intel bu mimariyi 2004'te Pentium 4 ile benimsedi. Bu, x86 tarihinde ailenin yönünü Intel'in değil rakibinin belirlediği nadir anlardandır; Intel'in kendi 64 bitlik yolu olan IA-64 (Itanium) piyasada tutunamamıştı.

1.1.6.7Transistör sayısı ve Moore yasası

1031041051061071081094004 · 19712.3008080 · 19746.0008086 · 197829.00080286 · 1982134.00080386 · 1985275.00080486 · 19891,2 milyonPentium · 19933,1 milyonPentium 4 · 200042 milyonCore 2 Duo · 2006291 milyonCore 2 Quad (45 nm) · 2008820 milyon
Şekil 1.1.22: Logaritmik ölçekte transistör sayıları: 4004'te 2.300, 8086'da 29.000, Pentium'da 3,1 milyon, Core 2 Quad'da (45 nm) 820 milyon. Logaritmik ölçekte düzgün artış, sabit oranlı (üstel) büyüme demektir.
Tanım 1.1.18

Moore yasası, Intel'in kurucularından Gordon Moore'un bir gözlemidir. Moore'un 1965'te ortaya koyup 1975'te düzelttiği biçimiyle yonga başına transistör sayısı yaklaşık her iki yılda bir iki katına çıkar.

Gözlem bir doğa yasası değil, yarı iletken endüstrisinin onlarca yıl tutturduğu bir hedeftir. Sağlaması kolaydır. 4004'ten (1971, 2.300 transistör) Core 2 Quad'a (2008, 820 milyon) 37 yıl geçmiştir. Oran 820 × 106 / 2300 ≈ 356.500'dür ve 218 = 262.144 ile 219 arasındadır; yani yaklaşık 18 kez iki katına çıkma. 37 yılda iki yılda bir iki katına çıkma 37 / 2 ≈ 18,5 kez eder. Gözlem bu aralıkta şaşırtıcı ölçüde tutmuştur. Transistör sayısındaki artış, önbellek, boru hattı, çok çekirdek gibi bu notta anlatılan bütün yeniliklerin hammaddesidir.

1.1.6.88080 ve 8086

Mikroişlemcilerin yapısı, örgütlenimi ve teknolojisi kısa sürede köklü biçimde değişti. Bu değişim ilk genel amaçlı mikroişlemci 8080'den 29.000 transistörlü 8086'ya, oradan 820 milyon transistörlü dört çekirdekli Core 2'ye uzanır. Bu dersin işlemcisi 8086'dır; onu öncülü 8080 ile karşılaştırmak, hangi adımın neden atıldığını gösterir.

8080 (1974) ilk genel amaçlı mikroişlemci olarak anılır. Veri yolu 8 bit, adres yolu 16 bittir; 64 KB bellek adresler. İlk kişisel bilgisayarlarda, örneğin Altair 8800'de kullanıldı.

8086 (1978) Veri yolu 16 bittir; 8080'den daha çok sayıda 16 bitlik yazmacı vardır. Adres yolu 20 bittir ve 1 MB bellek adresler. Yalnız gerçek modda çalışır; bellek koruması yoktur. En önemli yeniliği, komutları çalıştırmadan önce önden getirip (prefetch) 6 baytlık bir komut kuyruğunda bekletmesidir. BIU kuyruğu doldururken EU önceki komutu yürütür; getirme ile yürütme üst üste biner. 8086'da önbellek yoktur; hız kazancını bu kuyruk sağlar. Yonga üstü önbellek x86'ya ancak 80486 ile geldi.

Örnek 1.1.7

Kuyruğun kazancı kabaca nedir? 8086'da 2 baytlık bir komut, kuyruk olmasaydı önce bir yol döngüsüyle (4 tur) getirilip sonra yürütülürdü. add ax, cx gibi 3 turluk bir komut için bu 4 + 3 = 7 tur ederdi. Kuyruk doluyken getirme önceki komutların yürütülmesi sırasında yapılmış olur ve komut 3 turda biter. Veri sayfasındaki tur sayıları bu yüzden “kuyruk dolu” varsayımıyla verilir. Atlamalarda kuyruk boşaltıldığı için kazanç kaybolur; atlayan loop'un 17 tur sürmesinin nedeni budur.

1.1.6.980286, 80386 ve 80486

80286 (1982) 24 bitlik adres yoluyla 16 MB bellek adresler. Gerçek modun yanında 16 bitlik korumalı mod sunar. Veri yolu ve yazmaçları yine 16 bittir.

80386 (1985) Intel'in ilk 32 bitlik mikroişlemcisidir. Çoklu görevi (multitasking) donanımla destekler. 32 bitlik korumalı mod, sayfalama (paging) ve sanal 8086 modu getirir; 4 GB bellek adresler. Sanal 8086 modu, korumalı modda çalışan bir işletim sisteminin altında eski 8086 programlarını kendi yalıtılmış ortamlarında çalıştırmayı sağlar.

80486 (1989) yonga üstü önbellek (8 KB) ve komut boru hattı getirir. Sayfa yazma korumasını (CR0 yazmacının WP biti) ekler. Karmaşık aritmetik için tümleşik bir matematik işlemcisi (FPU) içerir; bu birim önceden ayrı bir yonga, 80387'ydi.

Tanım 1.1.19

Korumalı mod, her programın belleğini öbürlerinden yalıtan çalışma modudur. Bir program kendisine ayrılmamış belleğe erişmeye çalışırsa işlemci bunu engeller ve işletim sistemine haber verir. Böylece bir programın hatası işletim sistemini ya da başka programları çökertemez. Modern işletim sistemlerinin temeli budur.

8086'nın gerçek modunda böyle bir koruma yoktur. Bir program 1 MB'ın herhangi bir yerine, örneğin işletim sisteminin kendi koduna ya da kesme vektör tablosuna yazabilir. DOS döneminde hatalı bir programın bütün bilgisayarı kilitlemesi bu yüzden sıradandı.

1.1.6.10Pentium ailesi

Pentium (1993) süperskalardır; iki boru hattında (U ve V) iki komut aynı anda çalışabilir. x86'da ilk kez dallanma tahmini (branch prediction) kullanır: bir koşullu atlamanın sonucunu önceki davranışına bakarak tahmin eder ve boru hattını tahmin edilen yoldan doldurur. Sayfa boyutu uzantısı (PSE), 4 KB'lık sayfaların yanında 4 MB'lık sayfalar kullanarak sayfalamayı iyileştirir. Komut ve veri önbellekleri ayrıdır.

Pentium Pro (1995) üç teknikle yürütmeyi kökten değiştirir: gelişmiş dallanma tahmini, veri akış analiziyle sıra dışı yürütme (out-of-order execution) ve spekülatif yürütme (speculative execution). Sıra dışı yürütmede, işlenenleri hazır olan bir komut, önündeki ve bir sonucu bekleyen komutu beklemeden yürütülür; sonuçlar yine program sırasıyla kesinleştirilir. Spekülatif yürütmede, tahmin edilen dallanma yolundaki komutlar sonuç kesinleşmeden yürütülür; tahmin yanlış çıkarsa sonuçlar atılır. Intel bu üç tekniğin birlikte kullanımına “dinamik yürütme” (dynamic execution) adını verdi. Pentium Pro, düzey 2 (L2) önbelleği aynı paketin içine alır. PAE (physical address extension) ile 32 bitlik sanal adresler 36 bitlik fiziksel adreslere çevrilir ve 64 GB belleğe ulaşılır.

Pentium II (1997), multimedya için tamsayı SIMD komutları olan MMX teknolojisini Pentium Pro çekirdeğiyle birleştirdi. Video, ses ve grafik verisini etkili işler. MMX ilk kez 1997 başında “Pentium MMX” ile gelmişti; Pentium II onu devraldı.

Pentium III (1999) SSE'yi (Streaming SIMD Extensions) getirdi: 70 yeni komut ve kayan noktalı SIMD. Üç boyutlu grafik yazılımını destekler. En yüksek saat hızı 1,4 GHz'dir.

Pentium 4 (2000) multimedya için kayan nokta geliştirmeleri (önce SSE2, sonra SSE3) ekledi. NetBurst adlı çok derin bir boru hattıyla 3,8 GHz'e kadar çıktı ve Hyper-Threading'i getirdi. Hyper-Threading tek bir çekirdeğin iki iş parçacığını aynı anda yürütmesini sağlar; işletim sistemi bir çekirdeği iki mantıksal işlemci olarak görür. Çok derin boru hattı yüksek frekansa izin verdi, ama yanlış tahmin edilen her dallanmada boşaltılan aşama sayısı da arttı ve güç tüketimi yükseldi. Saat hızı yarışı bu kuşakla sınırına dayandı.

1.1.6.11Core ve Core 2

Core (Core Duo, 2006) mobil kökenli, düşük güçlü bir tasarımdır. İki çekirdek aynı kalıpta (die) durur ve L2 önbelleğini paylaşır; aynı kalıptaki iki çekirdeğin önbelleği paylaştığı ilk Intel işlemcisidir. Sanallaştırma teknolojisi (VT-x) bu kuşakla eklendi.

Core 2 (2006) 64 bitlik mimariyi (Intel 64) kullanır: 64 bitlik yazmaç kümesi ve adresleme modları. Core 2 Quad tek pakette dört çekirdek sunar; paketin içinde iki çift çekirdekli kalıp vardır.

Core 2 Duo: 1 kalıpçekirdek 0çekirdek 1paylaşılan L2 önbellekCore 2 Quad: 1 pakette 2 kalıpçek. 0çek. 1L2çek. 2çek. 3L2
Şekil 1.1.23: Core 2 Duo'da tek kalıpta iki çekirdek ve paylaşılan L2 önbellek vardır. Core 2 Quad bir pakette iki çift çekirdekli kalıp taşır; her kalıbın kendi L2 önbelleği vardır.

Intel'in ilk çift çekirdekli masaüstü işlemcisi 2005'te çıkan Pentium D'dir. Bu işlemcide iki çekirdeğin L2 önbellekleri ayrıydı ve çekirdekler birbirleriyle dış yol üzerinden haberleşiyordu; 2006 sürümünde iki çekirdek iki ayrı kalıp olarak aynı pakete konmuştu. Önbelleği paylaşmak, çekirdeklerin ortak veriyi belleğe gitmeden kullanmasını sağlar.

Kalıp ile paket farklı şeylerdir. Kalıp, silisyum dilimden kesilen tek bir yonga parçasıdır. Paket ise kalıbı (ya da birden çok kalıbı) taşıyan, pinleri ve ısı yayıcısı olan dış kılıftır. Kullanıcının elindeki “işlemci” pakettir.

1.1.6.12x86 mimarisinin güçlü ve zayıf yanları

x86'nın uzun ömrünün dört nedeni vardır.

  • Uyumluluk (compatibility): eski yazılımlar değiştirilmeden yeni x86 işlemcilerde çalışır. 1978'de 8086 için yazılmış kod bugün de çalışabilir.
  • Performans (performance): her yeni işlemci kuşağı öncekinden daha hızlı ve verimli oldu.
  • Çeşitlilik (versatility): kişisel bilgisayarlardan sunuculara, gömülü sistemlerden mobil aygıtlara kadar geniş bir kullanım yelpazesi.
  • Geniş endüstri desteği: büyük bir donanım ve yazılım üreticisi topluluğu x86'yı destekler; bu destek yeniliğin ve gelişmenin itici gücü oldu.

Aynı tarih, mimarinin zayıf yanlarını da açıklar.

  • Karmaşık komut kümesi: binlerce komut ve değişken uzunluklu kodlama çözücü donanımını karmaşıklaştırır; kodu performans için eniyilemek zorlaşır. Geriye uyumluluk, kullanılmayan eski komutların bile korunmasını gerektirir.
  • Güç tüketimi: x86'nın evrimi güç tüketiminde önemli bir artış getirdi. Pil ömrünün kritik olduğu aygıtlarda bu büyük bir sorundur.
  • Isı yayılımı: işlemciler güçlendikçe daha çok ısınır; soğutma maliyeti ve gürültü artar.
  • Maliyet ve lisans: x86 mimarisini yalnız lisans anlaşması olan firmalar (örneğin AMD) üretebilir; rekabet sınırlıdır.

Bu nedenlerle telefon ve tabletlerde ARM (RISC) baskındır; x86 ise masaüstü ve sunucuda güçlüdür. Son yıllarda ARM tabanlı işlemciler dizüstü bilgisayarlara ve sunuculara da girmiştir.

1.1.7Modern işlemci özellikleri

8086 ile bugünkü bir işlemci arasındaki fark yalnız saat hızında değildir. Bu kesim önce saat hızının neden tek başına performans ölçüsü olmadığını sayısal bir örnekle gösterir. Sonra bugünkü işlemcilerin performansını belirleyen özellikleri sıralar ve bellek hiyerarşisini açıklar.

1.1.7.1Saat hızı tek başına performans değildir

CPU süresi formülü bu kesimin temelidir:

CPU süresi = N × CPI × T = N × CPI / f

Burada N çalışan komut sayısı, CPI komut başına ortalama saat turu, f saat frekansıdır (T = 1/f). Formül, saat frekansının üç çarpandan yalnız biri olduğunu açıkça gösterir.

Örnek 1.1.8

Aynı program (N = 109 komut) iki işlemcide çalışıyor. İşlemci A: f = 2 GHz, CPI = 2. İşlemci B: f = 1,5 GHz, CPI = 1. Hangisi daha hızlıdır?

A: 109 × 2 / (2 × 109) = 1 s
B: 109 × 1 / (1,5 × 109) ≈ 0,67 s

Saati düşük olan B, 1 / 0,67 = 1,5 kat, yani %50 daha hızlıdır. A saniyede 2 × 109 / 2 = 109, B ise 1,5 × 109 / 1 = 1,5 × 109 komut yürütür.

Saat hızı “saniyedeki tur sayısıdır”, “saniyedeki komut sayısı” değildir. Saniyedeki komut sayısı f / CPI'dır ve mimari (boru hattı, önbellek, süperskalar yapı) CPI'yı düşürür. Pentium 4'ten Core kuşağına geçiş bunun tarihteki örneğidir. Core işlemcilerin saat hızı daha düşüktü, ama CPI'ları da düşüktü. Pentium 4'ten hem daha hızlı çalıştılar hem daha az güç harcadılar.

Sık yapılan hata

İki işlemci yalnız saat hızlarına bakılarak karşılaştırılır. Saat hızı yalnız aynı mimarideki ve aynı CPI'lı iki işlemciyi karşılaştırmaya yeter. Farklı mimarilerde CPI, hatta aynı program için N bile farklı olabilir; doğru karşılaştırma, aynı programın iki işlemcideki süresidir.

1.1.7.2Performansı belirleyen özellikler

Saat hızı (clock speed): saniyedeki saat turu sayısıdır (GHz). Komut hızı ayrıca CPI'ya bağlıdır.

Komut kümesi mimarisi (ISA): CISC ve RISC gibi mimariler verimliliği ve karmaşıklığı etkiler. ISA, yazılım ile donanım arasındaki sözleşmedir.

Önbellek (cache): sık kullanılan veriyi işlemcinin yanında tutan küçük ve çok hızlı bellektir. Düzeyleri L1, L2 ve L3 diye adlandırılır.

Çok çekirdek (multi-core): birden çok görevin gerçekten aynı anda yürütülmesini sağlar ve toplam performansı artırır. Tek bir programın hızlanması için ise programın iş parçacıklarına bölünmüş olması gerekir.

Sanallaştırma (virtualization): aynı donanım üzerinde birden çok işletim sisteminin, yani sanal makinenin, birbirinden yalıtılmış olarak çalışmasını sağlar. Donanım desteği Intel'de VT-x, AMD'de AMD-V adını taşır.

Güç yönetimi (power management): yük azaldığında saat frekansı ve besleme gerilimi düşürülür; buna DVFS (dynamic voltage and frequency scaling, dinamik gerilim ve frekans ölçekleme) denir. Boştaki çekirdekler uyku durumlarına (C-durumları) alınır. Intel'in SpeedStep ve Turbo Boost teknolojileri bu ilkeyle çalışır: Turbo Boost, ısı ve güç sınırı izin verdiğinde bazı çekirdeklerin frekansını kısa süre için yükseltir. Dinamik güç kabaca C V2 f ile orantılı olduğu için gerilimi düşürmek gücü karesiyle azaltır.

Grafik işleme: modern işlemciler tümleşik bir grafik işlem birimi (iGPU) içerir; grafik yoğun görevler ayrı bir ekran kartı olmadan daha hızlı ve verimli işlenir.

Güvenlik özellikleri: donanım düzeyinde şifreleme (AES-NI komutları), güvenli önyükleme (secure boot) ve yalıtılmış güvenli bölgeler (TPM, SGX, ARM TrustZone).

Bağlantı (connectivity): özellikle mobil ve gömülü yongalarda Wi-Fi, Bluetooth ve Ethernet gibi ağ birimleri yonganın içindedir.

Makine öğrenmesi: yapay zekâ için özel birimler eklenmiştir: sinir ağı işlem birimleri (NPU), matris hızlandırıcıları (Intel AMX) ve vektör nokta çarpımı komutları.

Yonga üstü sistem (system on chip, SoC): CPU, GPU, NPU, bellek denetleyicisi ve G/Ç'nin tek yongada birleşmesidir. Bu eğilim, mikrodenetleyicinin “her şey tek yongada” fikrine daha büyük ölçekte bir geri dönüştür. Telefonlardaki işlemciler ve Apple'ın M serisi birer SoC'dir.

1.1.7.3Önbellek ve bellek hiyerarşisi

İşlemci hızı yıllar içinde bellek hızından çok daha hızlı arttı. Bugünkü bir işlemci bir turda birkaç komut bitirirken ana bellekten bir okuma 50–100 ns, yani yüzlerce tur sürer. Her erişimde ana belleğe gidilseydi işlemci zamanının çoğunu beklemekle geçirirdi. Çözüm, farklı hız ve boyutlardaki bellekleri bir hiyerarşi içinde birlikte kullanmaktır.

YazmaçlarL1 önbellekL2 önbellekL3 önbellekAna bellek (RAM)SSD / disk < 1 ns · yüzlerce bayt ≈ 1 ns · 32–64 KB / çekirdek ≈ 3–5 ns · 256 KB – 2 MB ≈ 10–20 ns · birkaç–onlarca MB ≈ 50–100 ns · GB µs – ms · TB daha hızlı · daha pahalıdaha büyük · daha ucuz
Şekil 1.1.24: Bellek hiyerarşisi: yazmaçlar, L1, L2 ve L3 önbellek, ana bellek ve disk. Yukarı çıktıkça hız artar ve bayt başına maliyet yükselir; aşağı indikçe kapasite büyür ve maliyet düşer. Süreler yaklaşıktır.
Tanım 1.1.20

Önbellek (cache), ana bellekteki verinin sık kullanılan bir kısmının kopyasını işlemcinin yanında tutan küçük ve hızlı bellektir. Yerellik ilkesi (principle of locality), programların aynı veriye kısa sürede yeniden (zamansal yerellik) ve yakın adreslerdeki veriye art arda (uzamsal yerellik) erişme eğilimidir.

Önbelleğin işe yaramasının nedeni yerellik ilkesidir. Bir döngünün komutları her geçişte yeniden okunur; bir dizinin öğeleri ardışık adreslerden okunur. Önbellek bu küçük çalışma kümesini işlemcinin yakınında tutar ve erişimlerin büyük çoğunluğu önbellekte bulunur. Bu yüzden ortalama erişim süresi RAM'inkinin çok altına iner.

Örnek 1.1.9

Önbelleğe erişim 1 ns, ana belleğe erişim 100 ns sürüyor. Erişimlerin %95'i önbellekte bulunuyorsa ortalama erişim süresi nedir?

Erişimin %95'i 1 ns sürer. Kalan %5'inde önce önbelleğe bakılır (1 ns), bulunamayınca ana belleğe gidilir (100 ns):

ortalama = 1 + 0,05 × 100 = 1 + 5 = 6 ns

Ana belleğin 100 ns'lik erişim süresi, ortalamada 6 ns'ye iner; yaklaşık 17 kat iyileşme. Bulunma oranı %99'a çıkarsa ortalama 1 + 0,01 × 100 = 2 ns olur.

8086'da önbellek yoktu; bellek erişimi zaten yalnız dört saat turu sürüyordu ve işlemciyle bellek hızları birbirine yakındı. Bu denge 1980'lerin sonunda bozuldu. 80486 yonga üstü önbelleği, Pentium ayrı komut ve veri önbelleklerini, Pentium Pro aynı paketteki L2'yi, Core i7 ise çekirdekler arasında paylaşılan L3'ü getirdi.

Sık yapılan hata

Önbelleğin RAM'i hızlandırdığı ya da veriyi sıkıştırdığı sanılır. Önbellek RAM'in kendisini hızlandırmaz ve veriyi sıkıştırmaz. Yalnız verinin sık kullanılan kopyasını yakında tutar; erişimlerin çoğu RAM'e hiç gitmeden karşılandığı için ortalama süre düşer. Yerelliği zayıf bir programda, örneğin belleğe rastgele dağılmış adreslere erişen bir programda, önbelleğin kazancı da küçüktür.

1.1.8Sık yapılan hatalar

  • Veri yolu ile adres yolunu karıştırmak. Adreslenebilir belleği adres yolu belirler (2n bayt); veri yolu bir erişimde taşınan bit sayısını belirler. 16 bitlik 8086 1 MB adresler.
  • IP'nin her komutta 1 arttığını sanmak. IP bayt adresi tutar ve komut uzunluğu kadar artar; 8086 komutları 1–6 bayttır.
  • Komut döngüsü, yol döngüsü ve saat turunu karıştırmak. Saat turu en küçük zaman birimidir. Bir yol döngüsü 8086'da en az 4 turdur. Bir komut döngüsü bir ya da birkaç yol döngüsü içerebilir ve yol döngüsü olmayan turlar da kapsayabilir.
  • Atlayan ve atlamayan loop'u aynı süreyle saymak. 8086'da atlayan loop 17, atlamayan 5 tur sürer; n geçişli bir döngüde n − 1 atlama vardır.
  • Çok kelimeli toplamada yüksek yarıyı add ile toplamak. Düşük yarıdan gelen elde ancak adc ile eklenir.
  • Boru hattının tek komutu hızlandırdığını sanmak. Boru hattı gecikmeyi değil verimi artırır; n komut k + n − 1 turda biter.
  • Saat hızını performansla eş tutmak. Süre N × CPI / f'dir; düşük saatli ama düşük CPI'lı bir işlemci daha hızlı olabilir.
  • “n bitlik işlemci” tanımını dış veri yoluna dayandırmak. Tanım yazmaç ve ALU genişliğine dayanır: 8088'in dış yolu 8 bit ama işlemci 16 bitlik; Pentium'un dış yolu 64 bit ama işlemci 32 bitlik.
  • Önbelleğin RAM'i hızlandırdığını sanmak. Önbellek yalnız sık kullanılan verinin kopyasını yakında tutar; kazancı yerellik ilkesinden gelir.

1.1.9Alıştırmalar ve çözümleri

Bu alıştırmalar sunumun alıştırma slaytındaki soruların çözümlü hâlidir.

1.1.9.1Saat periyodu ve yol döngüsü

Soru. 5 MHz'lik bir 8086'da saat periyodu ve 4 T'lik bir yol döngüsünün süresi nedir?

Çözüm. T = 1 / f = 1 / (5 × 106) s = 200 ns. Yol döngüsü dört turdur: 4 × 200 ns = 800 ns.

1.1.9.224 bitlik adres yolu

Soru. 24 bitlik bir adres yolu kaç bayt belleği adresleyebilir? Hangi işlemcide vardır?

Çözüm. 224 = 16.777.216 bayt. 1 MB = 220 bayt olduğundan bu 24 = 16 MB'tır. 24 bitlik adres yolu 80286'da vardır.

1.1.9.3Beş aşamalı boru hattında 100 komut

Soru. 5 aşamalı bir boru hattında 100 komut kaç turda biter? Boru hattısız kaç tur gerekir?

Çözüm. k + n − 1 = 5 + 100 − 1 = 104 tur. Boru hattısız 5 × 100 = 500 tur gerekir. Hızlanma 500 / 104 ≈ 4,8 kattır.

1.1.9.4Çalışma süresi

Soru. N = 2 × 109 komutluk bir program, CPI = 1,5 olan 3 GHz'lik bir işlemcide kaç saniye sürer?

Çözüm. 2 × 109 × 1,5 / (3 × 109) = 1 s.

1.1.9.5Mikroişlemci mi, mikrodenetleyici mi?

Soru. Çamaşır makinesi kontrol kartı ve dizüstü bilgisayar için mikroişlemci mi mikrodenetleyici mi seçilir? Neden?

Çözüm. Çamaşır makinesi için mikrodenetleyici: ucuzdur, az güç harcar ve tek, sabit bir işi yapar; bellek ve G/Ç yonganın içindedir. Dizüstü bilgisayar için mikroişlemci: yüksek performans, gigabaytlarca bellek ve işletim sistemi gerekir.

1.1.9.6EPIC paketi

Soru. EPIC paketinde 128 bit nasıl paylaştırılır?

Çözüm. 41 bitlik üç komut 3 × 41 = 123 bit tutar; kalan 5 bit şablondur: 123 + 5 = 128.

1.1.10Özet

  • Mikroişlemci, bellekteki komutları getir–çöz–yürüt döngüsüyle çalıştıran programlanabilir CPU yongasıdır. Mikrodenetleyici bellek ve çevre birimlerini de aynı yongada taşır; ucuz, az güç harcayan ve tek işe adanmış sistemlerde kullanılır.
  • CPU dış dünyayla üç yolla konuşur: adres yolu (tek yönlü; n hat 2n bayt), veri yolu (çift yönlü) ve kontrol yolu. 8086'nın adres yolu 20 bit (1 MB), veri yolu 16 bittir.
  • Komut döngüsü getir, çöz, yürüt ve sonuç aşamalarından oluşur. IP sıradaki komutun adresini tutar ve komut uzunluğu kadar artar; atlamalar IP'ye yeni değer yazar.
  • CPU; ALU, kontrol birimi, yazmaçlar ve yol arayüzünden oluşur. 8086'da BIU komutları önden getirip 6 baytlık kuyrukta bekletir, EU onları yürütür.
  • Periyot T = 1/f; 8086'da bir yol döngüsü en az 4 T'dir. CPU süresi = N × CPI / f. Saat hızı tek başına performans ölçüsü değildir.
  • Bir döngünün süresi komutların tur sayıları toplanarak bulunur; küçük gövdeli döngülerde süreyi atlamaların bedeli belirler.
  • 16 bitlik işlemci 32 bitlik sayıları yazmaç çiftlerinde tutar ve add + adc ile toplar.
  • CISC zengin ve değişken uzunluklu komutlar, RISC basit sabit uzunluklu komut + yükle/sakla + boru hattı, EPIC derleyici güdümlü paralellik sunar. k aşamalı boru hattında n komut k + n − 1 turda biter.
  • Vektör ve dizi (SIMD) işlemcileri bir komutla çok veri işler; DSP tek turda çarp-topla yapar; GPU binlerce basit çekirdekle veri paralelliğinden yararlanır; sembolik işlemciler kural ve sembol işler.
  • Intel 4004 (1971) → 8080 (8 bit) → 8086 (1978, 16 bit, 1 MB) → 80286 (korumalı mod) → 80386 (32 bit) → 80486 (önbellek, FPU) → Pentium (süperskalar) → Core 2 (64 bit, çok çekirdek). Geriye uyumluluk x86'nın en büyük gücüdür.
  • Modern işlemciler önbellek, çok çekirdek, sanallaştırma, güç yönetimi ve özel hızlandırıcılarla performans kazanır. Önbelleğin kazancı yerellik ilkesinden gelir.

1.1.11Kavram listesi

Terimlerin İngilizce karşılıkları ve öteki bölümlerdeki kullanımları terim sözlüğünde bulunur.

1.1.12Kendini Dene

  1. Saat turu sayımında incelenen döngü (mov cx, 4 … hlt, 78 tur) 10 MHz'lik bir 8086'da kaç mikrosaniye sürer?

    Cevap

    10 MHz'de T = 100 ns. Tur sayısı frekanstan bağımsızdır: 78 × 100 ns = 7,8 µs. Süre 5 MHz'deki 15,6 µs'nin yarısıdır.

  2. Aynı döngüde mov cx, 4 yerine mov cx, 5 yazılırsa döngü kaç tur sürer ve AX ne olur?

    Cevap

    Gövde beş kez çalışır; loop dört kez atlar, bir kez atlamaz: 4 + 4 + 5 × 3 + 4 × 17 + 5 + 2 = 98 tur. AX = 5 + 4 + 3 + 2 + 1 = 15'tir. 5 MHz'de süre 98 × 200 ns = 19,6 µs'dir.

  3. IP izlemesindeki program 0100h yerine 0200h adresinden başlasaydı loop dongu komutunun makine kodu değişir miydi?

    Cevap

    Değişmezdi. loop hedef adresi değil, sıradaki komuta göre uzaklığı saklar. Etiket 0206h'de, sıradaki komut 020Ah'de olur; uzaklık yine −4 (FCh) ve kod yine E2 FC'dir.

  4. DX:AX = 0000FFFFh ve CX:BX = 00000001h iken add ax, bx ve adc dx, cx yürütülüyor. Her komuttan sonra AX, DX, CF ve ZF ne olur?

    Cevap

    add ax, bx: FFFFh + 0001h = 10000h; AX = 0000h, CF = 1, ZF = 1. adc dx, cx: 0000h + 0000h + 1 = 0001h; DX = 0001h, CF = 0, ZF = 0. Sonuç DX:AX = 00010000h = 65.536'dır.

  5. AL = 05h iken add al, 0FBh yürütülüyor. AL, ZF ve CF ne olur?

    Cevap

    05h + FBh = 100h. 9. bit AL'ye sığmaz: AL = 00h, CF = 1. Sonuç sıfır olduğu için ZF = 1'dir. İşaretli yorumda 5 + (−5) = 0 doğru bir sonuçtur, OF = 0 kalır.

  6. 6 aşamalı bir boru hattında bağımsız 50 komut kaç turda biter? Boru hattısız kaç tur gerekir?

    Cevap

    6 + 50 − 1 = 55 tur. Boru hattısız 6 × 50 = 300 tur. Hızlanma 300 / 55 ≈ 5,5 kattır.

  7. Skalar döngü (dört öğeli c = a + b) 100 öğeli dizilere uygulansaydı kaç komut yürütülürdü? Bunların kaçı toplama olurdu?

    Cevap

    2 + 100 × 5 = 502 komut; bunların 100'ü toplamadır. Kalan 402 komut okuma, yazma, döngü yükü ve hazırlıktır.

  8. Bir işlemci 2,4 GHz'de ve CPI = 0,8 ile çalışıyor. Saniyede kaç milyon komut yürütür? 6 × 109 komutluk bir program kaç saniye sürer?

    Cevap

    f / CPI = 2,4 × 109 / 0,8 = 3 × 109 komut/s, yani 3000 MIPS. Süre 6 × 109 / (3 × 109) = 2 s.

  9. L1 önbelleğe erişim 2 ns, ana belleğe erişim 80 ns sürüyor ve erişimlerin %90'ı önbellekte bulunuyor. Ortalama erişim süresi nedir?

    Cevap

    2 + 0,10 × 80 = 2 + 8 = 10 ns. Ana belleğe göre 8 kat iyileşme vardır.

  10. 4 GB belleği adreslemek için kaç adres hattı gerekir? 8086'nın adres yoluna kaç hat eklenmesi gerekirdi?

    Cevap

    4 GB = 22 × 230 = 232 bayt, yani 32 hat. 8086'nın 20 hattına 12 hat eklenmesi gerekirdi; 80386'nın adres yolu 32 bittir.

1.1.13İleri okuma

  • B. B. Brey, The Intel Microprocessors (8. baskı), Bölüm 1–2: 8086'dan Pentium 4'e Intel ailesinin tarihini, bellek ve G/Ç düzenini ve yazmaç modelini 8086 ağırlıklı anlatır; bu dersin temel kaynağıdır.
  • W. Stallings, Computer Organization and Architecture (10. baskı), Bölüm 2–3 ve 14–16: bilgisayarın evrimini, komut döngüsünü, yol yapılarını, boru hattını ve RISC ile süperskalar işlemcileri ayrıntılı ele alır.
  • D. A. Patterson ve J. L. Hennessy, Computer Organization and Design: The Hardware/Software Interface, Bölüm 1 ve 4: CPU süresi formülünü ve performans karşılaştırmasını, beş aşamalı RISC boru hattını ve bağımlılıkları açık örneklerle verir.
  • Intel Corporation, 8086 16-Bit HMOS Microprocessor veri sayfası: 8086'nın pinlerini, yol döngüsü zamanlamasını (T1–T4) ve komutların tur sayılarını içerir; bu nottaki tur sayıları bu kaynaktandır.

1.1.14Kaynaklar

  1. A. S. Tanenbaum, H. Bos, Modern Operating Systems, 3. baskı, Pearson.
  2. B. B. Brey, The Intel Microprocessors: 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium …, 8. baskı, Pearson.
  3. W. Stallings, Computer Organization and Architecture, 10. baskı, Pearson.
  4. D. A. Patterson, J. L. Hennessy, Computer Organization and Design: The Hardware/Software Interface, Morgan Kaufmann.
  5. Intel Corporation, 8086 16-Bit HMOS Microprocessor veri sayfası; Intel 64 and IA-32 Architectures Software Developer's Manual.

İlgili sayfalar: Bölüm 1.1 sunumu · Çalışma soruları · İşlemci Simülatörü · Terim sözlüğü · © Sercan Külcü. Tüm hakları saklıdır.