• 大小: 220KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: 其他
  • 标签: 内存管理  

资源简介

随机给出一个页面执行序列,如:1,5,3,4,2,1,3,4,5,7,9,……。要求计算以下几种置换算法的缺页数、缺页率和命中率。  最佳置换算法OPT(Optimal)  先进先出算法FIFO(First In First Out)  最近最少使用算法LRU(Least Recently Used) 实验报告(含流程图及运行结果)&源代码

资源截图

代码片段和文件信息

#include
#include
#include
#ifndef _UNISTD_H
#define _UNISTD_H
#include
#include
#endif
#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); //初始化页面结构数组和页面控制结构数组
void FIFO(int); //先进先出算法
void LRU(int); //最近最久未使用算法
void OPT(int); //最佳置换算法

int main( )
{
int s; //随机数
int i;
srand(10*getpid()); /*每次运行时进程号不同*/
s = (int)((float)(total_instruction-1)*(rand()/(RAND_MAX+1.0)));
printf(“\n随机执行序列:\n“);
for (i=0; i{
a[i]=s; //任选一指令访问点
a[i+1]=a[i]+1; //顺序执行一条指令
a[i+2]=(int)((float)a[i]*(rand()/(RAND_MAX+1.0)));//再次随机产生一条指令 
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(“\n不同置换算法对比:\n\n“);
printf(“\t 页数\t 缺页数\t 缺页率\t 命中率\n“);
for(i=4;i<=32;i++) 
{
FIFO(i);
LRU(i);
OPT(i);
printf(“\n“);
}
return 0;
}

int initialize(int total_pf)
{
int i;
diseffect=0;
for(i=0;i{
pl[i].pn=i;
pl[i].pfn=INVALID; //置页面所在主存区的帧号为-1.表示该页不在主存中 
pl[i].counter=0; //置页面结构中的访问次数为
pl[i].time=-1; //置页面结构中的上次访问的时间为-1
}
for(i=0;i{
pfc[i].next=&pfc[i+1]; //连接pfc[i-1]和pfc[i]
pfc[i].pfn=i; //初始化帧号
}
pfc[total_pf-1].next=NULL;
pfc[total_pf-1].pfn=total_pf-1;
freepf_head=&pfc[0]; //主存区页面控制结构的空闲页面头指针指向pfc[0] 
return 0;
}

void LRU (int total_pf)
{
int MinT; //最小的访问时间,即很久没被访问过
int MinPn; //拥有最小的访问时间的页的页号
int ij;
int CurrentTime; //系统当前时间
initialize(total_pf); //初始化页面结构数组和页面控制结构数组 
CurrentTime=0;
diseffect=0;
for(i=0;i{
if(pl[page[i]].pfn==INVALID) //页面失效
{
diseffect++; //页错误次数加

if(freepf_head==NULL) //无空闲页面
{
MinT=100000;
for(j=0;j{
if(MinT>pl[j].time&&pl[j].pfn!=INVALID)
{
MinT=pl[j].time;
MinPn=j;
}
}
freepf_head=&pfc[pl[MinPn].pfn]; //最久没被访问过的页被释放
pl[MinPn].pfn=INVALID; //最久没被访问过的页被换出主存
pl[MinPn].time=-1; //最久没被访问过的页的访问时间置为无效 
freepf_head->next=NULL;
}

pl[page[i]].pfn=freepf_head->pfn; //有空闲页面把相应的页面换入主存,并把pfn改为相应的帧号 
pl[page[i]].time=CurrentTime; //令访问时间为当前系统时间
freepf_head=freepf_head->next

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件      234185  2017-11-05 23:11  实验三 内存管理 实验报告.docx
     文件        6243  2017-11-05 21:17  未命名1.cpp
     文件       55296  2017-12-30 11:19  实验3 内存管理.doc

评论

共有 条评论