私が読んだドキュメントと xnu ソースに基づいて、Mac OS Xは Unified Buffer Cache (UBC) を使用してファイルI/O をキャッシュすることを理解しています。UBC は、使用可能な RAM に基づいて可能な限り大きくなりますが、UBC ページは、メモリが不足したときに最初に犠牲になるページの一部です。
私のドライバーでは、ディスク上のさまざまなメタデータを扱います。UBC や同様のメカニズムを使用して、このデータの MRU キャッシュを維持し、速度を向上させたいと考えていますが、カーネルが必要なときにいつでもそのメモリを取り戻すことができるようにしたいと考えています。ただし、メタデータはファイルデータを表していないため、UBC のドメインに直接分類されません。使用できる下位レベルのメカニズムはありますか、またはバッファー自体を処理する UBC の一部のみを使用できますか?
私は現在、HFS+ のソース コードを調べて、ファイルシステムのメタデータをキャッシュするかどうか、およびその方法を調べていますが、あまり成功していません。
もちろん、主な代替手段は、キャッシュ用に特定のメモリ領域を予約し、独自の LRU カリングを行うことです。固定キャッシュ サイズを選択するか、ある種のヒューリスティックを使用することができますが、RAM が豊富な場合はメモリの使用量が少なすぎ、そうでない場合はメモリが多すぎます。
アップデート:
さらに検索したところ、 のインスタンスがオプションIOBufferMemoryDescriptor
で作成される可能性があることがわかりました。これにより、破棄するメモリ「公正なゲーム」をマークするためにそれをkIOMemoryPurgeable
呼び出すことができます。IOMemoryDescriptor::setPurgeable()
私はそれを試して、結果で質問を更新します。