Modern işlemci içten dışa nasıl çalışır?
İşlemci (CPU), dört temel bileşenden oluşur: hesaplamaları gerçekleştiren aritmetik mantık birimi (ALU), tüm birimlerin çalışmasını koordine eden kontrol ünitesi, anlık erişim için verileri saklayan registerlar ve ana bellekle bilgi alışverişini hızlandıran önbellek bellek. Bu blokların uyumlu çalışması sayesinde bilgisayarlar komutları nanosaniyeler içinde işleyebilir.
Aşağıda her bir öğenin rolünü ve etkileşim ilkelerini detaylıca inceleyeceğiz.
Özet: İşlemci sadece "hesap yapmaz". Sürekli olarak komutları yükler, kodlarını çözer, verileri son derece hızlı bellekten (registerlar/önbellek) alır, ALU'da işler ve sonucu kaydeder. Bu döngünün hızı, tüm PC'nin performansını belirler.
Aritmetik Mantık Birimi (ALU)
ALU, işlemcinin "hesaplama çekirdeğidir". Görevi matematiksel işlemleri ve mantıksal karşılaştırmaları yürütmektir.
ALU'nun Temel İşlevleri
- Aritmetik: toplama, çıkarma, çarpma, bölme. Modern CPU'larda karmaşık işlemler (örneğin kayan noktalı bölme) için ayrı birimler (FPU) sorumludur ancak kavramsal olarak bunlar hesaplama devresinin bir parçasıdır.
- Mantık: VE (AND), VEYA (OR), DEĞİL (NOT), özel VEYA (XOR) işlemleri. Kodda karar alma mekanizmaları (
ifkoşulları, döngüler) için gereklidir. - Kaydırma ve Döndürme: Kriptografi ve düşük seviyeli optimizasyonda kullanılan bit düzeyinde veri taşıma işlemleri.
Pratikte Nasıl Çalışır?
Bir program 5 ve 10 sayılarını toplamak istediğinde, ALU doğrudan sabit diske veya hatta ana belleğe başvurmaz. Operandları zaten hazırlanmış halde (registerlardan) alır ve bir veya birkaç saat darbesi (clock cycle) içinde sonucu üretir.
Paralellik: Modern çok çekirdekli işlemcilerde, tek bir çekirdek içinde birden fazla bağımsız ALU bulunabilir. Bu, birbirine bağlı olmayan komutların aynı anda yürütülmesine olanak tanır (süper skaler mimari).
Kontrol Ünitesi (CU)
Eğer ALU işlemcinin "elleriyse", kontrol ünitesi (Control Unit) onun "beyni" veya orkestra şefidir. CU hesaplama yapmaz, ancak ne yapılacağını ve ne zaman yapılacağını belirler.
Kontrol Ünitesinin Görevleri
- Komut Getirme (Fetch): CU, komut sayacında belirtilen adresten bellekten (önbellek üzerinden) sonraki komutu okur.
- Kod Çözme (Decode): İkili komut kodunu diğer blokların anlayabileceği sinyallere dönüştürür. Örneğin,
ADD R1, R2komutu "register 1 ve 2'deki verileri al, ALU'ya gönder ve topla" olarak çözülür. - Yürütme (Execute): CU, ALU'ya, bellek modüllerine ve veri yollarına kontrol sinyalleri gönderir.
- Sonucu Yazma (Write-back): Hesaplama sonucunun doğru registera veya bellek hücresine kaydedilmesini denetler.
Boru Hattı ve Tahminleme
Zaman kaybetmemek için modern CU'lar boru hattı (pipeline) ile çalışır: bir komut ALU'da yürütülürken, sonraki komut zaten kodu çözülüyor ve üçüncü komut yükleniyor olur.
Dallanma Sorunu: Kodda bir koşul varsa (örneğin, eğer X > 0 ise buraya git, aksi takdirde oraya), CU hangi dalın yürütüleceğini önceden tahmin etmelidir. Yanlış tahmin, boru hattının temizlenmesine ve değerli saat darbelerinin kaybedilmesine neden olur.
İşlemci Registerları
Registerlar, bilgisayardaki en hızlı bellektir. Doğrudan işlemci çekirdeğinin içinde bulunurlar ve her biri sadece birkaç bayt kapasiteye sahiptir, ancak verilere 1 saat darbesinde erişim sağlarlar.
Register Türleri
- Genel Amaçlı Registerlar (GPR): Programcılar ve derleyiciler tarafından değişkenleri, ara hesaplama sonuçlarını ve adresleri saklamak için kullanılır.
- Komut Sayacı (IP/EIP/RIP): Yürütülecek sonraki komutun adresini tutar.
- Bayrak Registerı (EFLAGS/RFLAGS): Durum bitlerini içerir (sonuç sıfır mıydı, taşma oldu mu, işaret negatif miydi?). CU, bu bayraklara dayanarak dallanma kararları verir.
- Yığın İşaretçisi (SP/RSP): Fonksiyon çağrıları sırasında geçici veri saklama alanı olan yığının tepesini izler.
Neden Register Sayısı Önemlidir?
Genel amaçlı register sayısı ne kadar fazlaysa, işlemcinin yavaş ana belleğe başvurma ihtiyacı o kadar azalır. x86 mimarisi tarihsel olarak az sayıda registera (8–16) sahipken, ARM ve RISC-V başlangıçtan itibaren daha geniş bir set (32+) ile tasarlanmıştır; bu da boru hattı verimliliğini artırır.
Önbellek Bellek: Hız ve Kapasite Arasındaki Köprü
Ana bellek (RAM), işlemciden onlarca kat daha yavaş çalışır. Bu farkı telafi etmek için, CPU çipi üzerinde bulunan son derece hızlı SRAM tamponlarından oluşan bir önbellek hiyerarşisi kullanılır.
Önbellek Seviyeleri
| Seviye | Kapasite (yaklaşık) | Hız | Özellik |
|---|---|---|---|
| L1 (Seviye 1) | Çekirdek başına 32–64 KB | Maksimum | Komut önbelleği (L1i) ve veri önbelleği (L1d) olarak ayrılır. 3–4 saat darbesinde erişim. |
| L2 (Seviye 2) | Çekirdek başına 512 KB – 2 MB | Yüksek | Genellikle veri ve komutları birleştirir. 10–12 saat darbesinde erişim. |
| L3 (Seviye 3) | İşlemci başına 16–128 MB | Orta | Tüm çekirdekler tarafından paylaşılır. Çekirdeklerin RAM'e başvurmadan veri alışverişi yapmasına yardımcı olur. |
Yerellik İlkesi
Önbellek, programların iki özelliği sayesinde etkilidir:
- Zamansal Yerellik: Veriler şu an kullanıldıysa, yakın gelecekte tekrar ihtiyaç duyulması muhtemeldir (örneğin, döngü değişkeni).
- Mekansal Yerellik: İşlemci bir bellek hücresine başvurduysa, yakında komşu hücrelere de başvuracaktır (örneğin, dizi taraması sırasında).
Cache Miss (Önbellek Iskalama): Gerekli veriler L1/L2/L3'te yoksa, işlemci ana bellekten yükleme yapmak için beklemek zorunda kalır. Bu yüzlerce saat darbesi sürebilir ve bu süre boyunca boru hattı boşta kalır. Kod optimizasyonu çoğu zaman önbellek iskalama oranını minimize etmeye indirgenir.
Bileşenler Birlikte Nasıl Çalışır: Komut Döngüsü
Tek bir komutun yürütülme süreci şöyledir:
- Getirme (Fetch): Kontrol ünitesi bir komut ister. Komut, L1 komut önbelleğinde aranır.
- Kod Çözme (Decode): CU komutu çözer. Verilere ihtiyaç varsa, bunlar registerlardan veya L1 veri önbelleğinden istenir.
- Yürütme (Execute): Veriler ALU'ya aktarılır. ALU işlemi gerçekleştirir (örneğin toplama).
- Bellek Erişimi (Memory Access): Sonucun belleğe kaydedilmesi gerekiyorsa, CU yazma işlemini başlatır (önce önbelleğe, ardından asenkron olarak RAM'e).
- Sonucu Yazma (Write Back): Sonuç, sonraki komutlar tarafından kullanılmak üzere işlemci registerına yazılır.
Boru hattı sayesinde tüm bu aşamalar farklı komutlar için paralel olarak gerçekleşir.
CPU Çalışması Hakkında Sık Yapılan Yanlış Anlamalar
- "GHz ne kadar yüksekse, ALU o kadar hızlıdır." Frekans önemlidir, ancak verimlilik saat başına yürütülen komut sayısına (IPC) bağlıdır. Daha iyi boru hattı ve önbellek sayesinde, düşük frekanslı modern bir işlemci eski yüksek frekanslı bir işlemciden daha hızlı olabilir.
- "L3 önbelleği L1'den daha önemlidir." Tam tersi. L1 iskalaması en kritik olandır çünkü boru hattını anında durdurur. L3, çoklu thread görevleri ve çekirdekler arası veri alışverişi için önemlidir.
- "Registerlar, ana bellekle aynı şeydir." Hayır. Registerlar fiziksel olarak çekirdek mantığına gömülüdür. RAM'e erişim, bellek kontrolcüsü, veri yolu ve önbellekler üzerinden geçmeyi gerektirir ki bu kat be kat daha yavaştır.
SSS
Çekirdek ve thread arasındaki fark nedir? Çekirdek, kendi ALU'su, CU'su, registerları ve L1/L2 önbelleğine sahip fiziksel bir bloktur. Thread (hyper-threading), tek bir çekirdeğin iki komut kuyruğunu yönetmesine olanak tanıyan, boş kaynakları (örneğin bir ALU meşgulken diğerinin çalışabilmesi) daha iyi değerlendiren bir teknolojidir.
Neden ana belleği ortadan kaldırmak için devasa bir önbellek yapılamaz? Önbellek belleği (SRAM) çip üzerinde çok büyük bir alan kaplar ve çok pahalıdır. Önbelleğin büyütülmesi, büyük alandaki transistörlerin anahtarlama hızındaki fiziksel sınırlamalar nedeniyle işlemcinin maksimum frekansını düşürür. Önbellek boyutu ile frekans arasındaki denge, temel bir mühendislik sorunudur.
TDP nedir ve işlemci yapısıyla nasıl ilişkilidir? TDP (termal tasarım gücü), ALU, önbellek ve kontrolcüler dahil olmak üzere işlemcideki tüm transistörlerin dağıttığı enerji miktarını gösterir. Bloklar (özellikle yüksek frekanslarda önbellek ve ALU) ne kadar aktif çalışırsa, ısıl yayılım o kadar yüksek olur.