24

私の質問はこれの拡張です Linuxでページキャッシュを操作する方法は?

ファイルごとに使用されるページキャッシュのサイズを制限することを目的とした小さなプロジェクトを実行しようとしていました。私が使用したアプローチは次のとおりです-

  1. ページ キャッシュに追加されるページ ポインターの kfifo キューを維持します。
  2. add_to_page_cache_lru()にフックを追加し、ファイルの基数ツリー (address_space) のサイズが事前に決められたサイズよりも大きいかどうかを確認してから、FIFO キューから犠牲者を選択し、ページ キャッシュからページを削除します。
  3. 関数delete_from_page_cache()try_to_unmap()を使用してページ キャッシュからページを削除し、続いてput_page()を使用してページを解放しました。

このコードがページを解放し、メモリを解放することを期待していますが、それは起こらないようです。たとえば、サイズが 25MB のファイルを読み取り、このファイルのページ キャッシュのサイズを 512 ページ (2MB) に制限した場合、空きメモリ (free -m )。代わりに表示されるのは、25MB が完全に消費され、free コマンドに表示されることです。

要件が確実に満たされるようにするには、さらに何を行う必要がありますか? ダーティページについてはまだ考えていません。読み取りでも機能させることさえできなかったからです (cat the file)。どんなポインタも役に立ちます。

PS - このプロジェクトでは Linux 4.0 を使用しています。

4

2 に答える 2

1

delete_from_page_cache() + try_to_unmap() + put_page() ...以上のことをしなければならないかもしれません。

page_check_references ( )のチェックを含め、shrink_page_list() の動作を確認します

詳細はこちら: 構造体ページをマッピングしているすべての PTE から構造体ページのマッピングを解除する方法

于 2019-01-24T08:24:13.443 に答える