实验指导 一
、页面置换算法的基本内容
1.1 页面置换算法是在当进程运行过程中,若其要访问的页面不在内存且内存已满时,要决定将哪个页面换出的算法。常见的页面置换算法包括最佳置换、先进先出置换、最近最久未使用置换和Clock置换等。本次的实验实现的算法包括最佳置换算法(OPT)、先进先出置换算法(FIFO)和最近最久未使用算法(LRU)。
1.2 页面置换算法涉及到一些概念如下: 缺页率:当需要访问的页面不在内存时称为缺页,此时需要将页面调入内存。缺页率就是要访问的页面不在内存中的概率。因此缺页率=缺页次数/要访问的页面总数。需要注意的是,缺页的时候不一定需要进行页面置换(如果内存还没满,直接将页面调入内存即可)。
置换率:置换就是将旧页面调出内存,新页面调进内存,即新页面代替旧页面的过程。置换率就是需要进行页面置换的概率。所以置换率=置换次数/要访问的页面总数。
命中率:就是要访问的页面恰好在内存中的概率。可以发现(缺页率+命中率=1)。 最佳置换算法
最佳置换算法,就是所选择内存中以后永远不再使用,或者是在未来最长的一段时间内不再被访问的页面来换出。用这种算法可以保证获得最低的缺页率,最低的置换次数,因此效率最高。然而在实际情况中,我们是无法知道哪个页面是未来最长时间内不再被访问的,所以实际上它是无法实现的。
先进先出置换算法 先进先出置换算法,就是选择内存中最先进入内存,在内存中呆的最久的页面来换出。它实现简单,但是效率不高。 最近最久未使用算法
最近最久未使用算法,是选择当前内存中,最久没有被访问的页面来换出。它是希望通过过去页面访问的情况,来预测未来页面的访问情况,但是页面过去与未来的走向之间并没有必然的联系,因此它的效率也不是十分高。

根据实验指导书搜索资料编写实验代码

代码功能:
根据自己输入 物理块数量,访问页面总数,要访问的页面号,
然后选择所需的置换算法 OPT,FIFO,LRU 三选一. 计算过程,并得出 缺页次数,缺页率,置换次数,命中率的结果;
1.使用FIFO置换算法

2.使用OPT置换算法

