页面置换算法的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目5 页面置换算法的实现
5.1 题目的主要研究内容及预期达到的目标
(1)该程序模拟操作系统常用的页面置换算法;
A、最佳置换算法(OPT)
B、先进先出置换算法(FIFO)
C、最近最久未使用置换算法(LRU)
(2)理解页面置换算法相关内容;
(3)掌握页面置换算法主要流程;
(4)掌握常用页面置换算法的实现过程。

5.2 题目研究的工作基础或实验条件
(1)硬件环境:装有Linux操作系统(虚拟机)的计算机一台。

(2)软件环境:vim编辑器、Visual C++。

5.3 设计思想
(1)页面的随机生成
使用rand()函数随机产生页面号,用数组装入页面号,模拟页面调入内存中发生页面置换的过程。

整个过程,都是使用数组来实现每个算法,模拟队列,模拟堆栈的功能,实现每一个置换算法。

(2)先进先出(FIFO)置换算法的思路
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总指向最老的页面。

(3)最近久未使用(LRU)置换算法的思路
最近久未使用置换算法的替换规则,是根据页面调入内存后的使用情况来进行决策的。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当需淘汰一个页面的时候选择现有页面中其时间值最大的进行淘汰。

(4)最佳(OPT)置换算法的思路
其所选择的被淘汰的页面,奖是以后不使用的,或者是在未来时间内不再
被访问的页面,采用最佳算法,通常可保证获得最低的缺页率
5.4 流程图
图5-1 最佳置换算法(OPT )流程图 开始
初始化数据
结束
N
Y
页面是否存在
显示物理块信息
计算并输出缺页率
N
Y
选择以后最长时间内不被
访问的页面作为淘汰页 i 指向下一个页面
物理块是否空闲 将页面放到空闲物理块
i<页面长度
图5-2 先进先出置换算法(FIFO ) 开始
初始化数据
结束
N
Y
页面是否存在
显示物理块信息
计算并输出缺页率
N
Y 选择最先进入的页面作为淘汰页 i 指向下一个页面
物理块是否空闲
将页面放到空闲物理块
i<页面长度
图5-3 最近最久未使用置换算法(LRU )
5.5 主要程序代码
#include<iostream>
#include<stdlib.h>
using namespace std;
int const InsideCount=6;//内存中存放的页面数
int count=0; //用来记录已存放的页面数
int Inside[InsideCount]; //存放内存中的页号
int const PageCount=10;//总的页面数
int Page[PageCount]; //存放产生的页面号
int insert=0;//先到先出置换算法 fcfo 中表示 当内存满的时候,新进入的页号放的位置 int suiji=0; //随机置换算法 randchange 当内存满的时候,新进入的页号放的位置 double lost=0.0; //缺失次数 开始
初始化数据
结束
N
Y
页面是否存在
显示物理块信息
计算并输出缺页率
N
Y
选择最久未使用的
页面作为淘汰页 i 指向下一个页面
物理块是否空闲 将页面放到空闲物理块
i<页面长度
bool isInside(int num)//检测页号是否在内存中
{
for(int i=0;i<InsideCount;i++)
{
if(Inside[i]==Page[num])
{
return true;
}
}
return false;
}
void LRU(int num)//近久未使用置换算法LRU
{
int max=0; // 表示内存中的页号,下一次出现的距离
int maxchange; //表示内存中下次出现距离大的页号在内存中的位置
int k;
if(isInside(num)) //判断是否命中
{
cout<<"命中"<<endl;
for(int i=0;i<InsideCount;i++)
cout<<"内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
else if(count==InsideCount)
{
lost++; //缺失次数+1
for(int j=0; j<InsideCount;j++)
{
for(k=num;k>0;k--) //从当前的页号向前,发现页号与内存中的页号相同,break;比较内存中InsideCount个页号,哪一个走的远,用max 记录
{
if(Inside[j]==Page[k])
break;
}
if(num-k>max)//求最旧未使用
{
max=num-k;
maxchange=j;//j 表示把内存中第j 个Inside 中的页面从内存拿出,把新的页面放入
}
}
Inside[maxchange] = Page[num];
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
else
{
Inside[count] = Page[num];
count++;
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
}
void FIFO(int num)//先进先出置换算法(FIFO):
{
if(isInside(num)) //判断是否命中
{
cout<<"命中"<<endl;
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
else if(count==InsideCount) //内存是否已满
{
lost++; //缺页+1
Inside[insert]=Page[num]; //页面放入内存
insert++; //位置移到下一个
insert=insert%InsideCount; //保证循环
for(int i=0;i<InsideCount;i++) //打印
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
else //没命中且没满
{
Inside[count]=Page[num];
count++;
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
}
void OPT(int num)//最佳置换算法(OPT)(理想置换算法)
{
int max=0; // 表示内存中的页号,下一次出现的距离
int maxchange; //表示内存中下次出现距离大的页号在内存中的位置int k;
if(isInside(num))
{
cout<<"命中"<<endl;
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
else if(count==InsideCount)
{
lost++; //缺页+1
for(int j=0;j<InsideCount;j++)
{
for(k=num;k<PageCount;k++) //找到符合条件的第一个就跳出
{
if(Inside[j]==Page[k])
break;
}
if(k>max)
{
max=k; //k 表示在这个地方会再次出现给定页面
maxchange=j;//j 表示把内存中第j 个Inside 中的页面从内存拿出,把新的页面放入
}
}
Inside[maxchange]=Page[num];
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
else //没命中且没满
{
Inside[count]=Page[num];
count++;
for(int i=0;i<InsideCount;i++)
cout<<" 内存Inside["<<i<<"]中内容为:"<<Inside[i]<<endl;
}
}
int main()
{
char ch ;//选择使用哪种算法
while(1){
for(int i=0;i<PageCount;i++)
{
Page[i]=rand()%9+1;
}
cout<<" 请选择置换算法"<<"\n"<<endl;
cout<<"O 最佳置换算法(OPT)(理想置换算法)"<<"\n"<<endl;
cout<<"F 先进现出置换算法(FIFO)"<<"\n"<<endl;
cout<<"U 近久未使用(LRU)算法"<<"\n"<<endl;
cin>>ch;
switch(ch){
case 'O':{
lost=0;
count=0;
for(int j=0;j<InsideCount;j++)
{
Inside[j]=0;
}
for(int i=0;i<PageCount;i++)
{
cout<<"读入Page["<<i<<"]="<<Page[i]<<endl;
OPT(i);
}
cout<<"共"<<PageCount<<"次,"<<"缺失"<<lost<<" 次,缺失率为"<<lost/(PageCount)<<"\n\n"<<endl;
}
break;
case 'F':{
lost=0;
count=0;
for(int j=0;j<InsideCount;j++)
{
Inside[j]=0;
}
for(int i=0;i<PageCount;i++)
{
cout<<"读入Page["<<i<<"]="<<Page[i]<<endl;
FIFO(i);
}
cout<<"共" <<PageCount<<"次,"<<"缺失"<<lost<<" 次,缺失率为"<<lost/(PageCount)<<"\n\n"<<endl;
}
break;
case 'U':{
lost=0;
count=0;
for(int j=0;j<InsideCount;j++)
{
Inside[j]=0;
}
for(int i = 0; i < PageCount; i++)
{
cout<<"读入Page["<<i<<"]="<<Page[i]<<endl;
LRU(i);
}
cout<<"共" <<PageCount<<"次,"<<"缺失"<<lost<<" 次,缺失率为"<<lost/(PageCount)<<"\n\n"<<endl;
}
break;
}
}
return 0;
}
5.6 运行结果及分析
O
读入Page[0]=7
内存Inside[0]中内容为:7
内存Inside[1]中内容为:0
内存Inside[2]中内容为:0
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[1]=1
内存Inside[0]中内容为:7
内存Inside[1]中内容为:1
内存Inside[2]中内容为:0
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[2]=6
内存Inside[0]中内容为:7
内存Inside[1]中内容为:1
内存Inside[2]中内容为:6
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[3]=7
命中
内存Inside[0]中内容为:7内存Inside[1]中内容为:1内存Inside[2]中内容为:6内存Inside[3]中内容为:0内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[4]=3
内存Inside[0]中内容为:7内存Inside[1]中内容为:1内存Inside[2]中内容为:6内存Inside[3]中内容为:3内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[5]=9
内存Inside[0]中内容为:7内存Inside[1]中内容为:1内存Inside[2]中内容为:6内存Inside[3]中内容为:3内存Inside[4]中内容为:9内存Inside[5]中内容为:0读入Page[6]=8
内存Inside[0]中内容为:7内存Inside[1]中内容为:1内存Inside[2]中内容为:6内存Inside[3]中内容为:3内存Inside[4]中内容为:9内存Inside[5]中内容为:8读入Page[7]=4
内存Inside[0]中内容为:4内存Inside[1]中内容为:1内存Inside[2]中内容为:6内存Inside[3]中内容为:3内存Inside[4]中内容为:9内存Inside[5]中内容为:8读入Page[8]=5
内存Inside[0]中内容为:5内存Inside[1]中内容为:1内存Inside[2]中内容为:6内存Inside[3]中内容为:3内存Inside[4]中内容为:9内存Inside[5]中内容为:8读入Page[9]=3
命中
内存Inside[0]中内容为:5
内存Inside[1]中内容为:1
内存Inside[2]中内容为:6
内存Inside[3]中内容为:3
内存Inside[4]中内容为:9
内存Inside[5]中内容为:8
共10次,缺失 2 次,缺失率为0.2
F
读入Page[0]=8
内存Inside[0]中内容为:8
内存Inside[1]中内容为:0
内存Inside[2]中内容为:0
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[1]=7
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:0
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[2]=7
命中
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:0
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[3]=9
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:0
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[4]=6
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:6
内存Inside[4]中内容为:0
内存Inside[5]中内容为:0
读入Page[5]=4
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:6
内存Inside[4]中内容为:4
内存Inside[5]中内容为:0
读入Page[6]=7
命中
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:6
内存Inside[4]中内容为:4
内存Inside[5]中内容为:0
读入Page[7]=3
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:6
内存Inside[4]中内容为:4
内存Inside[5]中内容为:3
读入Page[8]=9
命中
内存Inside[0]中内容为:8
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:6
内存Inside[4]中内容为:4
内存Inside[5]中内容为:3
读入Page[9]=2
内存Inside[0]中内容为:2
内存Inside[1]中内容为:7
内存Inside[2]中内容为:9
内存Inside[3]中内容为:6
内存Inside[4]中内容为:4
内存Inside[5]中内容为:3
共10次,缺失 1 次,缺失率为0.1
U
读入Page[0]=1
内存Inside[0]中内容为:1
内存Inside[1]中内容为:0
内存Inside[2]中内容为:0
内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[1]=2
内存Inside[0]中内容为:1内存Inside[1]中内容为:2内存Inside[2]中内容为:0内存Inside[3]中内容为:0内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[2]=3
内存Inside[0]中内容为:1内存Inside[1]中内容为:2内存Inside[2]中内容为:3内存Inside[3]中内容为:0内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[3]=2
命中
内存Inside[0]中内容为:1内存Inside[1]中内容为:2内存Inside[2]中内容为:3内存Inside[3]中内容为:0内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[4]=9
内存Inside[0]中内容为:1内存Inside[1]中内容为:2内存Inside[2]中内容为:3内存Inside[3]中内容为:9内存Inside[4]中内容为:0内存Inside[5]中内容为:0读入Page[5]=4
内存Inside[0]中内容为:1内存Inside[1]中内容为:2内存Inside[2]中内容为:3内存Inside[3]中内容为:9内存Inside[4]中内容为:4内存Inside[5]中内容为:0读入Page[6]=6
内存Inside[0]中内容为:1内存Inside[1]中内容为:2内存Inside[2]中内容为:3内存Inside[3]中内容为:9
内存Inside[5]中内容为:6
读入Page[7]=3
命中
内存Inside[0]中内容为:1
内存Inside[1]中内容为:2
内存Inside[2]中内容为:3
内存Inside[3]中内容为:9
内存Inside[4]中内容为:4
内存Inside[5]中内容为:6
读入Page[8]=7
内存Inside[0]中内容为:7
内存Inside[1]中内容为:2
内存Inside[2]中内容为:3
内存Inside[3]中内容为:9
内存Inside[4]中内容为:4
内存Inside[5]中内容为:6
读入Page[9]=1
内存Inside[0]中内容为:7
内存Inside[1]中内容为:1
内存Inside[2]中内容为:3
内存Inside[3]中内容为:9
内存Inside[4]中内容为:4
内存Inside[5]中内容为:6
共10次,缺失2 次,缺失率为0.2
5.7 心得体会
操作系统常用的页面置换算法有最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU)。

当然还有其他的置换算法,比如说:Clock置换算法、最少使用置换算法等等。

置换算法的好坏直接影响到系统的性能,如何选择一个更好的置换算法显得至关重要,但是我们仅仅研究算法或许并不能很好的提高系统的性能,如何实现硬件和软件的相互提高似乎更关键。

就像现在的固态硬盘,可以很好的提高数据的读取速度。

随着科技的发展,是不是能够实现大容量的高速缓冲存储器呢?或许说随着云平台的发展,会不会淘汰现有的技术呢?
与其在这模拟实现已经接近淘汰的算法,不如开阔思维寻求新的技术。

或许说我们的课程设计应该更偏向于创新性。

相关文档
最新文档