资源简介
随机给出一个页面执行序列,如: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
- 上一篇:操作系统处理器调度实验报告及源码
- 下一篇:upload-avatar.rar
评论
共有 条评论