gpt4 book ai didi

memory-management - msync 性能是否取决于所提供范围的大小?

转载 作者:行者123 更新时间:2023-12-03 08:17:47 25 4
gpt4 key购买 nike

我正在对映射文件进行许多小的随机写入。我想确保一致性,因此有时会使用 msync,但我不想跟踪我所做的每一个小写入。在当前的 Linux 内核实现中,对整个文件使用 msync 是否会造成性能损失?例如,如果文件是 100GB,但我总共只做了 10MB 的更改?内核是否循环遍历为 msync 提供的范围内的每个页面来查找要刷新的脏页,或者将这些脏页保存在某种链接列表/其他结构中?

最佳答案

TL;DR:不,不是,保存所需信息的内核结构旨在使操作高效,无论范围大小如何。

可映射对象的页面保存在 radix tree 中然而,基数树的 Linux 内核实现还有一个额外的特殊功能:可以用最多 3 个不同的标记来标记条目,并且可以更快地找到和迭代标记的条目。实际使用的数据结构称为“XArray”,您可以在 this LWN article 中找到有关它的更多信息。或在 Documentation/core-api/xarray.rst .

脏页有一个可以设置的特殊标记(PAGECACHE_TAG_DIRTY),以便在需要写回时快速找到它们(例如msyncfsync等)。此外,XArray 提供了一种 O(1) 机制来检查是否存在带有给定标记的任何条目,因此对于页面,即使在查找脏页面之前也可以快速确定是否需要回写。

总之,在整个映射上调用 msync 时,您不应遭受明显的性能损失,而不是仅对较小范围的实际修改页面调用。

关于memory-management - msync 性能是否取决于所提供范围的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68832263/

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