CPU önbelleği ne zaman ana belleğe temizlenir?


18

İki çekirdekli bir CPU'm varsa, her çekirdeğin kendi L1 önbelleği vardır, Core1 ve Core2'nin aynı anda belleğin aynı bölümünü önbelleğe alması mümkün mü?
Mümkünse, hem Core1 hem de Core2 önbellekteki değerlerini düzenlediyse ana belleğin değeri ne olur?

Yanıtlar:


26

İki çekirdekli bir CPU'm varsa, her çekirdeğin kendi L1 önbelleği vardır, Core1 ve Core2'nin aynı anda belleğin aynı kısmını önbelleğe alması mümkün mü?

Evet. Durum böyle olmasaydı performans korkunç olurdu. Aynı kodu çalıştıran iki iş parçacığını düşünün. Bu kodu her iki L1 önbellekte de istiyorsunuz.

Mümkünse, hem Core1 hem de Core2 önbellekteki değerlerini düzenlediyse ana belleğin değeri ne olur?

Eski değer ana bellekte olacaktır, bu da hiçbir CPU okumadığından önemli değildir. Değiştirilmiş bir değeri önbellekten çıkarmadan önce belleğe yazılmalıdır. Tipik olarak MESI protokolünün bazı varyantları kullanılır. MESI'nin geleneksel uygulamasında, bir önbellekte bir değer değiştirilirse, aynı düzeyde başka bir önbellekte hiç bulunamaz.


15

Evet, bu (iki önbellek aynı bellek bölgesini önbelleğe sahip) olabilir, aslında pratikte çok ortaya çıkan bir sorundur. Çeşitli çözümler vardır, örneğin:

  • iki önbellek anlaşamadıklarından emin olmak için iletişim kurabilir
  • tüm önbellekleri izleyen ve buna göre güncelleyen bir çeşit amiriniz olabilir
  • her işlemci önbelleğe aldığı bellek alanlarını izler ve bir yazma algıladığında (şimdi geçersiz) önbelleğini atar

Soruna önbellek tutarlılığı denir . Konuyla ilgili Wikipedia makalesinde , sorun ve olası çözümler hakkında güzel bir genel bakış bulunmaktadır.


2

Başlığınızdaki soruyu cevaplamak, önbellek protokolünün ne olduğuna bağlıdır. Geri yazılırsa, önbellek yalnızca önbellek denetleyicisinin zaten işgal edilmiş alana yeni bir önbellek bloğu koymaktan başka seçeneği olmadığında ana belleğe temizlenir. Önceden alanı işgal eden blok kaldırılır ve değeri ana belleğe geri yazılır.

Diğer protokol yazma işlemidir. Bu durumda, önbellek bloğu n düzeyine her yazıldığında, düzeydeki (n + 1) ilgili blok güncellenir. (Bir formumuzu altında karbon kağıdı ile doldurmak benzerdir; üstüne ne yazıyorsanız, aşağıdaki sayfaya kopyalanır.) Bu daha yavaştır, çünkü daha fazla yazma işlemi içerir, ancak önbellekler arasındaki değerler daha tutarlıdır. Geri yazma şemasında, yalnızca en yüksek düzey önbellek belirli bir bellek bloğu için en güncel değere sahip olacaktır.


1
Buradaki okuyucuların yüzde kaçının karbon kağıdı kullandığını merak ediyorum. :)
Barmar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.