OS实验四:页面置换算法
OS实验四:页面置换算法
github地址:https://github.com/RebekahYuuu/OS_Experiment_04
一、实验目的
- 设计和实现【最佳置换算法OPT】、【先进先出置换算法FIFO】、【最近最久未使用置换算法LRU】、【页面缓冲置换算法PBA】;
- 通过页面访问序列随机发生器实现对上述算法的测试及性能比较。
二、知识背景说明
请求分页虚拟内存管理
工作集与缺页率
-
工作集
多数程序都显示出高度的局部性,也就是说,在一个时间段内,一组页面被反复引用。这组被反复引用的页面随着时间的推移,其成员也会发生变化。有时这种变化是剧烈的,有时这种变化则是渐进的。我们把这组页面的集合称为工作集。 -
缺页率
缺页率 = 缺页中断次数/页面访问次数
三、最佳置换算法OPT
- 基本思想
选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存 - 评价
理想化算法,具有最好性能(对于固定分配页面方式,本法可保证获得最低的缺页率),但实际上却难于实现,故主要用于算法评价参照 - 假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
进程运行时,先将7, 0, 1三个页面依次装入内存。
进程要访问页面2时,产生缺页中断,根据最佳置换算法,选择第18次访问才需调入的页面7予以淘汰。
然后,访问页面0时,因为已在内存中所以不必产生缺页中断。
访问页面3时又会根据最佳置换算法将页面1淘汰……依此类推,如图。
可以看到,发生缺页中断的次数为9,页面置换的次数为6。
实现方式
void OPT()
{
int i = 0;
int k = 0;
int loadInEmpty = 0;//在空页面载入该物理块
int loadByCover = 0;
int alreadyLoaded = 0;
//输出当前内存页面中分别装入的物理块
printPages(i);
for (i = 0; i < setBlockNum; ++i)//每装入一个物理块,进行一次检验
{
initLocatFirstUseInTheFuture();
//OPT确定每一个物理块的载入位置
loadBlockByOPT(i);
//输出当前内存页面中分别装入的物理块
printPages(i);
}
}
//OPT确定每一个物理块的载入位置
void loadBlockByOPT(int i)
{
int k = 0;
int loadInEmpty = 0;//在空页面载入该物理块
int loadByCover = 0;
int alreadyLoaded = 0;
for (k = 0; k < setPageNum; ++k)//先查看是否有空位
{
if (page[k] == -1)//当前页面为空
{
page[k] =