计算机工程学院
实验报告书
课程名: 操作系统原理A
题 目: 虚拟存储器理
页面置换算法模拟实验
班 级:
学 号:
姓 名:
评语:
成绩: 指导教师:
批阅时间: 年 月 日
实验目求
1 目:
请求页式虚存理常虚拟存储理方案通请求页式虚存理中页面置换算法模拟助理解虚拟存储技术特点加深请求页式虚存理页面调度算法理解
2 求:
实验求C语言编程模拟拥干虚页进程定干实页中运行缺页中断发生时分FIFOLRU算法进行页面置换情形中虚页数事先定(例10)虚页访问页址流(长度事先定例20次虚页访问)程序机产生事先保存文件中求程序运行时屏幕显示出置换程中状态信息输出访问结束时页面命中率程序应允许通该进程分配实页数较两种置换算法稳定性
二实验说明
1.设计中虚页实页表示
设计利C语言结构体描述虚页实页结构
pn
pfn
time
pn
pfn
next
虚页结构 实页结构
虚页结构中pn代表虚页号10虚页pn取值范围0—9pfn代表实页号虚页未装入实页时项值1该虚页已装入某实页时项值装入实页实页号pfntime项FIFO算法中LRU中存放该虚页访问时间
实页结构中中pn代表虚页号表示pn代表虚页目前正放实页中pfn代表实页号取值范围(0—n1)动态指派实页数n决定next指实页结构体指针实页链表形式组织起关实页链表组织详见面第4点
2.关缺页次数统计
计算命中率需统计20次虚页访问中命中次数程序应设置计数器count统计虚页命中发生次数访问虚页pfn项值1表示虚页已装入某实页虚页命中count加1终命中率count20*100
3.LRU算法中久未页面确定
找久未虚页面程序中引入时间计数器countime访问虚页面时countime值加1然访问虚页time项值设置增值前countime值表示该虚页次访问时间LRU算法需置换时已分配实页虚页中找出time值虚页久未虚页面应该置换出
4.算法中实页组织
分配实页数n程序运行时户动态指派应链表组织动态产生实页调度算法实现方便考虑引入freebusy两链表:free链表组织未分配出实页首指针free_head初始时n实页处free链表中busy链表组织已分配出实页首指针busy_head尾指针busy_tail初始值null访问虚页实页中时产生缺页中断时free链表空取链表首指针指实页分配该虚页free链表空说明n实页已全部分配出时应进行页面置换:FIFO算法busy_head 指实页busy链表中取分配该虚页然该实页插入busy链表尾部LRU算法已分配实页虚页中找出time值虚页该虚页装载实页中置换出该实页中装入前正访问虚页
三程序流程图
四程序清单
#include
#include
*全局变量*
int mSIZE
*物理块数*
int pSIZE
*页面号引串数*
static int memery[10]{0}
*物理块中页号*
static int page[100]{0}
*页面号引串*
static int temp[100][10]{0}
*辅助数组*
*置换算法函数*
void FIFO()
void LRU()
void OPT()
*辅助函数*
void print(unsigned int t)
void designBy()
void download()
void mDelay(unsigned int Delay)
*函数*
void main()
{
int ikcode
printf(请输入物理块数(M<10):)
scanf(d&mSIZE)
printf(请输入页面号引串数(P<100):)
scanf(d&pSIZE)
puts(请次输入页面号引串(连续输入需隔开):)
for(i0i
do
{
puts(输入页面号引串:)
for(k0k<(pSIZE1)20k++)
{
for(i20*k(i
if(((i+1)200)||(((i+1)20)&&(ipSIZE1)))
printf(d\npage[i])
else
printf(d page[i])
}
}
printf(* * * * * * * * * * * * * * * * * * * * * * *\n)
printf(* 请选择页面置换算法:\t\t\t *\n)
printf(* *\n)
printf(* 1先进先出(FIFO) 2久未(LRU) *\n)
printf(* 3退出 *\n)
printf(* * * * * * * * * * * * * * * * * * * * * * *\n)
printf(请选择操作:[ ]\b\b)
scanf(d&code)
switch(code)
{
case 1
FIFO()
break
case 2
LRU()
break
case 3
OPT()
break
case 4
system(cls)
system(color 0A)
exit(0)
default
printf(输入错误请重新输入:)
}
printf(意键重新选择置换算法:>>>)
getchar()
}
while (code4)
getchar()
}
*载入数*
void download() {
printf(\nFinish\n载入成功)
}
*设置延迟*
void mDelay(unsigned int Delay)
{
unsigned int i
for(Delay>0Delay)
{
for(i0i<124i++)
{
printf( \b)
}
}
}
*显示设计者信息*
void print(unsigned int t)
{
int ijkl int flag
for(k0k<(pSIZE1)20k++)
{
for(i20*k(i
if(((i+1)200)||(((i+1)20)&&(ipSIZE1)))
printf(d\npage[i])
else
printf(d page[i])
}
for(j0j
for(i20*k(i
if(i>j)
printf( |d|temp[i][j]) else
printf( | |) }
for(imSIZE+20*k(i
for(flag0l0l
flag++
if(flagmSIZE)*页面物理块中*
printf( )
else
printf( |d|temp[i][j])
}
*行显示20*
if(i200)
continue
printf(\n)
}
}
printf(\n)
printf(缺页次数:d\t\tt+mSIZE)
printf(缺页率:dd\nt+mSIZEpSIZE)
printf(置换次数:d\t\tt)
printf(访问命中率:d\n(pSIZE(t+mSIZE))*100pSIZE)
printf(\n)
}
*计算程延迟*
void compute()
{
int i
printf(正进行相关计算请稍候)
for(i0i++<30printf(\b))
for(i0i++<30printf( ))
for(i0i++<30printf(\b))
}
*先进先出页面置换算法*
void FIFO()
{
int memery[10]{0}
int time[10]{0} *记录进入物理块时间*
int ijkm
int max0
*记录换出页*
int count0
*记录置换次数*
*前mSIZE数直接放入*
for(i0i
memery[i]page[i]
time[i]i
for(j0j
}
for(imSIZEi
*判断新页面号否物理块中*
for(j0k0j
if(memery[j]page[i])
k++
}
if(kmSIZE)
*果物理块中*
{
count++
*计算换出页*
maxtime[0]