实验目的及基本要求
设计和实现:
- 最佳置换算法(Optimal)
- 先进先出置换算法(FIFO)
- 最近最久未使用置换算法(LRU)
- 改进型Clock置换算法
- 页面缓冲置换算法(PBA)
假设模拟的虚拟内存的地址为16位,页面大小为1K ,模拟的物理内存有32K,通过页面访问序列随机发生器实现对上述算法的测试及性能比较。
基本知识:
- 请求分页虚拟内存管理
请求分页虚拟内存管理是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能和置换功能。
- 工作集
多数程序都显示出高度的局部性,也就是说,在一个时间段内,一组页面被反复引用。这组被反复引用的页面随着时间的推移,其成员也会发生变化。有时这种变化是剧烈的,有时这种变化则是渐进的。我们把这组页面的集合称为工作集
- 缺页率
缺页中断次数/总的页面访问次数
前提说明
- 页表用整数数组或结构数组来表示
- 页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。页面访问序列串中的每个元素p表示对页面p的一次访问
- 符合局部访问特性的随机生成算法
(1)确定虚拟内存的尺寸N,工作集的起始位置p,工作集中包含的页数e,工作集移动率m(每处理m个页面访问则将起始位置p +1),以及一个范围在0和1之间的值t;
(2)生成m个取值范围在p和p + e间的随机数,并记录到页面访问序列串中;
(3)生成一个随机数r,0 ≤ r ≤ 1;
(4)如果r < t,则为p生成一个新值,否则p = (p + 1) mod N;
(5)如果想继续加大页面访问序列串的长度,请返回第2步,否则结束。
一、最佳置换算法Optimal
原理:
选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。是一种理想化算法,具有最好性能(对于固定分配页面方式,本法可保证获得最低的缺页率),但实际上却难于实现,故主要用于算法评价参照
全局数据结构设计:
int block = 3;
int access[32];//访问序列
int lost = 0; //没找到的页面数
int index = 0; //指示当前下标
int p; //工作集的起始位置
void generate();//模拟生成访问序列
void initMemory();//初始化存储空间,主要是设置分配空间的大小
bool inMemory (int n); //指定页号是否已经在内存中
//访问序列的长度始终为32,默认初始分配给每种算法的内存空间块数为3
数据结构设计:
void optimal (int n); //访问一个页面,执行一次最佳置换算法
void testOptimal(); //算法实现函数
//最佳适应算法
void optimal (int n)
{
int i = 0, j = 0;
if (inMemory (n))
{
printf ("页面已被调入\n");
}
else
if (index == block)
{
lost++;
int max = 0, pos, tag;
for (i = 0; i < block; i++)
{
tag = -1;
for (j = n + 1; j < 32; j++)
{
if (access[j] == memo[i])
{
tag = j;
break;
}
}
if (tag == -1)
{
max = 32;
pos = i;
break;
}
else
{
if (max < tag)
{
max = tag;
pos = i;
}
}
}
memo[pos] = access[n];
}
else
{
memo[index] = access[n];
index++;
}
}
void testOptimal()
{
initMemory();
int i = 0;
printf ("最佳置换算法:\n");
for (; i < 32; i++)
{
optimal (i);
printf ("%d %d %d\n", memo[0], memo[1], memo[2]);
}
printf("***************************************************\n");
printf ("最佳置换算法:\n");
printf("页面置换次数:%d ,缺页率:%2f \n", lo