什么是缺页中断:算法
进程线性地址空间里的页面没必要常驻内存,在执行一条指令时,若是发现他要访问的页没有在内存中(存在位为0),那么中止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可经过从外存加载加载该页到内存的方法来排除故障,以后,原先引发的异常的指令就能够继续执行,而再也不产生异常。数组
页面调度算法:并发
页式虚拟存储器实现的一个难点是设计页面调度(置换)算法,即将新页面调入内存时,若是内存中全部的物理页都已经分配出去,就要按某种策略来废弃某个页面,将其所占据的物理页释放出来,好的算法,让缺页率下降。常见的有先进先出调度算法,最近最少调度算法,最近最不经常使用调度算法。ide
缺页中断的计算:函数
做业自己的程序编制方法。程序编制的方法不一样,对缺页中断的次数有很大影响。spa
例如:有一个程序要将128×128的数组置初值“0”。现假定分给这个程序的主存块数只有一块,页面的尺寸为每页128个字,数组中的元素每一行存放在一页中,开始时第一页在主存。若程序以下编制:操作系统
Var A: array[1..128] of array [1..128] of设计
integer;htm
for j := 1 to 128进程
do for i := 1 to128
do A[i][j]:=0
则每执行一次A[i][j] :=0就要产生一次缺页中断,因而总共要产生(128×128-1)次缺页中断。
若是从新编制这个程序以下:
Var A: array[1..128] of
array[1..128] of
integer;
for i := 1 to128
do for j := 1 to128
do A[i][j] := 0
那么总共只产生(128-1)次缺页中断。
显然,虚拟存储器的效率与程序的局部化程度密切相关。程序的局部化有两种:时间局部化和空间局部化。
缺页中断就是要访问的页不在主存,须要操做系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。
中断
是指计算机在执行程序的过程当中,当出现异常状况或特殊请求时,计算机中止现行程序的运行,转向对这些异常状况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。
缺页中断的顺序
缺页中断发生时的事件顺序以下:
1) 硬件陷入内核,在内核堆栈中保存程序计数器。大多数机器将当前指令的各类状态信息保存在特殊的CPU寄存器中。
2) 启动一个汇编代码例程保存通用寄存器和其余易失的信息,以避免被操做系统破坏。这个例程将操做系统做为一个函数来调用。
3) 当操做系统发现一个缺页中断时,尝试发现须要哪一个虚拟页面。一般一个硬件寄存器包含了这一信息,若是没有的话,操做系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在作什么。
4) 一旦知道了发生缺页中断的虚拟地址,操做系统检查这个地址是否有效,并检查存取与保护是否一致。若是不一致,向进程发出一个信号或杀掉该进程。若是地址有效且没有保护错误发生,系统则检查是否有空闲页框。若是没有空闲页框,执行页面置换算法寻找一个页面来淘汰。
5) 若是选择的页框“脏”了,安排该页写回磁盘,并发生一次上下文切换,挂起产生缺页中断的进程,让其余进程运行直至磁盘传输结束。不管如何,该页框被标记为忙,以避免由于其余缘由而被其余进程占用。
6) 一旦页框“干净”后(不管是马上仍是在写回磁盘后),操做系统查找所需页面在磁盘上的地址,经过磁盘操做将其装入。该页面被装入后,产生缺页中断的进程仍然被挂起,而且若是有其余可运行的用户进程,则选择另外一个用户进程运行。
7) 当磁盘中断发生时,代表该页已经被装入,页表已经更新能够反映它的位置,页框也被标记为正常状态。
8) 恢复发生缺页中断指令之前的状态,程序计数器从新指向这条指令。
9) 调度引起缺页中断的进程,操做系统返回调用它的汇编语言例程。
10) 该例程恢复寄存器和其余状态信息[1]