Frage

Oder es wäre schneller wieder lesen, dass die Daten von der kartierten Speicher wieder, da das Betriebssystem einen eigenen Cache implementieren könnte?

Die Art der Daten ist nicht im Voraus bekannt ist, wird angenommen, dass Datei liest zufällig ist.

War es hilfreich?

Lösung

ich wollte ein paar Dinge erwähnen ich zu diesem Thema gelesen habe. Die Antwort lautet: nicht , Sie möchten nicht an zweiter Stelle erraten, der Speichermanager des Betriebssystems.

Das kommt zuerst von der Idee, dass Sie Ihr Programm mögen (z MongoDB, SQL Server) zu versuchen, Ihren Speicher zu begrenzen, basierend auf einem Prozentsatz des freien RAM:

  

Versuchen Sie nicht, Speicher zu reservieren, bis es nur x% frei

     

Gelegentlich wird ein Kunde für eine Art und Weise stellt ihr Programm so zu gestalten, es raubend RAM wird fortgesetzt, bis es nur x% frei. Die Idee ist, dass ihr Programm RAM aggressiv verwenden sollte, während noch genügend RAM verfügbar (x%) für eine andere Verwendung zu verlassen. Es sei denn, Sie ein System entwerfen, wo Sie das einzige Programm auf dem Computer ausgeführt wird, ist dies eine schlechte Idee.

     

(lesen Sie den Artikel für die Erklärung von Warum es ist schlecht, einschließlich der Bilder)

Als nächstes kommt von einigen Anmerkungen vom Autor von Lack und Reverse-Proxy:

  

Varnish Cache - Erläuterungen des Architekten

     

Was passiert also mit Tintenfische aufwendige Speicherverwaltung ist, dass es in Kämpfe bekommt mit der aufwendigen Speicherverwaltung Kern, und wie jeder Bürgerkrieg, das wird nie etwas getan.

     

Was passiert, ist dies: Squid erstellt ein HTTP-Objekt in „RAM“ und es wird einige Male schnell nach der Erstellung verwendet. Dann nach einiger Zeit bekommt es nicht mehr Hits und die Kernel merkt dies. Dann jemand versuchen Speicher aus dem Kernel für etwas zu bekommen, und der Kernel entscheidet, diese nicht genutzten Seiten des Speichers, um Auslagerungsspeicher verwenden (Cache-RAM) mehr sinnvoll für einige Daten zu schieben, die tatsächlich von einem Programm verwendet wird. Dies ist jedoch ohne Tintenfisch getan zu wissen, über sie. Squid noch denkt, dass diese http Objekte im RAM sind, und sie werden, die Sekunde versucht, auf sie zuzugreifen, aber bis dahin ist der RAM für etwas Produktives verwendet.

Stellen Sie sich vor Sie tun Cache etwas von einem Memory-Mapped-Datei. An einem gewissen Punkt in der Zukunft, dass der Speicher hält, dass „Cache“ wird auf der Festplatte ausgelagert werden.

  • das Betriebssystem auf die Festplatte etwas geschrieben hat, die ist bereits vorhanden auf der Festplatte

Als nächstes kommt eine Zeit, wenn Sie eine Suche von Ihrem „Cache“ Speicher ausgeführt werden sollen, anstatt der „echte“ Speicher. Sie versuchen, den „Cache“ für den Zugriff auf und da es die Hardware-RAM aus wirft eine PAGE FAULT getauscht wurde und Cache zurück in den RAM getauscht.

  • Sie die Cache-Speicher ist nur so langsam wie das „echte“ Gedächtnis, da beide nicht mehr im RAM

Schließlich möchten Sie Ihren Cache befreien (vielleicht Ihr Programm wird heruntergefahren). Wenn die „Cache“ ausgelagert wird, muss das O tauscht sie zuerst in so zurück, dass sie befreit werden kann. Wenn stattdessen nur Sie Ihre Memory-Mapped-Datei nicht zugeordnete, alles ist weg (nichts geht, werden ausgelagert in).

  • in diesem Fall Ihr Cache macht die Dinge langsamer

