最近最久未使用(LRU)页面置换算法原理及模拟实现
2016-04-01 22:50
846 查看
FIFO算法的性能较差,它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用状况。最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做出决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有也面中t值最大的,即最近最久未使用的页面予以淘汰。
1)寄存器
为了记录某进程在内存中各页的使用情况,须为每个内存中的页面配置一个移位寄存器,可表示为
R=Rn−1Rn−2⋅⋅⋅R2R1R0
当进程访问某物理块时,要将相应的寄存器的Rn−1位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果我们把n位寄存器的数看作是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。
2)栈
可利用一个特殊的栈保持当前使用的各个页面的页面号。每当进程访问某页面是,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最近最久未使用页面的页面号。
输出结果:
LRU算法的硬件支持
LRU算法虽然是一种比较好的算法,但是要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速得知道哪一页是最近最久未使用的页面,须有寄存器和栈两类硬件之一的支持。1)寄存器
为了记录某进程在内存中各页的使用情况,须为每个内存中的页面配置一个移位寄存器,可表示为
R=Rn−1Rn−2⋅⋅⋅R2R1R0
当进程访问某物理块时,要将相应的寄存器的Rn−1位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果我们把n位寄存器的数看作是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。
2)栈
可利用一个特殊的栈保持当前使用的各个页面的页面号。每当进程访问某页面是,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最近最久未使用页面的页面号。
代码模拟
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; class LRU { public: LRU() { siz=0; } bool isOutofBoundary() { if(siz>=N)return true; return false; } int indexOfElement(int o) { for(int i=0; i<N; i++) { if(o==a[i]) return i; } return -1; } void push(int o) { int t=-1; if(!isOutofBoundary()&&indexOfElement(o)==-1) { a[siz]=o; siz++; } else if(isOutofBoundary()&&indexOfElement(o)==-1) { for(int i=0; i<siz-1; i++) { a[i]=a[i+1]; } a[siz-1]=o; } else { t=indexOfElement(o); for(int i=t; i<siz-1; i++) { a[i]=a[i+1]; } a[siz-1]=o; } } void showMemoryBlock() { printf("now memory use:\n"); for(int i=0; i<siz; i++) { printf(i==siz-1?"%d\n":"%d ",a[i]); } } private: int N=5; int a[5],siz; }; int main() { int iter[]= {4,7,0,7,1,0,1,2,1,2,6}; LRU lru; printf("%d %d %d\n",sizeof(iter),sizeof(int),sizeof(iter)/sizeof(int)); for(int i=0; i<sizeof(iter)/sizeof(int); i++) { lru.push(iter[i]); lru.showMemoryBlock(); } return 0; }
输出结果:
now memory use: 4 now memory use: 4 7 now memory use: 4 7 0 now memory use: 4 0 7 now memory use: 4 0 7 1 now memory use: 4 7 1 0 now memory use: 4 7 0 1 now memory use: 4 7 0 1 2 now memory use: 4 7 0 2 1 now memory use: 4 7 0 1 2 now memory use: 7 0 1 2 6 Process returned 0 (0x0) execution time : 0.033 s Press any key to continue.
相关文章推荐
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- JavaScript避免内存泄露及内存管理技巧
- J2ME编程中的几个重要概念介绍
- c++实现逐行读取配置文件写入内存的示例
- Shell脚本查看进程内存真实占用情况
- w3wp.exe占用cpu过高的解决方法第1/2页