この記事は、進行中の UNIX カーネル概要シリーズの一部です。
カーネル シリーズの前回の記事では、Linux の仮想メモリとデマンド ページングについて説明しました。
仮想メモリとデマンド ページングは Linux メモリ管理システムの構成要素ですが、Linux メモリ管理を非常に強力にするさまざまな概念が他にもあります。
この記事では、これらの概念 (スワッピング、キャッシング、共有仮想メモリ) のいくつかに触れてみます。
I. Linux スワッピング
プロセスがその仮想ページの 1 つを物理メモリに入れる必要がある状況があるとしますが、物理メモリにはこれ以上ページを取り込む余地がありません。
この場合どうなりますか?
OS は、このページを物理メモリに配置できるようにすることで、この状況を管理する必要があります。ただし、これを行うには、物理メモリに既に存在するページを破棄する必要があります。
現在、破棄するページが実行可能イメージまたはデータ ファイルからのものであり、そのページが書き込まれていない場合は、必要に応じていつでも簡単に破棄でき、同じ実行可能ファイルから同じページを簡単に物理メモリに戻すことができます。画像またはデータ ファイル。
しかし、OS が破棄しようとしているページが書き込み済みのページであると仮定すると、この種のページはダーティ ページと呼ばれます。
ダーティ ページは、後の段階で使用できるように保存する必要があります。ダーティ ページが物理メモリから破棄されると、スワップ ファイルと呼ばれる特別なファイルに保存されます。これはスワッピングとして知られています .
プロセッサの速度と比較すると、スワップ ページへのアクセスにかかる時間はかなりのものです。
したがって、破棄とスワッピングのどちらを選択するかを決定するために、OS には適切なスワッピング アルゴリズムが必要であることがわかります。非効率的なスワップ アルゴリズムは、OS がファイルのスワップと物理メモリへの再読み取りでビジー状態になり、実際にプロセスが要求する実際の作業に費やす時間が非常に少なくなるという現象につながる可能性があります。この現象はスラッシングとして知られています .
また、プロセスが継続的に使用している一連のページは、ワーキング セットと呼ばれます。優れたスワップ アルゴリズムでは、OS がスラッシング状態になることはめったになく、すべてのプロセスのワーキング セットが常に物理メモリに存在するようになります。
Linux は、「最近使用されていない」スキームを使用して、どのページをメモリに保持し、どのページを削除するかを決定します。
このスキームでは、物理メモリ内の各ページに年齢が関連付けられています。ページがアクセスされているかどうかで年齢が変わります。ページが頻繁にアクセスされている場合、そのページの年齢はかなり若いはずですが、ページがアクセスされていない場合は、そのページよりも古いページになります。古い年齢のページは、物理メモリからスワップ/破棄するよう提案されます。
II.キャッシュ
システムを最大限に活用するために、高速なプロセッサとオペレーティング システムが開発されています。これは良いことですが、プロセッサ、オペレーティング システム、およびそれらの相互作用を高速化する 1 つの側面は、キャッシュの概念です。
Linux の重要なキャッシュのいくつかを以下に説明します。
1. Linux スワップ キャッシュ
すでに上で説明したように、変更されたページを保持する必要があるため、ダーティ ページのみが交換されます。また、ページが変更されてスワップされた場合、同じページが物理メモリに戻され、再度スワップする必要があるが、ページがそれ以上変更されていない場合、これをスワップする必要はないとします。ページ。このバージョンのページは既にスワップ ファイルにあるため、破棄してください。これにより、他の方法では無駄になっていた時間を大幅に節約できます。
上記の概念を実装するために、Linux はスワップ キャッシュを利用します。
- スワップ キャッシュ 物理ページごとに 1 つのエントリを持つページ テーブル エントリのリストに他なりません。
- 各エントリは、スワップ アウトされたページと、そのページが保持されているスワップ ファイルに関する情報、およびスワップ ファイル内の正確な位置に対応します。
- スワップ キャッシュ内のいずれかのページ テーブル エントリがゼロ以外の場合、それはスワップ ファイルに保持されているページを表し、そのページはそれ以上変更されていません。
- ページのエントリがスワップ キャッシュにあり、さらに変更された場合、そのエントリはスワップ キャッシュから削除されます。
- このようにして、最後にスワップされてから変更されていないページに関する情報のみがキャッシュに含まれます。
したがって、スワップ キャッシュがスワッピング メカニズムの効率を高めるのに大いに役立つことがわかります。
2.ハードウェア キャッシュ
前の記事で既に説明したように、プロセッサはページ テーブル エントリを読み取って仮想アドレスを物理アドレスに変換します。通常、プロセッサはページ テーブル エントリの情報をハードウェア キャッシュに保存します。 .
このハードウェア キャッシュは、変換ルックアサイド バッファまたは TLB で構成されます
プロセッサは、仮想アドレスを変換する必要があるときはいつでも、TLB からページ テーブル エントリ情報を取得しようとします。エントリが見つかった場合はさらに処理を進めますが、プロセッサがそのようなエントリを見つけることができない場合は、OS に TLB ミスが発生したことを伝え、OS に修正を依頼します。
この TLB ミスの情報を OS に配信するために、プロセッサに依存するある種の例外メカニズムが使用されます。これで、OS は正しいエントリを見つけ、TLB エントリを更新します。例外がクリアされると (OS が問題を修正した後)、プロセッサは再び TLB でエントリを検索しようとし、今度は有効なエントリを見つけます。
3. Linux バッファ キャッシュ
バッファ キャッシュには、ブロック デバイス ドライバが使用するデータ バッファが含まれます。
ブロックデバイスドライバーは、データのブロックで動作するドライバーです。つまり、データの固定チャンクまたはブロックを読み書きすることによってアクセスできます。バッファ キャッシュにはインデックスが付けられます。デバイス識別子は、インデックス作成の目的で使用されます。
バッファ キャッシュ 読み取り/書き込みが非常に効率的かつ高速になります。たとえば、ハードディスクなどのブロックデバイスを考えてみましょう。ハードディスクの読み取り/書き込みにはファイル I/O が必要です。これは、読み取りまたは書き込みが行われるたびにハードディスクで行うと、非常にコストがかかります。間にあるこのバッファ キャッシュは、読み取りと書き込みがこれで行われ、残りはキャッシュによって処理されるため、時間を節約します。
スワップ、メモリ、ページ、ブロック IO、トラップ、ディスク、および CPU アクティビティを表示するには、vmstat や sar などのツールを使用できます。
III.共有仮想メモリ
コードが書かれるとき、開発者はコードの一部が不必要に繰り返されないように細心の注意を払います。たとえば、関数はプログラムで使用されるため、コード内からいつでも同じコードを呼び出すことができます。
共通して使える機能群をライブラリにまとめました。そこで、一度メモリに読み込まれ、複数のプロセスで使用できる共有メモリの概念が登場します。
仮想メモリ これは、物理アドレスがページテーブルを介してマップされ、同じ物理ページフレーム番号が複数のプロセスのページテーブルにマップされる可能性が非常に高いためです。この概念は、共有仮想メモリとして知られています .