操作系统 您所在的位置:网站首页 虚拟页式存储管理的主要特点 操作系统

操作系统

2024-07-07 19:18| 来源: 网络整理| 查看: 265

文章目录 一、实验目的二、实验内容三、数据结构四、程序流程图五、实验代码六、实验结果七、实验体会总结

一、实验目的

①掌握分页式存储管理地址转换和缺页中断。 ②理解虚拟存储器概念。

二、实验内容

1.模拟分页式存储管理中硬件的地址转换和产生缺页中断 分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。 作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。如果块长为2的幕次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。 2.用先进先出(FIFO)页面调度算法处理缺页中断 在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。 FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来 表示该作业已在主存的页面。假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。

三、数据结构

//页表信息结构体 struct info { bool state;//页标志,1表示该页已在内存,0表示该页不在内存 long block;//块号 long disk;//在磁盘上的位置 bool dirty;//更新标志 bool visit; //访问位 }pagelist[PAGENUM];

1、函数以及功能

函数名称功能描述void InitEx1()分页式虚拟存储系统初始化void WorkEx1()拟分页式存储管理中硬件的地址转换和产生缺页中断过程void InitEx2()用先进先出(FIFO)页面调度算法处理缺页中断的初始化,其中也包含了对于当前的存储期内容的初始化void WorkEx2()FIFO算法模拟void option()选择哪种方法进行void DisplayInfo()信息展示int main()main函数 四、程序流程图

在这里插入图片描述

图1-地址转换程序流程图

在这里插入图片描述

图2- FIFO页面置换算法程序流程图 五、实验代码 #include #include #include #define PAGENUM 100 //页数 #define PAGESIZE 128 //页大小 #define BLOCKSIZE 4 //假设内存中最多允许M个页面 #define SYSINFO "存储器管理" // 系统信息 #define AUTHOR "Yrani - 依然" //作者 /** * @Author: Yrani - 依然 * @Date: 2022-04-25 20:00:17 * @LastEditTime: 2022-04-28 12:55:00 * @keywords: FIFO页面调度算法、缺页中断、地址转换 **/ //页表信息结构体 struct info { bool state; //页标志,1表示该页已在内存,0表示该页不在内存 long block; //块号 long disk; //在磁盘上的位置 bool dirty; //更新标志 bool visit; //访问位置 } pagelist[PAGENUM]; long po = 0; //队列标记s long P[BLOCKSIZE]; //假设内存中最多允许BLOCKSIZE个页面 //分页式虚拟存储系统初始化 void InitEx1() { memset(pagelist,0,sizeof(pagelist));//内存空间初始化 pagelist[0].state = 1; pagelist[0].block = 5; pagelist[0].disk = 011; pagelist[1].state = 1; pagelist[1].block = 8; pagelist[1].disk = 012; pagelist[2].state = 1; pagelist[2].block = 9; pagelist[2].disk = 013; pagelist[3].state = 1; pagelist[3].block = 1; pagelist[3].disk = 021; } //模拟分页式存储管理中硬件的地址转换和产生缺页中断过程 void WorkEx1() { bool stop = 0; long p = 0, q = 0; char s[128]; while(!stop) { printf("请输入指令的页号和页内偏移:\n"); if(scanf("%ld%ld",&p,&q) != 2) { scanf("%s",&s); if(strcmp(s,"exit") == 0) { //如果输入的为"exit"那么就退出,进入重选页面 system("cls"); stop = true; } } else if(p != 0) { if(pagelist[p].state) { //如果该页state标志位为1,说明该页在主存中 printf("绝对地址=%ld\n",pagelist[p].block * PAGESIZE + q);//计算出绝对地址,绝对地址 = 块号*块长(默认128)+单元号 } else { printf("该页%ld不在页表中,发生了缺页中断\n",p);//如果该页state标志位为0,表示该页不在主存中,则产生了一次缺页中断 } } } } //以下部分为用先进先出(FIFO)页面调度算法处理缺页中断的初始化,其中也包含了对于当前的存储期内容的初始化 void InitEx2() { po = 0; P[0] = 0; P[1] = 1; P[2] = 2; P[3] = 3;//对内存中的4个页面初始化并使目前排在第一位的为0 memset(pagelist,0,sizeof(pagelist));//内存空间初始化 pagelist[0].state = 1; pagelist[0].block = 5; pagelist[0].disk = 011; pagelist[1].state = 1; pagelist[1].block = 8; pagelist[1].disk = 012; pagelist[2].state = 1; pagelist[2].block = 9; pagelist[2].disk = 013; pagelist[3].state = 1; pagelist[3].block = 1; pagelist[3].disk = 021; } //FIFO算法模拟 void WorkEx2() { long p = 0; long q = 0; long i = 0; char s[100]; bool stop = false; do { printf("请输入指令的页号:\n"); if(scanf("%ld", &p) != 1) { scanf("%s", s); if(strcmp(s, "exit") == 0) //如果输入为"exit"那么就退出,进入重选页面 { stop = true; system("cls"); } } else { if(pagelist[p].state) //如果该页flag标志位为1,说明该页在主存中 { printf("绝对地址=%ld\n", pagelist[p].block * PAGESIZE + q);//计算绝对地址,绝对地址=块号×块长(128)+单元号 } else { if(pagelist[P[po]].dirty) //当前页面被更新过,需把更新后的内容写回外存 { pagelist[P[po]].state = 0; } pagelist[P[po]].state = 0;//将flag标志位置0,表示当前页面已被置换出去 printf("被置换出去的页面为%ld\n", P[po]);//显示根据FIFO算法被置换出去的页面 printf("调入的页面为%ld\n", p);//显示根据FTFO算法被调入的页面 pagelist[p].block = pagelist[P[po]].block;//块号相同 pagelist[p].state = 1;//将当前页面的标记置为1,表示已在主存中 P[po] = p;//保存当前页面所在的位置 po = (po + 1) % BLOCKSIZE; for(i = 0; i printf("★★★★★★★★★★★★★★★★★\n"); printf("★☆☆☆☆%s☆☆☆☆☆☆★\n",SYSINFO); printf("☆☆☆☆☆@Author:%s☆☆☆☆★\n",AUTHOR); printf("★★★★★★★★★★★★★★★★★\n"); } //选择哪种方法进行 void option() { int option = 0; char s[128]; do { DisplayInfo(); //展示信息 printf("请选择题号(1/2):\n"); printf("注:输入exit可以进行退出!\n"); if(scanf("%d",&option) != 1) { scanf("%s",&s); if(strcmp(s,"exit") == 0) { //如果输入为exit则退出整个程序 return; } } else { if(option == 1) { //如果option=1说明选择的是模拟分页式存储管理中硬件的地址转换和产生缺页中断 InitEx1();//初始化 WorkEx1();//进行模拟 } if(option == 2) { //如果option=2说明选择的是FFO算法来实现页面的置换 InitEx2();//初始化 WorkEx2();//进行模拟 } } } while(1); } //main函数 int main() { option();//选择题号 return 0; } 六、实验结果

