Önbelleğe Yazma ve Önbelleğe Yazma


93

Anladığım kadarıyla, iki yöntem arasındaki temel fark, "yazma" yönteminde verilerin, "geri yazma" durumunda verilerin "daha sonra" yazılırken, önbellek aracılığıyla ana belleğe hemen yazılmasıdır.

Hala hafızayı "daha sonra" beklememiz gerekiyor, öyleyse "yazma" nın faydası nedir?


@EricWang Sanırım write backperformansı daha iyi mi demek istiyorsun ?
wlnirvana

@wlnirvana Evet, haklısın, bu benim yazım hatam. Gelecekte yanıltıcı olmamak için onu kaldırır ve buraya yeni bir yorum koyardım.
Eric Wang

6
Basitçe söylemek gerekirse, write backdaha iyi performansa sahiptir, çünkü ana belleğe yazmak, cpu önbelleğine yazmaktan çok daha yavaştır ve veriler kısa olabilir (bu, daha kısa sürede yeniden değişebilir ve eski sürümü belleğe koymaya gerek yoktur). Karmaşık, ancak daha karmaşıktır, modern işlemcideki çoğu bellek bu ilkeyi kullanır.
Eric Wang

Açıklayıcı bir cevabın verildiğini görüyorum. Geri yazma algoritmasını tamamladıktan sonra Write-Allocate, Write-NoAllocate etiketlerine bakmanızı tavsiye ederim.
Çağlayan DÖKME

Sorunuzun cevabı, yazma önbelleğe alma ile aynı blok içinde yazarken, ana belleğe yalnızca bir yazma gerektiğidir. Ayrıntılar için cevabıma bakın.
qwr

Yanıtlar:


111

Ana belleğe yazma işleminin yararı, bilgisayar sisteminin tasarımını basitleştirmesidir. Yazma ile, ana bellekte her zaman satırın güncel bir kopyası bulunur. Böylece bir okuma yapıldığında, ana bellek her zaman istenen verilerle cevap verebilir.

Geri yazma kullanılıyorsa, bazen güncel veriler bir işlemci önbelleğinde ve bazen de ana bellekte bulunur. Veriler bir işlemci önbelleğindeyse, bu işlemcinin ana belleğin okuma isteğine yanıt vermesini durdurması gerekir, çünkü ana bellekte verilerin eski bir kopyası olabilir. Bu, yazma işleminden daha karmaşıktır.

Ayrıca, yazma işlemi, Değiştirme durumuna ihtiyaç duymadığından önbellek tutarlılık protokolünü basitleştirebilir . Değiştir o geçersiz veya çizgi evicts önce önbellek hattını geri yazmalıdır devlet kayıtları. Yazmada bir önbellek satırı, bellekte zaten satırın güncel bir kopyası bulunduğundan, geri yazılmadan her zaman geçersiz kılınabilir.

Bir şey daha var - bellek eşlemeli G / Ç kayıtlarına yazan bir geri yazma mimari yazılımında, yazma işlemlerinin hemen önbellekten gönderilmesini sağlamak için fazladan adımlar atması gerekir. Aksi takdirde, satır başka bir işlemci tarafından okunana veya satır çıkarılıncaya kadar yazmalar çekirdeğin dışında görünmez.


7
Bellek eşlemeli G / Ç için, bu adresler genellikle önbelleğe alınmamış olarak eşlenir. Yazma, güvenilirliği artırmak için de kullanılabilir (örneğin, L1'de yalnızca eşlik koruması ve L2'de ECC varsa). Yazma, yazma-ayırma kullanmayan daha küçük önbellekler için daha popülerdir (yani, bir yazma kaçırma bloğu önbelleğe ayırmaz, potansiyel olarak L1 kapasitesi ve L2 okuma / L1 dolgu bant genişliği talebini azaltır) çünkü donanımın çoğu Bu tür yazma için yazma gereksinimi zaten mevcuttur.
Paul

1
Çekirdeğimdeki önbellek yöntemimin geri yazılıp yazılmadığını kontrol etmem mümkün mü?
ArtificiallyIntelligence

