[先进先出页面算法程序.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)
//熬夜弄出来的,记得加分哦#include<stdio.h>
void Print(int bc[],int blockCount)
{
for(int i=0i<blockCounti++)
{
printf("%d ",bc[i])
}
printf("\n")
}
bool Travel(int bc[],int blockCount,int x)
{
bool is_found=false
int i
for(i=0i<blockCounti++)
{
if(bc[i]==x)
{
is_found=true
break
}
}
return is_found
}
void FIFO(int pc[],int bc[],int pageCount,int blockCount)
{
printf("0:FIFO置换算法\n")
int i
if(pageCount<=blockCount)
{
printf("缺页次数为0\n")
printf("缺页率为0\n")
}
else
{
int noPage=0
int p=0
for(i=0i<pageCounti++)
{
//printf("引用页:%d\n",pc[i])
if(!Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
bc[i]=pc[i]
}
else
{
if(p==blockCount)
{
p=0
}
bc[p]=pc[i]
p++
}
noPage++
//printf("物理块情况:\n")
//Print(bc,blockCount)
}
//printf("\n")
}
printf("FIFO缺页次数为:%d\n",noPage)
printf("FIFO缺页率为:%.2f%%\n",(float)noPage/pageCount*100)
}
}
int FoundMaxNum(int a[],int n)
{
int k,j
k=a[0]
j=0
for (int i=0i<ni++)
{
if(a[i]>=k)
{
k=a[i]
j=i
}
}
return j
}
void LRU(int pc[],int bc[],int pageCount,int blockCount)
{
printf("1:LRU置换算法\n")
if(pageCount<=blockCount)
{
printf("缺页次数为0\n")
printf("缺页率为0\n")
}
else
{
int noPage=0
int i,j,m
int bc1[100]
for(i=0i<blockCounti++)
{
bc1[i]=0
}
for(i=0i<pageCounti++)
{
// printf("引用页:%d\n",pc[i])
if(!Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
bc[i]=pc[i]
for(int p=0p<=ip++)
{
bc1[p]++
}
}
else
{
for(j=0j<blockCountj++)
{
bc1[j]++
}
int k=FoundMaxNum(bc1,blockCount)
bc[k]=pc[i]
bc1[k]=1
}
noPage++
//printf("物理快情况:\n")
//Print(bc,blockCount)
}
else if(Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
for(j=0j<=ij++)
{
bc1[j]++
}
for(m=0m<=im++)
{
if(bc[m]==pc[i])
{
break
}
}
bc1[m]=1
bc[m]=pc[i]
}
else
{
for(j=0j<blockCountj++)
{
bc1[j]++
}
for(m=0m<blockCountm++)
{
if(bc[m]==pc[i])
{
break
}
}
bc1[m]=1
bc[m]=pc[i]
}
}
//printf("\n")
}
printf("LRU缺页次数为:%d\n",noPage)
printf("LRU缺页率为:%.2f%%\n",(float)noPage/pageCount*100)
}
}
void Optiomal(int pc[],int bc[],int pageCount,int blockCount)
{
printf("2:最佳置换算法\n")
if(pageCount<=blockCount)
{
printf("缺页次数为0\n")
printf("缺页率为0\n")
}
else
{
int noPage=0
int i,j,k
for(i=0i<pageCounti++)
{
// printf("引用页:%d\n",pc[i])
if(!Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
bc[i]=pc[i]
}
else
{
int max=0
int blockIndex
for(j=0j<blockCountj++)
{
for(k=ik<pageCountk++)
{
if(bc[j]==pc[k])
{
break
}
}
if(k>=max)
{
max=k
blockIndex=j
}
}
bc[blockIndex]=pc[i]
}
noPage++
//printf("物理快情况:\n")
//Print(bc,blockCount)
}
//printf("\n")
}
printf("OPT缺页次数为:%d\n",noPage)
printf("OPT缺页率为:%.2f%%\n",(float)noPage/pageCount*100)
}
}
int main()
{
int pageCount,blockCount,i,pc[100]
printf("输入页面数\n")
scanf("%d",&pageCount)
printf("输入页面走向\n")
for(i=0i<pageCounti++)
{
scanf("%d",&pc[i])
}
blockCount=3//物理块数
int bc1[100]
printf("\n")
FIFO(pc,bc1,pageCount,blockCount)
int bc2[100]
printf("\n")
LRU(pc,bc2,pageCount,blockCount)
int bc3[100]
printf("\n")
Optiomal(pc,bc3,pageCount,blockCount)
return 0
}
分别使用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条)