《操作系统实验》模拟基本分页存储管理
注:其他实验见:点击查看
基本分页存储管理
- 一、实验内容及要求
- 二、实验环境
- 三、设计思想
- 四、数据结构
- 五、实验代码
- 六、运行结果
一、实验内容及要求
- 模拟分页存储管理方式;
- 模拟分页存储管理方式,定义地址变换机构函数;
- 程序要添加适当的注释,程序的书写要采用缩进格式;
- 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应;
- 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
二、实验环境
windows 10,Visual Studio 2019
三、设计思想
- 设内存大小为2GB,页面大小为4KB。
- 建立进程:由用户输入进程ID与大小,随机数分配各个页面对应的物理块号;
- 地址变换(十进制):
[1] 由用户输入一个十进制的逻辑地址A;
[2] 则页号为P=INT[A/L],页内地址为d=[A] MOD L,L为页面大小(4096);
[3] 查询页表,找到页号对应的物理块号B,计算物理地址B×L+d。 - 地址变换(二进制):
[1] 由用户输入一个二进制的逻辑地址A;
[2] 设页内地址的位数为x,则页号为A>>x,页内地址为A的低x位;
[3] 查询页表,找到页号对应的物理块号,计算物理地址将物理块号与页内地址拼接即可。
四、数据结构
- 定义一个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); //查询页表
};
- 对于二进制的处理,使用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;
}
六、运行结果
《操作系统实验》模拟基本分页存储管理相关推荐
- 操作系统【四】分页存储管理
连续分配方式的缺点: 固定分区分配:缺乏灵活性,产生大量的内部碎片,内存的利用率较低 动态分区分配:会产生许多外部碎片,虽然可以用紧凑技术处理,但是紧凑技术的时间代价较高 基本分页存储管理 思想:把内 ...
- 操作系统实验——模拟动态分区首次适应分配和回收算法
实验三 实验题目:模拟动态分区首次适应分配和回收算法 实验目的:通过本实验,可加深理解动态分区分配.回收程序的功能和具体实现,特别是对回收分区的合并的理解. 实验环境:硬件:pc 机.软件:Windo ...
- java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...
实验:动态分区式存储管理 实验内容: 编写程序模拟完成动态分区存储管理方式的内存分配和回收.实验具体包括:首先确定内存空闲分配表:然后采用最佳适应算法完成内存空间的分配和回收:最后编写主函数对所做工作 ...
- 操作系统实验——分页式存储管理
二.分页式存储器管理 目录 2.1目的 2.2内容 2.3实验提示 2.4数据结构 2.5算法设计及流程图 2.6 运行截图 2.7 小结 2.8代码 2.1目的 熟练掌握分页式管理基本原理,并在实验 ...
- 操作系统 实验3【动态分区存储管理】
操作系统 实验1[短作业优先调度算法(C++实现--FCFS\SJF\HRRN)] 操作系统 实验2[动态高优先权优先调度算法 C++实现] 操作系统 实验3[动态分区存储管理 Python实现] 操 ...
- 操作系统实验四-LRU算法的模拟
操作系统实验四:页式虚拟存储管理的模拟 一.实验目的: 掌握存储管理的基本原理.地址变换过程:用软件实现地址转换过程:用一种常用的页面置换算法来处理缺页中断并研究其命中率. 二.实验题目: 1.模拟请 ...
- 操作系统实验3—实现请求页式存储管理模拟程序
操作系统实验3-实现请求页式存储管理模拟程序 文章目录 操作系统实验3-实现请求页式存储管理模拟程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个请求页式存储管理程 ...
- 操作系统原理模拟实验(基于C/C++模拟处理机调度、存储管理和文件系统)
目录 引言 一.处理机调度模拟 1.下载链接 2.目的与要求 3.截图示例 二.存储管理模拟 动态分区分配 1.下载链接 2.目的与要求 3.截图示例 分页存储地址转换 1.下载链接 2.目的与要求 ...
- 操作系统简单分页存储管理(含代码)
实验目的: 在分页存储管理方式中,如果不具备页面置换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,显示一次性的特征.本实验通过程序模拟操作系统的基本分页存 ...
最新文章
- ashx PHP文件 优劣,.NET_后缀为 ashx 与 axd 的文件区别浅析,唯一不同的地方是:axd扩展名 - phpStudy...
- LightSwitch中的权限
- ASP.NET MVC SSO单点登录设计与实现
- 【BZOJ2073】[POI2004]PRZ 状压DP
- 【嵌入式系统】STM32串口通信的四种方法(基于RTOS)
- keepass2Android密码,Keepass2Android密码管理(快速解锁密码)
- notepad批量删除html元素,Notepad++几个常用删除类正则表达式汇总(收藏)
- 如何对大数据进行数据分析
- SET-Priority_Queue
- android p 第三方预装,刘作虎确认 一加6T将出厂预装Android P系统
- 第1章 【蓦然回首】开篇引导【少年,奋斗吧】
- Apollo Planning决策规划算法代码解析 (17):SPEED_HEURISTIC_OPTIMIZER 速度动态规划下
- 域名转入需要经过“命名审核”状态
- 语音助手——整体架构和设计
- CENTOS上的时间/时区设定
- 流量高的短视频有哪些特点?三个共同点分享,助你找准方向
- 孟郎诗词网3.0版本问题总结
- 小程序容器技术加持下,企业自主打造小程序生态
- [蓝桥杯][2018年第九届真题]日志统计(尺取法)
- 微信里嵌入html5页面,微信小程序web-view嵌套H5实现微信支付功能解决方案