注:其他实验见:点击查看

基本分页存储管理

  • 一、实验内容及要求
  • 二、实验环境
  • 三、设计思想
  • 四、数据结构
  • 五、实验代码
  • 六、运行结果

一、实验内容及要求

  1. 模拟分页存储管理方式;
  2. 模拟分页存储管理方式,定义地址变换机构函数;
  3. 程序要添加适当的注释,程序的书写要采用缩进格式;
  4. 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应;
  5. 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

二、实验环境

windows 10,Visual Studio 2019

三、设计思想

  1. 设内存大小为2GB,页面大小为4KB。
  2. 建立进程:由用户输入进程ID与大小,随机数分配各个页面对应的物理块号;
  3. 地址变换(十进制):
    [1] 由用户输入一个十进制的逻辑地址A;
    [2] 则页号为P=INT[A/L],页内地址为d=[A] MOD L,L为页面大小(4096);
    [3] 查询页表,找到页号对应的物理块号B,计算物理地址B×L+d。
  4. 地址变换(二进制):
    [1] 由用户输入一个二进制的逻辑地址A;
    [2] 设页内地址的位数为x,则页号为A>>x,页内地址为A的低x位;
    [3] 查询页表,找到页号对应的物理块号,计算物理地址将物理块号与页内地址拼接即可。

四、数据结构

  1. 定义一个pcb类,表示每一个进程,含有进程的编号、大小、页表等信息:
class PCB {public:PCB(int a, int b) :id(a), size(b) {};
private:int id;                   //进程编号int size;                 //进程大小int length;               //页表长度vector<int> page_table;   //页表
public:void init(vector<int> &s);       //给每页分配相应的物理块号void disp();                     //显示页表信息int comp(int a,int b);           //越界检查int comp(bitset<31> a, int b);   //越界检查int trans(int a);                //查询页表int trans(bitset<31> a);         //查询页表
};
  1. 对于二进制的处理,使用bitset<31>结构来进行相关的逻辑移位、按位与或运算、转换成十进制等。

五、实验代码

