根据我阅读的文档和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) 如果存储器仍然可用,这将是正确的,如果已丢弃,则为错误。

我有兴趣听到您是否遇到任何渔获物。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top