由于程序可能会远大于内存,需要引入虚拟内存。基本思想是:每个程序都拥有自己的地址空间,这个空间被分割成很多块,每一块称作为一个页面,每一页有连续的地址范围,这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射,而当程序引用到一部分不在内存的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。如果一个页面没有映射,内存管理单元注意到它没有映射时,使CPU陷入到操作系统,这个陷阱称为缺页中断。
【转载】关于操作系统页面替换算法http://blog.csdn.NET/wanghao109/article/details/13003479
页面置换:在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断(page
fault)。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
典型的置换算法有四种,如下所示:
OPT:最佳替换算法(optional replacement)。替换下次访问距当前时间最长的页。opt算法需要知道操作系统将来的事件,显然不可能实现,只作为一种衡量其他算法的标准。
分析:(F表示页帧最初填满时出现page fault)
a.需要页面2,内存中还有空闲位置,直接加入页面2
b.需要页面3,内存中还有空闲位置,直接加入页面3
c.需要页面2,内存中已经存在页面2,不加入任何页面
d.需要页面1,内存中还有空闲位置,直接加入页面1
e.需要页面5,页面2距离下次访问之间的距离为1,页面3距离下次访问距离为3,页面1没有下次访问(距离为无穷 大),所以替换掉页面1
f.需要页面2,内存中已经存在页面2,不加入任何页面
g.需要页面4,页面2,3,5距离下次访问的距离依次是3,2,1,所以替换掉页面2
h.需要页面5,内存中存在页面5,不改变
i.需要页面3,内存中存在页面3,不改变
j.需要页面2,页面4,3,5距离下次访问的距离依次是无穷大,无穷大,1,此时按照先后顺序替换掉页面4
k.需要页面5,内存中存在页面5,不改变
L.需要页面2,内存中存在页面2,不改变
LRU:最近最少使用(Least Recently Used).替换上次使用距离当前最远的页。根据局部性原理:替换最近最不可能 访问到的页。性能最接近OPT,但难以实现。可以维护一个关于访问页的栈或者给每个页添加最后访问的时间标签,但开销都很大。
分析:(F表示页帧最初填满时出现page fault)
a.需要页面2,内存中还有空闲位置,直接加入页面2
b.需要页面3,内存中还有空闲位置,直接加入页面3
c.需要页面2,内存中已经存在页面2,不加入任何页面,这里重置了2的最近历史访问记录
d.需要页面1,内存中还有空闲位置,直接加入页面1
e.需要页面5,页面2,3,1距离最近一次历史访问的距离依次为2,3,1(步骤c中重置了2的访问记录).所以替换掉页 面3.
f.需要页面2,内存中已经存在页面2,不加入任何页面,重置页面2的访问记录
g.需要页面4,页面2,5,1距离最近一次历史访问的距离依次是1,2,3,所以替换掉页面1
h.需要页面5,内存中存在页面5,不改变,重置页面5的访问记录
i.需要页面3,页面2,5,4距离最近一次历史访问的距离依次为3,1,2,所以替换掉页面2
j.需要页面2,页面3,5,4距离最近一次历史访问的距离依次为1,2,3,所以替换掉页面4
k.需要页面5,内存中存在页面5,不改变
L.需要页面2,内存中存在页面2,不改变
FIFO:先进先出(First In First Out),将页面看做一个循环缓冲区,按循环方式替换。这是实现最为简单的算法,隐含的逻辑是替换驻留在内存时间最长的页。但由于一部分程序或数据在整个程序的生命周期中使用频率很高,所以会导致反复的换入换出。
分析:
策略极为简单,如果内存中有空闲位置,则直接替换。否则,可以先想象有一个指针,开始指向第一个位置,没发生替换则指针位置不变,每次需要替换时替换指针所指的位置,然后将指针向后移动一位(若指针位于最后,则移动到内存第一个位置)。
Clock:时钟替换算法(Clock),给每个页帧关联一个使用位。当该页第一次装入内存或者被重新访问到时,将使用位置为1。每次需要替换时,查找使用位被置为0的第一个帧进行替换。在扫描过程中,如果碰到使用位为1的帧,将使用位置为0,在继续扫描。如果所谓帧的使用位都为0,则替换第一个帧。
分析:(表示说明:页面:“2(1)”表示页面2的使用位为1。"p(n)"表示扫描指针指向第n个的位置)
首先扫描指针p指向第一个帧位置p(1),每次发生替换(或者内存中有空闲位置时进行的替换),指针加1。
a.需要页面2,内存中还有空闲位置,直接加入页面2,得到2(1),p(2).
b.需要页面3,内存中还有空闲位置,直接加入页面3,得到2(1),3(1),p(3).
c.需要页面2,内存中已经存在页面2,不加入任何页面,且这不是页面2的第一次放置,得到2(1),3(1),p(3).
d.需要页面1,直接加入页面1,得到2(1),3(1),1(1),p(1)
e.需要页面5,第一轮扫描将2,3,1的使用位都置为0,然后替换掉页面2,得到5(1),3(0),1(0),p(2)
f.需要页面2,扫描到页面3的使用位为0,所以替换页面3,得到5(1),2(1),1(0),p(3)
g.需要页面4,扫描到页面1的使用位为0,所以替换页面1,得到5(1),2(1),4(1),p(1)
h.需要页面5,内存中存在页面5,不改变,得到5(1),2(1),4(1),p(1)
i.需要页面3,第一轮扫描将5,2,4的使用位都置为0,然后替换到页面5,得到3(1),2(0),4(0),p(2)
j.需要页面2,扫描到页面2的使用位为0,由于2被重新访问,所以将2的使用位置为1,得到3(1),2(1),4(0),p(2),注 意此时由于未发生页错误,p指针不加1.只是重置了使用位(记住:每次新加入的页使用位都为1)
k.需要页面5,第一轮扫描将2的使用位置为0,替换掉页面4,得到3(1),2(0),5(1),p(1)
L.需要页面2,重置页面2的使用位为1,指针p不变,得到3(1),2(1),5(1),p(1)
总结:
1.内存中不存在页面n,而内存中有空闲位置时,直接加入页面n(1),p加1
2.内存中不存在页面n,且内存中没有空闲位置时,发生替换n(1), p加1
3.内存中存在页面n,,p不变,将页面n重置为n(1)(不管页面n之前使用位为1或0)
改进后的时钟算法:设置使用位u,修改位m
1.最近未被访问,未被修改(u=0,m=0)
2.最近被访问,未被修改(u=1,m=0)
3.最近未被访问,被修改(u=0,m=1)
4.最近被访问,被修改(u=1,m=1)
a.从指针当前位置开始扫描,不修改使用位,对找到的第一个(u=0,m=0)进行替换
b.如果a失败,找到第一个(u=0,m=1)进行替换,扫描过程中,将使用位u置为0
c,如果b失败,此时指针回到起始位置,且所有帧的使用位为0,重复步骤a,如果有必要,重复步骤b,直到找到为止