请页式管理
请求分页式管理
根据调入方式的不同,虚拟分页式存储管理又分为请求分页式管理与预调入页式管理。预调入页式管理,根据某种算法动态预测进程最可能访问哪些页面,在使用前预先调入内存,尽量做到进程在访问页面之前已经预先调入该页,而且每次可以调入多个页面,以减小磁盘的
用得较多的分页式虚拟存储管理是请页式
请求调页也可看做一种动态内存分配技术,它把页面的分配推迟到不能再推迟为止,在内存总数保持不变的情况下,请求调页从总体上能使系统有更大的吞吐量。但是系统为此也要付出额外的开销,这是因为由请求调页所引发的每个“缺页”异常必须由内核处理,这将浪费
请页机制
当一个进程运行时,
- 程序出现错误,例如,要访问的虚地址在
PAGE_OFFSET(3GB)
之外,则该地址无效,Linux 将向进程发送一个信号并终止进程的运行; - 虚地址有效,但其所对应的页当前不在物理内存中,即缺页异常,这时,操作系统必须从磁盘或交换文件
( 此页被换出) 中将其装人物理内存。 - 要访问的虚地址被写保护,即保护错误,这时,操作系统必须判断
: 如果是某个用户进程正在写当前进程的地址空间,则发送一个信号并终止进程的运行;如果错误发生在旧的共享页上时,则处理方法有所不同,也就是要对这一共享页进行复制,这就是曾经描述过的“写时复制”技术。
缺页中断
缺页中断与一般中断的区别:
- 一般中断是在指令结束后接受中断请求并响应;缺页中断是在指令执行期间所要访问的指令或数据不在内存时产生和处理的
- 一条指令在执行期间可能产生多次缺页中断
请求调页
当页从未被访问时则调用 do_no_page()
函数。有两种方法可以装入所缺的页,采用哪种方法取决于这个页是否与磁盘文件建立了映射关系。该函数通过检查虚存区描述符的
nopage 域不为NULL 。在这种情况下,说明某个虚存区映射了一个磁盘文件,nopage 域指向从磁盘进行读入的函数。nopage 域为NULL 。在这种情况下,虚存区没有映射磁盘文件,也就是说,它是个匿名映射。因此,dono_page() 调用do_anonymous_page()
函数获得一个新的页面。
对于do_anonymous_page()
函数,当处理写访问时,该函数调用 _get_free_page
分配一个新的页面,并把新页面填为
相反,当处理读访问时empty_zero_page
变量中
地址变换