操作系统综合实践报告
课程号:220011050
设计题目:页面置换算法

姓 名 刘衍鸣
学 院 信息与电气工程学院
专 业 计算机科学与技术
年 级 2019级专升本
学 号 20192203172
成绩评定:
2019 年 12 月 25 日

一、 课程设计选题
1.选题内容
编程序实现先进先出算法(FIFO)、最近最久未使用算法(LRU)、最佳置换算法(OPT)的具体实现过程,并计算访问命中率。
2.选题要求
①计主界面以灵活选择某算法,且以上算法都要实现。
②用随机数方法产生页面走向。
③假定初始时页面都不在内存。
二、 课程设计需求分析
在进程运行过程中,若其所要访问的页面不在内存,而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据送到磁盘的对换区中。但应将哪个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms)。 置换算法的好坏将直接影响到系统的性能。
三、 概要设计
在程序中定义两个数组分别存放内存块的内容和页面引用序列,让页面引用序列进入内存块,如果内存块已满进行页面置换,实现先进先出算法时,定义一个时间数组,让先进内存块对应的数组值最大的用于置换;实现最近最久未使用算法时,定义一个使用数组,让最近未被使用的内存块对应数组最大值用于置换;实现最佳置换算法时,分别将内存块内容与剩余页面内容序列相同时的最大值的块用于页面置换。
四、 模块的基本算法
CreatePage():初始化页面序列,在页面序列数组Page[PNum]中随机生成PNum个数。
FIFO():先进先出页面置换算法。
LRU():最近最久未使用算法。
OPT():最佳置换算法。
五、 系统实现

  1. 流程图




2.代码

