İş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 önbelleği üretmişler ve işlemci yongası üstünde kullanmaya başlamışlardır.

## Yerellik ('''')

Önbelleğin çalışma ilkelerinden biri "yerellik ilkesi" (İng. **')'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ı önbelleğ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 ==

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

# **Bulamama oranını azaltmak,**
# **Bulma gecikmesini azaltmak,**
# **Önbelleğ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.

önbellekte, gerekli başarımı sağlamak için aranan verinin önbellekte olup olmaması ve varsa nasıl bulunacağı konusu önemli bir konudur. Bu da önbellekteki [[öbek]]lerin ([[İng.]] ) 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 önbellek vardır.

===Doğrudan ilişkili önbellek ===

Bir önbellekte, bir alt seviye bellekte bulunan her bir veri ögesi, önbellekte sadece bir yerde tutulabiliyorsa bu tür önbelleğe **doğrudan ilişkili önbellek** denir. Bu tür ilişkilendirmede alt seviyedeki birden fazla veri önbellekte **aynı konum**u paylaşır. Verilerin önbellekteki adresi, **bellek adresleri**nin önbelleğin öbek boyutuna bölümünden kalan hesaplanarak bulunur. Adresin 2<sup>N</sup> satırlık bir önbellekte 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<sup>M</sup> 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 önbellekteki satır sayısına bölünmesiyle bulunur. Geriye kalan kısım ise önbellekte verinin [[etiket]]i olarak saklanır.

Başarımı artırmak için önbelleğin [[öbek]] boyutunu artı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 önbelleğin oldukça yavaş çalışmasına sebep olur.



===Tam ilişkili önbellek ===

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

===Kümeli ilişkili önbellek ===

Bu önbellek türü, doğrudan ilişkili önbelleğin iki, dört veya daha fazla küme şeklinde ilişkilendirilmesiyle oluşturulmuştur. Yine doğrudan ilişkili önbellekte 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 önbellekten 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.]] **') istenen veri öbeği seçilip alınır.

Kümeli ilişkili önbelleğin, doğrudan ilişkili önbellekle farkı, küme ilişkisi kadar doğrudan eşlemeli önbelleğin aynı anda çalışıp sonuç üretmesidir. Fakat N yollu kümeli ilişkili önbellek içinde N tane karşılaştırma barındırırken, doğrudan ilişkili önbellek 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 önbellekte 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 önbellek türlerinde kullanılmaktadır.

## Yaz-sil denetimi ('''')

Yeni gelen öbeklere yer açmak için, önbelleğin içinde bulunan öbek veya öbeklerin silinmesi gerekir. Hangi öbeklerin önbellekten boşaltılacağını belirlemek için kullanılan kurala “**yaz-sil denetimi**” (İng. *replacement policy) denir. Yaz-sil denetiminin ana sorunu ileride en az kullanılacak olan öbeğin tahmin edilip önbellekten 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 önbellekten silineceğini belirlemek için kullanılan iki yöntem vardır:

* *'Rastgele öbek çıkarılması:** önbellekteki herhangi bir konumdaki öbek silinir ve bellekten getirilen öbek bu konuma yazılır. Bu yöntem pek sağlıklı değildir. önbellekte 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 “[[FIFO algoritması|ilk giren ilk çıkar]]” (FIFO) mantığı kullanılır.
* **Son zamanda en az kullanılan öbeğin çıkarılması:** ([[İng.]] **') önbellekte bir konuma veri yazılacaksa, öbeklerden son zamanda en uzun süredir erişim yapılmayan öbek çıkarılır. Önbelleğ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.

## önbellekte verinin bulunamamasının sebepleri

Aranılan öbek her zaman önbellekte 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ı önbellek satırına eşlenmesi sonucu oluşan çatışma:** Bu sorunun üstesinden gelmek için önbelleğ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:** Önbellek gerektiği kadar öbeği saklayacak sığaya sahip değilse çalıştırılan programlar ihtiyaç duydukları öbeklere önbellekten erişemez ve hız düşer. Bu önbelleğin boyutu arttırılarak giderilebilir. Ama önbellek 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 önbellekler 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 önbellek öbeği anlamsız kalır.

## Yazma denetimi ('''')

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

### Yazma tayini ('''')

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

**Sonra geri yaz ([[İng.]] **'):** Bu yöntemde veri öbeği öncelikle sadece önbelleğe yazılır. Bu öbek daha sonra önbellekten çıkarılacağı zaman alt seviyedeki belleğe yazılır. Bu tür bir yazma, karmaşık bir denetim gerektirir. Veri önbelleğe yazıldığında “**kirli**” ([[İng.]] **') olarak tanımlanır. Öbek önbellekten çı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 önbellekten çıkarken ana belleğe yazılır.

**Tümüne yaz ([[İng.]] **'):** Bu yöntemde veri önbelleğ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 önbelleğin, ana belleğe yazma işlemini beklememesi için yazma arabellekleri kullanılır. önbellekten çıkarılan veriler belleğe yazılmak üzere bir arabelleğe alınır. ''Dört ilâ sekiz satır'' gibi küçük bir boyuta sahip olan bu arabellek “ilk giren ilk çıkar” ([[İng.]] **') mantığıyla çalışır. Veri önbellekten geldikçe daha önce gelmiş olan veriler ana belleğe yazılmaya devam edilir.

Arabellek kullanılması ana belleğe yazılma işlemini hızlandırsa da bazı sorunlara yol açabilir. Eğer arabelleğin belleğe yazım hızı çok düşükse, kısa süre sonra arabellek dolar ve daha fazla veri alamamaya başlar. Bu durumda bütün sistem yavaşlayacağından arabelleğin hızlı çalışması gerekir.

Yazma arabelleğinin doymasını önlemek için seviyeli bellek yapısı kullanılır. Yazma arabelleği ile ana bellek arasına ikinci seviye bir önbellek daha eklenir ve “sonra geri yaz” mantığı kullanılır. Genellikle **ikinci seviye önbellek** ana bellek yongası üstünde bulunan SRAM yapıda küçük bir alandır. Bu uygulama bulamama gecikmesini azaltır.

### Yazmama tayini ('''')

Eğer önbellekte yazma işlemi gerçekleştirilmiyorsa, yazma işlemini yapmamak için sadece işlemci erişimi önbelleğe kaydediliyorsa bu duruma yazmama tayini (İng. **') denir.

==Çalışması ==

Bir önbelleğin çalışması, kabaca özetlenirse, işlemci yeni bir veri istediğinde belleğe erişmek istemesiyle başlar. Veri öbeği önce önbellekte 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 önbellek olabilir. Aranılan veri bu bellekten çekildikten sonra, önbelleğe de yazılması gerekir. Bunun için **yaz-sil denetimi** kullanılarak seçilen öbeklerin yerine yenileri yerleştirilir.

İşlemcinin önbelleğe yazım işlemini gerçekleştirmesi için ise **yazma denetimi** kullanılır. Yazma denetiminin kararına göre veri önbellekle, belleğe aynı anda veya öbekler önbellekten çıkarılırken yazılır. Bu aşamada genellikle bir yazma arabelleği kullanılır. Yazılacak veriler arabelleğe yerleştirilir ve bir üst seviyee yazma işlemini bu **arabellek** gerçekleştirir.

==Uygulamaları ==

önbellekler 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ş önbellek ===

[[Boru hattı (bilgisayar)|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 önbellekler 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ı önbellek ile biter.

===Geri dönüşüm önbelleği ===

**Geri dönüşüm önbelleği**, çakışma veya kapasite azlığından meydana gelen bulamama durumlarından dolayı işlemci önbelleğinden çıkan öbekleri atmak için kullanılır. Geri dönüşüm önbelleğ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 önbelleği ===

**İz önbelleğ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 önbelleği, buyrukları çözüldükten veya işlendikten ([[İng.]] **') sonra saklar. Genel olarak, buyruklar iz önbelleğ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 önbelleğ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 önbelleğinde erişim için kontrol edilir. Eğer erişim varsa iz çizgisi düzenli bir önbelleğe ya da belleğe gitmeyen buyrukların yakalanmasını sağlar. İz önbelleğ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ı önbellekler

Büyük önbellekler 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ş önbellekler tarafından desteklenen küçük ve hızlı önbellekler kullanılır.

Çok aşamalı önbellekler genellikle çalışmaya en küçük (aşama 1) önbellekle başlar ve eğer erişebilirse bu işlemci yüksek hızda çalışır. Eğer küçük önbellekte bulunamazsa büyük önbellek (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 önbelleklerdir. İşlemci içinde dallanma tahminleri vb. işlemleri gerçekleştiren tahmin ediciler de önbellek 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 önbelleği (İng. **) kullanılır

## Kaynakça

## Ayrıca bakınız
* Arabellek
* Bellek
* İşlemci
* Sanal bellek

## Dış bağlantılar
* Önbellek prensibini anlatan HowStuffWorks sayfası