En Verimli Önbellek Değiştirme Algoritması [kapalı]


12

Wikipedia 11 önbellek değiştirme algoritması listeler . Geliştireceğim uygulama hakkında neredeyse hiçbir şey bilmediğimi varsayarsak, "varsayılan" önbellek değiştirme algoritması olarak ne kullanmalıyım?

İşletim sistemi dersimden doğru şekilde hatırlarsam, LRU en iyi genel önbellek değiştirme algoritmasıdır. Ama belki yanılıyorum.

Ayrıca, bu biraz akademik bir sorudur, çünkü genellikle, ana bellek ucuz ve boldur ve gerçekten önbellek boyutu hakkında çok fazla endişelenmem gerekmez.


1
Ön getirme, uygulamanızla alakalı mı? Öyleyse, algoritmaları seçerken ön getirme ve tutma stratejisi birlikte düşünülmelidir.
rwong

İstediğiniz uygulama etki alanını temsil eden örnek izler (veri erişim kalıpları listesi) edinmeniz gerekir. Akademik araştırmalarda herkese açık test setlerini bulabilirsiniz. Ardından her algoritmayı uygulayabilir, simülasyon yapabilir ve bulgularınızı raporlayabilirsiniz. Başarısız olursa, LRU'yu az miktarda rastgele değiştirmeyle kullanın.
rwong

1
Eğer "uygulaması hakkında neredeyse hiçbir şey bilmiyoruz" o zaman bu kadar çok "verimli" önbellek değiştirme algoritmaları düşünmek erken.
Anon

Ana bellek ucuz olabilir, ancak performans önemli bir sorunsa erişim verimliliği önemli olacaktır. Yeni bir bilgisayarın baş mimarı değilseniz önbellek değiştirme stratejinizi seçeceğinizi sanmıyorum. Geri kalanımız pazarın sunduğu her şeyi elde ederiz. Hızlı gitmeniz gerekiyorsa, bellek hiyerarşisini verimli kullanmak için hesaplama ve veri yapılarınızı organize etmeniz gerekir.
Omega Centauri

1
@Omega Centauri Sadece CPU önbelleklerini düşünüyorsunuz, ancak çok daha fazlası var. İşletim sistemi kullanılan dosyaları ve dizinleri önbelleğe alır, veritabanları verilerini önbelleğe alır, hemen hemen her uygulama çok fazla önbellekleme yapar (örneğin zaten hesaplanmış sonuçlardan).
maaartinus

Yanıtlar:


15

Sanırım en iyi cevap buna bağlı. Deneyimlerime göre, önbellek algoritmalarını seçmeye giden birçok faktör var.

Dikkate alınacak faktörler

  1. Okuma / Yazma Dengesi. (Erişimlerin yüzde kaçı okumaya karşı yazılmıştır)
  2. Önbellek miktarı.
  3. Önbellek arkasındaki ortam türü. (Yavaş SATA sürücüler mi yoksa hızlı SSD sürücüler mi?)
  4. Hits vs Misses. (Şeyler ne sıklıkla yeniden yazılır veya tekrar okunur?)
  5. Ortalama erişim boyutu (Bu sayfa boyutunu seçmeye gider)
  6. Okuma ve yazma ne kadar pahalı.

Tüm farklı faktörleri düşündüğünüzde, bunu en iyi şekilde ele alan bir önbellek algoritması bulmanız gerekir. Örneğin, çok sayıda yazma, bazı yeniden yazma, yakın zamanda yazılan verilerin okunması ve bir çeşit dönen ortamın olduğu bir uygulamanız olduğunu varsayalım. Bu durumda bir çeşit hibrit önbellek algoritması istersiniz. Yazma verilerini işlemek için, Wise order of Writes (WOW) ve WRU algoritması ve diskten okunan veriler için bir LRU algoritması gibi bir şey isteyebilirsiniz. Bunun nedeni disk erişimlerinin çok pahalı olması ve WOW algoritmasının veri yazmayı daha verimli hale getirmesi ve LRU'nun sık erişilen verileri her zaman önbellekte tutmasıdır.

Çok hızlı erişim süresine sahip SSD diskleriniz olduğunu varsayalım, disk erişimi nispeten ucuz olduğu için seçiminizi LRU algoritmasına doğru yönlendirmek isteyebilirsiniz.

Gerçekten söylemek istediğim, "en iyi" yanıtın olmaması. En iyi cevap, sizin için geçerli olan faktörleri bilmek ve bunları en iyi şekilde ele alan bir algoritma seçmektir.

Algoritmayı sizin için bulma

Sisteminizin profilini oluşturun. Bu genellikle bellek erişimi istatistikleri tutmak için kod eklemeyi içerir. Profil oluşturarak hangi faktörlerin sizin için en önemli olduğunu görebilirsiniz.

Geçmişte, belirli bir süre boyunca tüm bellek erişimlerini izlemek için kod ekledim. Sonra desen ararım. Yeniden okuma, yeniden yazma, sıralı erişim, rastgele erişim vb.

