操作系统课程设计实验报告
设计题目六:模拟实现请求分页虚存页面替换
——
一、设计题目要求
(1)了解存储管理的基本目的和功能;
(2)理解实存管理的原理和实现技术;
(3)理解虚存管理的原理和实现技术;
(4)通过编程模拟实现请求分页虚存管理和替换算法。
二、程序设计思路及流程图
程序功能简介:
实现虚存页面替换算法的模拟程序含有以下功能:
(1)接收用户输入的参数:程序长度(页面数)、页框个数及页面大小;
(2)程序结果采用不同的颜色区分命中、替换及直接加入空闲块;
(3)实现FIFO替换算法。
维护两个数据结构,即请求页面队列和主存块队列。其中请求页面队列为进程所用, 记录当前进程请求的页面块信息。而主存块队列由系统维护,该队列保存当前系统 中给人主存块的状态(包括最后访问时间、忙闲状态等)。各种替换算法将以这两个 数据结构为基础,在系统中为用户请求寻求最佳块节点。
程序设计思路:
程序主要分为三大部分:
1.模拟进程访问页面:
(1)根据用户输入的进程号找到相应的页表,在该页表中查询该页号的页面是否在主存 中,若已在主存中,则直接访问,修改贮存队列中的访问时间。
(2)若不在主存队列中,则需要将其装入至主存队列,若可以找到一块空闲帧,则将其 装入至主存队列中,修改在主存中的信息:processID,pageID,state,time_last, BlockQueue中。
(3)若未在主存队列中,找到空闲帧,则需在驻留集队列中替换一个页面,替换哪一个 呢?根据FIFO算法,替换队头结点,即删除队头结点,同时将待访问页面构造为一 个新结点,插入至队尾,同时根据所删除结点的帧号在主存中队列中相应帧信息 processID,pageID,state,time_last,也要修改访问页面的信息frameID, state。
2.模拟进程结束:
进程结束,即将此进程在内存中所占的空间释放要做3件事:
(1)从驻留集中将processID为此进程的结点删除;
(2) 主存队列中释放该进程的所有页面,即修改processID,pageID,state,time_last, 重置为初始状态;
(3)修改此进程的页表的frameID, state,置为初始状态。
3.显示部分:
(1)遍历进程的页表,打印;
(2)遍历主存队列的页表,打印;
(3)display queue,显示驻留集队列的信息。
程序流程图:
见附录A
三、涉及的背景知识及所用函数简介
1、malloc函数
函数原型 :void *malloc(unsigned int num_bytes);
头文件 :stdlib.h
作用 :分配长度为num_bytes个字节的内存块
返回值 :分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
2、asctime函数
函数原型 :char *asctime(const struct tm * timeptr);
头文件 :#include <time.h>
作用 :将时间日期以字符串格式表示参数
返回值 :若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与 ctime 不同处在于传入的参数是不同的结构。
函数说明 :asctime()将参数timeptr 所指的tm 结构中的信息转换成真实世 界所使用的时间日期表示方法,然后将结果以字符串形态返回。
3、gmtime函数
函数原型 :struct tm *gmtime(const time_t *timep);
头文件 :#include <time.h>
作用 :获取当前时间和日期
函数说明 :gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世 界所使用的时间日期表示方法,然后将结果由结构tm 返回。
返回值 :返回结构tm 代表目前UTC 时间。
4、strcpy 函数
函数原型 :extern char strcpy(char dest,const char src);
头文件 :string,h
作用 :把从src地址开始且含有NULL结束符的字符串复制到已dest开始 的地址空间
参数 :scr:原串
Dest:目标串
返回值 :目标串的地址
四、程序所用数据结构简介
#define BUSY 1
#define IDLE 0 分别定义驻留集和主存队列中的结点的状态;
#define IN 1
#define OUT 0 分别定义页表中的结点的状态,即是否装入内存;
#define processNumber 3 提前定义好进程数目,不需要用户输入;
#define pageNumber 5 提前定义好一个进程的页面数目,不需要用户输入;
#define blockNumber 6 提前定义好主存帧数目,不需要用户输入;
#include<time.h> 时间函数需要的头文件;
typedef struct Page
{
int frameID;
int state;
}Page; 定义一个页表项的信息;
typedef struct Block
{
int processID;
int pageID;
int state;
char time_last[50];
}Block; 定义一个主存队列表项的信息;
typedef struct process
{
Page page_tab