请求页式存储管理的页面置换算法实验报告

实验报告探讨了请求页式存储管理中的页面置换算法,包括FIFO、LRU和OPT。通过随机指令序列模拟,展示了不同算法在不同内存容量下的命中率,分析了算法性能,并指出LRU通常优于FIFO,而OPT则是最优但难以实现的理想情况。

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

学生姓名: 学 号: 专业班级:
实验类型:□√ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:

一、 实验项目名称
请求页式存储管理的页面置换算法

二、 实验目的
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

三、 请求页式存储管理的实现原理
1.通过随机数产生一个指令序列,共 320 条指令,指令的地址按下述原则生产:
50%的指令是顺序执行的;
25%的指令是均匀分布在前地址部分;
25%的指令是均匀分布在后地址部分。
2.将指令序列变换成为页地址流
设页面大小为 1K;用户内存容量为 4 页到 32 页;用户虚存容量为 32K。
在用户虚存中,按每 K 存放 10 条指令排列虚存地址,即 320 条指令在虚存中的存放方式
为:第 0 条至第 9 条指令为第 0 页;第 10 条至 19 条指令为第 1 页;…第 310 条至 319 条指
令为第 31 页。
3.计算并输出下述各种算法在不同内存容量下的命中率。
(1) 先进先出算法(FIFO)
(2) 最近最少使用算法(LRU)
(3) 最佳使用算(OPT)
命中率=1-页面失效次数/页地址流长度
本实验中,页地址流长度为 320,页面失效次数为每次访问相应指令时,该指令所
对应的页不在内存的次数。

四、 主要程序代码

#include<conio.h>  
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<time.h> 
#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") /*表格控制*/  
#define bsize 4     //物理块大小 
#define psize 16     //进程大小 

typedef struct page  
{
     
       int num;  /*记录页面号*/  
       int time;  /*记录调入内存时间*/  
}Page;                   /* 页面逻辑结构,结构为方便算法实现设计*/  
Page b[bsize];            /*内存单元数*/  
int c[bsize][psize];   /*暂保存内存当前的状态:缓冲区*/  
int queue[100];      /*记录调入队列*/  
int K;             /*调入队列计数变量*/  
int phb[bsize]={
   0};   //物理块标号 
int pro[psize]={
   0};   //进程序列号 
int flag[bsize] = {
   0};  //进程等待次数(存放最久未被使用的进程标志) 
int i = 0, j = 0,k = 0;   //i 表示进程序列号,j 表示物理块号 
int m = -1, n = -1;       //物理块空闲和进程是否相同判断标志 
int max = -1,maxflag = 0; //标记替换物理块进程下标 
int count = 0;            //统计页面缺页次数 
 
//**************************************************************// 
//**************************************************************//随机产生序列号函数 
//************************************************************** 
int* build() 
{
    
 printf("随机产生一个进程序列号为:\n"); 
 int i = 0; 
    srand ( time(NULL) ); 
    for(i=0; i<psize; i++) 
    {
    
  pro[i] = 10*rand()/(RAND_MAX+1)+1; 
        printf("%d  ",pro[i]); 
     } 
     printf("\n"); 
  return(pro); 
} 
//**************************************************************//查找空闲物理块 
//************************************************************** 
int searchpb() 
{
    
 for(j=0; j<bsize; j++) 
    {
    
  if<
一、实验题目:页面置换算法请求) 二、实验目的: 进一步理解父子进程之间的关系。 1) 理解内存面调度的机理。 2) 掌握页面置换算法的实现方法。 3) 通过实验比较不同调度算法的优劣。 4) 培养综合运用所学知识的能力。 页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。 三、实验内容及要求 这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。 程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存面进行调度。要求: 1) 每个子进程应能反映出面置换的过程,并统计页面置换算法的命中或缺情况。 设缺的次数为diseffect。总的面访问次数为total_instruction。 缺率 = disaffect/total_instruction 命中率 = 1- disaffect/total_instruction 2)将为进程分配的内存面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
完整虚拟存储管理实验报告!一、实验目的请求虚存管理是常用的虚拟存储管理方案之一。通过请求虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求虚存管理的面调度算法的理解。二、实验环境 Turbo C 2.0/3.0或VC++6.0三、实验内容本实验要求使用C语言编程模拟一个拥有若干个虚的进程在给定的若干个实中运行、并在缺中断发生时分别使用FIFO和LRU算法进行面置换的情形。其中虚的个数可以事先给定(例如10个),对这些虚访问的地址流(其长度可以事先给定,例如20次虚访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的面命中率。程序应允许通过为该进程分配不同的实数,来比较两种置换算法的稳定性。四、实验说明 1.设计中虚和实的表示本设计利用C语言的结构体来描述虚和实的结构。pnpfntimepnpfnnext 虚结构 实结构在虚结构中,pn代表虚号,因为10个虚,所以pn的取值范围是0—9。pfn代表实号,当一虚未装入实时,此项值为-1;当该虚已装入某一实时,此项值为所装入的实的实号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚的最近访问时间。在实结构中,pn代表虚号,表示pn所代表的虚目前正放在此实中。pfn代表实号,取值范围(0—n-1)由动态派的实数n所决定。next是一个向实结构体的针,用于多个实以链表形组织起来,关于实链表的组织详见下面第4点。2.关于缺次数的统计为计算命中率,需要统计在20次的虚访问中命中的次数。为此,程序应设置一个计数器count,来统计虚命中发生的次数。每当所访问的虚的pfn项值不为-1,表示此虚已被装入某实内,此虚被命中,count加1。最终命中率=count/20*100%。3.LRU算法中“最近最久未用”面的确定为了能找到“最近最久未用”的虚面,程序中可引入一个时间计数器countime,每当要访问一个面时,countime的值加1,然后将所要访问的虚的time项值设置为增值后的当前countime值,表示该虚的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实的虚中找出time值为最小的虚就是“最近最久未用”的虚面,应该将它置换出去。4.算法中实的组织因为能分配的实数n是在程序运行时由用户动态派的,所以应使用链表组织动态产生的多个实。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实,首针为free_head,初始时n个实都处于free链表中;busy链表用于组织已分配出去的实,首针为busy_head,尾针为busy_tail,初始值都为null。当所要访问的一个不在实中时,将产生中断。此时若free链表不为空,就取下链表首针所的实,并分配给该虚。若free链表为空,则说明n个实已全部分配出去,此时应进行面置换:对于FIFO算法要将busy_head 所的实从busy链表中取下,分配给该虚,然后再将该实插入到busy链表尾部;对于LRU算法则要从所有已分配实的虚中找出time值为最小的虚,将该虚从装载它的那个实中置换出去,并在该实中装入当前正要访问的虚。~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值