#include <stdio.h>
#include <stdlib.h>
#define PNum 12
#define BNum 3
int Page[PNum]={0};
typedef struct{int block;int time;
}BLock;
typedef struct LNode{BLock B[3];
}Mem;
Mem M;
void CreatePage(){//初始化页面printf("页面走向:\n");for(int i=0;i<PNum;i++){Page[i]=rand()%9+1;printf("%d ",Page[i]);} printf("\n");
}
int max(int a,int b,int c){int x,z;if(a>=b)x=a;else x=b;if(x>=c)z=x;elsez=c;return z;
}
void InitM(){for(int q=0;q<PNum;q++){M.B[q].block=0;}for(int q=0;q<PNum;q++){M.B[q].time=0;}
}
void FIFO(){    //先进先出页面置换算法printf("具体实现过程:\n");InitM();int i=0,j=0;int a=-1,b=-1;int Max=-1;int MaxT=0;int count=0;for(i=0;i<PNum;i++){for(j=0;j<BNum;j++)if(M.B[j].block==0){a=j;  //记住第一个页面为空的下标用于进入内存 break; }for(j=0;j<BNum;j++){if(M.B[j].block==Page[i])b=j; //记住相同页面的下标不再置换 }for(j=0;j<BNum;j++){if(M.B[j].time>MaxT){MaxT=M.B[j].time;Max=j; //记住最先进入内存页面的下标 } }if(b==-1){  //内存中没有相同的页 if(a!=-1){ //内存中还有空页面 M.B[a].block=Page[i];M.B[a].time=0;for(j=0;j<=a;j++)M.B[j].time++ ;  //    a=-1; }else{ //内存中已没有空页需进行置换 M.B[Max].block=Page[i];M.B[Max].time=0;for(j=0;j<BNum;j++)M.B[j].time++;Max=-1;MaxT=0;count++; }    }else{ //内存中有相同的页不再置换 M.B[b].block=Page[i];for(j=0;j<BNum;j++){M.B[j].time++;}b=-1; }for(j=0;j<BNum;j++){printf("%d ",M.B[j].block);}printf("\n");  }float rate;float n=PNum-count;rate=(n/PNum)*100;printf("命中率为%.2lf%%\n",rate);
}
void LRU(){ //最近最久未使用置换算法printf("具体实现过程:\n");InitM();int i=0,j=0;int a=-1,b=-1;int Max=-1;int MaxU=0;int count=0;for(i=0;i<PNum;i++){for(j=0;j<BNum;j++)if(M.B[j].block==0){a=j;  //记住第一个页面为空的下标用于进入内存 break; }for(j=0;j<BNum;j++){if(M.B[j].block==Page[i])b=j; //记住相同页面的下标不再置换 }for(j=0;j<BNum;j++){if(M.B[j].time>MaxU){MaxU=M.B[j].time;Max=j; //记住最先进入内存页面的下标 } }if(b==-1){ //内存中没有相同的页 if(a!=-1){ //内存中还有空页面 M.B[a].block=Page[i];M.B[a].time=0;for(j=0;j<=a;j++)M.B[j].time++;a=-1;}else{//内存中已没有空页需进行置换 M.B[Max].block=Page[i];M.B[Max].time=0;for(j=0;j<BNum;j++)M.B[j].time++;Max=-1;MaxU=0;count++; }}else{//内存中有相同的页不再置换M.B[b].block=Page[i];M.B[b].time=0;  //再次使用,置其为0 if(a!=-1){M.B[a].time=0;  }for(j=0;j<BNum;j++){M.B[j].time++;}Max=-1;MaxU=0;b=-1;} for(j=0;j<BNum;j++){printf("%d ",M.B[j].block);}printf("\n");    }float rate;float n=PNum-count;rate=(n/PNum)*100;printf("命中率为%.2lf%%\n",rate);
}
void OPT(){ //最佳置换算法printf("具体实现过程:\n");for(int q=0;q<PNum;q++){M.B[q].block=0;} int i=0,j=0;int a=-1,b=-1;int Max=-1;int count=0;for(i=0;i<PNum;i++){for(j=0;j<BNum;j++)if(M.B[j].block==0){a=j;  //记住第一个页面为空的下标用于进入内存 break; }for(j=0;j<BNum;j++){if(M.B[j].block==Page[i])b=j; //记住相同页面的下标不再置换 }if(b==-1){//内存中没有相同的页if(a!=-1){ //内存中还有空页面 M.B[a].block=Page[i];//V[a]=0;a=-1;}else{  //内存中已没有空页需进行置换int c,d,e; int x,y,m;for(c=i+1;c<=PNum-1;c++){if(Page[c]==M.B[0].block){x=c;break;}else{x=PNum;}         }for(d=i+1;d<=PNum-1;d++){if(Page[d]==M.B[1].block){y=d;break;}else{y=PNum;}}for(e=i+1;e<=PNum-1;e++){if(Page[e]==M.B[2].block){m=e;break;}else{m=PNum;}}int z=max(x,y,m);if(z==x)Max=0;if(z==y)Max=1;if(z==m)Max=2;M.B[Max].block=Page[i];Max=-1; b=-1; count++;  } } else{//内存中有相同的页不再置换M.B[b].block=Page[i];}for(j=0;j<BNum;j++){printf("%d ",M.B[j].block);}printf("\n");}float rate;float n=PNum-count;rate=(n/PNum)*100;printf("命中率为%.2lf%%\n",rate);
}
void Printf(){printf("***********页面置换算法******************\n");printf("***** 1-先进先出页面置换算法*************\n");printf("***** 2-最近最久未使用页面置换算法*******\n");printf("***** 3-最佳置换算法*********************\n");printf("***** 0-退出*****************************\n");printf("*****************************************\n");
}
int main(){int n;while(1){Printf();printf("请选择您要进行的操作:\n");scanf("%d",&n);CreatePage();switch(n){case 1:FIFO();break;case 2:LRU();break;case 3:OPT();break;case 0:exit(0);break; }}return 0;
}

六、 系统测试



七、 总结
本次我的操作系统课程设计设计历时将近3天才得以完成,期间对作品进行了构想、思考、制作、完善,经历了这次实训让对知识点进行了系统化的学习,也让自己认识到了自己的不足。本次实训后,也让我深深地明白程序从系统设计的具体步骤,和一个系统应该具有哪些要素。相信在下一次的设计中我可以做的更好。
八、 参考文献
[1]汤小丹、梁红兵、哲凤屏、汤子瀛.计算机操作系统.西安电子科技大学出版社,2019.4