4
İşlemcinin ana belleğin okuma isteğine yanıt vermesini durdurması gerektiğinden, geri yazmanın daha karmaşık olduğunu söylemek yanıltıcı olabilir. Önbelleğin hangi verilerin veri olduğunu (ana bellekle hizalı olmadığını) ve "kirli bit (ler)" kullanarak neyin olmadığını takip etmesi daha da önemlidir, bu nedenle ana belleği hiç kontrol etmemek mümkündür.
steviejay

"Eşzamansız dahili geri yazma" gibi önbellek yeteneklerini gösteren @Shaowu "lshw" komutu
mug896

Hala geri yazmada kullanılan gerçek adımların ne olduğunu anlamıyorum, ancak bunun karmaşık olduğunu biliyorum ... Bununla ilgili daha fazla kaynak / ayrıntı sağlayabilir misiniz?
qwerty9898

10

Buna bir örnek yardımıyla bakalım. Doğrudan eşlenmiş bir önbelleğimiz olduğunu ve geri yazma politikasının kullanıldığını varsayalım. Yani önbellek satırında geçerli bir bit, kirli bit, etiket ve veri alanımız var. Bir işlemimiz olduğunu varsayalım: A yazın (burada A, önbelleğin ilk satırına eşlenir).

Olan şey, işlemciden gelen verilerin (A) önbelleğin ilk satırına yazılmasıdır. Geçerli bit ve etiket bitleri ayarlanmıştır. Kirli bit 1'e ayarlanmıştır.

Kirli bit, en son önbelleğe getirildiğinden beri yazılan önbellek satırının olduğunu gösterir!

Şimdi başka bir işlemin yapıldığını varsayalım: E'yi okuyun (burada E aynı zamanda ilk önbellek satırına da eşlenir)

Doğrudan eşlenmiş önbelleğe sahip olduğumuz için, ilk satır basitçe bellekten getirilecek olan E bloğu ile değiştirilebilir. Ancak satıra en son yazılan blok (blok A) henüz belleğe yazılmadığından (kirli bit ile gösterilir), bu nedenle önbellek denetleyicisi önce A bloğunu belleğe aktarmak için belleğe geri yazacak , sonra belleğe bir okuma işlemi yayınlayarak satırı E bloğu ile değiştirecektir. kirli bit artık 0'a ayarlanmıştır.

Bu nedenle, geri yazma politikası, bloğun bellekte ve ilişkili önbellek satırında aynı olacağını garanti etmez. Bununla birlikte, satır değiştirilmek üzereyken, ilk önce bir geri yazma gerçekleştirilir.

İlke üzerinden yazma bunun tam tersidir. Buna göre hafızada her zaman güncel veriler olacaktır. Yani, önbellek bloğu yazılırsa, bellek de buna göre yazılacaktır. (kirli bit kullanılmaz)


7

belki bu makalede yardımcı olabilir burada bağlantı

Yazma: Yazma, hem önbelleğe hem de yedekleme deposuna eşzamanlı olarak yapılır.

Geri yazma (veya Arkaya yazma): Yazma yalnızca önbelleğe yapılır. Değiştirilmiş bir önbellek bloğu, değiştirilmeden hemen önce mağazaya geri yazılır.

Yazma: Veriler güncellendiğinde, hem önbelleğe hem de arka uç belleğe yazılır. Bu modun kullanımı kolaydır, ancak verilerin hem önbelleğe hem de depoya yazılması gerektiğinden veri yazmada yavaştır.

Geri yazma: Veriler güncellendiğinde, yalnızca önbelleğe yazılır. Değiştirilen veriler, yalnızca veriler önbellekten kaldırıldığında arka uç belleğe yazılır. Bu mod, hızlı veri yazma hızına sahiptir, ancak güncellenen veriler depoya yazılmadan önce bir güç kesintisi meydana gelirse veriler kaybolur.


3

Geri yazma ve üzerine yazma, bir yazma isabeti gerçekleştiğinde, yani önbellekte istenen bilgiye sahip olduğunda politikaları açıklar . Bu örneklerde, tek bir işlemcinin bir önbellek ile ana belleğe yazdığını varsayıyoruz.

