花椒-操作系统实验报告3

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

昆明理工大学信息工程与自动化学院学生实验报告

(2012 —2013 学年第二学期)

课程名称:操作系统开课实验室:信自楼445 2013 年 5 月 16 日

一、实验要求

对给定的一个页面走向序列,请分别用先进先出算法和二次机会算法,计算淘汰页面的顺序、缺页次数和缺页率,具体的页面走向可参考教材例题或习题。

二、实验目的

存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。通过本次实验,要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

三、实验原理及基本技术路线图(方框原理图)

用C或C++语言模拟实现请求式分页管理。要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。

提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该空间进行

流程图:

数据结构定义:

我提供定义了两个类。第一个类就是页面类,在这类里面包括一些重要的数据成员。

有页号(page_no),页框号(frame_no),页面是否在内存的标志(flag(1表示在内存,0表示不在内存)),访问次数(times)。另一个类是进程控制块类PCB。类的数据成员有id(进程编号),name(进程名),size(进程大小),*p(页类指针)。在本类中,有一些成员函数:构造函数(用来初始化本类的所有数据),displayPCB(输出函数),convert(地址映射函数),allocation(分配函数),restore(回收函数)。另外还有一些类外的函数:initMemorySpace(初始化内存空间的函数),displayMemorySpace(输出内存空间的状态1(表示占用)0(表示空))。

四、所用仪器、材料(设备名称、型号、规格等)。

计算机一台

五、实验方法、步骤

程序代码:

#include

#include

#include

using namespace std;

const int frame_size=1024;//页框长度,固定为 1k

const int page_size=1024;//页面长度,固定为 1k

const int memory_size=102400;//内存容量,固定为 100k

const int frame_number=memory_size/frame_size;// 100k/1k=100 frames

int *memory;//指针变量,用来存内存的状态1还是0。

void initMemorySpace()//初始化内存空间

{

int i,ran,times;

time_t t;//定义time_t对象 t

t=time(0);

srand(t);//随机改变每秒

times=0;//变量times初始化为0,变量的功能是检查内存空间是否有一半空了没。

memory=new int[frame_number];//申请内存空间,有frame_number 这么大的空间for(i=0;i

memory[i]=1;//初始化全部为1

do

{

ran=rand()%frame_number;//随机空间位置

if(memory[ran]==0)continue;//如果当前的位置已经是空就要再循环

else//否则

{

memory[ran]=0;//内存空间在ran的位置为0(空)

times++;//times变量增加一个

}

}while(times<=(frame_number/2));//空的空间还没到内存空间的一半,再循环

}

void displayMemorySpace()//输出内存空间状态,1还是0

{

int i;

cout<<"内存空间(0 表示空,1表示占用)"<

for(i=0;i

{

cout<

if((i+1)%10==0)cout<

}

}

class page//定义页表类 page

{

public:

int logic_no;//定义页号变量

int frame_no;//定义页框号变量

int flag;//定义内存标志变量,1 表示在内存, 0表示不在

int times;//定义访问次数变量

};

class PCB//定义进程控制块类 PCB

{

private:

static int id;//定义静态进程编号变量

string name;//定义进程名为字符串类

int size;//定义进程大小

int page_number;//定义页面总数变量

int given_frame;//定义系统给的页框数变量

page *p;//类page的指针变量

public:

PCB();//本类的构造函数

void displayPCB();//输出进程和页表的重要信息

void convert();//地址映射函数,也有淘汰方法(最近最少使用方法LRU)int allocation(int);//分配函数。函数里是按到页框号分配的

void restore();//回收函数。用来回收内存空间

};

int PCB::id=0;//初始化进程编号

void PCB::restore()//实现restore函数在类外

{

int i;

for(i=0;i

{

memory[p[i].frame_no]=0;//请求到的页框号的内存空间改到被占用}

}

int PCB::allocation(int frame_no)//实现allocation函数体在类外部

{

相关文档
最新文档