gpt4 book ai didi

c - fadvise vs madvise?我可以同时使用两者吗?

转载 作者:IT王子 更新时间:2023-10-29 01:22:58 26 4
gpt4 key购买 nike

我在一个巨大的文件(太大而无法放入内存)中随机读取数据(每次读取 < 页面大小)。

我通常设置 MADV_DONTNEED,但查看文档和信息似乎我需要 FADV_NOREUSE

我不太明白 madvise()fadvise() 是如何协同工作的。它们是同义词吗?我喜欢其中一个重要吗?它们可以一起使用吗?它们是不同的内核子系统吗? FADV_NOREUSE 是我正在寻找的以获得最佳性能的方法吗?

最佳答案

madvise() 和 posix_fadvise() 不是同义词。madvise() 告诉内核(给出建议)如何处理现有内存区域,而 fadvise() 告诉内核如何处理文件数据的缓存(或 future 缓存)。

例如,如果您使用 mmap() 匿名区域,您应该使用 madvise() 来提示内核不要换出 (MADV_RANDOM) 或仅在访问后换出。 (MADV_SEQUENTIAL)

如果您 mmap() 一个文件或文件的一部分,您可以使用 madvise() 或 fadvise() 来提示内核为您预读(MADV_WILLNEED)或释放该缓存(MADV_DONTNEED)或释放除了上述之外,访问后(POSIX_FADV_NOREUSE,仅 fadvise())。

如果您使用文件而不将数据映射到您的进程内存(不使用 mmap()),您应该只使用 fadvise()。 madvise() 没有任何意义。

就内核子系统而言,在 linux 中,它是相同的子系统,只是引用内存页面和文件缓存的不同方式。请注意,这些只是提示,当内存不足时,内核可能会决定换出或重用缓存数据,尽管有提示。只有 mlock() 和 mlockall() 可以防止这种情况。

在您的情况下,不提供任何提示可能会有所帮助,尤其是当某些页面的读取次数多于其他页面时,因为内核会找出哪些页面是“热门”页面,并会尝试保留在内存中。

关于c - fadvise vs madvise?我可以同时使用两者吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20147881/

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