201210405217实验三存储管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学信息工程与自动化学院学生实验报告
(2013 —2014 学年第二学期)
课程名称:操作系统开课实验室: 2014 年 5 月 12 日
一、实验目的
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。通过本次实验,要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二、实验原理及基本技术路线图(方框原理图)
用C或C++语言模拟实现请求式分页管理。要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。
提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该空间进行页框的划分、分配等。
请加上程序功能结构图、流程图、数据结构定义、主要变量的说明、函数的说明等
三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台
四、实验方法、步骤
#include
#include
#include
#include
#include
using namespace std;
typedef struct node
{
int ID; //分区ID
struct node *next; //指向下个分区的指针
float beginAddress;//分区起始地址
float length;//分区长度
int ZY;//分区是否被占用,1被占用,0未被占用
}FQ;
FQ *First=(FQ*)malloc(sizeof(FQ)); //链表的头指针
int FQCount=0;//分区的个数
void display();//显示内存状态
void FenPei(float len);//主存分配函数
void HuiShou(int id);//主存回收函数
int maxID=0;
int main()
{
//初始化内存分区状态
fstream file;
file.open("input.txt",ios_base::in|ios_base::out|ios_base::app);
string s0;
getline(file,s0);
istringstream sin(s0);
sin>>FQCount;
FQ *temp=(FQ*)malloc(sizeof(FQ)); //当前指针
temp=First;
for(string s;getline(file,s);)
{
FQ *fq=(FQ*)malloc(sizeof(FQ));
istringstream sin(s);
sin>>fq->beginAddress;
sin>>fq->length;
sin>>fq->ZY;
fq->ID=++maxID;
fq->next=NULL;
temp->next=fq;
temp=fq;
}
cout<<"最初的内存分配状态:"< display(); while(1) { cout<<"请选择要进行的操作:\n1.请求分配内存 2.请求回收内存 3.退出\n"; int choice; cin>>choice; if(choice==1) { cout<<"请求分配内存\n"; cout<<"请输入要分配的内存的长度:"; int len; cin>>len; FenPei(len); } else if(choice==2) { cout<<"请求回收内存\n"; cout<<"请输入要回收的内存的ID:"; int ID; cin>>ID; HuiShou(ID); } else if(choice==3) { break; } else { cout<<"输入有误!请重新选择!\n"; continue; } } return 1; } void display() { FQ *fqBegin=First->next; cout<<"ID\tBeginAddress\tLength\tState\n"; while(fqBegin!=NULL) { cout< fqBegin=fqBegin->next; } } void FenPei(float len) { FQ *temp=(FQ*)malloc(sizeof(FQ)); //当前指针 temp=First; while(!(temp->next->ZY==0&&temp->next->length>=len)) { temp=temp->next; } temp=temp->next; FQ *fq1=(FQ*)malloc(sizeof(FQ)); fq1->ID=++maxID; fq1->next=temp->next; fq1->beginAddress=temp->beginAddress+len; fq1->length=temp->length-len; fq1->ZY=0; temp->next=fq1; temp->length=len;