页面调度算法处理缺页中断
本实验要求模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。以此来加深对虚拟存储的理解。
第一题:模拟分页式存储管理中硬件的地址转换和产生缺页中断。
第二题:用先进先出(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;
}
页面调度算法处理缺页中断相关推荐
- 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
一实验内容: 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断. 二.实验题目: 模拟分页式存储管理中硬件的地址转换和产生缺页中断. 用先进先出(FIFO)页面调度 ...
- 【学习笔记】第三章——内存 IV(虚拟内存、请求分页、页面置换、缺页中断、抖动现象)
文章目录 一. 虚拟内存 1)传统存储管理方式的特征.缺点 2)虚拟内存的定义和特征 3)如何实现虚拟内存 -- 请求分页存储管理 二. 缺页中断 1)缺页中断机构 2)请求分页的地址变换机构 三. ...
- c语言实现页面调度算法实验报告,c语言实现调度算法程序设计实验报告-先来先服务fcfs.docx...
c语言实现调度算法程序设计实验报告-先来先服务fcfs 实验报告 <操作系统>课程综合性实验报告 课程设计报告 课程设计题目:先来先服务(FCFS)调度算法模拟 专业:计算机科学与技术班级 ...
- 【操作系统】关于LRU算法,FIFO算法,OPT算法页面调度算法及例子
题目:一进程刚获得三个主存块的使用权,若该进程访问页面的次序是{1,3,2,1,2,1,5,1,2,3},采用LRU算法时,缺页数是______次. LRU算法 简介:算法根据数据的历史访问记录来进行 ...
- 内存常用的页面调度算法
1.最优(OPT)算法 选择不再使用或最远的将来才被使用的页,这是理想的算法,但是难以实现. 2.随机(RAND)算法 随机地选择被淘汰的页,开销小,但是可能选中立即就要访问的页. 3.先进先出算法( ...
- nowcoder 页面调度算法
问题描述 http://www.nowcoder.com/question/next?pid=1725826&qid=44805&tid=3976758 笔记 以一个vector作为缓 ...
- 东北大学软件学院操作系统v实验报告
课程编号:B080000070 <操作系统>实验报告 姓名 学号 班级 指导教师 实验名称 <操作系统>实验 开设学期 2016 ...
- 东北大学操作系统实验三详解
先进先出页面调度算法的思想? 先进先出(FIFO)页面调度算法处理缺页中断 在分页式虚拟存储系统中,当硬件发出"缺页中断"后,引出操作系统来处理这个中断事件.如果主存 ...
- 操作系统课程实验代码汇总
操作系统课程实验代码汇总 本次内容供需要有相关实验需要的提供参考,代码下载方式在文末 文章目录 操作系统课程实验代码汇总 前言 一.进程管理 实验目的 代码 说明 二.进程调度 实验目的 说明 三.银 ...
最新文章
- 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...
- ArcGIS中的三种查询
- 如何让局部变量具有全局生命期
- CentOS 阿里云硬盘扩容
- hdu2110(普通母函数)
- android倒计时录制视频下载,android录制视屏(预览,倒计时)
- TCP三次握手建立连接的过程
- 查看运行时间_怎样查看自己电脑系统的版本信息?
- halcon彩色图像颜色处理算子,持续更新
- leetcode97 交错字符串
- input子系统基础之按键4——输入核心层源码分析
- 我的一篇思想汇报——君子务本,本立而道生
- 【英语学习】【English L06】U08 News L4 A piece of great news
- 测试驱动开发_?使用jest进行测试驱动开发
- 01-03 Linux常用命令-文本处理
- emacs下的几个神器
- Excel取消自动行高调整(取消自动换行)
- mongo分片集群部署
- office2007 ppt制作与应用母板
- 游戏企业该如何做好网络安全防护?
热门文章
- mysql 给视图创建索引_mysql-视图及索引简介
- angular 点击div区域外div隐藏
- java 导入excel表格(批量导入),下载excel模板,导出表格
- 2,type-c,USB3.0/3.1,PD快充协议最详细的讲解;USB 3.0 Standard-A和Standard-B的引脚定义
- Spring Framework 5.3文档学习(一)
- android开发板配ip,itop4412开发板-Android4.4-设置静态IP
- Zipline学习笔记
- python itertools_Python之itertools库
- SpringBoot常用的application配置
- 初识网络基础《网络七层模型详解》