İşlemci önbelleği

İşlemci önbelleği, CPU'nun hafızadaki verilere ulaşma süresini azaltan bir donanımdır. Ana belleğe(RAM) kıyasla küçük, hızlı ve işlemci çekirdeğine yakındır. Sık kullanılan veriler ya da en güncel veriler işlemci önbelleğinde saklanır. Günümüzde pek çok CPU, birden çok seviyede önbellek içerir, bu önbellekler verilerin yanı sıra komutları da bünyesinde tutar.

Gelişim süreci ve bilgisayar mimarîsindeki yeri

Moore Yasası’nın belirttiği üzere işlemci başarımının bellek başarımına oranı yılda yaklaşık %50 artar. Bu da zaman geçtikçe, işlemci hızının bellek hızından çok daha büyük olmasına sebep olur. Gün geçtikçe artan bu fark, bilgisayar mimarîsinde çeşitli sorunlar meydana getirmiş, işlemci hızının oldukça yüksek değerlere ulaşmasına rağmen, bu hızın tam verimle kullanılamamasına sebep olmuştur. Yani bellek konusunda bir darboğaz oluşmuştur. Bu yüzden 1980 lerde, işlemci saati 20 Mhz değerlerine ulaşmaya başladığında mimarî geliştiricileri, işlemciyle bellek arasında bir tampon görevi gören ön belleği üretmişler ve işlemci yongası üstünde kullanmaya başlamışlardır.

Yerellik (principle of locality)

Ön belleğin çalışma ilkelerinden biri "yerellik ilkesi" (İng. principle of locality)’dir. Yerellik ilkesine göre iki tür yerellik vardır.

Zamanda yerellik

İşlemcinin son ulaştığı ögeye yakın bir zamanda yeniden ulaşmak istemesi olasıdır. Bu sebeple son ulaşılan ögelerin işlemciye yakın tutulması gerekir.

Alanda yerellik

Bellekten okunan bir ögenin yakınındaki adreslerde bulunan ögelere ulaşmak istemesi olasıdır. Bu sebeple okunan ögenin yakınındaki adreslerde bulunan verilerin işlemciye yakın tutulması gerekir.
Yerellik ilkesinden yararlanarak, çalıştırılan programların büyük ölçüde hızlanması sağlanır çünkü pek çok program yüksek sayıda döngü içerir ve yerellik sayesinde bellekte yakın adreslerde tutulan döngü komutları ön belleğe alınıp oldukça hızlı bir şekilde işlenebilir. Tasarımda istenenlere göre büyük boyutlu, ama yüksek zaman erişimine sahip ya da yüksek zaman erişimli, ama düşük kapasiteli bellek kullanılır.

Doğrudan ilişkili ön bellek

Bir ön bellekte, bir alt seviye bellekte bulunan her bir veri ögesi, ön bellekte sadece bir yerde tutulabiliyorsa bu tür ön belleğe doğrudan ilişkili ön bellek denir. Bu tür ilişkilendirmede alt seviyedeki birden fazla veri ön bellekte aynı konumu paylaşır. Verilerin ön bellekteki adresi, bellek adreslerinin ön belleğin öbek boyutuna bölümünden kalan hesaplanarak bulunur. Adresin 2ᴺ satırlık bir ön bellekte aranılan sözcüğü bulması için öncelikle adres üç parçaya ayrılır. Son M biti bayt seçimi için kullanılır. (Kelime boyutu 2ᴹ bayt olduğu için). Sondan M bit ayrıldıktan sonra kalan kısmın son N biti satırı seçmek için kullanılır. Adresin ön bellekteki satır sayısına bölünmesiyle bulunur. Geriye kalan kısım ise ön bellekte verinin etiketi olarak saklanır.
Başarımı arttırmak için ön belleğin öbek boyutunu arttırmak etkili bir çözüm olarak düşünülebilir. Ama öbek boyutu arttıkça alanda yerellikten yararlanmak kolaylaşsa da öbeklerin dolma zamanı ve bellekte bulunamama süreleri artacağından belli bir noktadan sonra ön belleğin oldukça yavaş çalışmasına sebep olur.

Tam ilişkili ön bellek

Tam ilişkili ön bellekte doğrudan ilişkili ön belleğin aksine adres satırı bölündüğünde konumu tutan bir adres parçası olmaz. Örneğin 32 bitlik öbeklere sahip bir ön bellekte 27 bit etiket, geri kalan bitler ise bayt seçimi için kullanılır. Bu ön bellekte satır numarası tutulmadığından etiketlerle verinin adresi aynı anda karşılaştırılır. Bu tür bir ön bellekte iki veri ögesi aynı ön bellek satırında tutulamayacağından çatışmadan dolayı bulamama 0’dır.

Kümeli ilişkili ön bellek

