Effizientester Cache-Ersetzungsalgorithmus [geschlossen]


12

Wikipedia listet 11 Cache-Ersetzungsalgorithmen auf . Angenommen, ich weiß fast nichts über die Anwendung, die ich entwickeln werde. Was soll ich als "Standard" -Algorithmus für den Cache-Austausch verwenden?

Wenn ich mich von meinem OS-Kurs richtig erinnere, ist LRU der beste allgemeine Cache-Ersetzungsalgorithmus. Aber vielleicht irre ich mich.

Dies ist auch eine akademische Frage, da Hauptspeicher im Allgemeinen billig und reichlich vorhanden ist und ich mir keine großen Gedanken über die Cache-Größe machen muss.


1
Ist der Vorabruf für Ihre Anwendung relevant? In diesem Fall müssen die Vorabruf- und Aufbewahrungsstrategie bei der Auswahl der Algorithmen zusammen berücksichtigt werden.
Rwong

Sie müssen Beispiel-Traces (die Liste der Datenzugriffsmuster) abrufen, die für Ihre beabsichtigte Anwendungsdomäne repräsentativ sind. Möglicherweise finden Sie öffentlich verfügbare Testsätze aus akademischen Forschungen. Anschließend können Sie jeden Algorithmus implementieren, eine Simulation durchführen und Ihre Ergebnisse protokollieren. Andernfalls verwenden Sie LRU mit sparsam zufälligen Ersatz.
Rwong

1
Wenn Sie "fast nichts über die Anwendung wissen", ist es viel zu früh, über "effiziente" Cache-Ersetzungsalgorithmen nachzudenken.
Anon

Hauptspeicher mag billig sein, aber wenn Leistung ein wichtiges Thema ist, spielt die Zugriffseffizienz eine Rolle. Ich glaube nicht, dass Sie Ihre Strategie für den Cache-Austausch festlegen können, es sei denn, Sie sind Chefarchitekt eines neuen Computers. Der Rest von uns bekommt alles, was der Markt bietet. Wenn Sie schnell vorgehen müssen, müssen Sie Ihre Berechnungen und Datenstrukturen organisieren, um die Speicherhierarchie effizient zu nutzen.
Omega Centauri

1
@Omega Centauri Sie denken nur an die CPU-Caches, aber es gibt noch viel mehr. Das Betriebssystem speichert verwendete Dateien und Verzeichnisse zwischen, Datenbanken speichern ihre Daten zwischen, fast jede Anwendung führt eine Menge Caching durch (z. B. von bereits berechneten Ergebnissen).
Maaartinus

Antworten:


15

Ich denke die beste Antwort ist, dass es darauf ankommt. Nach meiner Erfahrung gibt es viele Faktoren, die bei der Auswahl von Caching-Algorithmen eine Rolle spielen.

Zu berücksichtigende Faktoren

  1. Balance lesen / schreiben. (Wie viel Prozent der Zugriffe werden gelesen oder geschrieben?)
  2. Menge an Cache.
  3. Medientyp hinter dem Cache. (Sind sie langsame SATA-Laufwerke oder schnelle SSD-Laufwerke?)
  4. Hits vs Misses. (Wie oft werden Dinge umgeschrieben oder neu gelesen?)
  5. Durchschnittliche Zugriffsgröße (Hiermit legen Sie die Seitengröße fest.)
  6. Wie teuer sind Lese- und Schreibvorgänge?

Wenn Sie alle verschiedenen Faktoren berücksichtigt haben, müssen Sie einen Cache-Algorithmus finden, der dies am besten handhabt. Angenommen, Sie haben eine Anwendung, in der viele Schreibvorgänge, einige Schreibvorgänge, Lesevorgänge kürzlich geschriebener Daten und eine Art sich drehender Datenträger ausgeführt werden. In diesem Fall möchten Sie eine Art Hybrid-Caching-Algorithmus. Um mit den Schreibdaten umzugehen, benötigen Sie möglicherweise WOW (Wise Order of Writes) und einen LRU-Algorithmus für Daten, die von der Festplatte gelesen wurden. Der Grund dafür ist, dass Plattenzugriffe sehr teuer sind und der WOW-Algorithmus das Schreiben von Daten effizienter macht und die LRU Daten, auf die häufig zugegriffen wird, immer im Cache hält.

Angenommen, Sie haben SSD-Festplatten mit sehr schneller Zugriffszeit, dann möchten Sie Ihre Wahl möglicherweise auf den LRU-Algorithmus ausrichten, da die Festplattenzugriffe relativ kostengünstig sind.

Ich möchte also wirklich sagen, dass es keine "beste" Antwort gibt. Die beste Antwort ist, die für Sie zutreffenden Faktoren zu kennen und einen Algorithmus zu wählen, der sie am besten handhabt.

So finden Sie den Algorithmus für Sie

Profilieren Sie Ihr System. Dies beinhaltet normalerweise das Hinzufügen von Code, um Statistiken für Speicherzugriffe zu führen. Durch die Profilerstellung können Sie sehen, welche Faktoren für Sie am wichtigsten sind.

In der Vergangenheit habe ich Code hinzugefügt, um alle Speicherzugriffe über einen bestimmten Zeitraum nachzuverfolgen. Dann suche ich später nach Mustern. Ich suche nach erneutem Lesen, erneutem Schreiben, sequenziellem Zugriff, wahlfreiem Zugriff usw.

