次の状況を考えてみましょう: カーネルが物理 RAM を使い果たし、ページをスワップアウトする必要があります。最近使用されていないページ フレームを選択し、その内容をディスクにスワップ アウトして、そのフレームを別のプロセスに割り当てます。
私を悩ませているのは、このページ フレームが、一般的に言えば、複数のプロセスの複数の (同一の) ページに既にマップされていることです。カーネルは何らかの方法でこれらのプロセスをすべて見つけ、ページをスワップアウトとしてマークする必要があります。それはどのように実行されますか?
ありがとうございました。
編集:質問へのイラスト:
スワッピング プロセス 1 と 2 が物理メモリ フレーム 1 に常駐する共有ページ 1 を持つ前は、次のようになります。
ここで、システムのメモリが使い果たされ、カーネルはフレーム 1 からページ 1 をスワップアウトしてページ 2 に置き換えることにより、プロセス 3 にメモリを割り当てます。これを行うには、
1)ページ1を参照して、すべてのプロセスを見つけます(この場合、プロセス1とプロセス2)
2) ページ テーブル エントリを変更し、"Present" ビットを 0 に設定し、ページ 1 の場所をスワップに設定します。
したがって、ステップ1がどのように実行されるかわかりません。カーネルは、フレーム 1 を指しているページ テーブル エントリを見つけるために、すべてのプロセスのページ テーブルを繰り返し調べることはできません。ページ フレームからページ テーブル エントリへのある種の逆マッピングが必要です。
答えは:
「ページテーブル管理の最も重要で重要な変更は、リバース マッピング (rmap) の導入です。「rmap」と呼ぶのは、「頭字語」の一般的な使用法であり、-rmap と混同してはならないため、意図的に言及しています。 Rik van Riel によって開発されたツリーは、逆マッピングだけでなく、ストック VM に多くの変更を加えています。
1 つの文で、rmap は、構造体ページだけが与えられた特定のページをマップするすべての PTE を見つける機能を付与します。2.4 では、メモリ マップ共有ライブラリなどの共有ページをマップするすべての PTE を見つける唯一の方法は、すべてのプロセスに属するすべてのページ テーブルを線形検索することです。これはコストがかかりすぎるため、Linux はスワップ キャッシュを使用して問題を回避しようとします (セクション 11.4 を参照)。これは、多くの共有ページがある場合、ページの経過時間や使用パターンに関係なく、Linux がプロセス全体をスワップアウトしなければならない可能性があることを意味します。2.6 には代わりに、すべての構造体ページに関連付けられた PTE チェーンがあり、それを参照するすべてのページ テーブルからページを削除するためにトラバースすることができます。このようにして、LRU 内のページは、プロセス全体をスワップすることに頼ることなく、インテリジェントな方法でスワップアウトできます。」
Linux のメモリ管理を理解するから、「Linux2.6 の新機能」