操作系统从磁盘读取的内容多于程序实际请求的内容,因为程序将来可能需要附近的信息。在我的应用程序中,当我从磁盘中获取一个项目时,我想显示该元素周围的信息间隔。我请求和显示的信息量与速度之间存在权衡。但是,由于操作系统已经读取了比我请求的更多的内容,因此访问这些已经在内存中的字节是免费的。我可以使用什么 API 来找出操作系统缓存中的内容?
或者,我可以使用内存映射文件。在那种情况下,问题就简化为查明页面是否交换到磁盘。这可以在任何常见的操作系统中完成吗?
编辑:相关论文 http://www.azulsystems.com/events/mspc_2008/2008_MSPC.pdf
最佳答案
您确实可以使用第二种方法,至少在 Linux 上是这样。 mmap()
文件,然后使用 mincore()
函数确定驻留哪些页面。从手册页:
int mincore(void *addr, size_t length, unsigned char *vec);
mincore()
returns a vector that indicates whether pages of the calling process's virtual memory are resident in core (RAM), and so will not cause a disk access (page fault) if referenced. The kernel returns residency information about the pages starting at the addressaddr
, and continuing forlength
bytes.
这里当然存在竞争条件 - mincore()
可以告诉您页面是驻留的,但它可能会在您访问它之前被换出。 C'est la vie。
关于windows - 如何获得预读字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2732484/