Önemli şeyleri belirledikten sonra, hangi şeylerin en iyi şekilde işlendiğini görmek için tüm farklı önbellekleme algoritmalarına bakmanız gerekir.


Faktörlerin büyük dökümü. Ancak, uygulama alanını ve faktörleri bildiğimden, bunları nasıl uygulayacağımdan emin değilim.
ashes999

@ashes: Eski mühendislik tekniği var: Farklı şekillerde birkaç tane oluşturun ve hangisinin daha iyi çalıştığını ölçün.
Donal Fellows

"Önbellek" duyduğumda bellek ve CPU kayıtları arasındaki depolamayı düşünüyorum. Burada, bellek ile bir veya daha fazla g / Ç aygıtı arasında bir katman olan disk önbelleğinden bahsediyorsunuz.
Omega Centauri

@ barrem23 Dağıtılmış programlama yapıyorsanız, dikkate alınması gereken "önbellek ile arka uç depolama alanı arasındaki mesafe de dikkate alınır". Depolama 15 ms uzaktaysa, SSD veya dönen pasınız büyük, istikrarlı bir depolama alanı olarak önemli değilse, yine de her zaman minimum 30 ms'lik bir gidiş-dönüş yolculuğuna çıkacaksınız.
Vatine

9

Geliştireceğiniz uygulama hakkında neredeyse hiçbir şey bilmediğinizi varsayarsak, bir önbellek sistemini seçmeden ve uygulamadan önce bu konuda daha fazla bilgi sahibi olmalısınız. Başka bir deyişle, varsayılan uygulamalar yoktur: bazıları bazı amaçlar için iyidir ve diğerleri için tamamen kötüdür .

Örneğin, yalnızca iki uygulama alın: En Son Kullanılanlar ve En Az Kullanılanlar. Hangisinin diğerinden önce kullanılacağına nasıl karar verilir?

  • LRU, kullanıcının en son öğelere daha sık erişeceğinden ve eskisine hiç veya nadiren geri döneceğinden eminseniz iyidir. Örnek: Bir e-posta istemcisinin genel kullanımı. Çoğu durumda, kullanıcılar sürekli olarak en son postalara erişiyor. Onları okur, erteler, birkaç dakika, saat veya gün içinde geri dönerler. İki yıl önce aldıkları bir postayı ararken kendilerini bulabilirler, ancak son iki saatte aldıkları postalara erişmekten daha az sıklıkta gerçekleşir.

  • Öte yandan, LRU kullanıcının bazı öğelere diğerlerinden daha sık erişeceği bağlamda bir anlam ifade etmemektedir. Bir örnek: Sıklıkla sevdiğim müziği dinliyorum ve 400 şarkıda aynı beşi haftada en az bir kez dinlerken, yılda en fazla bir kez dinleyeceğim 100 şarkı da sevmiyorum çok. Bu durumda, LFU çok daha uygundur.

Uygulamalardan yalnızca ikisini alarak hangisinin daha iyi olduğunu veya uygulama hakkında yeterli bilgiye sahip olmak istemediğinizde kullanabileceğiniz "varsayılan" algoritma olmadığını görürsünüz. Bu, varsayılan olarak, hesap hakkında bir şey bilmediğinizde bir hesaplamanın sonucunu bulmak için iki sayıyı eklemeniz, çıkarmanız, çarpmanız veya bölmeniz gerektiğini sormak gibi.


Peki, bir algoritma seçmeye nasıl gidebilirim? Wikipedia'nın listesini inceleyin ve neyin en uygun olduğunu görün.
ashes999

@ ashes999: kesinlikle! İlk olarak, uygulamanın gereksinimleri hakkında daha fazla bilgi edinirsiniz, daha sonra farklı önbellek algoritmalarının artılarını ve eksilerini analiz edersiniz ve son olarak daha uygun olanı seçersiniz.
Arseni Mourzenko

3

Tercihlerinizi neden sadece Wikipedia ile sınırlandırıyorsunuz? ACM Dijital Kütüphanesi gibi bir araştırma veritabanına erişiminiz varsa, daha da fazla algoritma bulacaksınız. Ayrıca patentlerle uğraşmaktan da haberdar olun. Örneğin ARC iyi bir algoritmadır ancak maalesef patentlidir.


2

'En iyi' algoritma üzerinde çok fazla zaman harcayabilir veya basit bir algoritma uygulayabilir ve SİSTEMİN GERİ KALMASINA BAŞLAYABİLİRSİNİZ. Bir şeyin testable olduğunda sonra algoritma dert.

Erken optimizasyon ...


0

Mükemmel bir önbellek algoritması yoktur - her zaman çok kötü davranan bir durum bulabilirsiniz.

Bu nedenle, en az kötü davranacak sorunu belirlemek için önbelleğe alınan sorunun bilinmesi önemlidir.

Ayrıca, ne zamandan dikkate alınmalıdır ihtiyaç önbellek şeyler ve ne kadar süre için olabilir şeyleri önbelleğe ...

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.