烟台大学操作系统课程设计页面置换算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
烟台大学计算机与控制工程学院
计算机操作系统
课程设计报告
题目:页面置换算法
班级计165
姓名王承乾
学号************
日期2018-7-3
指导教师翟一鸣
实验地点计算机与控制工程学院实验室
一、实验内容
页面置换算法:淘汰掉内存中的某些页为必须进入内存的页面腾出空间的策略。
最优算法(OPT):从内存中移出以后不再使用的页面,如果没有这样的页面,则选择以后最长时间内不需要访问的页面。
先进先出算法(FIFO):总是先淘汰那些驻留在内存时间最长的页面,即先进入内存的页面先被置换掉。
最近最久未使用算法(LRU):当需要置换一页时,选择最近一段时间最久未使用的页面予以淘汰。
设计程序模拟先进先出(FIFO)置换算法,最佳(OPT)置换算法和最近最少用(LRU)置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。
程序的设计主要是测试先进先出FIFO,最佳置换OPT和最近最少用LRU页面置换算法的效率以及过程。
二、实验目的
使用系统函数以及c语言的相关语句实现页面置换的三个算法
三、实验环境
开发环境:Windows
编译环境:gcc,g++
开发软件:Codeblocks 16.01
四、设计思路和流程图(一)程序总体控制
五、结论
左上:FIFO和数据输入右上:OPT算法
左下:退出
右下:LRU算法
六、感想
通过对页面置换算法模拟程序的程序设计,让我对虚拟页式存储管理有了更深的了解。刚开始拿到这个题目觉得很难,不知道该怎么下手,因为是自己第一次用C语言编写操作系统程序。当时搞懂了页面置换的思想以后,对编程就有了一定的思路。经过几天的编写,程序也最终编写出来了。但是却遇到了许多困难,程序的调试也出现了许多的错误。经过几次上机操作,在老师的指导和帮助下,程序最终还是完成了。通过这次的程序设计,让我对C语言有了更深一步的了解和认识,编程能力也有了提高,我认到学好计算机要重视实践操作,只有真正动手了才知道自己还有那些不足之处。老师的耐心指导是我这次程序设计得以成功完成的重要筹码,如果没有老师的知道,单凭我一人之力肯定无法完成的。所以,在此,我要感谢我的知道老师。然后我们组与组之间的相互交流也是我成功完成这次设计的重要原因。总之,团结就是力量。思考才能促人进步。
七、源代码
//6,5,4,3,2,1,5,4,3,6,5,4,3,2,1,6,5
#include
#define pageNum 17
#define memoryNum 4
typedef struct item
{
int num; //页号
int time; //等待时间,LRU算法必须变量
}Pro;
void print(Pro *page); //打印当前主存中的页面
int Search(int num,Pro *memory); //在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
void fifo();
void opt();
void lru();
int i;
int curmemory; //当前调入内存中的页面个数
int misscount; //缺页次数
double missRate; //缺页率
char c; //得到用户的输入字符,来选择相应的置换算法
Pro page[1000]; //页面结构体
Pro memory[1000]; //内存结构体
int main()
{
printf("系统分配给作业的主存中的页面数:%d 输入内存页面数:%d\n",pageNum,memoryNum);
for (i=0; i { printf("tip %d page is:", i); scanf("%d",&page[i].num); page[i].time = 0; //等待时间开始默认为0 } while(1) { for (i=0; i { memory[i].num=-1;//页面为空用-1表示 memory[i].time=-1; } printf("***********************\n"); printf("*****f:FIFO***********\n"); printf("*****o:OPT************\n"); printf("*****l:LRU************\n"); printf("******e:退出界面*******\n"); printf("**请选择操作,输入f,o,l,e**\n"); printf("************************\n"); getchar(); scanf("%c", &c); curmemory=0; if(c=='f') //FIFO页面置换 fifo(); else if(c=='o') //OPT页面置换算法 opt(); else if(c=='l') //LRU页面置换算法 lru(); else if(c=='e') return 0; else printf("请再次输入\n"); } return 0; } void print(Pro *memory)//打印当前的页面 { int j; for (j = 0; j { printf("%d ", memory[j].num); } printf("\n"); } //在页面集memory1中查找num,如果找到,返回其在memory中的下标,否则返回-1 int Search(int num,Pro *memory) { int j; for (j=0; j { if (num == memory[j].num) //如果在内存中找到该页面,返回内存的位置标号return j; } return -1; //如果没找到的话,返回-1 }