mmap vs fgetc以避免缓存未命中

时间:2014-11-10 17:56:44

标签: c unix io

我有一个程序用fgetc()读取文件,一个问题是“通过使用mmap()和unmap()可以减少缓存未命中量吗?”

为了测试它,我编写了一段代码,在命令行上给出一个参数,使用mmap和mmap或fgetc返回的地址逐个字符地读取文件并在我的程序中使用valgrind --tool = cachegrind测量缓存未命中数并且mmap不会减少缓存未命中数,但会增加

我整天都在互联网上搜索有用的资源,以帮助我理解为什么会这样做。虽然我可以看到通过将文件加载到内存中,因为它被加载到一个连续的内存区域,并且我们从第一个字符读到最后一个字符,为什么它会增加缓存未命中?。

我正在寻找任何可能有助于我了解实际情况的特定资源或解释。

提前致谢。

1 个答案:

答案 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扩展名。

另见readahead(2)。并linuxatemyram

不希望奇迹出现,瓶颈就是硬件磁盘IO。