Çok çekirdekli CPU'ların, önbelleğe almanın, önbellek tutarlılığının ve belleğin nasıl çalıştığını öğrenmeye yeni başlıyorsanız, ilk başta biraz kafa karıştırıcı görünebilir. Bunu göz önünde bulundurarak, bugünün Süper Kullanıcı Soru-Cevap gönderisinde meraklı bir okuyucunun sorusuna yanıtlar var.
Bugünün Soru-Cevap oturumu bize, topluluk odaklı bir Soru-Cevap web siteleri grubu olan Stack Exchange'in bir alt bölümü olan SuperUser'ın izniyle geliyor.
Soru
Süper Kullanıcı okuyucu CarmeloS, bir CPU'nun önbelleğinin ne zaman ana belleğe geri yüklendiğini bilmek ister:
İki çekirdekli bir CPU'm varsa ve her çekirdeğin kendi L1 önbelleği varsa, Core1 ve Core2'nin her ikisinin de aynı anda belleğin aynı bölümünü önbelleğe alması mümkün müdür? Mümkünse, Core1 ve Core2 önbellekteki değerlerini düzenlediyse ana belleğin değeri ne olur?
Bir CPU'nun önbelleği ne zaman ana belleğe boşaltılır?
Cevap
SuperUser'a katkıda bulunanlar David Schwartz, sleske ve Kimberly W'nin cevabı bizim için. İlk olarak, David Schwartz:
İki çekirdekli bir CPU'm varsa ve her çekirdeğin kendi L1 önbelleği varsa, Core1 ve Core2'nin her ikisinin de aynı anda belleğin aynı bölümünü önbelleğe alması mümkün müdür?
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 önbelleğinde de istiyorsunuz.
Mümkünse, Core1 ve Core2 önbellekteki değerlerini düzenlediyse ana belleğin değeri ne olur?
Eski değer ana bellekte olacak ve hiçbir çekirdek onu okumayacağı için önemli olmayacak. Değiştirilmiş bir değeri önbellekten çıkarmadan önce, belleğe yazılmalıdır. Tipik olarak, bazı varyantları MESI protokolü kullanıldı. MESI'nin geleneksel uygulamasında, bir önbellekte bir değer değiştirilirse, aynı düzeydeki başka bir önbellekte hiç bulunamaz.
Sleske'nin cevabının ardından:
Evet, iki önbelleğe sahip olmak aynı bellek bölgesini önbelleğe alabilir ve aslında pratikte çokça ortaya çıkan bir sorundur. Örneğin çeşitli çözümler vardır:
- İki önbellek aynı fikirde olmadıklarından emin olmak için iletişim kurabilir
- Tüm önbellekleri izleyen ve bunları buna göre güncelleyen bir tür süpervizöre sahip olabilirsiniz.
- Her işlemci, önbelleğe aldığı bellek alanlarını izler ve bir yazma algıladığında (artık geçersiz) önbelleğini atar.
Sorun, önbellek tutarlılığı ve Wikipedia makalesi konuyla ilgili sorun ve olası çözümlere güzel bir genel bakış var.
Ve Kimberly W'den son cevabımız:
Gönderinizin başlığındaki soruyu cevaplamak, önbelleğe alma protokolünün ne olduğuna bağlıdır. Geri yazma ise, önbellek yalnızca, önbellek denetleyicisinin zaten dolu olan alana yeni bir önbellek bloğu koymaktan başka seçeneği olmadığında ana belleğe geri gönderilecektir. Daha önce alanı kaplayan blok kaldırılır ve değeri ana belleğe geri yazılır.
Diğer protokol yazmadır. Bu durumda, önbellek bloğu her seviyeye yazıldığında n , düzeydeki karşılık gelen blok n + 1 Güncellendi. Kavram olarak bir formu altındaki karbon kağıtla doldurmaya benzer; üstüne ne yazarsan yaz, aşağıdaki sayfaya kopyalanır. Bu daha yavaştır çünkü açıkça 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 seviye önbellek, belirli bir bellek bloğu için en güncel değere sahip olacaktır.
Açıklamaya eklemek istediğiniz bir şey var mı? Yorumlarda ses çıkarın. Diğer teknoloji meraklısı Stack Exchange kullanıcılarından daha fazla yanıt okumak ister misiniz? Tartışma dizisinin tamamına buradan göz atın .
Resim Kredisi: Lemsipmatt (Flickr)