模拟实现请求分页虚存页面替换

这篇操作系统课程设计实验报告详细介绍了如何模拟请求分页虚存页面替换算法,包括程序设计思路、功能实现、涉及的函数及数据结构,并通过多次调试优化程序,加深了对操作系统存储管理的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作系统课程设计实验报告


设计题目六:模拟实现请求分页虚存页面替换

——


一、设计题目要求

(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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值