Bu ön bellek türü, doğrudan ilişkili ön belleğin iki, dört veya daha fazla küme şeklinde ilişkilendirilmesiyle oluşturulmuştur. Yine doğrudan ilişkili ön bellekte olduğu gibi bellek adresi parçalara bölünür ve etiket, satır numarası ve bayt seçimi olarak ayrılır. Her bir satır yine satır numarasıyla kontrol edilir. Doğrudan ilişkili ön bellekten farklı olarak satır numarasıyla her bir küme sütunundan öbekler alınır ve etiketle karşılaştırıldıktan sonra eğer veri öbekte bulunduysa küme sayısı kadar girişi olan çoklayıcıyla (İng. MUX) istenen veri öbeği seçilip alınır.
Kümeli ilişkili ön belleğin, doğrudan ilişkili ön bellekle farkı, küme ilişkisi kadar doğrudan eşlemeli ön belleğin aynı anda çalışıp sonuç üretmesidir. Fakat N yollu kümeli ilişkili ön bellek içinde N tane karşılaştırma barındırırken, doğrudan ilişkili ön bellek sadece bir karşılaştırma barındırır. Ayrıca çoklayıcı da kullanıldığından belli bir çoklayıcı gecikmesini sahiptir. Doğrudan ilişkili ön bellekte veri bulundu/bulunamadı kararından önce hazırken burada karardan sonra veri hazır hale gelebilir. İşleme veri bulunmuş gibi devam edilip, bulunamadıysa düzeltilme yapılıp devam edilir.
Günümüzde her üç ilişkilendirme türü de tasarımın işlevine ve tasarım örüntülerine göre çeşitli ön bellek türlerinde kullanılmaktadır.

Yazma denetimi (write policy)

Bir veri öbeği, yazma aşamasına geldiğinde ön belleğe yazıldığı gibi ana belleğe de yazılmalıdır. Bunu kontrol eden denetime yazma denetimi (İng. write policy), denetimin davranış şekline de yazma-yazmama tayini (İng. write, no-write allocation) denir.

Yazma tayini (write allocation)

Bu atama şeklinde temelde kullanılan iki yöntem vardır.
Sonra geri yaz (İng. write-back): Bu yöntemde veri öbeği öncelikle sadece ön belleğe yazılır. Bu öbek daha sonra ön bellekten çıkarılacağı zaman alt seviyedeki belleğe yazılır. Bu tür bir yazma, karmaşık bir denetim gerektirir. Veri ön belleğe yazıldığında “kirli” (İng. dirty) olarak tanımlanır. Öbek ön bellekten çıkarılırken kirli olup olmadığı denetlenir ve kirliyse ana belleğe yazılır. Bu yöntemin avantajı her yazma işlemi yapıldığında ana belleğe yinelenen yazma işlemleri yapmayı önlemesidir. Veriler sadece ön bellekten çıkarken ana belleğe yazılır.
Tümüne yaz (İng. write thorough): Bu yöntemde veri ön belleğe yazıldığı anda alt seviyedeki belleklere de yazılır. Bu yöntem her aşamada belleğe erişimi ve yeniden yazmayı gerektirir.
Bu tür denetimde ön belleğin, ana belleğe yazma işlemini beklememesi için yazma ara bellekleri kullanılır. Ön bellekten çıkarılan veriler belleğe yazılmak üzere bir ara belleğe alınır. Dört ilâ sekiz satır gibi küçük bir boyuta sahip olan bu ara bellek “ilk giren ilk çıkar” (İng. FIFO) mantığıyla çalışır. Veri ön bellekten geldikçe daha önce gelmiş olan veriler ana belleğe yazılmaya devam edilir.
Ara bellek kullanılması ana belleğe yazılma işlemini hızlandırsa da bâzı sorunlara yol açabilir. Eğer ara belleğin belleğe yazım hızı çok düşükse, kısa süre sonra ara bellek dolar ve daha fazla veri alamamaya başlar. Bu durumda bütün sistem yavaşlayacağından ara belleğin hızlı çalışması gerekir.
Yazma ara belleğinin doymasını önlemek için seviyeli bellek yapısı kullanılır. Yazma ara belleği ile ana bellek arasına ikinci seviye bir ön bellek daha eklenir ve “sonra geri yaz” mantığı kullanılır. Genellikle ikinci seviye ön bellek ana bellek yongası üstünde bulunan SRAM yapıda küçük bir alandır. Bu uygulama bulamama gecikmesini azaltır.

Yazmama tayini (write no-allocate)

Eğer ön bellekte yazma işlemi gerçekleştirilmiyorsa, yazma işlemini yapmamak için sadece işlemci erişimi ön belleğe kaydediliyorsa bu duruma yazmama tayini (İng. write no-allocate) denir.

Çalışması

