当前位置:文档之家› 实验五:页面调度算法模拟实验报告

实验五:页面调度算法模拟实验报告

《计算机操作系统》实验报告实验五:页面调度算法模拟学校:╳╳╳院系:╳╳╳班级:╳╳╳姓名:╳╳╳学号:╳╳╳指导教师:╳╳╳目录一、实验题目 (3)二、实验学时 (3)三、指导老师 (4)四、实验日期 (4)五、实验目的 (4)六、实验原理 (4)6.1页面的含义 (4)6.2 页面置换算法的含义 (4)6.3 置换算法 (4)6.3.1最佳置换算法(Optimal) (4)6.3.2先进先出(FIFO)页面置换算法 (5)6.3.3 LRU置换算法 (5)七、实验步骤及结果 (5)7.1 验证最佳置换算法 (5)7.1.1 实验截图 (5)7.1.2 实验分析 (5)7.2 验证先进先出(FIFO)页面置换算法 (6)7.2.1 实验截图 (6)7.2.2 实验分析 (6)7.3 验证LRU置换算法 (7)7.3.1 实验截图 (7)7.3.2 实验分析 (8)八、报告书写人 (8)附录一最佳置换算法(Optimal) (9)附录二先进先出(FIFO)页面置换算法 (14)附录三 LRU置换算法 (18)实验五:页面调度算法模拟一、实验题目页面调度算法模拟二、实验学时2学时三、指导老师╳╳╳四、实验日期2018年12月10日星期一五、实验目的(1)熟悉操作系统页面调度算法(2)编写程序模拟先进先出、LRU等页面调度算法,体会页面调度算法原理六、实验原理6.1页面的含义分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,称为页面或页。

6.2 页面置换算法的含义在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。

但应将哪个页面调出,须根据一定的算法来确定。

通常,把选择换出页面的算法称为页面置换算法(Page_Replacement Algorithms)。

6.3 置换算法一个好的页面置换算法,应具有较低的页面更换频率。

从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。

6.3.1最佳置换算法(Optimal)它是由Belady于1966年提出的一种理论上的算法。

其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。

采用最佳置换算法,通常可保证获得最低的缺页率。

但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,便可以利用此算法来评价其它算法。

6.3.2先进先出(FIFO)页面置换算法这是最早出现的置换算法。

该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。

6.3.3 LRU置换算法LRU置换算法是选择最近最久未使用的页面予以淘汰。

