gpt4 book ai didi

macos - 如何分配可由操作系统回收用于在 Mac OS X 内核扩展中进行缓存的内存缓冲区?

转载 作者:行者123 更新时间:2023-12-01 18:10:42 25 4
gpt4 key购买 nike

根据我读过的文档和 xnu 源代码,我了解到 Mac OS X 使用统一缓冲区缓存 (UBC) 缓存文件 I/O。 UBC 会根据可用 RAM 尽可能增大,但当内存变得紧张时,UBC 页面将首先被牺牲。

在我的驱动程序中,我处理各种磁盘上的元数据。我希望能够使用 UBC 或类似的机制来保留此数据的 MRU 缓存以加快速度,同时让内核能够在需要时收回该内存。然而,元数据并不代表文件数据,因此不直接属于 UBC 的领域。是否有我可以使用的较低级别的机制,或者我可以以某种方式仅使用 UBC 中处理缓冲区本身的部分吗?

我目前正在寻找 HFS+ 源代码,试图弄清楚它是否以及如何缓存文件系统元数据,尽管没有取得太大成功。

主要的替代方案当然是为缓存保留特定的内存区域并进行我自己的 LRU 剔除。我可以选择固定的缓存大小或使用某种启发式方法,但当 RAM 充足时,它总是会使用太少的内存,而当 RAM 充足时,它总是会使用太多内存。

更新:

经过更多搜索后,我发现 IOBufferMemoryDescriptor 的实例可以使用kIOMemoryPurgeable选项创建。这让您可以调用IOMemoryDescriptor::setPurgeable()在其上标记内存“公平游戏”以便丢弃。我会尝试一下并用结果更新问题。

最佳答案

你是对的。当您请求内存时,将 kIOMemoryPurgeable 设置为选项之一。它一开始是非 volatile 的,可能会被调出,但不会被丢弃。

当您想让操作系统丢弃它时,请调用 setPurgeable(kIOMemoryPurgeableVolatile, &oldState );,操作系统将在必要时丢弃它,而不是将其分页到磁盘。

当你想访问内存时,你必须调用setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState );并检查if(oldState != kIOMemoryPurgeableEmpty),如果内存仍然可用,如果已被丢弃,则返回 false。

我很想知道您是否遇到任何问题。

关于macos - 如何分配可由操作系统回收用于在 Mac OS X 内核扩展中进行缓存的内存缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com