免责声明:此问题与我的操作系统类有关。但是,它不适用于任何特定的家庭作业问题。我只是想了解。
到目前为止,我认为我对需求分页的了解。每个进程都有自己的分页表。该表包含逻辑地址的索引,其对应的物理地址,以及指示页面当前是否已加载到主存储器的有效/无效位。
当访问页面时,如果有效/无效位设置为有效,则只需通过表中的逻辑地址条目在主存储器中访问该页面。如果页面未包含在物理内存中,则会生成页面错误。这会导致程序尝试将页面加载到内存中。
系统首先检查请求的地址是否有效。如果不是,则终止该过程。如果地址有效,则系统检查空闲帧。如果找到空闲帧,则系统从磁盘加载所请求的数据并将其放置在空闲帧中。有效/无效位在分页表中设置为有效,逻辑地址设置为先前空闲帧,程序可以继续执行。
如果不存在空闲帧,则系统必须换出当前使用的帧并将所请求的数据放入帧中。系统采用LRU,MRU等算法来确定要换出的页面。系统交换旧页面,在新页面中加载,然后将控制权返回给流程。
这是我的问题:当换出完整帧时,如何设置访问该帧的分页表的有效/无效位?也就是说,系统如何知道进程的分页表访问正在被换出的帧?
这是一个例子。假设有两个进程,每个进程都有大小为2的分页表和一个大小为2的物理内存。让进程的分页表如下:
处理虚拟内存:
Address Contents
0 'A'
1 'B'
进程B虚拟内存:
Address Contents
0 'C'
1 'D'
处理分页表:
Logical Physical Valid/Invalid
0 0 Valid
1 0 Invalid
进程B分页表:
Logical Physical Valid/Invalid
0 1 Valid
1 0 Invalid
主记忆:
Address Contents
0 'A'
1 'C'
现在假设进程A尝试访问其逻辑地址B.系统交换出主存储器地址1的内容并交换为“D”。系统如何知道在进程的B分页表中将有效/无效位设置为0的逻辑地址无效?
答案 0 :(得分:1)
页面表本身或OS内核中的其他位置有更多控制字段,用于区分根本没有映射的内存范围(从未分配/映射或已释放/未映射)和内存范围指向已被换出的内存位置。在这两种情况下都无法访问范围,并且访问会导致页面错误,但在这些情况下,操作系统会以不同方式处理此页面错误。在前者中它终止了这个过程。在后者中,它试图将数据带回内存并将映射恢复到可以访问数据的状态。
操作系统知道物理内存的页面在哪里使用。它既可以扫描页表,也可以查询它所维护的数据结构。如果操作系统需要从进程中窃取页面,它会保存它(如果已被修改),它会改变映射,以便进程无法在没有操作系统干预的情况下直接访问此页面,然后在其他地方重用此页面,例如在不同的过程中,通过填写正确的数据并适当地映射它,以便过程可以访问数据。