根据我阅读的文档和 xnu 源,我了解 Mac OS X使用统一缓冲区缓存 (UBC)缓存文件I/O。UBC 会根据可用 RAM 尽可能地增长,但是当内存变得更紧时,UBC 页面是最先被牺牲的页面。
在我的驱动程序中,我处理各种磁盘元数据。我希望能够使用 UBC 或类似机制来保留这些数据的 MRU 缓存以加快速度,同时让内核能够在需要时收回该内存。然而,元数据并不代表文件数据,因此不直接属于 UBC 的域。是否有我可以使用的较低级别的机制,或者我可以以某种方式仅使用 UBC 中处理缓冲区本身的部分?
我目前正在寻找 HFS+ 源代码,试图弄清楚它是否以及如何缓存文件系统元数据,尽管没有取得多大成功。
主要的替代方案当然是为缓存保留一个特定的内存区域并进行我自己的 LRU 剔除。我可以选择固定的缓存大小或使用某种启发式方法,但是当 RAM 充足时它总是会使用太少的内存,而当它不充足时它总是会使用太多的内存。
更新:
在搜索了更多之后,我发现IOBufferMemoryDescriptor
可以使用该kIOMemoryPurgeable
选项创建实例。这使您可以调用IOMemoryDescriptor::setPurgeable()
它来标记要丢弃的内存“公平游戏”。我会尝试并用结果更新问题。