主界面: 在这里插入图片描述

输入题号1 输入页号1和页内偏移101 在这里插入图片描述 输入页号2和页内偏移203 在这里插入图片描述

输入页号6 66,发生中断 在这里插入图片描述

再输入正确的页表 在这里插入图片描述

输入exit返回 在这里插入图片描述

输入题号2 输入已经在内存的页号 在这里插入图片描述在这里插入图片描述

输入不在内存的页号 在这里插入图片描述

再次循环

七、实验体会总结

总结与体会:

本次实验对页式存储器管理进行了学习,具体为模拟分页式存储管理中硬件的地址转换和产生缺页中断算法,和用先进先出(FIFO)页面调度算法处理缺页中断两种中断算法两种方式。分页式存储管理中硬件的地址转换中的地址结构为第一部分是页号,后一部分为页内地址(位移量),通过实验对页式存储器有了进一步的理解。当请求某一页面式时,该页不存在,此时就会产生缺页中断FIFO算法是先进先出算法处理缺页中断,该页不存在就会替换掉最先被放进的页面,可以通过选择2清楚的看到替换过程。相较于前三次实验,此次实验代码也较短较为简单,调试修改起来很快,但是调试的过程中也遇到了不少的问题,需要自己仔细推敲理梳理,才能理解其中的原理与逻辑。该次实验程序的健壮性有待提高,该程序有很多可拓展的地方,如果学有余力的话,可以将此代码再从新整理,完善。此次实验为实验5页面置换算法打下了基础。课下还需要多花时间,将理论与实践相结合起来,才能更好的掌握知识。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有