页式虚拟FIFO与LRU存储管理缺页中断的模拟算法并计算对应的物理地址Word下载.docx
- 文档编号:5782152
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:22
- 大小:157.27KB
页式虚拟FIFO与LRU存储管理缺页中断的模拟算法并计算对应的物理地址Word下载.docx
《页式虚拟FIFO与LRU存储管理缺页中断的模拟算法并计算对应的物理地址Word下载.docx》由会员分享,可在线阅读,更多相关《页式虚拟FIFO与LRU存储管理缺页中断的模拟算法并计算对应的物理地址Word下载.docx(22页珍藏版)》请在冰点文库上搜索。
}page;
三源程序的主要部分
1main函数
voidmain()
inti=0;
printf("
请输入1进入FIFO算法:
\n输入2进入LRU算法\n"
);
scanf("
%d"
&
i);
if(i==1)
FIFO();
else
LRU();
}
替换算法实现函数
//先进先出算法
四运行结果与运行情况分析
待调入页面数:
5
可用物理块数:
3
页面请求序列
01341203;
默认情况是将0号页面已调入内存
1FIFO算法
运行结果,如图:
2LRU算法
结论
通过测试运行,可以看出结果程序能满足设计要求,提示用户对对输入进行限制,并提示用户输入选择算法,按照不同的替换算法处理并且显示请求页面的调入和替换情况。
附录
#include<
stdio.h>
malloc.h>
#definepage_size1024
#definebase_address3000
voidFIFO()
intflag=0;
intmid_temp;
inttaskNum;
inttaskpage;
intmemoryBlockNum;
inttask_offset;
intmemory_block;
请输入虚页总数:
\n"
taskNum);
请输入内存块数目:
memoryBlockNum);
memory_block=memoryBlockNum;
//动态定义数组
page*p=(page*)malloc(taskNum*sizeof(page));
//对结构体初始化
for(inti=0;
i<
taskNum;
i++)
p[i].taskPageNum=i,
p[i].isMemory=0,
p[i].memoryPageNum=-1,
p[i].pageOffset=-1;
//首先装入0号页
p[0].isMemory=1;
p[0].memoryPageNum=flag;
flag++;
p[0].pageOffset=12;
//输出页表装入情况
虚页号内存块号装入位页内偏移物理地址\n"
for(intm=0;
m<
m++)
if(p[m].pageOffset!
=-1)
printf("
%8d%8d%8d%8d%11d\n"
p[m].taskPageNum,p[m].memoryPageNum,p[m].isMemory,p[m].pageOffset,p[m].memoryPageNum*page_size+base_address+p[m].pageOffset);
else
printf("
%8d%8d%8d%8d----\n"
p[m].taskPageNum,p[m].memoryPageNum,p[m].isMemory,p[m].pageOffset);
请输入要调用的虚页号和页内偏移(中间用空格隔开):
"
%d%d"
taskpage,&
task_offset);
//当用户输入的虚页数大于预设退出程序
while(taskpage<
taskNum)
{
//当内存有空余的块直接装入
//未命中的情况下将调入的页号装入内存
for(inti=0;
if(taskpage==i)
//未命中的情况
if(p[i].isMemory==0)
{
//内存还有空余memoryBlockNum是从输入的数值往下减
if(memoryBlockNum>
1)
{
p[i].isMemory=1;
p[i].pageOffset=task_offset;
p[i].memoryPageNum=flag%memory_block,
flag++;
memoryBlockNum--;
//printf("
虚页调入内存中的物理地址为:
%d\n"
p[i].memoryPageNum*page_size+base_address+p[i].pageOffset);
//输出页表装入情况
//显示调入
if(p[m].pageOffset!
{
if(i==m)
%8d%8d%8d%8d%11d调入\n"
else
}
else
}else
{
//内存已用完且未命中
//flag%memory_block目前的值为即将装入的内存块号
for(intj=0;
j<
j++)
{
if(p[j].memoryPageNum==flag%memory_block)
{
mid_temp=j;
}
}
//将要替换出内存的页号状态进行修改
p[mid_temp].memoryPageNum=-1;
p[mid_temp].isMemory=0;
p[mid_temp].pageOffset=-1;
//将即将调入的页号状态进行修改
p[i].isMemory=1;
p[i].memoryPageNum=flag%memory_block;
flag++;
//printf("
//输出页表装入情况
//显示调入
{
}
}
else
//在内存命中情况
//更新偏移地址
//printf("
命中页号在内存中的物理地址为:
//输出页表装入情况
//显示命中
%8d%8d%8d%8d%11d命中\n"
}
voidLRU()
//用于记录数组中的角码
//进程的页数
//用户输入的虚页号
//内存分的块数定值会被改变
//内存分的块数定值不会变
p[i].pageOffset=-1,
p[i].info=-1;
p[0].info=memory_block-1;
////////////////////////////////////////////////////
while(taskpage<
if(memoryBlockNum>
p[i].info=memory_block;
//将所有info》0的数值减一
for(m=0;
if(p[m].info>
-1)
p[m].info=p[m].info-1;
//显示调入
}else
{
//以下核心算法修改处
//p[j]目前的值为即将装入的内存块号
inttemporary=99999;
if(p[j].info>
-1&
&
temporary>
p[j].info)
temporary=p[j].info,
//核心算法修改处结束
p[mid_temp].info=-1;
p[i].info=memory_block;
//将所有info》0的数值减一
//输出页表装入情况
printf("
p[i].info=memory_block;
//将所有info》0的数值减一
printf("
p[m].taskPageNum,p[m].memoryPageNum,p[m].
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟 FIFO LRU 存储 管理 中断 模拟 算法 计算 对应 物理地址