İşlemci önbelleği

Vikipedi, özgür ansiklopedi
(Önbellek sayfasından yönlendirildi)
Atla: kullan, ara

Önbelleğin Tanımı[değiştir | kaynağı değiştir]

Sistem belleğinden gelen veriler çoğunlukla CPU'nun hızına yetişemezler. Bu problemi çözmek için CPU içinde yüksek hızlı hafızalar bulunur. Ön bellek çalışmakta olan programa ait komutların ve verilerin geçici olarak saklandığı yüksek hızlı hafızalardır.

Önbelleğin Gelişim Süreci ve Bilgisayar Mimarisindeki Yeri[değiştir | kaynağı değiştir]

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. İşlemci hızı ile bellek hızı arasındaki gün geçtikçe artan bu fark, bilgisayar mimarisinde ç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 neden olmuştur. Yani bellek konusunda bir darboğaz oluşmuştur. Bu yüzden 1980[1]lerde, işlemci saati 20 Mhz değerlerine ulaşmaya başladığında, mimari 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.

Önbellekte Yerellik(Principle of Locality)[değiştir | kaynağı değiştir]

Önbelleğin çalışma ilkelerinden biri "Yerellik İlkesi"(Principle of Locality)’dir. Yerellik İlkesi’ne göre 2 tür yerellik vardır.

Zamanda Yerellik[değiştir | kaynağı değiştir]

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

Alanda Yerellik[değiştir | kaynağı değiştir]

Bellekten okunan bir öğenin yakınındaki adreslerde bulunan öğelere ulaşmak istemesi olasıdır. Bu sebeple okunan öğenin yakınındaki adreslerde bulunan verilerin işlemciye yakın tutulması gerekir.

Yerellik İlkesi’nden 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 biçimde işlenebilir.

Yerellik İlkesi’ni kullanmaktaki amaç kullanıcıya,işleve göre sunulabilen en ucuz belleği sunmak ve en büyük hızı sağlamaktır. 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.

İlişkilendirmeye Göre Önbellek Çeşitleri ve Çalışma Biçimleri[değiştir | kaynağı değiştir]

Ö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 iki yöntem uygulanabilir.

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

Bu başarım ilkelerini gerçekleştirirken mühendisliğin pek çok dalında olduğu için 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 öbeklerin(datum) ana bellekteki adreslerle nasıl ilişkilendirileceği(eşleneceği) sorusunun cevabıdır. İlişkilendirme biçimlerine göre doğrudan ilişkili,tam ilişkili ve küme ilişkili olmak üzere 3 tür önbellek vardır.

Doğrudan İlişkili Önbellek[değiştir | kaynağı değiştir]

Bir önbellekte, bir alt düzey bellekte bulunan her bir veri öğesi, önbellekte sadece bir yerde tutulabiliyorsa bu tür önbelleğe doğrudan ilişkili önbellek denir. Bu tür ilişkilendirmede alt düzeydeki birden fazla veri önbellekte aynı konumu paylaşır. Verilerin önbellekteki adresi, bellek adreslerinin önbelleğin öbek boyutuna bölümünden kalan hesaplanarak bulunur. Adresin 2N satırlık bir önbellekte aranılan sözcüğü bulması için öncelikle adres 3 parçaya ayrılır.Son M biti bayt seçimi için kullanılır.(Sözcük 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 önbellekteki satır sayısına bölünmesiyle bulunur. Geriye kalan kısım ise önbellekte verinin etiketi olarak saklanır.

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

Tam ilişkili önbellekte ilişkilendirme

Tam İlişkili Önbellek[değiştir | kaynağı değiştir]

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 2 veri öğesi aynı önbellek satırında tutulamayacağından çatışmadan dolayı bulamama 0’dır.

Kümeli İlişkili Önbellek[değiştir | kaynağı değiştir]

Bu önbellek türü, doğrudan ilişkili önbelleğin 2, 4 veya daha fazla küme biçiminde 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(MUX) 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 1 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 3 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(Replacement Policy)[değiştir | kaynağı değiştir]

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”(Replacement Policy) denir. Yaz-sil denetiminin ana sorunu ileride en az kullanılacak olan öbeğin tahmin edilip önbellekten silineceğeni 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 2 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.
  • Son zamanda en az kullanılan öbeğin çıkarılması:(Least Recently Used - LRU) Ö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 nedenle 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 Nedenleri[değiştir | kaynağı değiştir]

Aranılan öbek her zaman önbellekte olmayabilir. Bunun nedenleri ş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(Write Policy)[değiştir | kaynağı değiştir]

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(write policy), denetimin davranış biçimine de yazma-yazmama ataması(write, no-write allocation) denir.

Yazma Ataması(Write Allocation)[değiştir | kaynağı değiştir]

Bu atama biçiminde temelde kullanılan 2 yöntem vardır.

Sonra Geri Yaz(Write-Back): Bu yöntemde veri öbeği öncelikle sadece önbelleğe yazılır. Bu öbek daha sonra önbellekten çıkarılacağı zaman alt düzeydeki belleğe yazılır. Bu tür bir yazma, karmaşık bir denetim gerektirir. Veri önbelleğe yazıldığında “kirli”(dirty) 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(Write Thorough): Bu yöntemde veri önbelleğe yazıldığı anda alt düzeydeki 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. 4-8 satır gibi küçük bir boyuta sahip olan bu arabellek “ilk giren ilk çıkar”(FIFO) 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 düzeyli bellek yapısı kullanılır. Yazma arabelleği ile ana bellek arasına 2. düzey bir önbellek daha eklenir ve “Sonra Geri Yaz” mantığı kullanılır. Genellikle 2. düzey önbellek ana bellek yongası üstünde bulunan SRAM yapıda küçük bir alandır. Bu uygulama bulamama gecikmesini azaltır.

Yazmama Ataması(Write no-Allocate)[değiştir | kaynağı değiştir]

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 ataması(write no-allocate) denir.

Önbelleğin Çalışması[değiştir | kaynağı değiştir]

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 düzey bellek kontrol edilir. Bu kullanılan yapıya göre ana bellek veya 2. düzey 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 ara belleğe yerleştirilir ve bir üst düzeye yazma işlemini bu ara bellek gerçekleştirir.

Önbellek Uygulamaları[değiştir | kaynağı değiştir]

Ö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[değiştir | kaynağı değiştir]

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[değiştir | kaynağı değiştir]

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 Önbellek[değiştir | kaynağı değiştir]

İz önbellek, 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 önbellek, buyrukları çözüldükten veya işlendikten(retire) sonra saklar. Genel olarak, buyruklar iz önbelleğe yalnız basit öbekler ya da devingen buyruk izleri şeklinde gruplar halinde eklenir. Basit öbek dallanmayla biten, dallanma olmayan buyruk gruplarından oluşur. Devingen iz(iz yolu), yalnızca sonuçları en son kullanılan buyrukları içerir ve dallanmaları takip eden buyrukları eler. Devingen 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 önbellek, 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[değiştir | kaynağı değiştir]

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[değiştir | kaynağı değiştir]

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 adreslerin gerçek adreslere dönüştürülmesinde de Adres dönüştürme önbelleği(Translation Lookaside Buffer) kullanılır

Referanslar[değiştir | kaynağı değiştir]

Ayrıca bakınız[değiştir | kaynağı değiştir]

Dış bağlantılar[değiştir | kaynağı değiştir]