メモリ管理は、Linux カーネルによって実行される最も複雑なアクティビティの 1 つです。それに関連するさまざまな概念/問題があります。
この記事は、進行中の UNIX カーネル概要シリーズの一部です。
カーネル シリーズの前回の記事では、UNIX プロセスの概要と再入可能カーネルについて説明しました。
この記事では、メモリ管理に関連する重要な概念の一部であるため、仮想メモリとデマンド ページングについて触れてみます。
仮想メモリ
仮想メモリの概念は、メモリ管理の非常に強力な側面の 1 つです。コンピュータの初期の時代から、既存の物理メモリよりも多くのメモリの必要性が感じられてきました。長年にわたり、この問題を克服するために多くのソリューションが使用されてきましたが、その中で最も成功したのは仮想メモリの概念です。
仮想メモリは、システムが実際より多くのメモリを持っているように見せます。これは興味深いと思われるかもしれません。それでは、概念を理解しましょう。
- まず、仮想メモリは、物理アドレスにマップされるメモリ アドレスのレイヤーであることを理解する必要があります。
- 仮想メモリ モデルでは、プロセッサがプログラム命令を実行すると、プロセッサは仮想メモリから命令を読み取り、実行します。
- ただし、命令を実行する前に、まず仮想メモリ アドレスを物理アドレスに変換します。
- この変換は、(OS によって維持される) ページ テーブルに含まれるマッピング情報に基づいて行われる、仮想アドレスから物理アドレスへのマッピングに基づいて行われます。
仮想メモリと物理メモリは、ページと呼ばれる固定長のチャンクに分割されます。このページ モデルでは、仮想アドレスを 2 つの部分に分けることができます。
- オフセット (下位 12 ビット)
- 仮想ページ フレーム番号 (残りのビット)
プロセッサは、仮想アドレスに遭遇するたびに、そこから仮想ページ フレーム番号を抽出します。次に、この仮想ページ フレーム番号を物理ページ フレーム番号に変換します。オフセット部分は、物理ページ内の正確なアドレスに移動するのに役立ちます。このアドレスの変換は、ページ テーブルを通じて行われます。
理論的には、ページ テーブルには次の情報が含まれていると見なすことができます:
- エントリが有効かどうかを示すフラグ
- このエントリで説明されている物理ページ フレーム番号
- ページに関する情報へのアクセス (読み取り専用、読み取り/書き込みなど)
ページ テーブルは、ページ テーブル内のエントリのオフセットとして仮想ページ フレーム番号を使用してアクセスされます。たとえば、仮想ページ フレーム番号「2」は、ページ テーブルのエントリ「1」を指します (エントリ番号は「0」で始まります)。
下の画像では、VPFN は仮想ページ フレーム番号を表し、PFN は物理ページ フレーム番号を示します。
プロセッサが、仮想ページ フレーム番号を持つプロセス ページ テーブル エントリに移動し、そのエントリが無効であると判断する場合があります。この場合、制御をカーネルに渡し、問題を解決するように依頼するのはプロセッサの責任です。異なるプロセッサが異なる方法で制御を渡しますが、この現象は「ページ フォールト」として知られています。ただし、エントリが有効な場合、プロセッサは物理ページ フレーム番号を取得し、ページのサイズを乗算して物理ページのベース アドレスを取得し、オフセットを加算して正確な物理アドレスを取得します。
これで、仮想メモリの概念により、各プロセスは仮想アドレスのすべての範囲を自由に使用できると見なし、したがって、この概念により、システムは実際に利用可能な物理メモリよりも多くの物理メモリを持っているように見えることがわかりました。
デマンド ページング
前のセクションで、プロセッサが、テーブルにエントリが存在しない仮想ページ フレーム番号を持つプロセス ページ テーブルに移動すると、2 つのケースが発生することを学びました。
<オール>上記の 2 つのケースのうち、ケース 1 は、プロセスが許可されていないアドレスをメモリしようとするケースです。この場合、ページ フォールトが生成され、カーネルはプロセスを終了します。
「2」の場合は、すでに説明したように、仮想アドレスに対応する物理ページがまだ物理メモリにロードされていません。この場合もページ フォールトが生成され、カーネルは必要なメモリ ページをハードディスクから物理メモリに取り込もうとします。
ハードディスクから物理メモリにページを移動するこの操作には時間がかかるため、この時点までにプロセス間のコンテキスト スイッチが発生し、他のプロセスが実行されます。その間、前のプロセスのページが物理メモリに取り込まれ、ページ テーブルが更新されます。その後、このプロセスは、「ページ フォールト」を引き起こした同じ命令から再び実行に戻されます。
これは、プロセスに対応するすべてのメモリ ページが常に物理メモリに存在しないデマンド ページングとして知られています。これにより、物理メモリが不要なメモリ ページで詰まるのを防ぐことができますが、必要に応じてこれらのページをページ フォールトによって物理メモリに取り込むことができます(上記の説明を参照)。