Mac OS X カーネル拡張機能でキャッシュするために OS によって再利用される可能性のあるメモリ バッファを割り当てるにはどうすればよいですか?
質問
私が読んだドキュメントと xnu ソースに基づいて、Mac OS X のキャッシュが ファイル 統合バッファ キャッシュ (UBC) を使用した I/O。UBC は利用可能な RAM に基づいて可能な限り大きくなりますが、メモリが逼迫すると最初に犠牲になるページの一部が UBC ページです。
私のドライバーでは、さまざまなディスク上のメタデータを処理します。UBC または同様のメカニズムを使用して、このデータの MRU キャッシュを保持して処理を高速化しながら、必要なときにいつでもそのメモリを取り戻すことができるようにカーネルに提供できるようにしたいと考えています。ただし、メタデータは次のことを表しません ファイル データなので、UBC のドメインには直接当てはまりません。使用できる下位レベルのメカニズムはありますか、それともバッファ自体を処理する UBC の部分のみを何らかの方法で使用できますか?
私は現在、HFS+ のソース コードを調べて、ファイル システムのメタデータをキャッシュするかどうか、またその方法を理解しようとしていますが、あまり成功していません。
もちろん、主な代替案は、キャッシュ用に特定のメモリ領域を予約し、独自の LRU カリングを行うことです。固定キャッシュ サイズを選択したり、ある種のヒューリスティックを使用したりすることもできますが、RAM が豊富な場合は常にメモリ使用量が少なすぎ、そうでない場合はメモリ使用量が多すぎます。
アップデート:
さらに検索したところ、次のような例が見つかりました。 IOBufferMemoryDescriptor
で作成できます kIOMemoryPurgeable
オプション。これにより、電話をかけることができます IOMemoryDescriptor::setPurgeable()
メモリに「公正なゲーム」のマークを付けて破棄します。試してみて、結果とともに質問を更新します。
解決
あなたは正しいです。セット kIOMemoryPurgeable
メモリをリクエストするときのオプションの 1 つとして。これは不揮発性として開始され、ページアウトされる可能性がありますが、破棄されません。
OS に破棄させたい場合は、 setPurgeable(kIOMemoryPurgeableVolatile, &oldState );
OS は、必要に応じてそれをディスクにページングするのではなく、破棄します。
メモリにアクセスしたいときは、次のコマンドを呼び出す必要があります。 setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState );
そしてチェックしてください if(oldState != kIOMemoryPurgeableEmpty)
メモリがまだ利用可能な場合は true、メモリが破棄された場合は false になります。
何か問題があった場合は、ぜひお聞きしたいと思います。