4

我使用文件映射来读取 20 GB 的文件。而当主存耗尽时,内核如何将文件映射页面交换到磁盘?

我猜一种可能的方法是将页面条目设置为NULL。然后下次如果访问该页面,do_no_page()将再次调用该函数以将文件映射到内存。这样对吗?

另一个问题是内核用来交换内存页的优先级是什么?普通页面还是文件映射页面?

4

1 回答 1

2

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

通常被交换的页面是不经常访问的页面。每个页表条目中还有一个位可以知道何时访问了页面。如何选择正确的页面来交换这个单个位是一个大问题,在Andrew Tanenbaum的非常好的操作系统中有一个完整的章节。

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

于 2010-02-01T13:55:41.740 回答