现在,当P2从同一个内存请求加载时会发生什么(例如,在共享DLL中执行相同的例程)? P2首次访问时肯定会出现故障;但是,操作系统如何知道数据已经存在于内存中,并且应该更新P2s页表结构以指向已驻留的页面框架?
我唯一的结论是,操作系统必须维护一个跟踪每个活动文件映射区域的全局结构:内存中驻留的部分以及它们驻留在哪些帧中。
作为一个具体的参考点,了解它在Linux或Windows下的工作原理会很棒。
答案 0 :(得分:1)
考虑Linux实施:
您要问的是通过页面缓存维护的。如果保持简单:IO访问期间的每个文件页面首先被读入页面缓存(内存中的缓存文件数据) - 聪明的哈希表。每次进一步访问文件都是通过页面缓存完成的。更具体地,使用以下方法:
page = find_get_page(mapping, index);
此处的映射 - 是指向struct address_space
类型
struct address_space {
struct inode *host; /* owning inode */
index
- 是文件中的块偏移量。
因此,知道文件(参见inode和地址空间)和readed页面偏移量的P2将在页面错误时查询页面缓存。因为P1已经将页面放入页面缓存中,所以P2会找到它并只返回指向适当struct page
的指针,这些指针从文件中读取数据。