一、实验目的

存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。

本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

二、实验内容

(1) 通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存

容量对命中率的影响。

页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。

在本实验中,假定页面大小为 1k,用户虚存容量为 32k,用户内存容量为 4 页到 32 页。

(2) produce_addstream 通过随机数产生一个指令序列,共 320 条指令。

A、 指令的地址按下述原则生成:

1) 50%的指令是顺序执行的

2)25%的指令是均匀分布在前地址部分

3) 25%的指令是均匀分布在后地址部分

B、具体的实施方法是:

1) 在[0,319]的指令地址之间随机选取一起点 m;

2) 顺序执行一条指令,即执行地址为 m+1 的指令;

3) 在前地址[0,m+1]中随机选取一条指令并执行,该指令的地 址为 m’;

4) 顺序执行一条指令,地址为 m’+1 的指令

5) 在后地址[m’+2,319]中随机选取一条指令并执行;

6) 重复上述步骤 1)~5),直到执行 320 次指令

C、将指令序列变换称为页地址流

在用户虚存中,按每 k 存放 10 条指令排列虚存地址,即 320 条指令在虚存中的存放方式为:

第 0 条~第 9 条指令为第 0 页(对应虚存地址为[0,9]);

第 10 条~第 19 条指令为第 1 页(对应虚存地址为[10,19]);

。。。。。。

第 310 条~第 319 条指令为第 31 页(对应虚存地址为[310,319]);

按以上方式,用户指令可组成 32 页。

(3)计算并输出下属算法在不同内存容量下的命中率。

1)先进先出的算法(FIFO);

2)最近最少使用算法(LRU);

3)最佳淘汰算法(OPT);

4)最少访问页面算法(LFR);

