#include
#include
#include
#include
#define Bsize 4
typedef struct BLOCK//声明一种新类型——物理块类型
{
int pagenum//页号
int accessed//访问字段,其值表示多久未被访问
}BLOCK
int pc//程序计数器,用来记录指令的序号
int n//缺页计数器,用来记录缺页的次数
static int temp[320]//用来存储320条随机数
BLOCK block[Bsize]//定义一大小为4的物理块数组
//*************************************************************
void init( )//程序初始化函数
int findExist(int curpage)//查找物理块中是否有该页面
int findSpace( )//查找是否有空闲物理块
int findReplace( )//查找应予置换的页面
void display ( )//显示
void suijishu( )//产生320条随机数,显示并存储到temp[320]
void pagestring( )//显示陵郑调用喊拦的页面队列
void OPT( )//OPT算法
void LRU( )// LRU算法
void FIFO( )//FIFO算法
//*************************************************************
void init( )
{
for(int i=0i<Bsizei++)
{
block[i].pagenum=-1
block[i].accessed=0
pc=n=0
}
}
//-------------------------------------------------------------
int findExist(int curpage)
{
for(int i=0i<Bsizei++)
{
if(block[i].pagenum == curpage )
return i//检测到内存中有该页面,返回block中的位置
}
return -1
}
//-------------------------------------------------------------
int findSpace( )
{
for(int i=0i<Bsizei++)
{
if(block[i].pagenum == -1)
return i//找到空闲的block,返回block中的位置
}
return -1
}
//-------------------------------------------------------------
int findReplace( )
{
int pos = 0
for(int i=0i<Bsizei++)
{
if(block[i].accessed >block[pos].accessed)
pos = i//找到应予置换页面,返回BLOCK中位置
}
return pos
}
//-------------------------------------------------------------
void display( )
{
for(int i=0i<Bsizei++)
{
if(block[i].pagenum != -1)
{ printf(" %02d",block[i].pagenum)}
}
cout<<endl
}
//-------------------------------------------------------------
void suijishu( )
{ int flag=0
cin>>pc
cout<<"******按照要郑汪胡求产生的320个随机数:*******"<<endl
for(int i=0i<320i++)
{
temp[i]=pc
if(flag%2==0) pc=++pc%320
if(flag==1) pc=rand( )% (pc-1)
if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)))
flag=++flag%4
printf(" %03d",temp[i])
if((i+1)%10==0) cout<<endl
}
}
//-------------------------------------------------------------
void pagestring( )
{
for(int i=0i<320i++)
{
printf(" %02d",temp[i]/10)
if((i+1)%10==0) cout<<endl
}
}
//-------------------------------------------------------------
void OPT( )
{
int exist,space,position
int curpage
for(int i=0i<320i++)
{
if(i%100==0) getch( )
pc=temp[i]
curpage=pc/10
exist = findExist(curpage)
if(exist==-1)
{
space = findSpace ( )
if(space != -1)
{
block[space].pagenum = curpage
display( )
n=n+1
}
else
{
for(int k=0k<Bsizek++)
{
for(int j=ij<320j++)
{
if(block[k].pagenum!= temp[j]/10)
{
block[k].accessed = 1000
}//将来不会用,设置为一个很大数
else
{
block[k].accessed = j
break
}
}
}
position = findReplace( )
block[position].pagenum = curpage
display( )
n++
}
}
}
cout<<"缺页次数:"<<n<<endl
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl
}
//-------------------------------------------------------------
void LRU( )
{
int exist,space,position
int curpage
for(int i=0i<320i++)
{
if(i%100==0) getch( )
pc=temp[i]
curpage=pc/10
exist = findExist(curpage)
if(exist==-1)
{
space = findSpace( )
if(space != -1)
{
block[space].pagenum = curpage
display( )
n=n+1
}
else
{
position = findReplace( )
block[position].pagenum = curpage
display( )
n++
}
}
else block[exist].accessed = -1//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(int j=0j<4j++)
{block[j].accessed++}
}
cout<<"缺页次数:"<<n<<endl
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl
}
//-------------------------------------------------------------
void FIFO( )
{
int exist,space,position
int curpage
for(int i=0i<320i++)
{
if(i%100==0) getch( )
pc=temp[i]
curpage=pc/10
exist = findExist(curpage)
if(exist==-1)
{
space = findSpace( )
if(space != -1)
{
block[space].pagenum = curpage
display( )
n=n+1
}
else
{
position = findReplace( )
block[position].pagenum = curpage
display( )
n++
block[position].accessed--
}
}
for(int j=0j<Bsizej++)
block[j].accessed++
}
cout<<"缺页次数:"<<n<<endl
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl
}
//*************************************************************
void main( )
{
int select
cout<<"请输入第一条指令号(0~320):"
suijishu( )
cout<<"*****对应的调用页面队列*******"<<endl
pagestring( )
do
{
cout<<"****************************************"<<endl
cout<<"------1:OPT 2:LRU 3:FIFO 4:退出-----"<<endl
cout<<"****************************************"<<endl
cout<<" 请选择一种页面置换算法:"
cin>>select
cout<<"****************************************"<<endl
init( )
switch(select)
{
case 1:cout<<"最佳置换算法OPT:"<<endl
cout<<"*****************"<<endl
OPT( )
break
case 2:cout<<"最近最久未使用置换算法LRU:"<<endl
cout<<"**************************"<<endl
LRU( )
break
case 3:cout<<"先进先出置换算法FIFO:"<<endl
cout<<"*********************"<<endl
FIFO( )
break
default:
}
}while(select!=4)
}
你试试可以不,应该没问题的
要注意这是用C++编写的,你改一下就可以用了
[fifo.rar] - *** 作系统中内存页面的先进先出的替换算法fifo[先进先出页面算法程序.rar] - 分别实现最佳置换算法(optimal)、先进先出(fifo)页面置换算法和最近最久未使用(LRU)置换算法,并给出各算法缺页次数和缺页率。
[0022.rar] - 模拟分页式虚拟存储管理宴丛仿中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断
[Change.rar] - 用java实现 *** 作系统的页面置换 其中包括 最佳置换算法(Optimal)、先进先出算法(First-in, First-out) 、最近最久不用的页面置换算法(LeastRecently Used Replacement)三种算法的实现
[M_Management.rar] - *** 作系统中内存管理页面置换算法的模拟程序,采用的是LRU置换算法
[detail_of_44b0x_TCPIP.rar] - TCPIP 程序包加载到44b0x 的ADS1.2工程文件的说明书。说名了加载过程的细节和如何处理演示程序和代码。演示代码已经上传,大家可以搜索
[OperatingSystemPageReplacementAlgorithm.rar] - java *** 作系统页面置换算法: (1)郑租进先出的算法(fifo) (2)最近最少使用的算法(LRU) (3)最佳淘汰算法(OPT) (4)最少访问页面算法(LFU) (注:由本人改成改进型Clock算法)晌纤 (5)最近最不经常使用算法(NUR)
分别使用FIFO、OPT、LRU三种置换算法来模拟页面置换的过程。(Linux、Windows下皆可)
输入: 3 //页帧数带裂皮
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 //待处理的页
输出:页面置换过程中各帧的变化过程和出现页错误的次数
[cpp]
#include<iostream>
using namespace std
int input[20]= {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1}
class page
{
public:
int num
int mark
page()
{
num=0
mark=21
}
}
void FIFO()
{
cout<<"------FIFO-----------"<<endl
int error=0
page frame[3]//页帧
for(int i=0i<3i++)//处理前三个引用
{
frame[i].num=input[i]
error++
cout<<frame[i].num<<" | "
for(int j=0j<=ij++)
cout<<frame[j].num<<' '
cout<<endl
}
for(int i=3i<20i++)
{
int j
for(j=0j<3j++)
if(input[i]==frame[j].num)
{
cout<<input[i]<<endl
break
}
if(j==3)
{
error++
frame[((error-1)%3)].num=input[i]//换掉最旧的页
cout<<input[i]<<" | "
for(int k=0k<3k++)
cout<<frame[k].num<<' '
cout<<endl
}
}
cout<<"Frame Error:"<<error<<endl<<endl
}
void OPT()
{
cout<<"------OPT------------"<<endl
int error=0
page frame[3]
for(int i=0i<3i++)//处理前三个引用
{
frame[i].num=input[i]
error++
cout<<frame[i].num<<" | "
for(int j=0j<=ij++)
cout<<frame[j].num<<' '
cout<<endl
}
for(int i=3i<20i++)
{
int j
for(j=0j<3j++)
if(input[i]==frame[j].num)
{
cout<<input[i]<<endl
break
}
if(j==3)
{
error++
for(j=0j<3j++)
{
frame[j].mark=21
for(int k=20k>=ik--)//向后遍历,找到最长时间不用的页
{
if(frame[j].num==input[k])
frame[j].mark=k
}
}
if(frame[0].mark>frame[1].mark&&frame[0].mark>frame[2].mark)
frame[0].num=input[i]
else if(frame[1].mark>frame[0].mark&&frame[1].mark>frame[2].mark)
frame[1].num=input[i]
else
frame[2].num=input[i]
cout<<input[i]<<" | "
for(int k=0k<3k++)
cout<<frame[k].num<<' '
cout<<endl
}
}
cout<<"Frame Error:"<<error<<endl<<endl
}
void LRU()
{
cout<<"------LRU------------"<<endl
int error=0
page frame[3]
for(int i=0i<3i++)//处理前三个引用
{
frame[i].num=input[i]
error++
cout<<frame[i].num<<" | "
for(int j=0j<=ij++)
cout<<frame[j].num<<' '
cout<<endl
}
for(int i=3i<20i++)
{
int j
for(j=0j<3j++)
if(input[i]==frame[j].num)
{
cout<<input[i]<<endl
break
}
if(j==3)
源缓{
error++
for(j=0j<3j++)
{
frame[j].mark=0
for(int k=0k<=ik++)//向前遍历,找到最近最少使用的
{
if(frame[j].num==input[k])
frame[j].mark=k
}
} 蠢差
if(frame[0].mark<frame[1].mark&&frame[0].mark<frame[2].mark)
frame[0].num=input[i]
else if(frame[1].mark<frame[0].mark&&frame[1].mark<frame[2].mark)
frame[1].num=input[i]
else
frame[2].num=input[i]
cout<<input[i]<<" | "
for(int k=0k<3k++)
cout<<frame[k].num<<' '
cout<<endl
}
}
cout<<"Frame Error:"<<error<<endl<<endl
}
int main()
{
FIFO()
OPT()
LRU()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)