作为简单的测试,我仅仅使用perl的Sys::Mmap模块来进行文件映射(使用“mmap”子程序,我相信它直接映射到底层C函数),然后让该进程休眠。当执行此操作时,代码在从mmap调用返回之前花费了一分钟以上的时间,尽管这个测试没有对mmap映射的文件做任何操作,甚至没有读取。
我猜想,也许Linux需要在第一次 mmap 映射时读取整个文件,因此在第一个进程(处于休眠状态)中映射文件后,我在另一个进程中调用了一个简单的测试,试图读取文件的前几兆字节。
令人惊讶的是,第二个进程也花费了很长时间才从 mmap 调用中返回,大约与第一次 mmap 文件的时间相同。
我确保使用了 MAP_SHARED,并且第一次映射文件的进程仍然处于活动状态(即它没有终止,并且 mmap 没有被解除映射)。
我期望 mmap 文件将允许我给多个工作进程有效地随机访问大文件,但是如果每个 mmap 调用都需要先读取整个文件,那就有点困难了。我还没有测试使用长时间运行的进程来查看在第一次延迟后是否可以快速访问,但是我预计使用 MAP_SHARED 和另一个单独的进程应该足够了。
我的理解是 mmap 应该会立即返回,而 Linux 应该按需加载块,但是我看到的行为相反,表明它需要在每次调用 mmap 时读取整个文件。
你知道我做错了什么,或者我完全误解了 mmap 的工作原理吗?