如何分配由OS在Mac OS X内核扩展中缓存的内存缓冲区?
题
根据我阅读的文档和XNU源,我了解Mac OS X缓存 文件 I/O使用统一的缓冲缓存(UBC)。 UBC根据可用的RAM尽可能大,但是UBC页面是记忆更紧密时要牺牲的一些页面。
在我的驾驶员中,我处理各种磁盘元数据。我希望能够使用UBC或类似的机制来保持这些数据的MRU缓存,以加快事物的速度,但可以使内核能够随时收回该内存。但是元数据不代表 文件 数据,因此不会直接落入UBC的域。我可以使用较低的机制,还是可以以某种方式仅使用处理缓冲区本身的UBC的部分?
我目前正在围绕HFS+源代码进行狩猎,以尝试弄清楚它是否以及如何缓存文件系统元数据,尽管没有成功。
当然,主要的选择是为缓存保留特定的内存区域,并进行我自己的LRU剔除。我可以选择固定的高速缓存大小或使用某种启发式词,但是当RAM丰富而不是在不使用时,它总是会使用太少的内存。
更新:
在搜索更多之后,我发现 IOBufferMemoryDescriptor
可以用 kIOMemoryPurgeable
选项。这让您打电话 IOMemoryDescriptor::setPurgeable()
在其上标记记忆“公平游戏”以丢弃。我将尝试并通过结果更新问题。
解决方案
你是对的。放 kIOMemoryPurgeable
当您请求内存时,作为选项之一。它从非挥发性开始,可能会被分类,但不会被丢弃。
当您想让操作系统丢弃时,请致电 setPurgeable(kIOMemoryPurgeableVolatile, &oldState );
并且在必要时将操作系统丢弃,而不是将其调整到磁盘上。
当您想访问内存时,必须致电 setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState );
并检查 if(oldState != kIOMemoryPurgeableEmpty)
如果存储器仍然可用,这将是正确的,如果已丢弃,则为错误。
我有兴趣听到您是否遇到任何渔获物。