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.
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.
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.
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.
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.
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.
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.
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 ö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.
| Ölçüt | Mikroişlemci (MPU) | Mikrodenetleyici (MCU) |
|---|---|---|
| İçerik | CPU (ALU, kontrol birimi, yazmaçlar) | CPU + RAM + Flash + G/Ç + zamanlayıcı + ADC… |
| Bellek | dış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) |
| Maliyet | yüksek; ek yongalar gerekir | düşük; tek yonga yeterli |
| Yazılım | genelde işletim sistemi + çok sayıda uygulama | tek, sabit bir program (gömülü yazılım) |
| Kullanım | PC, 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.
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
Komut döngüsü (instruction cycle), işlemcinin her komut için yinelediği aşamalar dizisidir:
- Getir (fetch): komutu, program sayacının gösterdiği adresten bellekten çeker.
- Çöz (decode): işlem kodunu (opcode) çözer; hangi işlemin hangi işlenenlerle (operand) yapılacağını belirler.
- Yürüt (execute): çözülen komutu uygular; ALU'da hesap yapar, veri taşır ya da atlar.
- 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.
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 ; F4Assembler 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.
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:
- Getir. IP'deki
0100hadres yoluna konur. BellekB0baytını döndürür. Kontrol birimi işlem kodundan komutun 2 bayt olduğunu anlar ve05baytını da getirir. IP komut uzunluğu kadar artar:0100h + 2 = 0102h. - Çöz. Kontrol birimi
B0'ı “AL'ye 8 bitlik sabit yükle” diye çözer; sabit05h'dir. - Yürüt ve sonuç.
05h, AL yazmacına yazılır. ALU kullanılmaz.MOVkomutu hiçbir bayrağı değiştirmez; bayraklar önceki değerlerinde kalır. - Getir. Döngü yeniden başlar.
0102h'deki04 03getirilir; IP =0104holur. - Çöz.
04= “AL'ye 8 bitlik sabit ekle”. İşlenenler AL'deki05hve sabit03h'tir. - Yürüt ve sonuç. ALU
05h + 03h = 08hhesaplar 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. - Getir ve çöz.
0104h'tekiF4getirilir; IP =0105holur.F4,HLTdiye çözülür ve işlemci bir kesme ya da sıfırlama gelene kadar durur.
| Adres | Makine kodu | Komut | IP (sonra) | AL | ZF | CF |
|---|---|---|---|---|---|---|
| — | — | başlangıç | 0100h | ?? | ? | ? |
| 0100h | B0 05 | mov al, 5 | 0102h | 05h | ? | ? |
| 0102h | 04 03 | add al, 3 | 0104h | 08h | 0 | 0 |
| 0104h | F4 | hlt | 0105h | 08h | 0 | 0 |
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.
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 ; durmov 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.
| Adım | Yürütülen | IP | CX | AX | Açıklama |
|---|---|---|---|---|---|
| 1 | mov cx, 3 | 0103h | 0003h | ???? | 3 bayt ilerler |
| 2 | mov ax, 0 | 0106h | 0003h | 0000h | toplam sıfırlandı |
| 3 | add ax, cx | 0108h | 0003h | 0003h | 0 + 3 |
| 4 | loop dongu | 0106h | 0002h | 0003h | CX = 2 ≠ 0, atla |
| 5 | add ax, cx | 0108h | 0002h | 0005h | 3 + 2 |
| 6 | loop dongu | 0106h | 0001h | 0005h | CX = 1 ≠ 0, atla |
| 7 | add ax, cx | 0108h | 0001h | 0006h | 5 + 1 |
| 8 | loop dongu | 010Ah | 0000h | 0006h | CX = 0, atlama yok |
| 9 | hlt | 010Bh | 0000h | 0006h | iş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.
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.
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.
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.
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.
| f | T = 1/f | 4T |
|---|---|---|
| 5 MHz (8086) | 200 ns | 800 ns |
| 10 MHz (8086-1) | 100 ns | 400 ns |
| 3 GHz | 0,333 ns | 1,33 ns |
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üğü.
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.
| İşlemci | f | CPI | T | 4T | MIPS | Süre |
|---|---|---|---|---|---|---|
| 8086 | 5 MHz | 10 | 200 ns | 800 ns | 0,5 | 2 s |
| 80386 | 33 MHz | 4 | 30,3 ns | 121 ns | 8,25 | 121 ms |
| Pentium | 66 MHz | 1,5 | 15,2 ns | 60,6 ns | 44 | 22,7 ms |
| Core i7 | 3,33 GHz | 0,5 | 0,30 ns | 1,20 ns | 6660 | 0,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.
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 turTur 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.
| Adım | Komut | Tur | Toplam tur | Süre | CX | AX |
|---|---|---|---|---|---|---|
| 1 | mov cx, 4 | 4 | 4 | 0,8 µs | 4 | ? |
| 2 | mov ax, 0 | 4 | 8 | 1,6 µs | 4 | 0 |
| 3 | add ax, cx | 3 | 11 | 2,2 µs | 4 | 4 |
| 4 | loop (atlar) | 17 | 28 | 5,6 µs | 3 | 4 |
| 5 | add ax, cx | 3 | 31 | 6,2 µs | 3 | 7 |
| 6 | loop (atlar) | 17 | 48 | 9,6 µs | 2 | 7 |
| 7 | add ax, cx | 3 | 51 | 10,2 µs | 2 | 9 |
| 8 | loop (atlar) | 17 | 68 | 13,6 µs | 1 | 9 |
| 9 | add ax, cx | 3 | 71 | 14,2 µs | 1 | 10 |
| 10 | loop (atlamaz) | 5 | 76 | 15,2 µs | 0 | 10 |
| 11 | hlt | 2 | 78 | 15,6 µs | 0 | 10 |
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.
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
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.
| Sözcük | İşaretsiz aralık |
|---|---|
| 8 bit | 0 … 255 |
| 16 bit | 0 … 65.535 |
| 32 bit | 0 … 4.294.967.295 |
| 64 bit | 0 … ≈ 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.
| Adres yolu | Bellek | Örnek |
|---|---|---|
| 16 bit | 64 KB | 8080, 8085 |
| 20 bit | 1 MB | 8086, 8088 |
| 24 bit | 16 MB | 80286 |
| 32 bit | 4 GB | 80386, 80486 |
| 36 bit | 64 GB | Pentium 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.
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.| Komut | DX | AX | CX | BX | CF | Açıklama |
|---|---|---|---|---|---|---|
mov ax, 0FFFFh | ???? | FFFFh | ???? | ???? | 0 | a'nın düşük yarısı |
mov dx, 0001h | 0001h | FFFFh | ???? | ???? | 0 | DX:AX = 131.071 |
mov bx, 0002h | 0001h | FFFFh | ???? | 0002h | 0 | b'nin düşük yarısı |
mov cx, 0003h | 0001h | FFFFh | 0003h | 0002h | 0 | CX:BX = 196.610 |
add ax, bx | 0001h | 0001h | 0003h | 0002h | 1 | FFFFh + 0002h = 1 0001h |
adc dx, cx | 0005h | 0001h | 0003h | 0002h | 0 | 0001h + 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.
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ış
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.
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 kopyalaADD [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.
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ı
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.
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.
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.
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, yazRISC 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] @ saklaLDR (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 0123hProgram 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:
- Oku. BIU, BX'in gösterdiği
010Bhadresindeki 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. - Topla. ALU
0123h + 0007h = 012Ahhesaplar ve bayrakları günceller. - Yaz. Sonuç ikinci bir yol döngüsüyle belleğe geri yazılır:
sayi = 012Ah.
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).| Komut | BX | AX | sayi (010Bh) | Yol döngüsü | Bayraklar |
|---|---|---|---|---|---|
| başlangıç | ? | ? | 0123h | — | — |
mov bx, offset sayi | 010Bh | ? | 0123h | — | değişmez |
mov ax, 7 | 010Bh | 0007h | 0123h | — | değişmez |
add [bx], ax | 010Bh | 0007h | 012Ah | oku + yaz | ZF=0 CF=0 SF=0 OF=0 AF=0 |
add [bx], ax | 010Bh | 0007h | 0131h | oku + yaz | ZF=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ı
| Ölçüt | RISC | CISC |
|---|---|---|
| Komut kümesi | az ve basit | geniş ve karmaşık |
| Komut uzunluğu | sabit | değişken |
| Komut başına tur | az (≈ 1, boru hattıyla) | çok (değişken) |
| Bellek erişimi | yalnız yükle/sakla | çoğu komut belleğe erişebilir |
| Yazmaç sayısı | çok | az |
| Program boyutu | daha uzun | daha kısa |
| Güç tüketimi | düşük | görece yüksek |
| Esneklik | yük derleyicide | geniş 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.
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.
Ş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.
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.
| Geçiş | İşlem | AL | c dizisi | SI | CX | Yürütülen komut (toplam) |
|---|---|---|---|---|---|---|
| başlangıç | — | ? | 0, 0, 0, 0 | 0 | 4 | 2 |
| 1 | 3 + 10 | 13 | 13, 0, 0, 0 | 1 | 3 | 7 |
| 2 | 5 + 20 | 25 | 13, 25, 0, 0 | 2 | 2 | 12 |
| 3 | 7 + 30 | 37 | 13, 25, 37, 0 | 3 | 1 | 17 |
| 4 | 9 + 40 | 49 | 13, 25, 37, 49 | 4 | 0 | 22 |
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
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.
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ı
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.
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:
| Sınıf | Anlamı | Örnek |
|---|---|---|
| SISD | tek komut, tek veri | klasik 8086 |
| SIMD | tek komut, çok veri | dizi ve vektör işlemcileri, GPU |
| MISD | çok komut, tek veri | nadir; 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
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.
Ş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)
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, 30BX 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.
| Komut | SI | AL / AX | BX (toplam) | CX |
|---|---|---|---|---|
| hazırlık | 0 | ? | 0 | 3 |
mov al, h[0], mul x[0] | 0 | AX = 2 × 10 = 20 | 0 | 3 |
add bx, ax, inc si, loop | 1 | AX = 20 | 20 | 2 |
mov al, h[1], mul x[1] | 1 | AX = 3 × 20 = 60 | 20 | 2 |
add bx, ax, inc si, loop | 2 | AX = 60 | 80 | 1 |
mov al, h[2], mul x[2] | 2 | AX = 1 × 30 = 30 | 80 | 1 |
add bx, ax, inc si, loop | 3 | AX = 30 | 110 | 0 |
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
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)
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 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
| Tür | Temel fikir | Güçlü yanı | Örnek |
|---|---|---|---|
| CISC | zengin, karmaşık komutlar | kısa kod, uyumluluk | 8086, Pentium, 68000 |
| RISC | basit komut + boru hattı | hız, düşük güç | ARM, MIPS, RISC-V |
| EPIC | derleyici paralelliği belirler | komut düzeyi paralellik | IA-64 Itanium |
| Skalar | komut başına bir veri | genel amaçlı | çoğu CPU çekirdeği |
| Vektör | komut başına veri dizisi | bilimsel hesap | Cray-1, AVX |
| Dizi (SIMD) | çok PE, aynı komut | büyük paralellik | ILLIAC IV, GPU |
| DSP | MAC, özel adresleme | gerçek zamanlı sinyal | TMS320, SHARC |
| Sembolik | sembol/kural işleme | yapay zekâ (klasik) | LISP makineleri |
| GPU | binlerce basit çekirdek | grafik, derin öğrenme | NVIDIA, 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
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
| İşlemci | Yıl | Saat | Transistör | Komut hızı / not |
|---|---|---|---|---|
| 4004 (4 bit) | 1971 | 740 kHz | 2.300 | ≈ 60.000 komut/s; Ted Hoff, Federico Faggin, Stanley Mazor |
| 4040 (4 bit) | 1974 | 740 kHz | ≈ 3.000 | 4004'ün geliştirilmiş sürümü (kesme, daha çok komut) |
| 8008 (8 bit) | 1972 | 500 kHz | 3.500 | ≈ 50.000 komut/s; ilk 8 bitlik |
| 8080 (8 bit) | 1974 | 2 MHz | 6.000 | 8008'in ≈ 10 katı hız; 16 bit adres (64 KB); Altair 8800 |
| 8085 (8 bit) | 1976 | 3 MHz | 6.500 | tek +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
| İşlemci | Yıl | Saat | Transistör | Özellik |
|---|---|---|---|---|
| 8086 | 1978 | 5 · 8 · 10 MHz | 29.000 | 16 bit veri yolu, 20 bit adres yolu (1 MB); donanımsal çarpma/bölme; ≈ 0,33–0,75 MIPS |
| 8088 | 1979 | 5 · 8 MHz | 29.000 | 8086'nın 8 bit dış veri yollu ucuz sürümü; IBM PC (1981, 4,77 MHz) |
| 80186 / 80188 | 1982 | 6 MHz'den | ≈ 55.000 | yonga üstünde kesme denetleyicisi, saat üreteci, yerel yol denetleyicisi, sayaçlar, DMA; 80188 ucuz (8 bit dış yol) sürüm |
| 80286 | 1982 | 6–12,5 MHz | 134.000 | 16 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
| İşlemci | Yıl | Saat | Transistör | Özellik |
|---|---|---|---|---|
| 80386 | 1985 | 16–33 MHz | 275.000 | 32 bit veri ve adres yolu (4 GB), sayfalama; sürümler: 386DX, 386SX (1988; 16 bit dış veri, 24 bit adres), 386SL (dizüstü) |
| 80486 | 1989 | 16–100 MHz | 1,2 milyon | yonga üstü 8 KB önbellek, tümleşik FPU, 5 aşamalı boru hattı; sürümler: 486DX, 486SX (FPU'suz), DX2, DX4 |
| Pentium | 1993 | 60 · 66 MHz (ilk) | 3,1 milyon | sü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
| İşlemci | Yıl | Saat | Transistör | Özellik |
|---|---|---|---|---|
| Core 2 | 2006 | 1,2–3 GHz | 291 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 i7 | 2008 | 2,66–3,33 GHz | 731 milyon | 4 çekirdek, Hyper-Threading, tümleşik bellek denetleyicisi, 8 MB L3 |
| Core i5 | 2009 | 2,4–3,6 GHz | — | orta sınıf; Turbo Boost |
| Core i3 | 2010 | 2,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ı
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.
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.
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.
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.
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.
İ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.
Ö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.
Ö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.
Ö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 atlayanloop17, 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ı
addile toplamak. Düşük yarıdan gelen elde ancakadcile 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+adcile 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.
- mikroişlemci microprocessor
- mikrodenetleyici (MCU) microcontroller
- merkezî işlem birimi (CPU) central processing unit
- yonga chip
- tümleşik devre (IC) integrated circuit
- yol bus
- adres yolu address bus
- veri yolu data bus
- kontrol yolu control bus
- yol döngüsü bus cycle
- T durumu T state
- bekleme durumu wait state
- komut döngüsü instruction cycle
- getir / çöz / yürüt fetch / decode / execute
- işlem kodu opcode
- işlenen operand
- anlık değer immediate value
- komut işaretçisi (IP) instruction pointer
- program sayacı (PC) program counter
- aritmetik-mantık birimi (ALU) arithmetic logic unit
- kontrol birimi control unit
- yazmaç register
- bayrak flag
- yol arayüz birimi (BIU) bus interface unit
- yürütme birimi (EU) execution unit
- önden getirme kuyruğu prefetch queue
- mikrokod microcode
- saat sinyali clock signal
- saat turu clock cycle
- saat hızı clock speed
- komut başına tur (CPI) cycles per instruction
- bit genişliği word length
- sözcük word
- kesim segment
- bağıl konum offset
- elde bayrağı (CF) carry flag
- komut kümesi instruction set
- CISC complex instruction set computer
- RISC reduced instruction set computer
- boru hattı pipeline
- boru hattında bekleme pipeline stall
- sayıl (skalar) işlemci scalar processor
- vektör işlemcisi vector processor
- SIMD single instruction, multiple data
- sayısal sinyal işlemcisi (DSP) digital signal processor
- grafik işlem birimi (GPU) graphics processing unit
- kayan nokta birimi (FPU) floating-point unit
- gerçek mod real mode
- korumalı mod protected mode
- dallanma tahmini branch prediction
- önbellek cache
- bellek hiyerarşisi memory hierarchy
1.1.12Kendini Dene
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.
Aynı döngüde
mov cx, 4yerinemov cx, 5yazılırsa döngü kaç tur sürer ve AX ne olur?Cevap
Gövde beş kez çalışır;
loopdö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.IP izlemesindeki program
0100hyerine0200hadresinden başlasaydıloop dongukomutunun makine kodu değişir miydi?Cevap
Değişmezdi.
loophedef adresi değil, sıradaki komuta göre uzaklığı saklar. Etiket0206h'de, sıradaki komut020Ah'de olur; uzaklık yine −4 (FCh) ve kod yineE2 FC'dir.DX:AX =
0000FFFFhve CX:BX =00000001hikenadd ax, bxveadc dx, cxyü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.AL =
05hikenadd al, 0FBhyü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 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.
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.
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.
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.
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
- A. S. Tanenbaum, H. Bos, Modern Operating Systems, 3. baskı, Pearson.
- B. B. Brey, The Intel Microprocessors: 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium …, 8. baskı, Pearson.
- W. Stallings, Computer Organization and Architecture, 10. baskı, Pearson.
- D. A. Patterson, J. L. Hennessy, Computer Organization and Design: The Hardware/Software Interface, Morgan Kaufmann.
- 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.