Auch von Raymon Chen: Wenn Ihre Anwendung ist zu schließen - in der Nähe bereits:

  

Wenn DLL_PROCESS_DETACH Sie sagt, dass der Prozess wird beendet, Ihre beste Wette ist einfach zurück, ohne etwas zu tun

     

Ich benutze regelmäßig ein Programm, das dieser Regel nicht folgen. Das Programm   zuordnet vielen Speicher im Laufe ihres Lebens, und wenn ich   das Programm beenden, es sitzt nur einige Minuten, manchmal   bei 100% CPU Spinnen, manchmal die Festplatte am laufenden Band (manchmal   beide). Als ich mit dem Debugger einbrechen, um zu sehen, was los ist, ich   entdecken, dass das Programm nicht produktiv etwas zu tun. Es ist nur   jeden letzten Byte von memor methodisch zu befreieny war es zugewiesen während   seine Lebensdauer.

     

Wenn mein Computer nicht unter großem Speicherdruck, dann die meisten der   Speicher das Programm während seiner Lebenszeit zugeteilt worden ist noch nicht   ausgelagert, so jeden letzten Tropfen Speicherfreigabe ist ein CPU-bound   Operation. Auf der anderen Seite, wenn ich einen Build gekickt oder getan hatte   etwas anderes speicherintensiv, dann den größten Teil des Speichers das Programm   während seiner Lebenszeit zugeteilt wurde ausgelagert, was bedeutet hätte, dass   die Programmseiten alle, dass der Speicher wieder in von der Festplatte, nur so   es könnte auf sie kostenlos anrufen. Art boshaft Sounds, eigentlich. "Kommen Sie   Ich kann Ihnen hier so sagen gehen weg. "

     

Das alles anal-rententive Speicherverwaltung ist sinnlos. Der Prozess   verlässt. Alles wird, dass Speicher freigegeben werden, wenn der Adressraum   zerstört. Vergeuden Sie keine Zeit und nur bereits verlassen.


Die Realität ist, dass die Programme laufen nicht mehr in "RAM" , sie laufen in Speicher - < em> virtuelle Speicher.

Sie können make Verwendung eines Cache, aber Sie müssen Arbeit mit der virtuellen Speichermanager des Betriebssystems:

  • Sie Ihren Cache zu halten, innerhalb von so wenigen Seiten wie möglich
  • Sie sie im RAM bleiben, um sicherzustellen, durch die Tugend von ihnen eine Menge zugegriffen wird (das heißt eigentlich eine nützliche Cache ist)

Zugriff auf:

  • tausend 1-Byte-Stellen um eine 400GB-Datei

ist viel teurer als der Zugriff auf

  • eine einzige 1000-Byte-Stelle in einer 400-GB-Datei

Mit anderen Worten:. Sie nicht wirklich brauchen, um Cache Daten, die Sie benötigen eine lokalisierte Datenstruktur

Wenn Sie Ihre wichtigen Daten auf eine einzige 4k Seite beschränkt halten, werden Sie viel schöner mit dem VMM spielen; Windows- is Cache.

Wenn Sie 64-Byte-Quad-Wort ausgerichtet Cache-Zeilen hinzufügen, gibt es noch mehr Anreiz Ihre Datenstruktur Layout anzupassen. Aber dann wollen Sie nicht es zu kompakt, oder du wirst Leiden Leistungseinbußen von Cache-Flush von false-Sharing .

Andere Tipps

Die Antwort ist sehr OS-spezifisch. Im Allgemeinen wird es keinen Sinn, diese Daten in dem Caching. Sowohl die „Cache“ Daten sowie die Memory-Mapped können jederzeit ausgelagert entfernt werden.

Wenn es keinen Unterschied geben wird es spezifisch für ein Betriebssystem sein -. Es sei denn, Sie diese Granularität benötigen, gibt es keinen Sinn, die Daten in das Caching

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top