目的:
熟悉页面置换算法及其实现,引入计算机系统性能评价方法的概念。
内容:
编制页面置换算法的模拟程序。
要求:
(1)用随机数方法产生页面走向,页面走向长度为L。
(2)根据页面走向,分别采用FIFO和LRU算法进行页面置换,统计缺页率。
(3)假定可用内存块和页表长度(作业的页面数)分别为m和k,初始时,作业页面都不在内存。
随机数产生程序:
function random : real:
begin Seed : = 125.0(seed + 1.0)
Seed : = Seed8192.0trunc(seed / 8192)
random : = (Seed + 0.5) / 8192
end;
上述随机数发生函数产生的随机数为0.01.0,稍另变化就可得到0n1之间的随机数。
程序开始时,应对变量Seed(实型)赋初值。
#include<iostream>
#include<time.h>
using namespace std;
#define L 20//页面走向长度最大为20
int M; //内存块
struct Pro//定义一个结构体
{
int num, time;
};
int Input(int m, Pro p[L])//打印页面走向状态
{
cout << "请输入页面走向长度L:";
cin >> m;
int i, j;
j = time(NULL);//取时钟时间
srand(j);//以时钟时间x为种子,初始化随机数发生器
cout << "输出随机数: ";
for (i = 0;i < m;i++)
{
p[i].num = rand() % 10 + 1;//产生1到10之间的随即数放到数组p中
p[i].time = 0;
cout << p[i].num << " ";
}
cout << endl;
return m;
}
void print(Pro * page1)//打印当前的页面
{
Pro* page = new Pro[M];
page = page1;
for (int i = 0;i < M;i++)
cout << page[i].num << " ";
cout << endl;
}
int Search(int e, Pro * page1)//寻找内存块中与e相同的块号
{
Pro* page = new Pro[M];
page = page1;
for (int i = 0;i < M;i++)
if (e == page[i].num)
return i;//返回i值
return -1;
}
void timePlus(Pro* page1)//内存中页面时间增加
{
Pro* page = new Pro[M];
page = page1;
for (int i = 0;i < M;i++)
page[i].time++;
}
int foundMaxTime(Pro* page1)
{
Pro* page = new Pro[M];
page = page1;
int max = -1000, n;
for (int i = 0;i < M;i++)
{
if (page[i].time > max)
{
n = i;
max = page[i].time;
}
}
return n;
}
int Max(Pro * page1)//寻找最近最长未使用的页面
{
Pro* page = new Pro[M];
page = page1;
int e = page[0].time, i = 0;
while (i < M) //找出离现在时间最长的页面
{
if (e < page[i].time)
e = page[i].time;
i++;
}
for (i = 0;i < M;i++)
if (e == page[i].time)
return i;//找到离现在时间最长的页面返回其块号
return -1;
}
int Count(Pro * page1, int i, int t, Pro p[L])//记录当前内存块中页面离下次使用间隔长度
{
Pro* page = new Pro[M];
page = page1;
int count = 0;
for (int j = i;j < L;j++)
{
if (page[t].num == p[j].num)
break;//当前页面再次被访问时循环结束
else
count++;//否则count+1
}
return count;//返回count的值
}
int main()
{
int c;
int m = 0;
float n = 0;
Pro p[L];
m = Input(m, p);//调用input函数,返回m值
cout << "请输入可用内存页面数m: ";
cin >> M;
Pro* page = new Pro[M];
do {
for (int i = 0;i < M;i++)//初试化页面基本情况
{
page[i].num = -1;
page[i].time = 100;//将初始化的物理块时间设得很大,这样就优先替换这些物理块
}
int i = 0;
cout << "1:FIFO页面置换" << endl;
cout << "2:LRU页面置换" << endl;
cin >> c;
if (c == 1)//FIFO页面置换
{
n = 0;
cout << "FIFO算法页面置换情况如下:" << endl;
while (i < m)
{
if (Search(p[i].num, page) >= 0) //当前页面在内存中
{
cout << "不缺页" << endl;
timePlus(page);
print(page);
i++; //i加1
}
else //当前页不在内存中
{
int change = foundMaxTime(page);
n++; //缺页次数加1
page[change].num = p[i].num; //把当前页面放入内存中
page[change].time = 0;
timePlus(page);
print(page); //打印当前页面
i++; //指向下一个页面
}
}
cout << "缺页次数:" << n << " 缺页率:" << n / m << endl;
}
if (c == 2)//LRU页面置换
{
n = 0;
int t;
cout << "LRU算法页面置换情况如下:" << endl;
while (i < m)
{
int a;
t = Search(p[i].num, page);
if (t >= 0)//如果已在内存块中
{
cout << "不缺页" << endl;
timePlus(page);
page[t].time = 0; //把与它相同的内存块的时间置0
print(page);
}
else //如果不在内存块中
{
n++; //缺页次数加1
t = Max(page); //返回最近最久未使用的块号赋值给t
page[t].num = p[i].num; //进行替换
print(page);
timePlus(page); //其它的时间加1
page[t].time = 0; //替换后时间置为0
}
i++;
}
cout << "缺页次数:" << n << " 缺页率:" << n / m << endl;
}
} while (c == 1 || c == 2 );
return 0;
}