实
课程:
操作系统
验
班级:
报
姓名:
告
学号:
成绩:
指导教师: 实验日期:
实验密级: 预习程度: 实验时间:
仪器组次: 实验名称:
必修/选修: 实验序号:
访问实验二 请求页式管理中的置换算法
实验目的与要求:
1.采用FIFO(先进先出)置换算法,发生缺页中断时,给出相应的字地址及页号,计算缺页中断率。
2.采用LFU(最不经常使用)置换算法,发生缺页中断时,给出相应的字地址及页号,计算缺页中断率。
实验仪器: 名称 微机 型号 数量 1
一、实验内容
1.假设有一个用户进程P的地址空间为n(n=60)页,系统已在内存中给该进程分配有m(m 2.进程依次要访问的字地址序列(访问串),在0~1024*n-1(0~61439)中模拟随机发生,访问序列的随机生成规则为:50%的字地址前向顺序增长,25%的字地址均匀分布在前地址(低地址)部分,25%的字地址均匀分布在后地址(高地址)部分,为了减少模拟次数,前向顺序递增产生的字地址如小于1024*n-513(60927)则自动加512。模拟访问串长度为100。以n=60为例,字地址序列(访问串)的随机生成方法如下: (1)在[0,61439]之间随机产生起始字地址,当前访问的字地址记为k; (2)前向顺序递增产生的字地址为k+1+512; (3)前地址(低地址)在[0,k-1]内随机产生; (4)后地址(高地址)在[k+1,61439]内随机产生; (5)重复顺序递增、前地址区间随机产生、后地址区间随机产生的过程,概率分别为:50%、25%、25%。 二、实验要求 1.采用FIFO(先进先出)置换算法,发生缺页中断时,给出相应的字地址及页号,计算缺页中断率。 2.采用LFU(最不经常使用)置换算法,发生缺页中断时,给出相应的字地址及页号,计算缺页中断率。 三、实验思路 首先应该确认全局变量,比如:物理块大小、进程数量;建立一个结构体用于记录页面号和页面调度次数,并定义好所要使用的变量,如记录调入页面的序号队列queue[psize]、初始化情况下已经分配的页面数rearp、在查找时是否有相同页面flag(初值为1表示没有)、在LFU中最先进去的页面号frontlea。 随机数产生序列函数:此函数比较简单,按照要求写出即可。首先随机产生 存储块号,并将其列入调入页面序号队列,然后用另一个随机变量suiji,保证重复顺序递增、前地址区间随机产生、后地址区间随机产生的概率是50%、25%、25%,有下面是具体实现部分。 void Build() //产生页面调度的页面随机序列 { int i=0; int suiji; int k; //表示随机出来的存储块号 printf(\产生页面调度的页面随机序列:\\n\ srand(time(NULL)); k=rand()%(61440); y[i++]=k; do { suiji=rand()%4+1; switch(suiji) { case 1: case 2: if(k<61440 - 513) y[i++]=(k+1+512); k=k+1+512; break; case 3: k=rand()%k; y[i++]=k; break; case 4: k=rand()%(61439 - k) + k; y[i++]=k; break; default: break; } } while(i<100); for(i=0; i<100; i++) { printf(\ if(i%6==5)printf(\ } printf(\ } FIFO算法: 在FIFO算法中存在三种情况,分别为:存在相同的进程、不存在相同的进程但是存在空闲物理块、不存在相同的进程并且不存在空闲物理块。根据这三种情况编写FIFO函数,并且在这些情况中,还需要使用到查找空闲物理块的子函数,在不存在相同的进程并且不存在空闲物理块的情况时即为发生缺页中断。 (1)查找空闲物理块函数: int searchpb()//查找空闲物理块,成功返回值是物理块号,否则就是-1 { int j,m; for(j=0; j return -1; } (2)FIFO函数(省略在程序中); (3)缺页中断率的计算:根据公式缺页中断率=缺页次数/调用程序次数,即可得出缺页中断率。 LFU思路: 最不经常使用页面淘汰算法LFU(least frequently used)。该算法在需要淘汰某一页时,首先淘汰到当前时间为止,被访问次数最少的那一页。这只要在页表中给每一页增设一个访问计数器即可实现。每当该页被访问时,访问计数器加1,而发生一次缺页中断时,则淘汰计数值最小的那一页,并将所有的计数器清零。在此函数执行过程中,还需要调用查找计数值最小页面的函数、计数器清零函数。 (1)查找计数值最小页面的函数: int searchleast() //查找计数值最小的页面,返回其页号 { } int k; int least; least=frontlea; for(k=0;k return least; (2)计数器清零函数: void empty() { int i; for(i=0;i (3)LFU函数:省略在程序中 (4)缺页中断率的计算:根据公式缺页中断率=缺页次数/调用程序次数,即可得出缺页中断率。 四、 程序流程图 先进先出结构