Linuxのキャッシュメモリ(free -mのように)は、再度必要になった場合に再利用できるメモリのページ、または新しいアプリケーションでさらにメモリが必要になった場合にすぐに解放できるページとして常に理解していました(私は この記事 =数年前に役立つこと)。
実行可能ファイル(Thunderbirdのようなプログラムなど)とデータ(ログファイルの内容など)の両方をキャッシュできるようです。実際、* nixではテキストファイルと実行可能ファイルの違いはないと思います。
あまり変更されていないデータ(テキストファイルなど)ではどのように機能するかはわかりますが、本質的に動的なプログラムではどのように機能しますか?確かに、キャッシュされたメモリは動的に割り当てられたオブジェクトを復元できませんか?その場合にキャッシュされるのはバイトコード(またはスクリプトの場合は命令)だけですか?
編集1
キャッシュされたメモリとは、「free」を実行したときに「cached」列の下にあるメモリを意味します。
$ free -m
total used free shared buffers cached
Mem: 7985 6650 1334 0 150 3201
-/+ buffers/cache: 3298 4686
Swap: 13178 2 13176
編集2
私が行方不明だったヒントをくれたls-lrtに感謝します。 SEでのこの応答が明確に述べているように(最初にそこで検索する必要があります)、 "キャッシュされたメモリはVFSによって使用されるディスクキャッシュです" 。つまり、実行可能ファイルの場合、この列の下には命令(バイトコード、スクリプト行など)のみが表示され、動的に割り当てられるものとは関係ありません。メモリのページ全体(動的に作成されたオブジェクトを含む)が「キャッシュ」されているという印象を受けました。
編集3
ディスクキャッシュを使用 に関する良い例。
無料で表示されるキャッシュはファイルシステムキャッシュです。ファイルシステムレベルでは、すべてがデータのオクテットにすぎません。アプリケーションデータであろうとファイルデータであろうと、違いはありませんそのレベルで。ファイルキャッシュからスワップアウトされた実行可能ファイルをリロードすることは可能ですが(実行可能ファイルはスワップファイルに書き込まれますnot、単にメモリから追い出されます)、ファイルキャッシュのため、これはまれです。通常、最初に犠牲にされます。
ここで、freeによって示されるファイルキャッシュと、実行中のプログラムに関係する可能性のある他の種類のメモリとの違いを明確にします。 「キャッシュされたメモリは動的に割り当てられたオブジェクトを復元できない」とはどういう意味かが明確ではないためです。アプリケーションで使用されているメモリはすべてnotファイルキャッシュに関係しています。アプリケーションによるいかなる種類のメモリ割り当ても、ファイルキャッシュによってキャッシュされません。ファイルキャッシュは、ディスクとOSの間の仲介にすぎません。
厳しい質問に答えるには、「そのときキャッシュされるのはバイトコード(またはスクリプトの場合は命令)だけですか?」
ファイルキャッシュは、ディスク上のオクテットのみをキャッシュします。アプリケーションがどのメモリを使用しているかは関係ありません。
Linuxカーネルがメモリ内のさまざまなタイプのデータを処理する方法に基本的に違いはありません。これを処理するカーネルの部分は「仮想メモリサブシステム」と呼ばれ、メモリの特定の部分が使用されているかどうかのみを考慮します。プログラムによるかどうか。
Linuxカーネルは、使用可能なRAMを「ページ」と呼ばれる小さなチャンクに分割します。次に、ページを「使用中」に分類します(たとえば、現在実行中のプログラムのコードまたはデータを含むページ)。 「未使用」ページの場合、実行可能コード、テキストデータ、Javaバイトコードなど)が含まれているかどうかは関係ありません。重要なのは、それらが含まれていることだけです。 「使用中」です。データは常にアクセスされているため、RAMにある必要があります。
RAMは利用可能な最速のストレージデバイスであるため、「未使用」ページを非アクティブにするのは無駄です。したがって、カーネルは未使用ページを「リサイクル」して、ディスクからフェッチされたデータをキャッシュし、カーネルには、この予測を行うためのいくつかのアルゴリズムがあります。I/ Oシステムのパフォーマンスは、このアルゴリズムがコンピューターの実際のワークロードをどれだけ適切に予測できるかに大きく依存します。
さらに、I/O操作を高速化するために、RAMの一部は、ディスクに書き込まれているデータをバッファリングするために使用されます。大きなファイルをコピーすると、気付いたかもしれません。低速のディスク(USBスティックなど)では、データがデバイスに完全に書き込まれる前にcp
コマンドが終了します。これは、カーネルがデータを「空き」メモリに保持して速度を上げるために発生します。 (遅い)書き込み操作; cp
プログラムがすでに終了している可能性がある場合、データは数秒後にディスクに書き戻されます。データがディスクに書き込まれるとすぐに、これらのページは再び空きと見なされます(そして再-データのキャッシュに使用されるか、必要に応じて「使用中」のプールに移動されます)。
ご指摘のとおり、「キャッシュ」ページは「キャッシュ」ページが保持しているデータを保持しているだけなので、「使用中」のデータにさらにページを割り当てる必要がある場合は、カーネルによって(比較的)すばやく再利用できます。ディスクから利用可能(キャッシュされたデータは、要求されたときにディスクから再度フェッチされます)。
参考文献: