请求分页系统
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、实验内容及要求
1.模拟进程访问页面:
(1)根据用户输入的进程号找到相应的页表,在该页表中查询该页号的页面是否在主存中,若已在主存中,则直接访问,修改贮存队列中的访问时间。
(2)若不在主存队列中,则需要将其装入至主存队列,若可以找到一块空闲帧,则将其装入至主存队列中,修改在主存中的信息:processID,pageID,state,time_last,BlockQueue中。
{
if(page[i].flag == 1)
{
printf("请求的页面在主存中!\n");
page[i].times++;
physicsNumber = page[i].pnumber;//由页号得到块号
printf("请求的主存块号为:%ld\n",physicsNumber);
physicsAddress = physicsNumber<< 10 |innerAddress;//得到物理地址
(3)若未在主存队列中,找到空闲帧,则需在驻留集队列中替换一个页面,替换哪一个呢?根据FIFO算法,替换队头结点,即删除队头结点,同时将待访问页面构造为一个新结点,插入至队尾,同时根据所删除结点的帧号在主存中队列中相应帧信息processID,pageID,state,time_last,也要修改访问页面的信息frameID, state。
short intpnumber;//该页所在主存块的块号
short int write;//该页是否被修改过,"1"表示修改过,"0"表示没有修改过
short intdnumber;//该页存放在磁盘上的位置,即磁盘块号
short int times;//被访问的次数,用于LRU算法
}
page[n];//定义页表//各个函数的实现如下:
3.显示部分:
(1)遍历进程的页表,打印;
(2)遍历主存队列的页表,打印;
(3)display queue,显示驻留集队列的信息。
三、实验条件(可含设备、材料、工具、软件等)
1、Vc6.0
四、实验原理(可含实验思想、原理图、程序框图等)
五、实验过程(可含操作步骤、现象、结果、参考代码等)
#include<stdlib.h>
printf("页号为:%ld\n",logicNumber);
innerAddress = logicAddress& 0x03ff;//得到页内地址
printf("页内地址为:%ld\n",innerAddress);
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
void computer()
{
inti;
for(i=0;i<n;i++)
{
page[i].lnumber = i;
page[i].flag = 0;
page[i].pnumber = 10000;//用10000表示为空
page[i].write = 0;
page[i].dnumber = i;
page[i].times = 0;
{
printf("采用先进先出算法!\n"); fail = p[head];
printf("第%d页将被替换!\n",fail);
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
printf("第%d页曾被修改过!\n",fail);
绵阳师范学院信息工程学院
操作系统课程实验报告
学期:
实验地点:
姓名
学号
班级
主讲教师
指导教师
专业
实验名称
请求分页系统模拟实现
实验日期
实验组员
一、实验目的
(1)了解存储管理的基本目的和功能;
(2)理解实存管理的原理和实现技术;
(3)理解虚存管理的原理和实现技术;
(4)通过编程模拟实现请求分页虚存管理和替换算法。
page[fail].flag = 0; page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[fail].pnumber;
page[fail].pnumber = 10000;
inti, fail = 0;
intmethod,temppage=0;
short int times = 10000;
printf("请输入一个逻辑地址(四位十六进制数):");
scanf("%x",&logicAddress);//读入逻辑地址
logicNumber = logicAddress>> 10;//得到页号
computer();
showpage();
showpagelist();
while(flag == 'y' || flag == 'Y'){transformation();
printf("是否显示页和页表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y'){showpage();
这学期的操作系统课程设计的六个题目,有大有小,有自己觉得写得好的,也有自己不满意的,但是都是自己亲自写的,很佩服自己能写出这么多行的代码,很佩服自己能找出错误,改正错误,同时也很讨厌自己很马虎,犯一些不该犯的错误,但是应该坚信,没有什么不可以的,一切皆有可能。还记得第一节课的时候,听到要写这么难的程序真的是头都大了,因为那些理论知识都忘了,当初学得也不好,但有些事,当硬着头皮去做的时候,收获往往很大,而且完成之后,自己也对自己很惊讶,“哇!我竟然写完了!真不可思议!”。这次课程不仅对操作系统的理论知识理解更加深刻了,而且在动手编程能力上对自己也有了信心,操作系统的一些思想让我们在以后思考问题时思维更加严谨,更有逻辑,对于解决生活中的一些问题也是有帮助的。
2.模拟进程结束:
进程结束,即将此进程在内存中所占的空间释放要做3件事:
(1)从驻留集中将processID为此进程的结点删除;
(2)主存队列中释放该进程的所有页面,即修改processID,pageID,state,time_last,重置为初始状态;
(3)修改此进程的页表的frameID, state,置为初始状态。
}
void showpage()
{
inti;
for(i=0;i<m;i++)
{
printf("\t%d\n",p[i]);
}
}
void transformation() //缺页中断处理
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
#include<stdio.h>
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m];//定义页
int head=0;
struct { short intlnumber;//页号0
short int flag;//表示该页是否在主存,"1"表示在主存,"0"表示不在主存
showpagelist();
}
else
{
while(c=='N'||c=='n')
{
printf("\n是否继续进行请求分页?(Y/N)");
d = getchar(); d = getchar();
if(d=='Y'||d=='y')
{
transformation();
printf("\n是否显示页和页表?(Y/N)");
for(i=0;i<n;i++)
{
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times);
}
page[logicNumber].times++;
break;
}
else
if(method == 2) //采用最近最少用算法
{
printf("采用最近最少用算法!\n");
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
}//初始化页表
for(i=0;i<m;i++)
{
page[i].pnumber = i;
}
for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化页
}
void showpagelist()
{
inti;
printf("\n页号\t是否在主存中\t块号\t是否被修改过\t磁盘块号\t访问次数\n");
printf("第%d页曾被修改过!\n",temppage);
page[temppage].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[temppage].pnumber;
八、教师评语(或成绩)
教师签字:
年月日
(说明:本实验报告可以先填写完成后再打印出来,也可以先按实际填写版面需要调整后再打印出来填写)
printf("请求的物理地址为:%ld",physicsAddress);//输出物理地址
break;
}
else
{
printf("请求的页面不在主存中!将进行缺页中断处理!\n请选择算法!\n");
printf("1.先进先出\n2.最近最少用\n请选择置换算法:");
scanf("%d",&method); if(method == 1) //采用先进先出算法
c = getchar();c = getchar();
if(c=='Y'||c=='y'){showpage();
showpagelist();
}
}
else if (d=='N'||d=='n')
exit(1);
else printf("输入错误!\n");
}
}
printf("\n是否继续进行请求分页?(Y/N)");
page[temppage].pnumber = 10000;
page[logicNumber].times++; break;
}
else
{
printf("你输入有误,即将退出!");
exit
void main() {
char c,d,flag='y';
printf("页表正在初始化中...,3秒钟后为你显示页和页表!\n");
flag = getchar();
flag = getchar();
}
}
六、实验中存在的问题和解决办法
无
七、意见、建议或感想
这次实验主要是对带有头结点、包含队头队尾指针的队列数据结构的操作,受前面动态多分区链表结构的影响,也出现了一些错误,在改正这些错误的过程中,也逐渐体会到了二者的区别和用法,以及当初为什么要建立这两个模型,感觉这些前辈们真的是太聪明了。从动态多分区和请求分页替换算法(虽然只实现了FIFO)中,深深地体会到了逻辑思维严密的重要性,同时还要考虑一些特殊情况。
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
printf("第%d页将被替换!\n",temppage);
for(i=0;i<m;i++) { if(p[i] == temppage) { p[i] = logicNumber;
}
}
if(page[temppage].write == 1)
1.模拟进程访问页面:
(1)根据用户输入的进程号找到相应的页表,在该页表中查询该页号的页面是否在主存中,若已在主存中,则直接访问,修改贮存队列中的访问时间。
(2)若不在主存队列中,则需要将其装入至主存队列,若可以找到一块空闲帧,则将其装入至主存队列中,修改在主存中的信息:processID,pageID,state,time_last,BlockQueue中。
{
if(page[i].flag == 1)
{
printf("请求的页面在主存中!\n");
page[i].times++;
physicsNumber = page[i].pnumber;//由页号得到块号
printf("请求的主存块号为:%ld\n",physicsNumber);
physicsAddress = physicsNumber<< 10 |innerAddress;//得到物理地址
(3)若未在主存队列中,找到空闲帧,则需在驻留集队列中替换一个页面,替换哪一个呢?根据FIFO算法,替换队头结点,即删除队头结点,同时将待访问页面构造为一个新结点,插入至队尾,同时根据所删除结点的帧号在主存中队列中相应帧信息processID,pageID,state,time_last,也要修改访问页面的信息frameID, state。
short intpnumber;//该页所在主存块的块号
short int write;//该页是否被修改过,"1"表示修改过,"0"表示没有修改过
short intdnumber;//该页存放在磁盘上的位置,即磁盘块号
short int times;//被访问的次数,用于LRU算法
}
page[n];//定义页表//各个函数的实现如下:
3.显示部分:
(1)遍历进程的页表,打印;
(2)遍历主存队列的页表,打印;
(3)display queue,显示驻留集队列的信息。
三、实验条件(可含设备、材料、工具、软件等)
1、Vc6.0
四、实验原理(可含实验思想、原理图、程序框图等)
五、实验过程(可含操作步骤、现象、结果、参考代码等)
#include<stdlib.h>
printf("页号为:%ld\n",logicNumber);
innerAddress = logicAddress& 0x03ff;//得到页内地址
printf("页内地址为:%ld\n",innerAddress);
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
void computer()
{
inti;
for(i=0;i<n;i++)
{
page[i].lnumber = i;
page[i].flag = 0;
page[i].pnumber = 10000;//用10000表示为空
page[i].write = 0;
page[i].dnumber = i;
page[i].times = 0;
{
printf("采用先进先出算法!\n"); fail = p[head];
printf("第%d页将被替换!\n",fail);
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
printf("第%d页曾被修改过!\n",fail);
绵阳师范学院信息工程学院
操作系统课程实验报告
学期:
实验地点:
姓名
学号
班级
主讲教师
指导教师
专业
实验名称
请求分页系统模拟实现
实验日期
实验组员
一、实验目的
(1)了解存储管理的基本目的和功能;
(2)理解实存管理的原理和实现技术;
(3)理解虚存管理的原理和实现技术;
(4)通过编程模拟实现请求分页虚存管理和替换算法。
page[fail].flag = 0; page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[fail].pnumber;
page[fail].pnumber = 10000;
inti, fail = 0;
intmethod,temppage=0;
short int times = 10000;
printf("请输入一个逻辑地址(四位十六进制数):");
scanf("%x",&logicAddress);//读入逻辑地址
logicNumber = logicAddress>> 10;//得到页号
computer();
showpage();
showpagelist();
while(flag == 'y' || flag == 'Y'){transformation();
printf("是否显示页和页表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y'){showpage();
这学期的操作系统课程设计的六个题目,有大有小,有自己觉得写得好的,也有自己不满意的,但是都是自己亲自写的,很佩服自己能写出这么多行的代码,很佩服自己能找出错误,改正错误,同时也很讨厌自己很马虎,犯一些不该犯的错误,但是应该坚信,没有什么不可以的,一切皆有可能。还记得第一节课的时候,听到要写这么难的程序真的是头都大了,因为那些理论知识都忘了,当初学得也不好,但有些事,当硬着头皮去做的时候,收获往往很大,而且完成之后,自己也对自己很惊讶,“哇!我竟然写完了!真不可思议!”。这次课程不仅对操作系统的理论知识理解更加深刻了,而且在动手编程能力上对自己也有了信心,操作系统的一些思想让我们在以后思考问题时思维更加严谨,更有逻辑,对于解决生活中的一些问题也是有帮助的。
2.模拟进程结束:
进程结束,即将此进程在内存中所占的空间释放要做3件事:
(1)从驻留集中将processID为此进程的结点删除;
(2)主存队列中释放该进程的所有页面,即修改processID,pageID,state,time_last,重置为初始状态;
(3)修改此进程的页表的frameID, state,置为初始状态。
}
void showpage()
{
inti;
for(i=0;i<m;i++)
{
printf("\t%d\n",p[i]);
}
}
void transformation() //缺页中断处理
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
#include<stdio.h>
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m];//定义页
int head=0;
struct { short intlnumber;//页号0
short int flag;//表示该页是否在主存,"1"表示在主存,"0"表示不在主存
showpagelist();
}
else
{
while(c=='N'||c=='n')
{
printf("\n是否继续进行请求分页?(Y/N)");
d = getchar(); d = getchar();
if(d=='Y'||d=='y')
{
transformation();
printf("\n是否显示页和页表?(Y/N)");
for(i=0;i<n;i++)
{
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times);
}
page[logicNumber].times++;
break;
}
else
if(method == 2) //采用最近最少用算法
{
printf("采用最近最少用算法!\n");
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
}//初始化页表
for(i=0;i<m;i++)
{
page[i].pnumber = i;
}
for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化页
}
void showpagelist()
{
inti;
printf("\n页号\t是否在主存中\t块号\t是否被修改过\t磁盘块号\t访问次数\n");
printf("第%d页曾被修改过!\n",temppage);
page[temppage].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[temppage].pnumber;
八、教师评语(或成绩)
教师签字:
年月日
(说明:本实验报告可以先填写完成后再打印出来,也可以先按实际填写版面需要调整后再打印出来填写)
printf("请求的物理地址为:%ld",physicsAddress);//输出物理地址
break;
}
else
{
printf("请求的页面不在主存中!将进行缺页中断处理!\n请选择算法!\n");
printf("1.先进先出\n2.最近最少用\n请选择置换算法:");
scanf("%d",&method); if(method == 1) //采用先进先出算法
c = getchar();c = getchar();
if(c=='Y'||c=='y'){showpage();
showpagelist();
}
}
else if (d=='N'||d=='n')
exit(1);
else printf("输入错误!\n");
}
}
printf("\n是否继续进行请求分页?(Y/N)");
page[temppage].pnumber = 10000;
page[logicNumber].times++; break;
}
else
{
printf("你输入有误,即将退出!");
exit
void main() {
char c,d,flag='y';
printf("页表正在初始化中...,3秒钟后为你显示页和页表!\n");
flag = getchar();
flag = getchar();
}
}
六、实验中存在的问题和解决办法
无
七、意见、建议或感想
这次实验主要是对带有头结点、包含队头队尾指针的队列数据结构的操作,受前面动态多分区链表结构的影响,也出现了一些错误,在改正这些错误的过程中,也逐渐体会到了二者的区别和用法,以及当初为什么要建立这两个模型,感觉这些前辈们真的是太聪明了。从动态多分区和请求分页替换算法(虽然只实现了FIFO)中,深深地体会到了逻辑思维严密的重要性,同时还要考虑一些特殊情况。
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
printf("第%d页将被替换!\n",temppage);
for(i=0;i<m;i++) { if(p[i] == temppage) { p[i] = logicNumber;
}
}
if(page[temppage].write == 1)