本实验要求模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。以此来加深对虚拟存储的理解。

第一题:模拟分页式存储管理中硬件的地址转换和产生缺页中断。

第二题:用先进先出(FIFO)页面调度算法处理缺页中断。

第三题:用最近最少用(LRU)页面调度算法处理缺页中断。

注:网上代码很多,但我借鉴的那篇,它的LRU算法的解题思想与主流不一样,我对其做了修正。

编程语言:C/C++

编译环境:Vs Code


运行结果截图: 

FIFO算法:

 LRU算法:


源代码:

#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#include <iostream>
using namespace std;
#define PROCESSLOGICPAGE 7  // 进程的逻辑页数
#define SIZEOFPAGE 128      // 每个页面的大小
#define PROCESSPAGENUMBER 4 // 给予进程的页框数struct pageinfo //页表
{bool flag;                // 标志位, 1 为已经在主存中 0 为不在主存中int block;                // 主存块号int disk;                 // 在磁盘上的位置bool revise;              // 修改标志, 1 为被修改 0 为未被修改
} pagelist[PROCESSLOGICPAGE]; // 页表int pageQueuePointer = 0;     // 队列指针,指向调出的页面
int queue[PROCESSPAGENUMBER]; // 主存页号队列void init() // 初始化页表
{queue[0] = 0;queue[1] = 1;queue[2] = 2;queue[3] = 3;pagelist[0].flag = 1;pagelist[0].block = 5;pagelist[0].disk = 011;pagelist[1].flag = 1;pagelist[1].block = 8;pagelist[1].disk = 012;pagelist[2].flag = 1;pagelist[2].block = 9;pagelist[2].disk = 013;pagelist[3].flag = 1;pagelist[3].block = 1;pagelist[3].disk = 021;pagelist[4].disk = 022;pagelist[5].disk = 023;pagelist[6].disk = 121;
}void showPageListCondition()
{printf("\n-------------Information of pagelist-------------\n");printf("页号\t标志位\t页框号\t在磁盘上的位置\t修改标志\n");for (int i = 0; i < PROCESSLOGICPAGE; i++)printf("%d\t%d\t %d\t %d\t\t %d\n", i, pagelist[i].flag, pagelist[i].block, pagelist[i].disk, pagelist[i].revise);printf("------------------------------------------This is the dividing line.--------------------------------------------------\n");
}void pageFault() // 缺页中断
{int page, unit;string select;do{printf("请输入指令的页号和单元号:\n");if (scanf("%d %d", &page, &unit) != 2){cin >> select;if (select == "exit")break;}if (unit >= SIZEOFPAGE || unit < 0 || page < 0 || page >= PROCESSLOGICPAGE){printf("页号或单元号超出范围,请重新输入\n");continue;}else{if (pagelist[page].flag) // 该页在主存中{int result = pagelist[page].block * SIZEOFPAGE + unit;cout << "绝对地址为:" << pagelist[page].block << "*" << SIZEOFPAGE << "+" << unit << "=" << result << 'B' << endl;}else // 该页不在主存中printf("发生缺页中断:* %d\n", page);}} while (true);
}void pageFault_FIFO()
{int page, unit;string select;do{printf("请输入指令的:\n页号 单元号 是否为存指令(y/n) \n");if (scanf("%d %d", &page, &unit) != 2) // 输入页号和单元号{cin >> select;if (select == "exit") // 输入exit退出break;}if (unit >= SIZEOFPAGE || unit < 0 || page < 0 || page >= PROCESSLOGICPAGE){printf("页号或单元号超出范围,请重新输入\n");cin >> select;continue;}else{cin >> select;           // 读入是否为存指令if (pagelist[page].flag) // 该页在主存中{int result = pagelist[page].block * SIZEOFPAGE + unit;cout << "绝对地址为:" << pagelist[page].block << "*" << SIZEOFPAGE << "+" << unit << "=" << result << 'B' << endl;if (select[0] == 'Y' || select[0] == 'y') // 是存指令,修改标志为“1”pagelist[page].revise = 1;}else // 该页不在主存中,产生缺页中断{pagelist[page].revise = 0; // 将页块修改标志置为“0”pagelist[queue[pageQueuePointer]].flag = 0;  // 从主存中调出该页printf("Bring up: %d\t\tWrite back to disk: %s\n", queue[pageQueuePointer], pagelist[queue[pageQueuePointer]].revise ? "True" : "False"); //输出调出的页号printf("Call in: %d\n", page);  //输出装入的页号pagelist[page].block = pagelist[queue[pageQueuePointer]].block; // 将该页的块号更新为被调出的页面的块号pagelist[page].flag = 1;   // 将该页标志置为“1”queue[pageQueuePointer] = page; // 将该页号放入队列pageQueuePointer = (pageQueuePointer + 1) % PROCESSPAGENUMBER;  // 队列指针后移}}} while (true);printf("------------------------------------------This is the dividing line.--------------------------------------------------\n");printf("主存页号队列为(第一个队首元素为下一个要被调出的页号):\n");for (int i = pageQueuePointer; i < PROCESSPAGENUMBER; i++)printf("%d\t", queue[i]);for (int i = 0; i < pageQueuePointer; i++)printf("%d\t", queue[i]);printf("\n");
}int findSubpoint(int page)
{for (int i = 0; i < PROCESSPAGENUMBER; i++)if (queue[i] == page)return i;return PROCESSPAGENUMBER - 1;
}void pageFault_LRU()
{int page, unit;string select;do{printf("请输入指令的:\n页号 单元号 是否为存指令(y/n) \n");if (scanf("%d %d", &page, &unit) != 2){cin >> select;if (select == "exit")break;}if (unit >= SIZEOFPAGE || unit < 0 || page < 0 || page >= PROCESSLOGICPAGE){printf("页号或单元号超出范围,请重新输入\n");cin >> select;continue;}else{cin >> select;           // 读入是否为存指令if (pagelist[page].flag) // 该页在主存中{int result = pagelist[page].block * SIZEOFPAGE + unit;cout << "绝对地址为:" << pagelist[page].block << "*" << SIZEOFPAGE << "+" << unit << "=" << result << 'B' << endl;if (select[0] == 'Y' || select[0] == 'y') // 是存指令,修改标志为“1”pagelist[page].revise = 1;for (int i = findSubpoint(page); i > 0; i--)queue[i] = queue[i - 1];queue[0] = page;}else // 该页不在主存中,产生缺页中断{pagelist[page].revise = 0;   // 将页块修改标志置为“0”pagelist[queue[PROCESSPAGENUMBER - 1]].flag = 0;    // 调出队尾元素printf("Bring up: %d\t\tWrite back to disk: %s\n", queue[PROCESSPAGENUMBER - 1], pagelist[queue[PROCESSPAGENUMBER - 1]].revise ? "True" : "False"); //输出调出的页号printf("Call in: %d\n", page);  //输出装入的页号pagelist[page].block = pagelist[queue[PROCESSPAGENUMBER - 1]].block;pagelist[page].flag = 1;queue[PROCESSPAGENUMBER - 1] = page;for (int i = PROCESSPAGENUMBER - 1; i > 0; i--)queue[i] = queue[i - 1];queue[0] = page;}}} while (true);printf("------------------------------------------This is the dividing line.--------------------------------------------------\n");printf("主存页号队列为(第一个队首页号为最近一次访问,最后一个队尾页号为下一次调出页号):\n");for (int i = 0; i < PROCESSPAGENUMBER; i++)printf("%d\t", queue[i]);printf("\n");
}int main()
{int select;string s;do{init();printf("\n********Page scheduling algorithm simulation********\n");printf("1.第一题  2.第二题  3.第三题  exit.退出\n");if (scanf("%d", &select) != 1){cin >> s;if (s == "exit")break;}else{system("cls");if (select == 1){printf("******************Basic simulation******************\n");showPageListCondition();pageFault();}if (select == 2){printf("********FIFO scheduling algorithm simulation********\n");showPageListCondition();pageFault_FIFO();}if (select == 3){printf("*********LRU scheduling algorithm simulation*********\n");showPageListCondition();pageFault_LRU();}}for (int i = 0; i < PROCESSLOGICPAGE; i++){pagelist[i].flag = 0;pagelist[i].block = 0;pagelist[i].revise = 0;}} while (true);return 0;
}

页面调度算法处理缺页中断相关推荐

  1. 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    一实验内容: 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断. 二.实验题目: 模拟分页式存储管理中硬件的地址转换和产生缺页中断. 用先进先出(FIFO)页面调度 ...

  2. 【学习笔记】第三章——内存 IV(虚拟内存、请求分页、页面置换、缺页中断、抖动现象)

    文章目录 一. 虚拟内存 1)传统存储管理方式的特征.缺点 2)虚拟内存的定义和特征 3)如何实现虚拟内存 -- 请求分页存储管理 二. 缺页中断 1)缺页中断机构 2)请求分页的地址变换机构 三. ...

  3. c语言实现页面调度算法实验报告,c语言实现调度算法程序设计实验报告-先来先服务fcfs.docx...

    c语言实现调度算法程序设计实验报告-先来先服务fcfs 实验报告 <操作系统>课程综合性实验报告 课程设计报告 课程设计题目:先来先服务(FCFS)调度算法模拟 专业:计算机科学与技术班级 ...

  4. 【操作系统】关于LRU算法,FIFO算法,OPT算法页面调度算法及例子

    题目:一进程刚获得三个主存块的使用权,若该进程访问页面的次序是{1,3,2,1,2,1,5,1,2,3},采用LRU算法时,缺页数是______次. LRU算法 简介:算法根据数据的历史访问记录来进行 ...

  5. 内存常用的页面调度算法

    1.最优(OPT)算法 选择不再使用或最远的将来才被使用的页,这是理想的算法,但是难以实现. 2.随机(RAND)算法 随机地选择被淘汰的页,开销小,但是可能选中立即就要访问的页. 3.先进先出算法( ...

  6. nowcoder 页面调度算法

    问题描述 http://www.nowcoder.com/question/next?pid=1725826&qid=44805&tid=3976758 笔记 以一个vector作为缓 ...

  7. 东北大学软件学院操作系统v实验报告

    课程编号:B080000070     <操作系统>实验报告             姓名   学号   班级   指导教师   实验名称 <操作系统>实验 开设学期 2016 ...

  8. 东北大学操作系统实验三详解

    先进先出页面调度算法的思想?        先进先出(FIFO)页面调度算法处理缺页中断 在分页式虚拟存储系统中,当硬件发出"缺页中断"后,引出操作系统来处理这个中断事件.如果主存 ...

  9. 操作系统课程实验代码汇总

    操作系统课程实验代码汇总 本次内容供需要有相关实验需要的提供参考,代码下载方式在文末 文章目录 操作系统课程实验代码汇总 前言 一.进程管理 实验目的 代码 说明 二.进程调度 实验目的 说明 三.银 ...

最新文章

  1. 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...
  2. ArcGIS中的三种查询
  3. 如何让局部变量具有全局生命期
  4. CentOS 阿里云硬盘扩容
  5. hdu2110(普通母函数)
  6. android倒计时录制视频下载,android录制视屏(预览,倒计时)
  7. TCP三次握手建立连接的过程
  8. 查看运行时间_怎样查看自己电脑系统的版本信息?
  9. halcon彩色图像颜色处理算子,持续更新
  10. leetcode97 交错字符串
  11. input子系统基础之按键4——输入核心层源码分析
  12. 我的一篇思想汇报——君子务本,本立而道生
  13. 【英语学习】【English L06】U08 News L4 A piece of great news
  14. 测试驱动开发_?使用jest进行测试驱动开发
  15. 01-03 Linux常用命令-文本处理
  16. emacs下的几个神器
  17. Excel取消自动行高调整(取消自动换行)
  18. mongo分片集群部署
  19. office2007 ppt制作与应用母板
  20. 游戏企业该如何做好网络安全防护?

热门文章

  1. mysql 给视图创建索引_mysql-视图及索引简介
  2. angular 点击div区域外div隐藏
  3. java 导入excel表格(批量导入),下载excel模板,导出表格
  4. 2,type-c,USB3.0/3.1,PD快充协议最详细的讲解;USB 3.0 Standard-A和Standard-B的引脚定义
  5. Spring Framework 5.3文档学习(一)
  6. android开发板配ip,itop4412开发板-Android4.4-设置静态IP
  7. Zipline学习笔记
  8. python itertools_Python之itertools库
  9. SpringBoot常用的application配置
  10. 初识网络基础《网络七层模型详解》