C 多个匿名页面的提前故障处理

C 多个匿名页面的提前故障处理,c,linux,memory-management,mmap,virtual-memory,C,Linux,Memory Management,Mmap,Virtual Memory,我已经分配了大量带有mmap/MAP\u ANONYMOUS的页面,这些页面用于只会增长的列表 在Linux中访问多个页面之前,有没有一种方法可以让内核智能地预先为我准备多个页面 MAP\u POPULATE标志似乎是MAP\u ANONYMOUS的禁止操作 我当然可以在样式中循环指针: for (i = 1; i < num_pages_to_prefault; i++) *((char *)pointer_to_current_page + i * sysconf(_SC_PA

我已经分配了大量带有
mmap/MAP\u ANONYMOUS
的页面,这些页面用于只会增长的列表

在Linux中访问多个页面之前,有没有一种方法可以让内核智能地预先为我准备多个页面

MAP\u POPULATE
标志似乎是
MAP\u ANONYMOUS
的禁止操作

我当然可以在样式中循环指针:

for (i = 1; i < num_pages_to_prefault; i++)
    *((char *)pointer_to_current_page + i * sysconf(_SC_PAGE_SIZE)) = 0;

这将只导致一个上下文切换,并预故障许多页面,或者如果它们没有映射或已经在我的常驻集中,则保持它们不变。

您正在寻找的调用是
madvise()
带有
madvise\u将需要

使用
mlock
如何?我从未使用过它,但可能
madvise()
使用
MADV\u将需要
MADV\u顺序
?@Macattack谢谢
MADV_WILLNEED
正是我所需要的。Linux似乎遵守了这一建议。在前面4Mb的块中出错给了我25%的加速。如果你把它作为一个答案发布,那么我会给你评分。@KerrekSB尝试过它,比手动修改每个页面更慢。该死的,只有最新的内核支持这一点。它在我的开发系统上很有吸引力,但在运行旧内核版本的集群上却不起作用。需要一些不同的东西
prefault_memory(void * start_address, size_t length);