Sobald Sie wichtige Dinge identifiziert haben, müssen Sie sich alle verschiedenen Arten von Caching-Algorithmen ansehen, um herauszufinden, welche Dinge am besten funktionieren.


Großartige Aufschlüsselung der Faktoren. Aber ich bin mir nicht sicher, wie ich diese anwenden soll, da ich die App-Domäne und die Faktoren kenne.
Asche999

@ashes: Es gibt die alte Technik: Bauen Sie ein paar auf verschiedene Arten und messen Sie, was am besten funktioniert.
Donal Fellows

Wenn ich "Cache" höre, denke ich an die Speicherung zwischen dem Speicher und den CPU-Registern. Hier geht es um den Festplatten-Cache, der eine Schicht zwischen dem Speicher und einem oder mehreren E / A-Geräten ist.
Omega Centauri

@ barrem23 Wenn Sie eine verteilte Programmierung ausführen, muss auch der "Abstand zwischen dem Cache und dem zwischengespeicherten Back-End-Speicher" berücksichtigt werden. Es spielt keine Rolle, viel, wenn Sie eine SSD oder einen sich drehenden Rost als großen, stabilen Speicher haben, wenn der Speicher 15 ms entfernt ist, werden Sie sowieso immer eine Hin- und Rückfahrt von mindestens 30 ms haben.
Vatine

9

Vorausgesetzt, Sie wissen fast nichts über die zu entwickelnde Anwendung, sollten Sie mehr darüber wissen, bevor Sie ein Cache-System auswählen und implementieren. Mit anderen Worten, es gibt keine Standardimplementierungen: Einige sind für bestimmte Zwecke gut und für andere völlig schlecht .

Nehmen Sie zum Beispiel nur zwei Implementierungen: Am wenigsten verwendet und Am wenigsten häufig verwendet. Wie kann man entscheiden, welches vor dem anderen verwendet werden soll?

  • LRU ist gut, wenn Sie ziemlich sicher sind, dass der Benutzer häufiger auf die neuesten Elemente zugreift und nie oder selten zu den alten Elementen zurückkehrt. Ein Beispiel: eine allgemeine Verwendung eines E-Mail-Clients. In den meisten Fällen greifen die Benutzer ständig auf die neuesten E-Mails zu. Sie lesen sie, verschieben sie, kehren in ein paar Minuten, Stunden oder Tagen zurück usw. Sie können feststellen, dass sie nach einer E-Mail suchen, die sie vor zwei Jahren erhalten haben. Dies ist jedoch seltener als der Zugriff auf E-Mails, die sie in den letzten zwei Stunden erhalten haben.

  • Andererseits macht LRU keinen Sinn in dem Kontext, in dem der Benutzer auf einige Elemente viel häufiger als auf andere zugreift. Ein Beispiel: Ich höre häufig die Musik, die ich mag, und es kann vorkommen, dass ich bei 400 Songs mindestens einmal pro Woche die gleichen fünf Songs höre, während ich höchstens einmal pro Jahr 100 Songs höre, die ich auch nicht mag viel. In diesem Fall ist LFU viel geeigneter.

Wenn Sie nur zwei der Implementierungen verwenden, sehen Sie, dass es keinen "Standard" -Algorithmus gibt, den Sie verwenden können, wenn Sie nicht überlegen möchten, welcher besser ist oder nicht genügend Informationen über die Anwendung haben. Es ist so, als ob Sie standardmäßig gefragt werden, ob Sie zwei Zahlen addieren, subtrahieren, multiplizieren oder dividieren müssen, um ein Ergebnis eines Kalküls zu finden, wenn Sie nichts darüber wissen.


Ok, wie wähle ich einen Algorithmus aus? Durchsuchen Sie die Wikipedia-Liste und finden Sie heraus, was am besten passt.
Asche999

@ ashes999: genau! Zunächst erfahren Sie mehr über die Anforderungen der jeweiligen Anwendung, analysieren dann die Vor- und Nachteile der verschiedenen Cache-Algorithmen und wählen schließlich die geeignetere aus.
Arseni Mourzenko

3

Warum beschränken Sie Ihre Auswahl nur auf Wikipedia? Wenn Sie Zugriff auf eine Forschungsdatenbank wie die ACM Digital Library haben , finden Sie noch mehr Algorithmen. Seien Sie sich auch über das Durcheinander mit Patenten bewusst. Zum Beispiel ist ARC ein guter Algorithmus, der aber leider patentiert ist.


2

Sie könnten viel Zeit damit verbringen, sich mit dem besten Algorithmus auseinanderzusetzen, oder Sie könnten einfach einen einfachen Algorithmus implementieren und mit dem Rest des Systems weitermachen. Wenn Sie etwas prüfbar haben dann Sorgen über den Algorithmus.

Vorzeitige Optimierung ...


0

Es gibt keinen perfekten Cache-Algorithmus - Sie können immer einen Fall finden, der sich sehr schlecht verhält.

Daher ist es wichtig, das zwischengespeicherte Problem zu kennen, um das Problem zu ermitteln, das sich am wenigsten schlecht verhält.

Außerdem sollten Sie in Betracht ziehen , wie lange Sie brauchen , um Cache Dinge und wie lange Sie können Dinge cachen ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.