兰州大学操作系统实验八存储管理模拟题目和答案实验报告

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

实验报告实验八

实验名称:

存储管理模拟

实验目的:

1.掌握请求分页存储管理系统的基本原理

2.实现一个模拟的虚拟分页存储管理系统

实验要求:

编写一个程序,模拟一个虚拟分页存储管理系统。其中,由系统随机产生进程;

进程大小、进程到达次序、时间、进程执行轨迹(页面访问顺序)也随机生成,但进程之间必须有并发存在,进程执行时间需有限,进程调度采用时间片轮转算法(以页面模拟);rss驻留集大小物理块分配策略采取固定分配局部置换;分配算法采用按比例分配算法;调页采用请求调页方式;置换分别采用FIFO、LRU(一直没用) 访问次数和简单CLOCK算法(循环链表)标志有没有被访问;

驻留集大小可调,观察驻留集大小对缺页率的影响。

算法思想:

FIFO 先进先出法

LRU 最久未使用算法

CLOCK 简单时钟算法

命中率=1-页面失效次数/页地址流(序列)长度

驻留集大小可调,观察驻留集大小对缺页率的影响。

结构体定义

包含链表:空闲页面表忙页面表包含数组:进程数组页面号数组

流程图:

实验结果分析:

观察数据可看出:横向:三种替换算法的命中率由高到底排列应该是LRU>CLOCK>FIFO。

纵向:进程的驻留级越大,其缺页率就越低。

实验体会:

1.存中进程的多少会影响驻留集大小和缺页中断率。

如果存中进程太多,将导致每个进程的驻留集太小,发生缺页中断的概率很大。

相应地,系统发生抖动的可能性就会很大。

如果在存中保持太少的活动进程,那么所有活动进程同时处于阻塞状态的可能性就会很大,从而降低处理机的利用率。

2.置换算法的好坏将直接影响系统的性能,不适当的置换算法可能导致系统出现“抖动”

现象。常用的页面置换算法:最佳置换算法、最近最少使用算法、先进先出算法和时钟算法等。最佳置换算法难以实现但可以成为核对其他算法的标准。

3.也应注意负载问题,解决系统应当保持多少个活动进程驻留在存的问题,即控制多道程

序系统的度。当存中的活动进程数太少时,负载控制将增加新进程或激活一些挂起进程进入存;反之,当存中的进程数太多时,负载控制将暂时挂起一些进程,减少存中的活动进程数。

实验代码:

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define INVALID -1

#define total_instruction 320 //指令流长

#define total_vp 32 //页长

#define clear_period 50

typedef struct //页面结构

{

int pn, //页面序号

pfn, //页面所在存区的页框号

counter, //单位时间访问次数

time; //上次访问的时间

}pl_type;

pl_type pl[total_vp]; //页面结构数组

struct pfc_struct{ //页面控制结构

int pn, //页面号

pfn; //存区页面的页框号

struct pfc_struct *next; //页面指针,用于维护存缓冲区的链式结构

};

typedef struct pfc_struct pfc_type; //主存区页面控制结构别名

pfc_type pfc[total_vp], //主存区页面控制结构数组

*freepf_head, //主存区页面控制结构的空闲页面头指针

*busypf_head, //主存区页面控制结构的忙页面头指针

*busypf_tail; //主存区页面控制结构的忙页面尾指针

int diseffect; //页错误计数器,初次把页面载入主存时也当做页错误

int a[total_instruction]; //随即指令流数组

int page[total_instruction]; //指令对应的页面号

int offset[total_instruction]; //指令所在页面中的偏移量

int initialize(int); //初始化页面结构数组和页面控制结构数组

int FIFO(int); //先进先出算法

int LRU(int); //最近最久未使用算法

int CLOCK(int); //简单时钟(钟表)算法

int main( )

{

int s; //随机数

int i;

srand(10*getpid()); /*每次运行时进程号不同,用来作为初始化随机数队列的"种子"*/

s = (int)((float)(total_instruction-1)*(rand()/(RAND_MAX+1.0)));

printf("\n--------rand instructions queue--------\n");

for (i=0; i

{

a[i]=s; //任选一指令访问点m

a[i+1]=a[i]+1; //顺序执行一条指令

a[i+2]=(int)((float)a[i]*(rand()/(RAND_MAX+1.0))); //执行前地址指令m' a[i+3]=a[i+2]+1; //顺序执行一条指令

printf("%6d%6d%6d%6d\n", a[i],a[i+1],a[i+2],a[i+3]);

s = (int)((float)((total_instruction-1)-a[i+2])*(rand()/(RAND_MAX+1.0))) + a[i+2]; }

printf("--------------------------------------\n");

for (i=0;i

{

page[i]=a[i]/10;

offset[i]=a[i]%10;

}

printf("compare the three methods:");

printf("\n--------------------------------------\n");

printf(" Rss\t FIFO\t LRU\t CLOCK\n");

for(i=4;i<=32;i++) //用户存工作区从4个页面到32个页面

{

printf(" %2d \t",i);

FIFO(i);

LRU(i);

相关文档
最新文档