其中 3)和 4)为选做内容

  • 实验方案

  • 实验代码
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
#define dx 32                                           //物理块数
struct element{                                         //用来排序的数据结构 int data;                                       //数据 int index;                                     //序号
};
int cmp(const void *a,const void *b){                   //升序排序return((struct element*)a)->data - ((struct element*)b)->data;
}
void rand(int a[],int n){int i;struct element ele[320];srand((int)time(0));                             //初始化随机数种子 for(i=0;i<n;i++){ele[i].data=rand();                              //随机生成一个数 ele[i].index=i+1;}qsort(ele,n,sizeof(ele[0]),cmp);                  //排序 for(i=0;i<n;i++){a[i]=ele[i].index;}
}
class FIFO{                                             //FIFO类
private:int page[dx];int time[dx];int zhCount;                                      //置换次数int qyCount;                                      //非置换缺页次数
public:FIFO(){                                              //初始化for(int i=0;i<dx;i++)time[i]=0;for(int i=0;i<dx;i++)page[i]=-1;zhCount=0;qyCount=0;}void changePage(int m,int n){page[m]=n;time[m]=0;}   //将m号物理块内容变为页n,时间归零 int returnPage(int m){return page[m];}int returnTime(int m){return time[m];}int zh(){return zhCount;}int qy(){return qyCount;}int longestTime(){                                    //计算时间最长的块 int max=0;for(int i=0;i<dx;i++){if(time[i]>time[max])max=i;}return max;}int empty(){                                      //判断是否有空for(int i=0;i<dx;i++){if(page[i]==-1)return i;                  //返回值非-1说明有空,空物理块位置为i}return -1;                                        //返回-1说明没空}bool hit(int m){                                 //判断是否命中for(int i=0;i<dx;i++){if(page[i]==m)return true;}return false;}void alFIFO(int m){                                      //FIFO算法if(hit(m)){if(empty()==-1)for(int i=0;i<dx;i++)time[i]++; //命中后,所有时间均加一else for(int i=0;i<empty();i++)time[i]++;}else{if(empty()==-1){                               //没空changePage(longestTime(),m);                //修改页面for(int i=0;i<dx;i++){time[i]++;                              //更换页面后,所有时间+1}zhCount++;                                    //置换次数+1}else{                                         //有空int e=empty();for(int i=0;i<e;i++)time[i]++;changePage(e,m);                           //将第一个空物理块内容变为页mtime[e]++;qyCount++;                                    //缺页次数+1}}}
};
class LRU{                                                  //LRU类
private:int page[dx];int zhCount;int qyCount;
public:LRU(){for(int i=0;i<dx;i++)page[i]=-1;zhCount=0;qyCount=0;}             //初始化void changePage(int m,int n){page[m]=n;}          //将m号物理块内容变为页nint returnPage(int m){return page[m];}int zh(){return zhCount;}int qy(){return qyCount;}int empty(){                                      //判断是否有空for(int i=0;i<dx;i++){if(page[i]==-1)return i;                  //返回值非-1说明有空,空物理块位置为i}return -1;                                        //返回-1说明没空}int hit(int m){                                      //判断是否命中for(int i=0;i<dx;i++){if(page[i]==m)return i;                       //命中返回物理块i}return -1;                                       //未命中返回-1}void alLRU(int m){                                    //LRU算法if(hit(m)!=-1){                                 //命中int h=hit(m);if(h>0){for(int i=h;i>0;i--)page[i]=page[i-1];  //1到命中的物理块,全部后移一位page[0]=m;                               //m页移到第一位}}else{                                            //未命中if(empty()==-1){                         //没空for(int i=dx-1;i>0;i--)page[i]=page[i-1];page[0]=m;zhCount++;}else{                                     //有空for(int i=empty();i>0;i--)page[i]=page[i-1];page[0]=m;qyCount++;}}}
};
int main(){int a[320];rand(a,320);                                      //生成320的随机随机数列int b[320];for(int i=0;i<320;i++){                              //生成相应页数列b[i]=a[i]/10;if(a[i]==320)b[i]=0;}int count=0;/*cout<<"以下为指令流:\n";for(int i=0;i<320;i++){                                //输出随机数列cout<<a[i]<<"  ";count++;if(count%8==0)cout<<endl;}cout<<endl<<endl;count=0;cout<<"以下为页码流:\n";for(int i=0;i<320;i++){                             //输出相应页数列cout<<b[i]<<" ";count++;if(count%8==0)cout<<endl;}*/cout<<"如需要改变物理块个数,请在代码第5行,修改dx的值(确保在1-32之间)\n";cout<<"请选择页面置换算法(f:FIFO。l:LRU。b:比较):\n";char y;cin>>y;switch(y){case'f':{FIFO x;for(int i=0;i<320;i++){x.alFIFO(b[i]);/*cout<<"页面    时间\n";int count=0;for(int j=0;j<dx;j++){cout<<x.returnPage(j)<<"   "<<x.returnTime(j)<<" ";count++;if(count%4==0)cout<<endl;}*/}double hitRate=1.0-(double)(x.qy()+x.zh())/320;cout<<"命中率为:"<<hitRate<<endl;break;}case'l':{LRU x;for(int i=0;i<320;i++){x.alLRU(b[i]);/*cout<<"页面:  ";for(int j=0;j<dx;j++)cout<<x.returnPage(j)<<"   ";cout<<endl;*/}double hitRate=1.0-(double)(x.qy()+x.zh())/320;cout<<"命中率为:"<<hitRate<<endl;break;}case'b':{FIFO x;for(int i=0;i<320;i++)x.alFIFO(b[i]);double hitRate1=1.0-(double)(x.qy()+x.zh())/320;cout<<"FIFO命中率为:"<<hitRate1<<endl;LRU z;for(int i=0;i<320;i++)z.alLRU(b[i]);double hitRate2=1.0-(double)(z.qy()+z.zh())/320;cout<<"LRU命中率为:"<<hitRate2<<endl;}}system("pause");return 0;
}

操作系统实验:存储管理(C++)相关推荐

  1. 操作系统实验—存储管理

    操作系统实验-存储管理 所有实验源码: gitee:https://gitee.com/infiniteStars/os-project github:https://github.com/hello ...

  2. 操作系统实验--存储管理

