または、OS が独自のキャッシュを実装している可能性があるため、マップされたメモリからそのデータを再度読み取る方が高速でしょうか?
データの性質は事前にわかりません。ファイルの読み取りはランダムであると想定されています。
または、OS が独自のキャッシュを実装している可能性があるため、マップされたメモリからそのデータを再度読み取る方が高速でしょうか?
データの性質は事前にわかりません。ファイルの読み取りはランダムであると想定されています。
この件について私が読んだいくつかのことを述べたいと思います。答えはノーです。オペレーティング システムのメモリ マネージャーを推測したくありません。
1 つ目は、プログラム (MongoDB、SQL Server など) が空き RAM のパーセンテージに基づいてメモリを制限しようとするという考えから来ています。
空き容量が x% になるまでメモリを割り当てようとしないでください
ときどき、顧客はプログラムを設計して、空き容量が x% になるまで RAM を消費し続ける方法を尋ねることがあります。プログラムは RAM を積極的に使用する必要がありますが、他の使用のために十分な RAM (x%) を残しておく必要があります。コンピューター上で実行される唯一のプログラムであるシステムを設計している場合を除き、これは悪い考えです。
(なぜダメなのかは画像付きで解説記事を読んでください)
次は、Varnish とリバース プロキシの作成者からのメモです。
Varnish Cache - 建築家からのメモ
そのため、squid の精巧なメモリ管理で何が起こるかというと、カーネルの精巧なメモリ管理との戦いになり、他の内戦と同様に、何も成し遂げられません。
何が起こるか: Squid は "RAM" に HTTP オブジェクトを作成し、作成後すぐに使用されます。その後、しばらくするとヒットしなくなり、カーネルがこれに気付きます。次に、誰かが何かのためにカーネルからメモリを取得しようとすると、カーネルはそれらの未使用のメモリページをプッシュしてスペースをスワップし、実際にプログラムによって使用されるデータのために (キャッシュ RAM) をより賢明に使用することを決定します。ただし、これは squid が知らないうちに行われます。Squid はまだこれらの http オブジェクトが RAM にあると考えており、それらにアクセスしようとするとすぐにそうなるでしょうが、それまでは RAM は何か生産的なことに使用されます。
メモリ マップト ファイルから何かをキャッシュするとします。将来のある時点で、その「キャッシュ」を保持するメモリはディスクにスワップアウトされます。
次は、「実際の」メモリではなく、「キャッシュ」メモリからルックアップを実行したいときです。「キャッシュ」にアクセスしようとすると、RAM からスワップアウトされているため、ハードウェアが を発生させPAGE FAULT
、キャッシュが RAM にスワップバックされます。
最後に、キャッシュを解放します (おそらく、プログラムがシャットダウンされます)。「キャッシュ」がスワップアウトされている場合、OS は最初にそれをスワップインして解放できるようにする必要があります。代わりに、メモリ マップト ファイルのマップを解除しただけでは、すべてがなくなります (何もスワップ インする必要はありません)。
再び Raymon Chen から: アプリケーションが閉じている場合 - 既に閉じてください:
プロセスが終了していることを DLL_PROCESS_DETACH が通知した場合、最善の策は、何もせずに戻ることです。
私は、この規則に従わないプログラムを定期的に使用しています。プログラムはその存続期間中に大量のメモリを割り当てます。プログラムを終了すると、数分間そこに留まり、CPU 100% で回転することもあれば、ハード ドライブを大量に消費することもあります (両方の場合もあります)。何が起こっているのかを確認するためにデバッガーに割り込むと、プログラムが何も生産的ではないことに気付きます。有効期間中に割り当てられたメモリの最後のバイトをすべて系統的に解放しているだけです。
私のコンピューターが多くのメモリ プレッシャを受けていなかった場合、プログラムが有効期間中に割り当てたメモリのほとんどはまだページ アウトされていないため、メモリの最後の一滴をすべて解放することは CPU バウンド操作です。一方、ビルドを開始したり、メモリを集中的に使用する何かを行ったりした場合、プログラムが有効期間中に割り当てたメモリのほとんどがページ アウトされています。ハードドライブを無料で呼び出すことができます。実際、ちょっと意地悪に聞こえます。「ここに来て、私があなたに去るように言うことができます。」
このすべての肛門的記憶管理は無意味です。プロセスは終了しています。アドレス空間が破壊されると、そのメモリはすべて解放されます。時間を無駄にするのはやめて、すぐに終了してください。
現実には、プログラムは"RAM"ではなく、メモリ(仮想メモリ) で実行されます。
キャッシュを利用できますが、オペレーティング システムの仮想メモリ マネージャーを使用する必要があります。
アクセス:
アクセスするよりもはるかに高価です
つまり、実際にはデータをキャッシュする必要はなく、よりローカライズされたデータ構造が必要です。
重要なデータを単一の 4k ページに限定しておくと、VMM をよりうまく利用できます。Windowsはキャッシュです。
64 バイトのクワッド ワードにアラインされたキャッシュ ラインを追加すると、データ構造のレイアウトを調整する動機がさらに高まります。しかし、あまりコンパクトにしたくない場合は、 False Sharingによるキャッシュ フラッシュのパフォーマンス ペナルティが発生し始めます。
答えはOS固有です。一般的に言えば、このデータをキャッシュしても意味がありません。「キャッシュされた」データとメモリマップされたデータの両方をいつでもページングできます。
違いがある場合、それは OS に固有のものになります。その粒度が必要でない限り、データをキャッシュしても意味がありません。