操作系统课程设计(页面置换算法 C语言)相关推荐

  1. 操作系统作业调度算法c语言,操作系统课程设计报告电梯调度算法c语言实现.doc...

    操作系统课程设计报告电梯调度算法c语言实现 操作系统课程设计报告电梯调度算法c语言实现 :调度 算法 电梯 课程设计 操作系统 操作系统课程设计报告 模拟操作系统课程设计 写一个简单的操作系统 篇一: ...

  2. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  3. OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc

    实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...

  4. 操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记)

    操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记) 题目要求 输入要求 输出要求 编程平台 实验成果 开始模拟 错误输入 退出程序 代码实现 抽象数据类型定义 指令地址流生成 指令地址流到页 ...

  5. 虚拟存储页面置换算法c语言,虚拟存储器管理页面置换算法模拟实验.doc

    虚拟存储器管理页面置换算法模拟实验 淮海工学院计算机工程学院 实验报告书 课程名:< 操作系统原理A > 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 软件*** 学 号: 2 ...

  6. 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...

    LRU页面置换算法模拟-最近最久未使用置换算法 LRU页面置换算法模拟-最近最久未使用置换算法|课程设计|计算机数据库课程设计 一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了 ...

  7. 时钟页面置换算法c语言,clock置换算法例题(改进clock置换算法例题讲解)

    Clock页面置换算法: 6)动态给出页面调用序列并进行调度: 7)输出置换结. C++编程要? 考试用 哪位大侠 帮帮 快点 谢谢了 这很简单啊,要打字太多了.不过网上这类算法举例很少,就看你怎么理 ...

  8. 先进先出(FIFO)页面置换算法 C语言实现

    广东工业大学 操作系统实验 实验内容 假设每个页面中可存放10条指令,分配给作业的内存块数为4.用C语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入 ...

  9. 操作系统课程设计——进程调度模拟程序(JAVA语言实现)

    本科期间的一些学习回忆记录(自己用) 一.课程设计的任务和要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算法模拟程序.  具体 ...

  10. 操作系统:基于页面置换算法的缓存原理详解(上)

    概述: 作为一个学计算机的一定听过缓存(注意这里是缓存,不是缓冲).比如我们在登录网页时,网页就可以缓存一些用户信息:比如我们在写界面代码的时候,可能就会遇到界面的绘制是基于一些缓存算法的.所以,了解 ...

最新文章

  1. NextGEN Gallery ~ 最强WordPress相册插件
  2. 再谈javascript图片预加载经典技术
  3. SSE2实现HAAR小波变换(dwt2与idwt2)
  4. 你真的了解Scrum吗?
  5. UITableView从storyBoard加载UITableViewCell的细节以及布局内边距问题
  6. 机器学习中目标函数、损失函数以及正则项的通俗解释
  7. 第二章:2线性表---单链表表示和实现
  8. python dict嵌套dict_处理复杂嵌套dict结构的python方法
  9. Pycharm远程调试服务器程序
  10. Android系统如何录制屏幕(录制成mp4格式)
  11. 微型计算机硬件包括啥,微型计算机系统的硬件包括哪五大组成部分
  12. python 拆分excel工作表_Python几行代码轻松拆分表格
  13. adb运行以及adb常用命令
  14. IDEA自动补全tab键向下选择s-tab向上选择
  15. 正无穷大、负无穷大和非数
  16. 分享136个PHP源码,总有一款适合您
  17. CCPC-Wannafly Winter Camp Day8 (Div2, onsite)
  18. mac 用户 文件夹 权限_Mac修改账户名称和个人目录后,进不去系统怎么办?
  19. 深度学习经典卷积神经网络之VGGNet
  20. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter学习

热门文章

  1. cad汉仪长仿宋体_长仿宋体字体下载 cad工程机械绘图工程制图国标字体下载
  2. python视频大全
  3. java用什么软件_Java编程什么软件最好用?
  4. java书籍私藏书单推荐!
  5. WebDriver Selenium eclipse环境搭建
  6. 我对“硬盘分区”的愚见
  7. 数论在计算机科学中的应用,近世代数思想方法在数论中的应用
  8. Nexus下载安装+登录修改密码(Maven私服)
  9. linux红帽认证考试费,红帽rhce认证考试费用是多少?
  10. 前端案例:飞机大战( js+dom 操作,代码完整,附图片素材)