    设计要求 ·模拟一个虚拟内存: ·虚拟内存采用页式管理方式,页面大小为4k: ·在内存中申请一个10MB的大空间,将它模拟成主存储器: ·在硬盘上建立一个文件,将它模拟成交换区: ·实现虚拟内存管理中 ...

  3. 操作系统实验--存储管理--页面置换算法--FIFO and LRU c++实现

    #include<iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  4. 操作系统 实验3【动态分区存储管理】

    操作系统 实验1[短作业优先调度算法(C++实现--FCFS\SJF\HRRN)] 操作系统 实验2[动态高优先权优先调度算法 C++实现] 操作系统 实验3[动态分区存储管理 Python实现] 操 ...

  5. 实验五 操作系统之存储管理

    实验五 操作系统之存储管理 一.实验目的 连续内存分配方式会形成许多"碎片",虽然可以通过"紧凑"方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销.如果 ...

  6. 操作系统实验3—实现请求页式存储管理模拟程序

    操作系统实验3-实现请求页式存储管理模拟程序 文章目录 操作系统实验3-实现请求页式存储管理模拟程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个请求页式存储管理程 ...

  7. java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...

    实验:动态分区式存储管理 实验内容: 编写程序模拟完成动态分区存储管理方式的内存分配和回收.实验具体包括:首先确定内存空闲分配表:然后采用最佳适应算法完成内存空间的分配和回收:最后编写主函数对所做工作 ...

  8. 操作系统实验五 存储管理

    ★观前提示:本篇内容为操作系统实验内容,代码等内容经测试没有问题,但是可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考. 目录 一.实验目的 二.实验内容 三.具体实现 四.实验总结 一.实 ...

  9. 计算机操作系统存储管理实验报告,《操作系统》存储管理实验报告

    <操作系统>存储管理实验报告 ____大学____学院实验报告课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期: 班级: 姓名: 学号: 仪器编号: XX 实验报告要求:1. ...

  10. 操作系统实验五--存储管理

    文章目录 操作系统实验五--存储管理 一.实验目的 二.实验内容 三.设计原理及相关算法 四.结果分析 五.源代码 操作系统实验五–存储管理 一.实验目的 1.了解虚拟存储技术的特点,掌握请求页式存储 ...

最新文章

  1. 若依前后端分离如何写移动端接口_前后端分离后,如何定义接口规范~
  2. ECMA_作用域深入This关键字
  3. 动态代理之Rxjava/Retrofit应用实战
  4. MySQL 数据库性能优化,看这篇就够了
  5. spring学习(15):required属性
  6. Android Button字母自动全部大写的问题
  7. 2019最佳工作、平均年薪达百万!想入行,先看这10本书
  8. php静态资源服务器,Node实现静态资源服务器
  9. DedeCMS 批量删除垃圾注册用户和垃圾文档
  10. Exploring Ionic Lists
  11. 寒冬、裁员?!你想知道的真相都在这里
  12. android 中LayoutInflater 的使用
  13. Mongo散记--聚合(aggregation)amp; 查询(Query)
  14. [Leetcode] Climbing Stairs
  15. 软件设计师-知识产权和标准化知识
  16. win10下装黑苹果双系统_手把手教你轻松安装 Win10/ 黑苹果macOS10.14.1双系统
  17. Java课程报告实验总结,java实验报告总结 [Java课程设计实验报告]
  18. EV3文件打不开,闪退怎么办(完美解决,无弹窗,无警告)
  19. 用python做一张图片_用 Python 生成一张有“内涵”的图片
  20. 2020年中国车规级IGBT(新能源汽车用IGBT)市场规模现状及发展潜力分析[图]

热门文章

  1. Java实现多重继承
  2. libcurl 使用记录2(curl_muli的使用)
  3. 644.奇怪的打印机(困难)
  4. (转)IST:Iterative Shrinkage/Thresholding和Iterative Soft Thresholding
  5. Eclipse clearcase plugin
  6. PIVOT 用法详解
  7. order by Sql server
  8. Unity UGUI 背景图片自适应文字内容大小
  9. iia期是第几期_IIa期和IIb期的定义,区别
  10. Cravatar头像