Linux メモリに関して次の質問があります。
アクティブなメモリは、最も頻繁にアクセスされるメモリの一部であることを知っています。しかし、Linuxがメモリの場所をアクティブなメモリまたは非アクティブなメモリに使用すると見なす方法を説明してもらえますか。
アクティブメモリを構成するすべてのコンポーネントは何ですか? アクティブなメモリの一部と見なされるディスク/ファイル キャッシュです。
Buffers
とCached
記憶はどう違いますか?
私はあなたの質問に答えようとします:
(1)基本的に、あなたの考えは正しいです。しかし、Linux カーネルでのページ キャッシュの実装は複雑です。Linux カーネルは、LRU (Least Recent Used) アルゴリズムを使用してページ キャッシュ リストを管理します。1 つの Linux システムに異なるメモリ ゾーンが存在する場合があります。各ゾーンは、LRU_INACTIVE_ANON、LRU_ACTIVE_ANON (これら 2 つのリストは匿名ページ キャッシュ用)、LRU_INACTIVE_FILE、LRU_ACTIVE_FILE (これら 2 つのリストはファイル ページ キャッシュ用)、LRU_UNEVICTABLE などの複数の LRU リストを保持します。これらのリストは、LRU アルゴリズム (テールに追加、ヘッドから削除) を使用して維持されます。また、ページはアクセス頻度に応じてアクティブリストと非アクティブリストを遷移します。ページがアクセスされ、非アクティブ リストに存在する場合にのみ、ページはアクティブ リストの末尾に追加されます。アクティブ リストが大きくなりすぎると、アクティブなリストの先頭にあるページは、非アクティブなリストの末尾に移動されます。ページの再利用は非アクティブ リストで発生し、非アクティブ リストの先頭から開始されます。
(2) 通常のファイルの読み取り/書き込み、ブロック デバイス ファイル アクセス、およびメモリ マップ ファイルはすべて、Linux カーネルをトリガーして、アクティブまたは非アクティブのページ キャッシュを生成できます。また、ユーザー空間プロセスとユーザー空間スタックで使用される malloc は、Linux カーネルをトリガーしてページ キャッシュを生成することもできます。
(3) 質問を誤解しているかもしれません。バッファ キャッシュとページ キャッシュの違いを意味していると思います。古いバージョンのカーネルは、バッファ キャッシュとページ キャッシュの両方を使用します。ページ キャッシュはファイル アクセス (通常のファイル アクセス、メモリ マップ ファイル、ブロック デバイス ファイル アクセスなど) 用であり、バッファ キャッシュは物理ディスク ブロック アクセス用です (通常、物理ディスク ブロックのサイズは 1 ページ未満であるため、いくつかの物理ディスク ブロックは 1 ページを埋めることができます)。新しいバージョンのカーネルはまだバッファ キャッシュの概念を使用していますが、新しいカーネルはページ キャッシュに基づくバッファ キャッシュを実装しています。
または、メモリバッファとCPUキャッシュの違いを意味します。そうであれば、メモリバッファはディスク/周辺機器のアクセスを高速化するためのものであり、CPUキャッシュはメモリアクセスを高速化するためのものです。