32

次の状況を考えてみましょう: カーネルが物理 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 の新機能」

4

1 に答える 1

12

Linux:

スワップ ファイルを使用すると、ページ テーブル エントリが更新され、無効としてマークされ、スワップ ファイル内の保存場所に関する情報が保持されます。つまり、swap_info配列へのインデックスと 内のオフセットswap_mapです。

pte_tx86 の(少し古い) ページ テーブル エントリ タイプ ( ) の例。一部のビットは、ハードウェアによってフラグとして使用されます。

Bit         Function
_PAGE_PRESENT   Page is resident in memory and not swapped out
_PAGE_PROTNONE  Page is resident but not accessable
_PAGE_RW        Set if the page may be written to
_PAGE_USER      Set if the page is accessible from user space
_PAGE_DIRTY     Set if the page is written to
_PAGE_ACCESSED  Set if the page is accessed

表 3.1: ページ テーブル エントリの保護とステータス ビット

x86-64ページテーブル形式の図を含む別のSO回答も参照してください。下位ビット = 0 の場合、ハードウェアは他のすべてのビットを無視するため、カーネルはそれらを何にでも使用できます。「現在の」エントリであっても、将来のハードウェアでの使用のために予約されていない、無視が保証されているビットがいくつかあるため、カーネルはそれらを独自の目的で使用できます。

おそらく他のアーキテクチャも同様です。


簡単に言えば、プロセスがページを指し、ページが更新されます。したがって、プロセスも事実上更新されます。物理ページが要求されると、それがスワップインされるため、すべてのプロセスも同様にスワップされます。ポイントは、メモリがスワップアウトされたときにページ テーブル エントリが削除されないことです。

これのいくつかは役に立つかもしれません:

カーネルのドキュメントには、Mel Gorman (2007)の本が含まれていました。

于 2013-05-15T10:19:24.100 に答える