5

私が読んだドキュメントと xnu ソースに基づいて、Mac OS Xは Unified Buffer Cache (UBC) を使用してファイルI/O をキャッシュすることを理解しています。UBC は、使用可能な RAM に基づいて可能な限り大きくなりますが、UBC ページは、メモリが不足したときに最初に犠牲になるページの一部です。

私のドライバーでは、ディスク上のさまざまなメタデータを扱います。UBC や同様のメカニズムを使用して、このデータの MRU キャッシュを維持し、速度を向上させたいと考えていますが、カーネルが必要なときにいつでもそのメモリを取り戻すことができるようにしたいと考えています。ただし、メタデータはファイルデータを表していないため、UBC のドメインに直接分類されません。使用できる下位レベルのメカニズムはありますか、またはバッファー自体を処理する UBC の一部のみを使用できますか?

私は現在、HFS+ のソース コードを調べて、ファイルシステムのメタデータをキャッシュするかどうか、およびその方法を調べていますが、あまり成功していません。

もちろん、主な代替手段は、キャッシュ用に特定のメモリ領域を予約し、独自の LRU カリングを行うことです。固定キャッシュ サイズを選択するか、ある種のヒューリスティックを使用することができますが、RAM が豊富な場合はメモリの使用量が少なすぎ、そうでない場合はメモリが多すぎます。

アップデート:

さらに検索したところ、 のインスタンスがオプションIOBufferMemoryDescriptorで作成される可能性があることがわかりました。これにより、破棄するメモリ「公正なゲーム」をマークするためにそれをkIOMemoryPurgeable呼び出すことができます。IOMemoryDescriptor::setPurgeable()私はそれを試して、結果で質問を更新します。

4

1 に答える 1

3

あなたは正しいです。kIOMemoryPurgeableメモリを要求するときのオプションの 1 つとして設定します。不揮発性として開始され、ページアウトされる可能性がありますが、破棄されることはありません。

OS に破棄させたい場合は、 を呼び出すsetPurgeable(kIOMemoryPurgeableVolatile, &oldState );と、ディスクにページングするのではなく、必要に応じて OS が破棄します。

メモリにアクセスする場合は、呼び出して、メモリがまだ使用可能な場合は true、破棄されている場合は falsesetPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState );を確認する必要があります。if(oldState != kIOMemoryPurgeableEmpty)

キャッチに遭遇したかどうか聞いてみたいです。

于 2011-06-01T12:54:26.480 に答える