2つの異なるプロセスがそれぞれ2つの異なるファイルを開くとします。通常、それらにはそれぞれ独自のiノードがあり、各iノードには独自のiノードがありますstruct address_space
(これは、ページキャッシュページがメモリ内のどこにあるかを覚えている人です)。
しかし、これらのファイルが最初は同一であることがわかっていたとしましょう。可能な限りスマートシェアキャッシングを行う方法を考え出したいです。
私はこれらの戦略を検討していました:
構造体に新しいフィールドを追加し
struct address_space
ます:「親」へのポインタ。次に、既存のページを探すときはいつでも、親(存在する場合)も調べます。したがって、ページに書き込むときはいつでも、ページをフォールトしてメインのaddress_spaceにCOWする必要があります。両方のファイルが共通の親を共有します。struct address_space
の関連する各セットをリンクリストにグループ化します。既存のページを探すときはいつでも、リンクリスト全体を検索してください。ただし、このシナリオでは、友人のaddress_spaceでダーティページを「見つける」ことは許可されません。つまり、ページが汚れると、バックアップとして使用できなくなります。このシナリオでは、誰かがファイルにデータを書き込んだ場合、address_spacesの関連付けを解除する必要があります。これを維持するためにも、ある種のCOWの振る舞いが必要です。
誰か教えてもらえますか:
- これらのアイデアのどちらかまたは両方が正しいですか?
- 特に気をつけるべきことは何ですか?
参考までに、私のシステムでは複数の同一ファイルが開かれているため、カスタムカーネルハックを実行してメモリを節約しています(ただし、同じiノード=ページキャッシュを共有していません)。
編集:3番目のアイデア:
- 「関連する」ページキャッシュのリンクリストを保持し、
address_space
ディスクから読み取るたびに、address_space
開いているすべての構造体を更新します。新しい関連ファイルを開くと、ダーティページをスキップする場合を除いて、大きなページテーブルのコピーが発生する必要があります。