#include<vector>
#include<bitset>
#include<ctime>
#include<random>
#include<cmath>
#include<iostream>
#include<string>using namespace std;class PCB {public:PCB(int a, int b) :id(a), size(b) {};
private:int id;                   //进程编号int size;                 //进程大小int length;               //页表长度vector<int> page_table;   //页表
public:void init(vector<int> &s);       //给每页分配相应的物理块号void disp();                     //显示页表信息int comp(int a,int b);           //越界检查int comp(bitset<31> a, int b);   //越界检查int trans(int a);                //查询页表int trans(bitset<31> a);         //查询页表
};//给每页分配相应的物理块号
void PCB::init(vector<int> &s) {int num,a,flag=1;num = size / 4;if (size % 4 != 0) {num++;}static uniform_int_distribution<int> u(0, int(pow(2,19)));static default_random_engine e(time(0));while(page_table.size()!=num) {a = u(e);for (auto j = s.begin(); j != s.end(); j++) {    //检查物理块是否被占用if (*j == a) {flag = 0;break;}}if (flag) {page_table.push_back(a);s.push_back(a);}}length = page_table.size();
}//显示页表信息
void PCB::disp() {int no=0;auto i = page_table.begin();while (i != page_table.end()) {cout << no << "\t" << *i << endl;no++;i++;}
}//越界检查
int PCB::comp(int a,int b) {if (id!=b)return 1;else if (a > length|| a < 0)return 2;elsereturn 0;
}//越界检查
int PCB::comp(bitset<31> a, int b) {if (id != b)return 1;else if (a.to_ulong() > length - 1 || a.to_ulong() < 0)return 2;elsereturn 0;
}//查询页表
int PCB::trans(int a) {auto p = page_table.begin();for (int i = 0; i < a; i++) {p++;}return *p;
}//查询页表
int PCB::trans(bitset<31> a) {auto p = page_table.begin();for (int i = 0; i < int(a.to_ulong()); i++) {p++;}return *p;
}//内存大小2GB,页面大小4KB
//创建进程
bool create(vector<PCB>& pcbs, vector<int>& s) {unsigned pid,psize;cout << "请输入进程编号与大小(KB):";cin >> pid >> psize;if (psize > (524288 - s.size()) * 4) {return 1;}pcbs.push_back(PCB(pid, psize));auto p = pcbs.end();p--;p->init(s);return 0;
}//显示页表
void display(vector<PCB> pcbs) {int num=1;for (auto i = pcbs.begin(); i != pcbs.end(); i++) {cout << "第" << num << "个进程:" << endl;cout << "页号\t" << "块号" << endl;i->disp();num++;}
}//地址转换机构1
bool addr_trans(vector<PCB> pcbs) {int no,addr;int chunk_no,offset;auto p = pcbs.begin();cout << "输入转换的进程编号:";cin >> no;cout << "输入十进制地址:";cin >> addr;chunk_no = addr / 4096;//找到进程并进行越界检查while (p!=pcbs.end()&&p->comp(chunk_no, no)) {if (p->comp(chunk_no, no) == 1)p++;else if (p->comp(chunk_no, no) == 2) {cout << "地址越界,重新输入十进制地址:";cin >> addr;chunk_no = addr / 4096;} }if (p == pcbs.end()) {cout << "未找到该进程!";return 1;}offset = addr % 4096;cout << "对应的物理地址为:" << p->trans(chunk_no)*int(pow(2,12.0)) + offset << endl;return 0;
}//地址变换机构2
bool addr_trans2(vector<PCB> pcbs) {bitset<31> addr,chunk_no, offset, s(string("0000000000000000000111111111111"));bitset<31> p_addr;int no;auto p = pcbs.begin();cout << "输入转换的进程编号:";cin >> no;cout << "输入二进制地址:";cin >> addr;chunk_no = addr >> 12;//找到进程并进行越界检查while (p != pcbs.end()&&p->comp(chunk_no, no)) {if (p->comp(chunk_no, no) == 1)p++;else if (p->comp(chunk_no, no) == 2) {cout << "地址越界,重新输入十进制地址:";cin >> addr;chunk_no = addr >> 12;}}if (p == pcbs.end()) {cout << "未找到该进程!";return 1;}offset = addr & s;p_addr = p->trans(chunk_no);p_addr = p_addr << 12;p_addr = p_addr | offset;cout << "对应的二进制物理地址为:" << p_addr << "\n转化为十进制为:" << p_addr.to_ulong()<< endl;return 0;
}int main() {int choose = 0;vector<PCB> pcbs;vector<int> s;   //记录占用的物理块号cout << "1.创建进程\n"<< "2.显示进程页表\n"<< "3.逻辑地址转换(十进制)\n"<< "4.逻辑地址转换(二进制)\n"<< "5.退出" << endl;while (choose != 5) {cout << "\n请选择:" ;cin >> choose;switch (choose) {case 1:if (create(pcbs,s))cout << "创建失败!" << endl;elsecout << "创建成功!" << endl;break;case 2:display(pcbs);break;case 3:if (addr_trans(pcbs)) {cout << "转换失败!" << endl;};break;case 4:if (addr_trans2(pcbs)) {cout << "转换失败!" << endl;};break;default:break;}}return 0;
}

六、运行结果

《操作系统实验》模拟基本分页存储管理相关推荐

  1. 操作系统【四】分页存储管理

    连续分配方式的缺点: 固定分区分配:缺乏灵活性,产生大量的内部碎片,内存的利用率较低 动态分区分配:会产生许多外部碎片,虽然可以用紧凑技术处理,但是紧凑技术的时间代价较高 基本分页存储管理 思想:把内 ...

  2. 操作系统实验——模拟动态分区首次适应分配和回收算法

    实验三 实验题目:模拟动态分区首次适应分配和回收算法 实验目的:通过本实验,可加深理解动态分区分配.回收程序的功能和具体实现,特别是对回收分区的合并的理解. 实验环境:硬件:pc 机.软件:Windo ...

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

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

  4. 操作系统实验——分页式存储管理

    二.分页式存储器管理 目录 2.1目的 2.2内容 2.3实验提示 2.4数据结构 2.5算法设计及流程图 2.6 运行截图 2.7 小结 2.8代码 2.1目的 熟练掌握分页式管理基本原理,并在实验 ...

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

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

  6. 操作系统实验四-LRU算法的模拟

    操作系统实验四:页式虚拟存储管理的模拟 一.实验目的: 掌握存储管理的基本原理.地址变换过程:用软件实现地址转换过程:用一种常用的页面置换算法来处理缺页中断并研究其命中率. 二.实验题目: 1.模拟请 ...

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

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

  8. 操作系统原理模拟实验(基于C/C++模拟处理机调度、存储管理和文件系统)

    目录 引言 一.处理机调度模拟 1.下载链接 2.目的与要求 3.截图示例 二.存储管理模拟 动态分区分配 1.下载链接 2.目的与要求 3.截图示例 分页存储地址转换 1.下载链接 2.目的与要求 ...

  9. 操作系统简单分页存储管理(含代码)

    实验目的: 在分页存储管理方式中,如果不具备页面置换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,显示一次性的特征.本实验通过程序模拟操作系统的基本分页存 ...

最新文章

  1. ashx PHP文件 优劣,.NET_后缀为 ashx 与 axd 的文件区别浅析,唯一不同的地方是:axd扩展名 - phpStudy...
  2. LightSwitch中的权限
  3. ASP.NET MVC SSO单点登录设计与实现
  4. 【BZOJ2073】[POI2004]PRZ 状压DP
  5. 【嵌入式系统】STM32串口通信的四种方法(基于RTOS)
  6. keepass2Android密码,Keepass2Android密码管理(快速解锁密码)
  7. notepad批量删除html元素,Notepad++几个常用删除类正则表达式汇总(收藏)
  8. 如何对大数据进行数据分析
  9. SET-Priority_Queue
  10. android p 第三方预装,刘作虎确认 一加6T将出厂预装Android P系统
  11. 第1章 【蓦然回首】开篇引导【少年,奋斗吧】
  12. Apollo Planning决策规划算法代码解析 (17):SPEED_HEURISTIC_OPTIMIZER 速度动态规划下
  13. 域名转入需要经过“命名审核”状态
  14. 语音助手——整体架构和设计
  15. CENTOS上的时间/时区设定
  16. 流量高的短视频有哪些特点?三个共同点分享,助你找准方向
  17. 孟郎诗词网3.0版本问题总结
  18. 小程序容器技术加持下,企业自主打造小程序生态
  19. [蓝桥杯][2018年第九届真题]日志统计(尺取法)
  20. 微信里嵌入html5页面,微信小程序web-view嵌套H5实现微信支付功能解决方案

热门文章

  1. 网络爬虫可以做什么?
  2. 交换机或者路由器下面继续串小路由器掉线
  3. Visio中mathtype公式粘贴到word中模糊
  4. Android中assets的使用(用于读取内容)
  5. Python中正则表达式findall用法
  6. linux下的socket在哪个头文件,socket函数在哪个文件定义,解决方案
  7. maven中groupId和artifactId的含义
  8. 一个简单的用async实现发送ajax函数的封装
  9. 自监督学习 对比学习了解
  10. 深度学习入门 --- 自我学习与半监督学习