Bir ön belleğin çalışması, kabaca özetlenirse, işlemci yeni bir veri istediğinde belleğe erişmek istemesiyle başlar. Veri öbeği önce ön bellekte aranır ve bulunursa gerekli öbek işlemci tarafından alınır. Bulunamaması durumunda ise aranılan veri için bir üst seviye bellek kontrol edilir. Bu kullanılan yapıya göre ana bellek veya ikinci seviye bir ön bellek olabilir. Aranılan veri bu bellekten çekildikten sonra, ön belleğe de yazılması gerekir. Bunun için yaz-sil denetimi kullanılarak seçilen öbeklerin yerine yenileri yerleştirilir.
İşlemcinin ön belleğe yazım işlemini gerçekleştirmesi için ise yazma denetimi kullanılır. Yazma denetiminin kararına göre veri ön bellekle, belleğe aynı anda veya öbekler ön bellekten çıkarılırken yazılır. Bu aşamada genellikle bir yazma ara belleği kullanılır. Yazılacak veriler ara belleğe yerleştirilir ve bir üst seviyee yazma işlemini bu ara bellek gerçekleştirir.

Uygulamaları

Ön bellekler günümüzde işlemci dışındaki alanlarda veya işlemcide çeşitli farklı işlemleri gerçekleştirmek için kullanılırlar.

Özelleştirilmiş ön bellek

Boru hattı kullanan MİB’ler (Merkezi İşlem Birimi yani CPU) belleğe boru hattındaki birkaç noktadan erişirler. Bunlar buyruğun yakalanması, sanal-fiziksel adres dönüşümü ve veri yakalanmasıdır. Bu noktaların her biri için farklı fiziksel ön bellekler kullanılır, böylece hiçbir fiziksel kaynak boru hattında iki noktaya hizmet vermek zorunda kalmaz. Sonuç olarak boru hattı her biri farklı görevde özelleşmiş en az üç farklı ön bellek ile biter.

Geri dönüşüm ön belleği

Geri dönüşüm ön belleği, çakışma veya kapasite azlığından meydana gelen bulamama durumlarından dolayı işlemci ön belleğinden çıkan öbekleri atmak için kullanılır. Geri dönüşüm ön belleği, ana bellek ve onun tekrar dolma yoluna dayanır ve sadece bulamama durumunda öbekleri atar. Bu teknik, bulamama durumunun gecikmesini azaltmak için kullanılır.

İz ön belleği

İz ön belleği, buyruğun önceden yakalanmış ve çözülmüş izlerini saklayarak buyruk yakalama bant genişliğini artırmak ve güç tüketimini azaltmak için kullanılır.
İz ön belleği, buyrukları çözüldükten veya işlendikten (İng. retire) sonra saklar. Genel olarak, buyruklar iz ön belleğe yalnız basit öbekler ya da hareketli buyruk izleri şeklinde gruplar halinde eklenir. Basit öbek dallanmayla biten, dallanma olmayan buyruk gruplarından oluşur. Hareketli iz (iz yolu), yalnızca sonuçları en son kullanılan buyrukları içerir ve dallanmaları takip eden buyrukları eler. Hareketli iz, birkaç basit öbeğin birbirine bağlanmasından oluşabilir. Bu, işlemcinin buyruk yakalama biriminin basit öbekleri, çevrimde olan dallanmaları önemsemeden getirmesine izin verir.
İz çizgileri izdeki ilk buyruğun program sayacı ve bir dallanma tahmini kümesine dayanacak şekilde iz ön belleğinde saklanır. Bu, aynı adresle başlayan, her biri farklı dallanma gösteren farklı iz yollarını saklamak için kullanılır. Bir boru hattının buyruk yakalama aşamasında, o anki program sayacı bir dallanma tahmini kümesi ile birlikte iz ön belleğinde erişim için kontrol edilir. Eğer erişim varsa iz çizgisi düzenli bir ön belleğe ya da belleğe gitmeyen buyrukların yakalanmasını sağlar. İz ön belleği, iz çizgisi bitene ya da boru hattında bir yanlış tahmin olana kadar yakalama birimini beslemeye devam eder. Bulamama durumu olduğunda yeni bir iz yaratılmaya başlanır.

Çok aşamalı ön bellekler

Büyük ön bellekler daha iyi bulma oranına sahiptirler fakat gecikme süresi fazladır. Bu sorunu çözmek için birçok bilgisayarda büyük ve yavaş ön bellekler tarafından desteklenen küçük ve hızlı ön bellekler kullanılır.
Çok aşamalı ön bellekler genellikle çalışmaya en küçük (aşama 1) ön bellekle başlar ve eğer erişebilirse bu işlemci yüksek hızda çalışır. Eğer küçük ön bellekte bulunamazsa büyük ön bellek (aşama 2) kontrol edilir ve tüm bellek kontrol edilene kadar devam eder.

Diğer uygulamalar

Diğer işlemciler,diğer tür tahmin ediciler ve gelecekteki işlemcilerde gelişmesi muhtemel olan çeşitli özelleştirilmiş tahmin ediciler kullanır. Bu tahmin ediciler hesaplaması masraflı bilgiler saklayan ön belleklerdir. İşlemci içinde dallanma tahminleri vb. işlemleri gerçekleştiren tahmin ediciler de ön bellek yapısına sahiptir. Ayrıca sanal bellek uygulamalarında sanal adreslerin gerçek adreslere dönüştürülmesinde de adres dönüştürme ön belleği (İng. Translation Lookaside Buffer) kullanılır