资源描述
课程设计说明书
题目: 请求页式存储器管理程序
院 系: 计算机科学与工程学院
专业班级: 计算机09-15班
学 号: 123456789055
学生姓名: 某某某
指导教师: 某 某
2011年 12 月 18日
安徽理工大学课程设计(论文)任务书
计算机科学与工程学院 计算机科学与技术系
学 号
1234456
学生姓名
某某
专业(班级)
计算机09-3班
设计题目
请求页式存储器管理程序
设
计
技
术
参
数
了解页面置换算法的概念
加深对页面置换算法的理解
先进先出(FIFO)页面置换算法
用高级语言编写和调试一个简单的页面置换算法程序
设
计
要
求
(1)对程序的每一部分要有详细的设计分析说明。
(2)源代码格式要规范。
(3)设计合适的测试用例,对得到的运行结果要有分析。
(4)设计中遇到的问题,设计的心得体会。
(5)按期提交完整的程序代码、可执行程序和课程设计报告。
工
作
量
课程设计任务要求不少于2500字的报告,要赋有模块图或流程图。
工
作
计
划
12月15日—11月21日:查找相关资料。
11月22日—11月28日:确定选用C语言为编程语言。
11月29日—12月04日:写需求分析报告。
12月05日—12月11日:着手进行编程,实现算法,并调试程序。
12月12日—12月18日:测试程序并优化功能,最终完成设计报告。
参
考
资
料
[1]汤小丹 梁红兵 哲凤屏 汤子瀛. 计算机操作系统(第三版)西安电子科技大学出版社,2007
[2]杨克昌 王岳斌 计算机导论(第二版)[M]中国水电出版社.2005
[3](美)Roger S.Pressman 著 软件工程[M] 机械工业出版社 .2009
[4]徐孝凯 C++语言基础教程(第二版)[M] 清华大学出版社.2007
指导教师签字
系主任签字
2011年 10月 22日
学生姓名: 某某某 学号: 2009355555 专业班级: 计算机09-3班
设计题目: 请求页式存储器管理程序
指导教师评语:
成绩:
指导教师:
年 月 日
安徽理工大学课程设计(论文)任务书
摘 要
分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中
系统为每个进程建立一个页表,页表给出逻辑页号和具体内存块号相应的关系。一个页表中包含若干个表目,表目的自然序号对应于用户程序中的页号,表目中的块号是该页对应的物理块号。
请求页式存储管理方式是一种实现虚拟存储器的方式,是指在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面,之后根据进程运行的需要,动态装入其它页面。当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。
请求页式存储管理主要需要解决以下问题:系统如何获知进程当前所需页面不在主存;当发现缺页时,如何把所缺页面调入主存;当主存中没有空闲的页框时,为了要接受一个新页,需要把老的一页淘汰出去,根据什么页面淘汰算法选择欲淘汰的页面。
关键词:虚拟存储器 资源 缺页 页面淘汰算法
iii
安徽理工大学课程设计(论文)
目 录
1 系统分析 1
1.1设计内容 1
1.2 设计要求 1
2 系统设计 2
2.1 问题分析 2
2.2 算法与程序流程图 2
3 系统实现 4
3.1数据结构 4
3.2函数声明 4
3.3运行结果 4
4 总结 6
参考文献 7
附录 8
11
--
1 系统分析
1.1 设计内容
设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。而不再判断它是否被改写过,也不将它写回到辅存。
1.2 设计要求
(1). 运行给出的实验程序,查看执行情况,进而分析算法的执行过程,在理解FIFO页面置换算法后,模拟程序实现,并集成到参考程序中。
(2). 执行页面置换模拟程序,分析缺页率的情况。最好页框数和访问序列长度可调
节,在使用同一组访问序列数据的情况下,改变页框数并执行页面置换模拟程序,查看缺页率的变化。
(3). 在每次产生置换时要求显示分配状态和缺页率。程序的地址访问序列通过随机数产生,要求具有足够的长度。最好页框数和访问序列长度可调节。
(4). 每个学生必须独立完成课程设计,不能相互抄袭;
(5).设计完成后,将所完成的工作交由老师检查;
(6).要求写出一份详细的设计报告。课程设计报告内容包括:设计目的、设计内容、设计原理、算法实现、流程图、源程序、运行示例及结果分析、心得体会、参考资料等。
2 系统设计
2.1 问题分析
分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中
系统为每个进程建立一个页表,页表给出逻辑页号和具体内存块号相应的关系。一个页表中包含若干个表目,表目的自然序号对应于用户程序中的页号,表目中的块号是该页对应的物理块号。
请求页式存储管理方式是一种实现虚拟存储器的方式,是指在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面,之后根据进程运行的需要,动态装入其它页面。当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。
请求页式存储管理主要需要解决以下问题:
系统如何获知进程当前所需页面不在主存;当发现缺页时,如何把所缺页面调入主存;当主存中没有空闲的页框时,为了要接受一个新页,需要把老的一页淘汰出去,根据什么策略选择欲淘汰的页面。
2.2 算法与程序流程图
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,是他总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量,常用函数,例程等的页面,FIFO算法并不能保证这些页面不被淘汰。
设计原理:需要进行页面置换,即把内存中装入最早的那个页面淘汰,换入当前的页面。
算法流程图,如图2-1所示。
打印页表
淘汰一页后调入所需的页,修改页表
调入该页并修改页表
页框未满
该页已是否在主存
计算页号, 查页表
结束
0<=地址<=进程大小
输入要访问的地址
开始
输入进程大小,对页表进行初始化
是
是
是
图2-1先进先出置换算法
3 系统实现
3.1数据结构
请求分页存储管理方式当中用到的主要数据结构就是页表项。与普通分页管理存储方式当中的页表项相比,请求分页存储管理方式的页表项要进行相应的补充,共程序在换进、换出内存时参考。
具体而言,请求分页存储管理方式的页表项一般包括以下几项:页号、驻留位、内存块号、外存地址、访问位、修改位、(存取控制、辅存地址)。其中,中断位表示该页是在内存还是在外存;访问位表示该页最近被访问过,根据访问位来决定淘汰哪页;修改位用于查看此页是否在内存中被修改过。
本程序中采用的页表项数据结构如下(由于以上所述的有些域在程序中用不到,因此进行了相应的简化)
struct pageinfo //页面信息结构结构
{
int serial[100]; // 模拟的最大访问页面数,实际控制在20以上 int flag; // 标志位,0表示无页面访问数据
int diseffect; // 缺页次数
int total_pf; // 分配的页框数
int total_pn; // 访问页面序列长度
} pf_info;
3.2函数声明
Void initialize( )//打印页面走向状态
void createps( )//打印当前的页面
void displayinfo( )//寻找内存块中与e相同的块号
void fifo( )//寻找最近最长未使用的页面
void findpage( )//记录当前内存块中页面离下次使用间隔长度
3.3运行结果
运行程序界面将显示如图3-1的结果:
图3-1初始化结果
图3-2 FIFO算法页面置换结果
4 总结
通过这次课程设计让我更深的了解算法的设计思想,并且对C语言进行了复习。
对于页面算法,我们平时上课时,只是知道了页面置换算法是怎么做的,并没有想如何去实现这些算法。在真正要做的时候才发现了问题。
在这次课程设计的过程中,我发现了自己的许多不足,特别是自己以前的c语言和数据结构学的不好,在写代码的时候有了许多的麻烦。最后,在老师和同学的帮助下,终于完成了这次课程设计。
参考文献
[1] 徐孝凯.C++语言基础教程.北京:清华大学出版社,2007
[2] 徐孝凯.数据结构应用教程.北京:清华大学出版社,2007
[3] 张海藩.面向对象程序设计实用教程.北京: 清华大学出版社,2007
[4] 汤小丹, 梁红兵 ,哲凤屏, 汤子瀛编.计算机操作系统.西安:西安电子科技大学出版社,2007
[5] 黄干平, 陈洛资编.计算机操作系统.北京:科学出版社,1989
[6] 李勇, 刘恩林.计算机体系结构. 长沙:国防科技大学出版社,1987
[7] 黄祥喜.计算机操作系统实验教程.广州:清中山大学出版社,1994
[8] 尤晋元.UNIX操作系统教程.西安: 西安电子科技大学出版社,1995
[9] 孟庆昌.操作系统教程 .北京:电子工业出版社,2004
[10] 陈向群 杨芙清.操作系统教程.北京:北京大学出版社,2006
附录
程序源代码:
#include "windows.h"
#include <conio.h>
#include <stdlib.h>
#include <fstream.h>
#include <io.h>
#include <string.h>
#include <stdio.h>
void initialize(); //初始化相关数据结构
void createps(); //随机生成访问序列
void displayinfo(); //显示当前状态及缺页情况
void fifo(); //先进先出算法
int findpage(); //查找页面是否在内存
int invalidcount = 0; // 缺页次数
int vpoint; //页面访问指针
int pageframe[10]; // 分配的页框
int pagehistory[10]; //记录页框中数据的访问历史
int rpoint; //页面替换指针
int inpflag; //缺页标志,0为不缺页,1为缺页
struct PageInfo //页面信息结构
{
int serial[100]; // 模拟的最大访问页面数,实际控制在20以上
int flag; // 标志位,0表示无页面访问数据
int diseffect; // 缺页次数
int total_pf; // 分配的页框数
int total_pn; // 访问页面序列长度
} pf_info;
//初始化相关数据结构
void initialize()
{
int i,pf;
inpflag=0; //缺页标志,0为不缺页,1为缺页
pf_info.diseffect =0; // 缺页次数
pf_info.flag =0; // 标志位,0表示无页面访问数据
printf("\n请输入要分配的页框数:"); // 自定义分配的页框数
scanf("%d",&pf);
pf_info.total_pf =pf;
for(i=0;i<100;i++) // 清空页面序列
{
pf_info.serial[i]=-1;
}
}
// 随机生成访问序列
void createps(void )
{
int s,i,pn;
initialize(); //初始化相关数据结构
printf("\n请输入要随机生成访问序列的长度:"); //自定义随机生成访问序列的长度
scanf("%d",&pn);
srand(rand()); //初始化随机数队列的"种子"
s=((float) rand() / 32767) * 50 + pn; // 随机产生页面序列长度
pf_info.total_pn = s;
for(i=0;i<s;i++) //产生随机访问序列
{
pf_info.serial[i]=((float) rand() / 32767) * 16 ; //随机数的大小在0-15之间
}
}
// 显示当前状态及缺页情况
void displayinfo(void)
{
int i,n;
if(vpoint==0)
{
printf("\n=============页面访问序列=============\n");
for(i=0; i<pf_info.total_pn; i++)
{
printf("%4d",pf_info.serial[i]);
if ((i+1) % 10 ==0) printf("\n"); //每行显示10个
}
printf("\n======================================\n");
}
printf("访问%3d : 内存<",pf_info.serial[vpoint]);
for(n=0;n<pf_info.total_pf;n++) // 页框信息
{
if (pageframe[n] >=0)
printf("%3d",pageframe[n]);
else
printf(" ");
}
printf(" >");
if(inpflag==1) //缺页标志,0为不缺页,1为缺页
{
printf(" ==>缺页 ");
printf("缺页率%3.1f",(float)(pf_info.diseffect)*100.00/vpoint);
}
printf("\n");
}
// 查找页面是否在内存,1为在内存,0为不在即缺页
int findpage(int page)
{
int n;
for(n=0;n<pf_info.total_pf;n++)
{
pagehistory[n] ++; // 访问历史加1
}
for(n=0;n<pf_info.total_pf;n++)
{
if (pageframe[n]==page )
{
inpflag=0 ; //inpflag缺页标志,0为不缺页,1为缺页
pagehistory[n]=0; //置访问历史为0
return 1;
}
}
inpflag=1; //页面不存在,缺页
return 0;
}
// FIFO页面置换算法
void fifo(void)
{
int n,count,pstate;
rpoint=0; // 页面替换指针初始化为0
invalidcount = 0; // 缺页数初始化为0
createps(); // 随机生成访问序列
count=0; // 是否装满是所有的页框
for(n=0;n<pf_info.total_pf;n++) // 清除页框信息
{
pageframe[n]=-1;
}
inpflag=0; //缺页标志,0为不缺页,1为缺页
for(vpoint=0;vpoint<pf_info.total_pn;vpoint++) // 执行算法
{
pstate=findpage(pf_info.serial[vpoint]); //查找页面是否在内存
if(count<pf_info.total_pf) // 开始时不计算缺页
{
if(pstate==0) // 页不存在则装入页面
{
pageframe[rpoint]=pf_info.serial[vpoint];
rpoint=(rpoint+1) % pf_info.total_pf;
count++;
}
}
else // 正常缺页置换
{
if(pstate==0) // 页不存在则置换页面
{
pageframe[rpoint]=pf_info.serial[vpoint];
rpoint=(rpoint+1) % pf_info.total_pf;
pf_info.diseffect++; // 缺页次数加1
}
}
Sleep(10);
displayinfo(); // 显示当前状态
} // 置换算法循环结束
_getch();
return;
}
// 主函数
int main()
{
char ch;
system("cls") ;
while ( true )
{
printf("*******************************************\n");
printf(" 若要执行FIFO页面置算法请按 1 \n");
printf(" 若要退出请按 2 \n") ;
printf("*******************************************\n");
printf( "Enter your choice (1 or 2 ): ");
do
{ //如果输入信息不正确,继续输入
ch = (char)_getch() ;
}while(ch != '1' && ch != '2'&& ch != '3');
printf("\n\n你按的是:%c ,现在为你执行对应操作。",ch);
if(ch == '2') //选择2,退出
{
return 0;
}
else
{
printf("\n\n----------*****执行FIFO算法*****-----------\n");
fifo();
}
system("cls") ;
}
printf("\n\nPress Any Key To Continue:");
_getch() ;
return 0;
}
展开阅读全文