#include <stdio.h>//初始化队列
void initializeList(int list[],int number){for (int i = 0; i < number; i ++) {list[i] = -1;}
}
//展示队列状态
void showList(int list[], int number){for (int i = 0; i < number; i ++) {printf("%2d",list[i]);}printf("\n");
}//展示当前内存状态
void showMemoryList(int list[],int phyBlockNum){for (int i = 0; i < phyBlockNum; i ++) {if (list[i] == -1) {break;}printf(" |%d|",list[i]);}printf("\n");
}void informationCount(int missingCount,int replaceCount,int pageNum){printf("缺页次数:%d   缺页率:%d/%d\n",missingCount,missingCount,pageNum);double result = (double)(pageNum - missingCount)/(double)pageNum;printf("置换次数:%d  命中率:%.2f\n",replaceCount,result);
}//找到该页面下次要访问的位置
int getNextPosition(int currentPage,int currentPosition,int strList[],int pageNum){for (int i = currentPosition+1; i < pageNum; i ++) {if (strList[i] == currentPage) {return i;}}return 100;
}//最佳置换算法
void replacePageByOPT(int memoryList[],int phyNum,int strList[],int pageNum){//置换次数int replaceCount = 0;//缺页次数int missingCount = 0;//记录在内存的物理块的下一次访问位置int nextPosition[phyNum];//初始化initializeList(nextPosition, phyNum);//记录当前页面的访问情况: 0 未访问int isVisited;for (int i = 0; i < pageNum; i ++) {isVisited = 0;//判断是否需要置换->内存已满且需要访问的页面不在内存中for (int j = 0; j < phyNum; j ++) {if (memoryList[j] == strList[i]) {//该页面已经存在内存中//记录下一次访问它的位置nextPosition[j] = getNextPosition(memoryList[j], i, strList, pageNum);//修改访问情况isVisited = 1;//展示printf("%d\n",strList[i]);break;}if (memoryList[j] == -1) {//页面不在内存中且内存未满->直接存入memoryList[j] = strList[i];nextPosition[j] = getNextPosition(memoryList[j], i, strList, pageNum);missingCount ++;//修改访问情况isVisited = 1;//展示printf("%d\n",strList[i]);showMemoryList(memoryList, phyNum);break;}}if (!isVisited) {//当前页面还没访问过//内存已满且当前访问不在内存中->进行置换//1.寻找到最晚才被访问到的页面int max = 0;for (int k = 1; k < phyNum; k ++) {if (nextPosition[max] < nextPosition[k]) {max = k;}}//2.将该位置的页面换出memoryList[max] = strList[i];nextPosition[max] = getNextPosition(memoryList[max], i, strList, pageNum);missingCount ++;replaceCount ++;//展示printf("%d\n",strList[i]);showMemoryList(memoryList, phyNum);}}informationCount(missingCount, replaceCount,pageNum);
}
//先进先出置换算法
void replacePageByFIFO(int memoryList[],int phyNum,int strList[],int pageNum){//置换次数int replaceCount = 0;//缺页次数int missingCount = 0;//记录当前最早进入内存的下标int pointer = 0;//记录当前页面的访问情况: 0 未访问int isVisited = 0;for (int i = 0; i < pageNum; i ++) {isVisited = 0;//判断是否需要置换->内存已满且需要访问的页面不在内存中for (int j = 0; j < phyNum; j ++) {if (memoryList[j] == strList[i]) {//该页面已经存在内存中//修改访问情况isVisited = 1;//修改访问时间//展示printf("%d\n",strList[i]);break;}if (memoryList[j] == -1) {//页面不在内存中且内存未满->直接存入memoryList[j] = strList[i];//修改访问情况isVisited = 1;missingCount ++;//展示printf("%d\n",strList[i]);showMemoryList(memoryList, phyNum);break;}}if (!isVisited) {//当前页面还未被访问过->需要进行页面置换//直接把这个页面存到所记录的下标中memoryList[pointer] = strList[i];//下标指向下一个pointer ++;//如果到了最后一个,将下标归零if (pointer > phyNum-1) {pointer = 0;}missingCount ++;replaceCount ++;//展示printf("%d\n",strList[i]);showMemoryList(memoryList, phyNum);}}informationCount(missingCount, replaceCount, pageNum);
}//最近最久未使用置换算法
void replacePageByLRU(int memoryList[],int phyNum,int strList[],int pageNum){//置换次数int replaceCount = 0;//缺页次数int missingCount = 0;//记录内存中最近一次访问至今的时间int timeRecord[phyNum];//初始化initializeList(timeRecord, phyNum);//记录当前页面的访问情况: 0 未访问int isVisited = 0;//记录已经在内存中的页面数量int pageCount = 0;for (int i = 0; i < pageNum; i ++) {isVisited = 0;//时间加一for (int p = 0; p < pageCount; p ++) {if (memoryList[p] != -1) {timeRecord[p] ++;}}//是否需要置换for (int j = 0; j < phyNum; j ++) {if (memoryList[j] == strList[i]) {//该页面已经存在内存中//修改访问情况isVisited = 1;//重置访问时间timeRecord[j] = -1;//展示printf("%d\n",strList[i]);break;}if (memoryList[j] == -1) {//页面不在内存中且内存未满->直接存入memoryList[j] = strList[i];pageCount ++;//修改访问情况isVisited = 1;//修改访问时间timeRecord[j] ++;missingCount ++;//展示printf("%d\n",strList[i]);showMemoryList(memoryList, phyNum);break;}}if (!isVisited) {//需要置换//1.遍历时间记录表,寻找最久未访问的页面所在的内存下标int max = 0;for (int k = 0; k < phyNum; k ++) {if (timeRecord[max] < timeRecord[k]) {max = k;}}//2.将该位置的页面换出memoryList[max] = strList[i];timeRecord[max] = -1;missingCount ++;replaceCount ++;//展示printf("%d\n",strList[i]);showMemoryList(memoryList, phyNum);}}informationCount(missingCount, replaceCount, pageNum);
}int main(int argc, const char * argv[]) {//物理块的数量int phyBlockNum;printf("请输入物理块数量:\n");scanf("%d",&phyBlockNum);//生成内存队列int memoryList[phyBlockNum];//初始化内存状态initializeList(memoryList, phyBlockNum);//showMemoryList(memoryList,phyBlockNum);//页面数量int pageNum;printf("请输入要访问的页面总数:\n");scanf("%d",&pageNum);//保存页面号引用串int pageNumStrList[pageNum];printf("请输入要访问的页面号:\n");for (int i = 0; i < pageNum; i ++) {scanf("%d",&pageNumStrList[i]);}showList(pageNumStrList, pageNum);int chose;while (1) {printf("请选择所需的置换算法:\n");printf("1.OPT 2.FIFO 3.LRU 4.退出\n");scanf("%d",&chose);switch (chose) {case 1:showList(pageNumStrList, pageNum);replacePageByOPT(memoryList, phyBlockNum, pageNumStrList, pageNum);//重新初始化内存initializeList(memoryList, phyBlockNum);break;case 2:showList(pageNumStrList, pageNum);replacePageByFIFO(memoryList, phyBlockNum, pageNumStrList, pageNum);//重新初始化内存initializeList(memoryList , phyBlockNum);break;case 3:showList(pageNumStrList, pageNum);replacePageByLRU(memoryList, phyBlockNum, pageNumStrList, pageNum);//重新初始化内存initializeList(memoryList, phyBlockNum);break;default:return 0;break;}}return 0;
}