Yazma: Bilgiler önbelleğe ve belleğe yazılır ve her ikisi de bittiğinde yazma işlemi biter. Bu, uygulanması daha basit olma avantajına sahiptir ve ana bellek her zaman önbellekle tutarlıdır (senkronize olarak) (tek işlemcili durum için - başka bir cihaz ana belleği değiştirirse, bu politika yeterli değildir) ve bir okuma kaçırma asla ana belleğe yazma ile sonuçlanmaz. Bariz bir dezavantaj, her yazma isabetinin, biri daha yavaş ana belleğe erişen iki yazma yapması gerektiğidir.

Geri yazma: Bilgiler önbellekteki bir bloğa yazılır. Değiştirilen önbellek bloğu, yalnızca değiştirildiğinde belleğe yazılır (aslında, bir tembel yazma ). Her önbellek bloğu için özel bir bit olan kirli bit , önbellekte iken önbellek bloğunun değiştirilip değiştirilmediğini gösterir. Kirli bit ayarlanmadıysa, önbellek bloğu "temizdir" ve bir yazma eksikliğinin bloğu belleğe yazması gerekmez.

Avantajı, yazma işlemlerinin önbellek hızında gerçekleşebilmesidir ve aynı blok içinde yazma durumunda yalnızca bir ana belleğe yazma gerekir (önceki blok değiştirilirken). Dezavantajları, bu protokolün uygulanmasının daha zor olması, ana belleğin önbellek ile tutarlı olmaması (senkronize olmaması) ve değiştirmeyle sonuçlanan okumaların, kirli blokların ana belleğe yazılmasına neden olabilmesidir.

Yazma kaybına ilişkin politikalar ilk bağlantımda ayrıntılı olarak açıklanmıştır.

Bu protokoller, modern işlemcilerde yaygın olduğu gibi, birden çok işlemciye ve birden çok önbelleğe sahip durumlarla ilgilenmez. Bunun için daha karmaşık önbellek uyum mekanizmalarına ihtiyaç vardır. Yazma önbellekleri, önbelleğe yazma anında belleğe yansıdığından daha basit protokollere sahiptir.

İyi kaynaklar:


0

Geri Yazma daha karmaşıktır ve karmaşık bir Önbellek Tutarlılık Protokolü (MOESI) gerektirir, ancak sistemi hızlı ve verimli hale getirdiği için buna değer.

Write-Through'nun tek yararı, uygulamayı son derece basit hale getirmesi ve karmaşık bir önbellek tutarlılık protokolü gerektirmemesidir.


1
WT'nin hala bir tutarlılık protokolüne ihtiyacı var. Bir çekirdekten gelen bir deponun, diğer önbelleklerdeki kopyaları geçersiz kılması gerekir, böylece süresiz olarak eski verileri okumaya devam etmezler. Atomic RMW'nin bazı özel desteğe ihtiyacı var. Bence tüm bunlar WT ile daha kolay, ancak gerekli tutarlılık hala biraz karmaşık.
Peter Cordes

Ya da belki önbellek hiyerarşisi L1 / L2 (ve belki daha fazlası) olan tek çekirdekli bir sistemden bahsediyordunuz. Bu durumda, en dıştaki önbellek yönüne erişebilen önbellek uyumlu DMA'yı desteklemek istemediğiniz sürece, dış önbelleklerden gelen iç önbellekler için gerçekten MESI / MOESI kullanmanız gerekmez. Ancak, iç önbelleği geçersiz kılmak için bir DMA yazımı için yine de tutarlılığa ihtiyacınız vardır.
Peter Cordes

1
Önbellek tutarlılık protokolü yalnızca birden çok önbellek / işlemci için destek olması gerekiyorsa veya DMA gibi bir şey belleği etkiliyorsa gereklidir. Yazma, tek işlemcili sistemler için bile avantajlara, yani yazma hızına sahiptir.
qwr

DMA için, işletim sistemi, G / Ç sonrasında önbelleği açıkça temizleyebilir. Yazılım olması daha az verimlidir.
qwr
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.