我使用文件映射来读取20 GB的文件。当主内存耗尽时,内核如何将文件映射页面交换到磁盘?
我猜想一种可能的方法是将页面条目设置为NULL。然后,如果访问该页面,则再次调用do_no_page()
函数将文件映射到内存。这样对吗?
另一个问题是内核用于交换内存页面的优先级是什么?普通页面或文件映射页面?
答案 0 :(得分:2)
页表中的每个条目都有一个invalid
位。将页面交换到硬盘驱动器时,会设置其invalid
位。每当访问页面时,MMU(处理器内部的内存管理单元)引发异常,系统负责将页面重新加载到内存中。然后重新执行错误的指令。
通常,交换的页面是不经常访问的页面。每个页表条目中还有一个位,以便在访问页面时知道。 如何选择正确的页面来交换这一位是一个很大的问题,Andrew Tanenbaum在非常好的操作系统中有一整章。
您可以使用mlock()
系统调用将页面锁定到RAM内存中。如果使用mmap()
将文件映射到内存中,可以使用标记MAP_LOCKED(参见手册)来完成。