操作系统页面置换算法实验报告相关推荐

  1. 操作系统——页面置换算法练习题

    操作系统--页面置换算法练习题 1.设某计算机的逻辑地址空间和物理地址空间均为64KB,按字节编址.若某进程最多需要6页(Page)数据存储空间,页的大小为1KB,操作系统采用固定分配局部置换策略为此 ...

  2. 操作系统-页面置换算法

    实验六:页面置换算法 一. 实验目的( 页面置换 ) 在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选 ...

  3. 2020-11-22(操作系统——页面置换算法)

    当内存中的页面满了之后,需要的数据又在磁盘虚拟内存中,可以使用页面置换算法将需要的页置换到物理内存中.下面先介绍几种局部页面置换算法,其针对一个进程而言的页面置换. 一.局部页面置换算法 1.最优页面 ...

  4. 计算机操作系统——页面置换算法

    声明:本篇博客参考书籍<计算机操作系统>(西安电子科技大学出版社) 文章目录 一.最佳页面置换算法 1.基本知识 2.算法思想 二.先进先出(FIFO)页面置换算法 1.基本知识 2.算法 ...

  5. 操作系统——页面置换算法

    一.页面置换算法简介 操作系统将内存按照页的进行管理,在需要的时候才把进程相应的部分调入内存.当产生缺页中断时,需要选择一个页面写入.如果要换出的页面在内存中被修改过,变成了"脏" ...

  6. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  7. 操作系统 页面置换算法模拟

    据实验作业挑选了几种页面置换算法进行实验.(仅个人理解 1.先进先出页面置换算法(FIFO). 2.最近最久未被使用页面置换算法(LRU). 3.最佳页面置换算法(OPT). 4.最少使用页面置换算法 ...

  8. 操作系统页面置换算法之先进先出(FIFO)页面置换算法(C语言实现)

    先进先出(FIFO)页面置换算法 [注]本代码数据及思路方法参考自<计算机操作系统(第四版)>汤小丹等 编著的教材. #include <iostream>int access ...

  9. 操作系统页面置换算法

    通常把选择换出页面的算法称为页面置换算法,置换算法的好坏直接影响到系统的性能,不适当的算法可能会导致抖动, 最近学习了一下,算是做一个笔记吧... 实现OPT和LRU置换算法 #include < ...

最新文章

  1. HDU5593 ZYB's Tree 树形DP +分治
  2. osg中添加自定义事件UserEvent
  3. JQuery this和$(this)的区别及获取$(this)子元素对象的方法
  4. js 实现网页显示倒计时
  5. 想做大牛,Java开发的必备技术点你了解了吗?
  6. Abp vnext Web应用程序开发教程 4 —— 集成测试
  7. activiti 文档_Activiti快速入门 kft-activiti-demo
  8. Wise UNpacker 0.91A [with Delphi Source]
  9. 62. WWW 服务器
  10. linux安装p12,用命令行安装mobileprovision和p12证书
  11. MFC学生信息管理系统
  12. 程序员保护眼睛几种方法
  13. win10各版本的历史记录
  14. 腾讯云平台WordPress建站问题记录
  15. 金士顿内存条真假测试软件,金士顿内存条真伪怎么看?金士顿内存条判别真伪的几种方法...
  16. bugly怎么读_腾讯Bugly巨坑:使用不当造成UI界面卡死
  17. Docker 18.09.0更换阿里镜像加速器
  18. 系统架构演变和远程调用
  19. Word多级标题设置,一级标题是汉字数字,其他级别是阿拉伯数字
  20. EXCEL破冰 - 锁定单元格样式和输入格式

热门文章

  1. U9cloud RPA加持 智领未来
  2. 记Thoughtworks一次糟糕的面试
  3. 【转】ubuntu 下安装mongodb php 拓展的方法
  4. lintcode:二叉树的中序遍历
  5. led显字风扇原理?
  6. 用rate-limit来限制特定用户的流量
  7. ASP.NET 2.0 XML 系列(2): XML技术
  8. spark比java快吗_为什么我的Spark DataFrame比RDD慢得多?
  9. google浏览器javascript没反应_浏览器之导航这件小事
  10. ABAP delete的用法