资源简介
随机给出一个页面执行序列,如: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
相关资源
- 基于numa架构的tcmalloc内存管理算法
- 操作系统课程设计 内存管理
- 操作系统内存管理仿真
- 操作系统原理实验报告+源代码哲学家
- glibc内存管理ptmalloc源代码分析
- malloc实现源码
- linux源代码分析之内存管理
- XV6阅读报告包含进程线程、内存管理
- 操作系统进程管理和内存管理demo
-
zw_ob
jective-C高级编程iOS与OSX多线程和 - 内存管理算法模拟(首次分配、邻近
- 十六进制转物理地址
- qemu内存管理流程
- 内存管理选择题.txt
- 虚拟内存管理基于时钟策略的页面置
- 伙伴系统Buddy System 内存管理
- 操作系统实验三源代码加实验报告
- nginx slab内存管理精简源码及注释
- 系统级编程lab7 第七次实验 四川大学
- 四川大学操作系统虚拟内存管理实验
- 操作系统进程管理与内存管理QT实现界
- 简单的内存管理结构
- 用C实现的段页式内存管理
- 仿照linux的buddy+slub内存管理算法
- 操作系统 内存管理课程设计报告
- 操作系统实验,进程调度,作业调度
- TLSF开源算法
- 进程调度与内存管理:这是我花了很
- linux内存管理实验报告
- 操作系统实验五 内存管理
评论
共有 条评论