Başlığın diğer anlamları için Bellek (anlam ayrımı) sayfasına bakınız.**İş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 (*İngilizce: principle of locality*)
---------------------------------------------

Ön belleğin çalışma ilkelerinden biri "yerellik ilkesi" (İng. *İngilizce: 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.

Çeşitleri ve çalışma şekilleri
------------------------------

Ön belleğin başarımını artırmak için tasarımcılar çeşitli yollar düşünmüşlerdir. Ön bellekte başarımı artırmak için üç yöntem uygulanabilir.

1. **Bulamama oranını azaltmak,**
2. **Bulma gecikmesini azaltmak,**
3. **Ön belleğin erişim süresini azaltmak,**

Bu başarım ilkelerini gerçekleştirirken mühendisliğin pek çok dalında olduğu gibi birinden kazanç sağlamak için diğer ilkeden ödün verilmesi çoğu zaman kaçınılmazdır.

Ön bellekte, gerekli başarımı sağlamak için aranan verinin ön bellekte olup olmaması ve varsa nasıl bulunacağı konusu önemli bir konudur. Bu da ön bellekteki öbeklerin (İng. İngilizce: cache line) ana bellekteki adreslerle nasıl ilişkilendirileceği (eşleneceği) sorusunun cevabıdır. İlişkilendirme şekillerine göre doğrudan ilişkili, tam ilişkili ve küme ilişkili olmak üzere üç tür ön bellek vardı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ı konum**u paylaşır. Verilerin ön bellekteki adresi, **bellek adresleri**nin ön belleğin öbek boyutuna bölümünden kalan hesaplanarak bulunur. Adresin 2N 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 2M 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 bellekte ilişkilendirme
### 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. *İngilizce: 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.

Yaz-sil denetimi (*İngilizce: replacement policy*)
--------------------------------------------------

Yeni gelen öbeklere yer açmak için, ön belleğin içinde bulunan öbek veya öbeklerin silinmesi gerekir. Hangi öbeklerin ön bellekten boşaltılacağını belirlemek için kullanılan kurala "**yaz-sil denetimi**" (İng. *İngilizce: replacement policyreplacement policy) denir. Yaz-sil denetiminin ana sorunu ileride en az kullanılacak olan öbeğin tahmin edilip ön bellekten silineceğini belirlemektir. Donanımın hangi öbeğin en az kullanılacağını belirlemesi oldukça zordur. Günümüzde hangi öbeğin ön bellekten silineceğini belirlemek için kullanılan iki yöntem vardır:*

* **Rastgele öbek çıkarılması:** Ön bellekteki herhangi bir konumdaki öbek silinir ve bellekten getirilen öbek bu konuma yazılır. Bu yöntem pek sağlıklı değildir. Ön bellekte sık erişilen bir öbeğin silinmesine ve zaman kayıplarına yol açabilir.
* **En eski öbeğin çıkarılması:** Bu yöntemde "ilk giren ilk çıkar" (FIFO) mantığı kullanılır.
* **Son zamanda en az kullanılan öbeğin çıkarılması:** (İng. *İngilizce: Least Recently Used - LRU*) Ön bellekte bir konuma veri yazılacaksa, öbeklerden son zamanda en uzun süredir erişim yapılmayan öbek çıkarılır. Ön belleğin dinamik kullanımı hakkında bilgi gerektirir. Bu sebeple maliyet daha fazladır, ancak FIFO yönteminden daha başarılıdır.
* **Optimum yaz-sil denetimi:** Gelecekte hangi öbeklere hangi sıra ile erişim olacağını bilmeyi gerektirir. Bu sıra tahmin edilebilir ya da kod daha önce çalıştırılarak görülebilir. Ancak maliyet yüksektir.

Ön bellekte verinin bulunamamasının sebepleri
---------------------------------------------

Aranılan öbek her zaman ön bellekte olmayabilir. Bunun sebepleri şunlardır:

* **İşlemci bir öbeğe ilk kez erişmek istediğinde:** Bu durumda bulamamayı engellemek için yapılabilecek bir şey yoktur çünkü tahmini de hemen hemen imkânsızdır. Ama işlenen buyruk sayısı oldukça fazla ise bu tür bir bulamama durumu önemsiz kalır.
* **Birden çok bellek konumunun aynı ön bellek satırına eşlenmesi sonucu oluşan çatışma:** Bu sorunun üstesinden gelmek için ön belleğin boyutu arttırılabilir ya da ilişkilendirme sayısı arttırılıp bir satırda daha fazla öbek olması sağlanabilir. Böylece eşlenme sayısı artacağından çatışma riski azalır.
* **Boyut yetersizliği:** Ön bellek gerektiği kadar öbeği saklayacak sığaya sahip değilse çalıştırılan programlar ihtiyaç duydukları öbeklere ön bellekten erişemez ve hız düşer. Bu ön belleğin boyutu arttırılarak giderilebilir. Ama ön bellek boyutu çok fazla arttırılırsa ana bellek gibi davranmaya başlayacağından belli değerlerin üstüne çıkması başarımı düşürür. Günümüzde ön bellekler genellikle **2 MB ve altı** sığalarda üretilmektedir.
* **Geçersizleştirme:** Eğer belleğe erişim sonucu bellek içeriği değişirse ön bellek öbeği anlamsız kalır.

Yazma denetimi (*İngilizce: 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. *İngilizce: write policy*), denetimin davranış şekline de yazma-yazmama tayini (İng. *İngilizce: write, no-write allocation*) denir.

### Yazma tayini (*İngilizce: write allocation*)

Bu atama şeklinde temelde kullanılan iki yöntem vardır.

**Sonra geri yaz (İng. *İngilizce: 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. *İngilizce: 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. *İngilizce: 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. *İngilizce: 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 (*İngilizce: 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. *İngilizce: 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. *İngilizce: 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 adres**lerin **gerçek adres**lere dönüştürülmesinde de adres dönüştürme ön belleği (İng. *İngilizce: Translation Lookaside Buffer*) kullanılır

Kaynakça
--------

1. ↑  "işlemci-bellek başarımı farkı". acm.org. 19 Mayıs 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Kasım 2007.

Ayrıca bakınız
--------------

* Ara bellek
* Bellek
* İşlemci
* Sanal bellek

Dış bağlantılar
---------------

* Ön bellek prensibini anlatan HowStuffWorks sayfası 24 Aralık 2007 tarihinde Wayback Machine sitesinde arşivlendi.