Linux内核如何交换文件映射的页面?

4
我使用文件映射来读取一个20 GB的文件。当主内存用尽时,内核是如何将映射到磁盘的文件页面交换到磁盘上的?
我猜测一种可能的方式是将页面条目设置为NULL。那么下一次访问该页面时,将再次调用do_no_page()函数将文件映射到内存中。这样对吗?
另一个问题是内核使用什么优先级来交换内存页面?是正常页面还是映射到文件的页面?

不要误会,但我无法理解你想要实现什么。请澄清你的问题。 - batbrat
1个回答

2

在页面表中,每个条目都有一个invalid位。当页面被换出到硬盘时,其invalid位被设置。每当访问该页面时,MMU(处理器内存管理单元)会引发异常,系统负责重新将页面加载到内存中,然后重新执行故障指令。

通常交换的页面是不经常访问的页面。每个页面表条目中还有另一个位用于知道页面是否已被访问过。如何选择要与此单个位一起交换的正确页面是一个大问题,在 Andrew Tanenbaum 的优秀书籍 操作系统 中有一整章关于这个问题。

您可以使用mlock()系统调用将页面锁定到RAM内存中。如果使用mmap()将文件映射到内存中,则可以使用MAP_LOCKED标志进行操作(请参阅手册)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接