我有一个程序用fgetc()读取文件,一个问题是“通过使用mmap()和unmap()可以减少缓存未命中量吗?”
为了测试它,我编写了一段代码,在命令行上给出一个参数,使用mmap和mmap或fgetc返回的地址逐个字符地读取文件并在我的程序中使用valgrind --tool = cachegrind测量缓存未命中数并且mmap不会减少缓存未命中数,但会增加
我整天都在互联网上搜索有用的资源,以帮助我理解为什么会这样做。虽然我可以看到通过将文件加载到内存中,因为它被加载到一个连续的内存区域,并且我们从第一个字符读到最后一个字符,为什么它会增加缓存未命中?。
我正在寻找任何可能有助于我了解实际情况的特定资源或解释。
提前致谢。
答案 0 :(得分:3)
有几个缓存。我猜你在谈论内核文件系统缓存(或page cache),而不是关于CPU cache。
您可以使用madvise(2)系统调用通过内存映射提供提示(在mmap
之后,或将MAP_POPULATE
传递给mmap(2)),或使用posix_fadvise(2)为文件I / O提供提示(在read
之前)。
如果使用stdio(3),您可能需要更大的缓冲区(例如64K字节或更多),请参阅setvbuf(3)。请注意,GNU glibc
fopen(3)可以mmap
在模式中使用m
扩展名。