七、实验步骤及结果7.1 验证最佳置换算法7.1.1 实验截图7.1.2 实验分析in 7 2 7 7 1 0 4 4 0 8 0 4 b1 7 7 7 7 4 4b2 2 2 2 2 8b3 1 1 1 1b4 0 0 0out 7 27.2 验证先进先出(FIFO)页面置换算法7.2.1 实验截图7.2.2 实验分析7.3 验证LRU置换算法7.3.1 实验截图7.3.2 实验分析in 9 6 8 7 7 3 7 1 2 6 7 0b1 9 9 9 9 3 3 3 6 6 b2 6 6 6 6 1 1 1 0 b3 8 8 8 8 2 2 2 b4 7 7 7 7 7 7out 9 6 8 3 1八、报告书写人╳╳╳附录一最佳置换算法(Optimal)#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 12 /*随机数列的长度*/#define B 4 /*内存页面数*/int IsInBuf(int buf[],int list[],int num){int i,j=-1;int max_p;int max_d=0;for(i=0;i<B;i++){if(buf[i]==list[num]) //当x在buf中,返回-1return -1;else if(buf[i]==-1) //当x不在buf中,且buf[i]为空,则把x 填入buf,并返回-1{buf[i]=list[num];return -2;}}for(i=0;i<B;i++){for(j=num+1;j<N;j++){if(buf[i]==list[j]){if(max_d<j){max_d=j;//buf[i]在list[]中的最近距离max_p=i;//list[j]在buf[]的位置}break;}}if(j==N) //如果buf满,并且buf[i]不在list[]的后半部分,返回位置ireturn i;}return max_p;//返回距离最远的buf[]的位置}int main(){int list[N];//={4,3,2,1,4,3,5,4,3,2,1,5};int buf[B],i,f[N],j,m,bufuse=0,tmp;int change=0; //置换次数int interrupt=0; //中断次数int successfully=0; //访问成功次数srand((int)time(NULL));for(i=0;i<B;i++)buf[i]=f[i]=-1;printf("\n\n");printf("The Optimal List:");for(i=0;i<N;i++){list[i]=(int) rand()%10;printf("%2d",list[i]);}printf("\n");printf("\nthe lost in Optimal:\n");for(i=0;i<N;i++){j=IsInBuf(buf,list,i);if(j==-1){successfully++;for(m=0;m<=B;m++){printf(" "); /*成功的打印*/}printf(" in<--%d successfully\n",list[i]);/*成功的打印*/}else if(j==-2){bufuse++;interrupt++;printf("newbuf=");for(m=0;m<bufuse;m++){printf("%d ",buf[m]); /*缺页中断次数的打印*/}for(m;m<B;m++){printf(" "); /*缺页中断的打印*/}printf(" in<--%d interrupt\n",list[i]);/*缺页中断的打印*/}else{tmp=buf[j];buf[j]=list[i];change++;printf("newbuf=");for(m=0;m<bufuse;m++){printf("%d ",buf[m]); /*缺页置换的打印*/}for(m;m<B;m++){printf(" ");/*缺页置换的打印*/}printf(" in<--%d change %d-->out\n",list[i],tmp);/*缺页置换的打印*/}}printf("\n\n");printf("interrupt=%d\n",interrupt);printf("change=%d\n",change);printf("successfully=%d\n",successfully);return 0;}附录二先进先出(FIFO)页面置换算法#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 12 /*随机数列的长度*/#define B 4 /*内存页面数*/int IsInBuf(int buf[],int x){int i;for(i=0;i<B;i++){if(buf[i]==x) /*当x在buf中,返回其位置*/return -1;else if(buf[i]==-1) /*当x不在buf中,且buf[i]为空,则把x填入buf,并返回其位置*/{buf[i]=x;return -2;}}return 0;}int main(){int list[N];//={4,3,2,1,4,3,5,4,3,2,1,5};int buf[B],i,f[N],j,m,bufuse=0,tmp;int old=0;int change=0; //置换次数int interrupt=0; //中断次数int successfully=0; //访问成功次数srand((int)time(NULL));for(i=0;i<B;i++)buf[i]=f[i]=-1;printf("\n\n");printf("The FIFO List:");for(i=0;i<N;i++){list[i]=(int) rand()%10;printf("%2d",list[i]);}printf("\n");printf("\nthe lost in FIFO:\n");for(i=0;i<N;i++){j=IsInBuf(buf,list[i]);if(j==-1){successfully++;for(m=0;m<=B;m++){printf(" "); /*成功的打印*/ }printf(" in<--%d successfully\n",list[i]);/*成功的打印*/}else if(j==-2){bufuse++;interrupt++;printf("newbuf=");for(m=0;m<bufuse;m++){printf("%d ",buf[m]); /*缺页中断次数的打印*/}for(m;m<B;m++){printf(" "); /*缺页中断的打印*/}printf(" in<--%d interrupt\n",list[i]);/*缺页中断的打印*/}else{tmp=buf[old];buf[old]=list[i];old=(old+1)%(int)B; /*数据在buf中的储存是循环的*/change++;printf("newbuf=");for(m=0;m<bufuse;m++){printf("%d ",buf[m]); /*缺页置换的打印*/}for(m;m<B;m++){printf(" ");/*缺页置换的打印*/}printf(" in<--%d change %d-->out\n",list[i],tmp);/*缺页置换的打印*/}}printf("\n\n");printf("interrupt=%d\n",interrupt);printf("change=%d\n",change);printf("successfully=%d\n",successfully);return 0;}附录三 LRU置换算法#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 12 /*随机数列的长度*/#define B 4 /*内存页面数*/int IsInBuf(int buf[],int list[],int num){int i,j=-1;for(i=0;i<B;i++){if(buf[i]==list[num]) /*当x在buf中,返回其位置*/{j=i;break;}else if(buf[i]==-1) /*当x不在buf中,且buf[i]为空,则把x填入buf,并返回其位置*/{buf[i]=list[num];j=-2;break;}}return j;}int Get(int buf[],int list[],int num){int buff[B];int buffuse=0;int i,j,k,m;for(m=0;m<B;m++)buff[m]=-1;for(i=num-1;i>=0;i--){for(j=0;j<B;j++){if(list[i]==buf[j]){for(k=0;k<buffuse;k++){if(list[i]==buff[k])break;}if(k==buffuse){buff[buffuse]=list[i];buffuse++;if(buffuse==B)return j;}break;}}}return 0;}int main(){int list[N];//int list[12]=int buf[B],i,f[N],j,m,bufuse=0,tmp;int old=0;int change=0;int interrupt=0;int successfully=0;srand((int)time(NULL));for(i=0;i<B;i++)buf[i]=f[i]=-1;printf("The Random List:");for(i=0;i<N;i++){list[i]=(int) rand()%10;printf("%2d",list[i]);}printf("\n\n");printf("\nthe lost in LRU:\n");change=0; /*中断的次数*/for(i=0;i<N;i++){j=IsInBuf(buf,list,i);if(j==-1){old=Get(buf,list,i);tmp=buf[old];buf[old]=list[i];change++;printf("newbuf=");for(m=0;m<bufuse;m++){printf("%d ",buf[m]); /*缺页置换的打印*/ }for(m;m<B;m++){printf(" ");/*缺页置换的打印*/}printf(" in<--%d change %d-->out\n",list[i],tmp);/*缺页置换的打印*/}else if(j==-2){bufuse++;interrupt++;printf("newbuf=");for(m=0;m<bufuse;m++){printf("%d ",buf[m]); /*缺页中断次数的打印*/}for(m;m<B;m++){printf(" "); /*缺页中断的打印*/}printf(" in<--%d interrupt\n",list[i]);/*缺页中断的打印*/}else{successfully++;for(m=0;m<=B;m++){printf(" "); /*成功的打印*/}printf(" in<--%d successfully\n",list[i]);/*成功的打印*/}}printf("\n\n");printf("interrupt=%d\n",interrupt);printf("change=%d\n",change);printf("successfully=%d\n",successfully);return 0;}。

相关主题