如何为共享文件/区域提供页面错误服务

时间:2018-04-23 10:31:29

标签: linux windows operating-system

  • 2个过程;需求分页环境中的P1,P2
  • 两者都将文件区域F映射到其虚拟地址空间的区域(注意:虚拟地址空间的区域可能不同),只读(例如,P1和P2都可以执行相同的操作)可执行文件,或在同一个DLL中的映射,F可以对应于.text部分)
  • P1首先从此内存请求加载,导致页面错误。 OS在区域映射中查找错误地址,看到F映射到该区域,找到要使用的帧,并在更新P1页表结构之前将必要的F块读入所述帧。

现在,当P2从同一个内存请求加载时会发生什么(例如,在共享DLL中执行相同的例程)? P2首次访问时肯定会出现故障;但是,操作系统如何知道数据已经存在于内存中,并且应该更新P2s页表结构以指向已驻留的页面框架?

我唯一的结论是,操作系统必须维护一个跟踪每个活动文件映射区域的全局结构:内存中驻留的部分以及它们驻留在哪些帧中。

作为一个具体的参考点,了解它在Linux或Windows下的工作原理会很棒。

1 个答案:

答案 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的指针,这些指针从文件中读取数据。