实验三 存储管理 昆工版本

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

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

( 2013 — 2014 学年 第二学期 )

课程名称:操作系统 开课实验室:信自楼442 2014 年5 月12 日 一、实验目的

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

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

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

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

框的划分、分配等。

1、功能结构图

2、流程图

3、数据结构定义

本程序使用C++的组合概念,创建三个类,Memory类用来表示模拟的内

存块、Pcb类用来表示一个进程里面含有关于进程需要请求页式的信息、Page 类用来表示进程的一个页面。Pcb里面有一个变量,它的数据类型是Page类,所以Pcb类和Page类是类组合的概念。

4、主要变量的说明

——Memory类型里面含有两个含有两个私有变量成员:bool free是一个布尔类型的变量用来表内存中的某一个页框是否为空,就是说它只保存两个值1表示空,0表示已经被分配。Int frame_num 是一个整数的类型,用来保存某一个页框号,这个类型中也有一个共有静态成员变量int count用来表示内存中,空闲页框的总数。

——Pcb类中含有七个成员变量:string name 是一个字符串类型的变量用来表示一个进程的名字、int size 是一个整数类型的变量用来保存某一个进程所需要内存空间的总量、Page *p是一个指针变量,它的类型是Page类的类型,用来指向一个进程所需要的页面信息、int given_size保存系统分内存空间给一个进程的总量、int given_page保存系统能让某一个进程的页面存在内存的总数、int* allocate_in_ram的作用是:当一个进程创建的时候,初始只能有2/3

的页面的总量能进入到内存、这些初始能进入到内存就保存到allocation_in_ram 指针指向的地址的空间。

——Page类里面含有6个成员数据变量:int logic_addr是一个整数的变量用来保存页面对应的逻辑地址、int frame_num用来保存页面对应的页框号、int page_num用来保存页号、bool flag是一个布尔类型的变量用来表示该页面是否存在内存用1来表示在内存和0表示不在内存、bool edit 也是一个布尔类型的变量用来表示一个页面是否已经被修改过、int access_time是一个整数的类型用来保存某一个页面被访问的次数。

——Memory*frame是一个全球变量用来模拟一大块空间。它是Memory

类型的对象指针变量。

——Pcb* pcb是Pcb类型对象指针变量。用来指向一个进程。

——const int FRAME_SIZE=1024,是一个常量用来表示模拟空间每个页面的大小,这里每个页面的大小为1KB。

——const int FRAME_NUM =1024,是一个常量用来表示模拟空间的页框总数,这里页框为1024说明模拟空间的大小为1MB。

5、函数的说明

——void Memory:: memory_creation():是Memory类用的一个函数。用来模拟创建一大块空间。初始它申请1MB得空间并且每个页框都初始为已经分配。然后,该函数开始修改最多有一般的页框为空。

——void Memory:: memory_show():也是Memory类用的一个函数。用来输出当前内存空间的情况、例如输出内存的总量、已经分配空间和空闲的大小还有空间分配的情况就是输出所以页框的状态那些页框被分配,那些页框还是空闲。

——void Pcb:: relocatable_address()是Pcb中的成员函数。它的功能就是算出地址重定位。首先它让用户输入一个逻辑地址,根据输入的逻辑地址分别算出对应的页号和页内地址。并且对页号开始判断是否越界,如果没有越界开始判断该页是否已经在内存了,如果没有在需要把页号调入到内存,但是调入以前必须判断该内存空间是否还有空间,如果没有开始淘汰算法(本程序中使用LRU淘汰算法)淘汰一个页面从内存到外存。最后根据的得到的页框和业内地址来形成对应的物理地址,并且输出给用户看。

——void Pcb::input() 也是Pcb中的成员函数,用来输入摸个进程的信息。

用户输入进程的名字,并且由程序随机算出进程总需要空间的数量,算出对应的需要页面总数,而且系统按2/3进程需要的页面的总量来让一些页面初始能进入到内存,还有对该进入内存的页面算出该页面在内存对应的页框。并且输出进程的一些信息,例如进程的大小。

——Pcb::~Pcb() 是Pcb类中的析构函数。当一个进程已经运行完,需要对那个进程回收它所占的内存空间。函数是判断如果某一个页面已经在内存所以要把那个空间换回给系统。

——int Pcb:: LRU()是Pcb类中的一个函数。它的功能是最近最少使用的算法,找到一个淘汰页面。显然,当发生一个缺页中断,系统需要把那个页面调入到内存里面,但是如果那时候内存已经满了就需要从内存中淘汰一个页面。LRU()需要找到一个页面的访问次数最少,所以大需要变量进程所以占用在内存空间的页面,让后返回找到的淘汰页面的编号。

——void Page:: cal_frame_num(int size)是Page类型中的一个成员函数。它的功能就是找出某一个页面的页框号。首先,随机出一个逻辑地址,然后根据逻辑地址找出对应的页号。显然,因为本程序中采用每个页面的对大小为

1KB,所以如果对应的逻辑地址右移十位就能得到页号。然后,就随机寻找内存用的页框来保存这个页面。并且修改页面的访问次数。还有,减少一个单元内存的空间。

——void Page:: show_page():输出某一个页面的信息。例如:页面对应的页框,页面是否在内存是否被修改过和页面被访问次数。

相关文档
最新文档