İşlemci önbelleği

Vikipedi, özgür ansiklopedi
Şuraya atla: kullan, ara

Ön belleğ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.

Ön belleğin gelişim süreci ve bilgisayar mimarîsindeki 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 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[1] 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.

Ön bellekte yerellik (principle of locality)[değiştir | kaynağı değiştir]

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

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

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.

Yerellik ilkesini 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 ön bellek çeşitleri ve çalışma şekilleri[değiştir | kaynağı değiştir]

Ö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 iki 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. {{dil|en|datum) 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[değiştir | kaynağı değiştir]

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

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

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.

Yaz-sil denetimi (replacement policy)[değiştir | kaynağı değiştir]

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. replacement policyreplacement policy) denir. Yaz-sil denetiminin ana sorunu ileride en az kullanılacak olan öbeğin tahmin edilip ön bellekten 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 ö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. 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[değiştir | kaynağı değiştir]

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

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

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

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.

Ön belleğin çalışması[değiştir | kaynağı değiştir]

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.

Ön bellek uygulamaları[değiştir | kaynağı değiştir]

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

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

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

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[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 ö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

Kaynaklar[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]