操作系统页面置换算法
通常把选择换出页面的算法称为页面置换算法,置换算法的好坏直接影响到系统的性能,不适当的算法可能会导致抖动,
最近学习了一下,算是做一个笔记吧。。。
实现OPT和LRU置换算法
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 12 #define B 3 #define P 5 int isInBuf(int buf[], int x, int *p) { int i, j = -1; for (i = 0; i < B; i++) { if(buf[i] == x) { j = i; break; } else if (buf[i] == -1) { (*p)++; buf[i] = x; j = i; break; } } if(j==-1) (*p)++; return j; } int oldopt(int i, int buf[ ], int list[ ], int f[ ]) { int k, h, j=0, max=-1; for (k = 0; k < B; k++) { for (h = i; h < N; h++) if (buf[k] == list[h]) { f[k] = h; break; } if(h==N) f[k] = N; } for (k = 0; k < B; k++) { if (max < f[k]) { max = f[k]; j = k; } } return j; } int main() { int list[N]; int change[N]; int buf[B],f[B],i,j,k; int result[B][N]; int old; int absent; srand((int)time(NULL)); printf("\n The Random List:\n"); for (i = 0; i < N; i++) { list[i] = rand() % P+1; printf("%3d", list[i]); } printf("\n----------------------------------------------\n"); printf("\nOPT:\n"); absent=0; for(i = 0; i < B; i++) buf[i] = f[i] = -1; for(i = 0; i < N; i++) { j=isInBuf(buf, list[i],&absent); if(j== -1) //需置换页面 { old=oldopt(i, buf, list, f); change[i]=buf[old]; buf[old] = list[i]; } else change[i]=-1; for(k=0;k<B;k++) result[k][i]=buf[k]; } printf("the result is:\n"); for(i=0;i<B;i++) { for(j=0;j<N;j++) printf("%3d",result[i][j]); printf("\n"); } printf("\nthe page is changed:\n"); for(i=0;i<N;i++) { if(change[i]== -1) printf(" "); else printf("%3d",change[i]); } printf("\nabsent:%d\n",absent); printf("the absent vote is:%f\n",(float)absent/N);}
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 12 #define B 3 #define P 5 int isInBuf(int buf[], int x, int *p) { int i, j = -1; for (i = 0; i < B; i++) { if(buf[i] == x) { j = i; break; } else if (buf[i] == -1) { (*p)++; buf[i] = x; j = i; break; } } if(j==-1) (*p)++; return j; } int oldlru(int f[ ]) { int i, j = 0, max = -1; for (i = 0; i < B; i++) { if(f[i] > max) { max = f[i]; j = i; } f[i]++; } return j; } int main() { int list[N]; int change[N]; int buf[B], f[B], i, j,k; int result[B][N]; int old; int absent; srand((int)time(NULL)); printf("\n The Random List:\n"); for (i = 0; i < N; i++) { list[i] = rand() % P+1; printf("%3d", list[i]); } printf("\n-------------------------------------------\n"); printf("\nLRU:\n"); absent = 0; for(i = 0; i < B; i++) buf[i] = f[i] = -1; for(i = 0; i < N; i++) { j = isInBuf(buf, list[i],&absent); old = oldlru(f); if(j== -1) { change[i]=buf[old]; buf[old] = list[i]; f[old] = 0; } else { f[j]=0; change[i]=-1; } for(k=0;k<B; k++) result[k][i]=buf[k]; } printf("the result is:\n"); for(i=0;i<B;i++) { for(j=0;j<N;j++) printf("%3d",result[i][j]); printf("\n"); } printf("\nthe page is changed:\n"); for(i=0;i<N;i++) { if(change[i]== -1) printf(" "); else printf("%3d",change[i]); } printf("\nabsent:%d\n",absent); printf("the absent vote is:%f\n",(float)absent/N); }
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 12 //随机生成的页地址流的长度 #define B 3 //分配给当前进程的内存块数 #define P 5 //进程的页面数 int isInBuf(int buf[], int x, int *p) //返回某个数x有没有在缓冲Buf[]中,若在,返回其位置,否则返回-1,*p为缺页次数 { int i, j = -1; for (i = 0; i < B; i++) { if(buf[i] == x) { j = i; break; } else if (buf[i] == -1) { //有空闲内存块(在装入最初的几个页面时) (*p)++; buf[i] = x; j = i; break; } } if(j==-1) (*p)++; return j; } int main() { int list[N]; //程序的访页地址流 int change[N]; //记录每次被替换出去的页 int buf[B],f[B],i,j,k; //buf是分配给进程的内存块,f记录内存中页面下次使用的时间 int result[B][N]; //置换的详细过程 int old; //指向将要换出去的页 int absent; //缺页次数 int count=0;//判断顺序 srand((int)time(NULL)); //初始化随机数种子 printf("\n The Random List:\n"); for (i = 0; i < N; i++) {//产生随机页面访问序列 list[i] = rand() % (P-1); printf("%3d", list[i]); } printf("\n----------------------------------------------------------------\n"); //OPT置换算法 printf("\nFIFO:\n"); absent=0; for(i = 0; i < B; i++) buf[i] = f[i] = -1; for(i = 0; i < N; i++) { j=isInBuf(buf, list[i],&absent); if(j== -1) //需置换页面 { old=count++;//对次序的判断 if(count==3) count=0; change[i]=buf[old]; buf[old] = list[i]; } else change[i]=-1; //保存当前内存页面情况 for(k=0;k<B;k++) result[k][i]=buf[k]; } //输出置换详细过程 printf("the result is:\n"); for(i=0;i<B;i++) { for(j=0;j<N;j++) printf("%3d",result[i][j]); printf("\n"); } //输出每次被置换出去的页 printf("\nthe page is changed:\n"); for(i=0;i<N;i++) { if(change[i]== -1) printf(" "); else printf("%3d",change[i]); } //显示缺页次数及缺页率 printf("\nabsent:%d\n",absent); printf("the absent vote is:%f\n",(float)absent/N); }
三种置换算法结合
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 12 //随机生成的页地址流的长度 #define B 3 //分配给当前进程的内存块数 #define P 5 //进程的页面数 int isInBuf(int buf[], int x, int *p) //返回某个数x有没有在缓冲Buf[]中,若在,返回其位置,否则返回-1,*p为缺页次数 { int i, j = -1; for (i = 0; i < B; i++) { if(buf[i] == x) { j = i; break; } else if (buf[i] == -1) { //有空闲内存块(在装入最初的几个页面时) (*p)++; buf[i] = x; j = i; break; } } if(j==-1) (*p)++; return j; } int oldopt(int i, int buf[ ], int list[ ], int f[ ]) {//功能:返回下次使用距离现在最久的页面位置 int k, h, j=0, max=-1; for (k = 0; k < B; k++) { for (h = i; h < N; h++) if (buf[k] == list[h]) // 判断物理块中的页面是否与未来页面相等 { f[k] = h; break; } if(h==N) f[k] = N; } //寻找下次使用距离现在最久的页面 for (k = 0; k < B; k++) { if (max < f[k]) { max = f[k]; j = k; } } return j; } int oldlru(int f[ ]) { //功能: 返回最近最久未使用页面的位置 int i, j = 0, max = -1; for (i = 0; i < B; i++) { if(f[i] > max) { max = f[i]; j = i; } f[i]++; } return j; } int main() { int list[N]; //程序的访页地址流 int change[N]; //记录每次被替换出去的页 int buf[B],f[B],i,j,k; //buf是分配给进程的内存块,f记录内存中页面下次使用的时间 int result[B][N]; //置换的详细过程 int old; //指向将要换出去的页 int absent; //缺页次数 int count=0;//判断顺序 srand((int)time(NULL)); //初始化随机数种子 printf("\n The Random List:\n"); for (i = 0; i < N; i++) {//产生随机页面访问序列 list[i] = rand() % (P-1); printf("%3d", list[i]); } printf("\n------------------------------------------------------------\n"); //OPT置换算法 printf("\nOPT:\n"); absent=0; for(i = 0; i < B; i++) buf[i] = f[i] = -1; for(i = 0; i < N; i++) { j=isInBuf(buf, list[i],&absent); if(j== -1) //需置换页面 { old=oldopt(i, buf, list, f); change[i]=buf[old]; buf[old] = list[i]; } else change[i]=-1; //保存当前内存页面情况 for(k=0;k<B;k++) result[k][i]=buf[k]; } //输出置换详细过程 printf("the result is:\n"); for(i=0;i<B;i++) { for(j=0;j<N;j++) printf("%3d",result[i][j]); printf("\n"); } //输出每次被置换出去的页 printf("\nthe page is changed:\n"); for(i=0;i<N;i++) { if(change[i]== -1) printf(" "); else printf("%3d",change[i]); } //显示缺页次数及缺页率 printf("\nabsent:%d\n",absent); printf("the absent vote is:%f\n",(float)absent/N); printf("\n---------------------------------------------------\n"); // LRU置换算法 printf("\nLRU:\n"); absent = 0; for(i = 0; i < B; i++) buf[i] = f[i] = -1; for(i = 0; i < N; i++) { j = isInBuf(buf, list[i],&absent); old = oldlru(f); if(j== -1) //需置换页面 { change[i]=buf[old]; buf[old] = list[i]; f[old] = 0; } else //不需置换页面 { f[j]=0; change[i]=-1; } //保存当前内存页面情况 for(k=0;k<B; k++) result[k][i]=buf[k]; } //输出置换详细过程 printf("the result is:\n"); for(i=0;i<B;i++) { for(j=0;j<N;j++) printf("%3d",result[i][j]); printf("\n"); } //输出每次被置换出去的页 printf("\nthe page is changed:\n"); for(i=0;i<N;i++) { if(change[i]== -1) printf(" "); else printf("%3d",change[i]); } //显示缺页次数及缺页率 printf("\nabsent:%d\n",absent); printf("the absent vote is:%f\n",(float)absent/N); printf("\n------------------------------------------------------------\n"); //fifo置换算法 printf("\nFIFO:\n"); absent=0; for(i = 0; i < B; i++) buf[i] = f[i] = -1; for(i = 0; i < N; i++) { j=isInBuf(buf, list[i],&absent); if(j== -1) //需置换页面 { old=count++;//对次序的判断 if(count==3) count=0; change[i]=buf[old]; buf[old] = list[i]; } else change[i]=-1; //保存当前内存页面情况 for(k=0;k<B;k++) result[k][i]=buf[k]; } //输出置换详细过程 printf("the result is:\n"); for(i=0;i<B;i++) { for(j=0;j<N;j++) printf("%3d",result[i][j]); printf("\n"); } //输出每次被置换出去的页 printf("\nthe page is changed:\n"); for(i=0;i<N;i++) { if(change[i]== -1) printf(" "); else printf("%3d",change[i]); } //显示缺页次数及缺页率 printf("\nabsent:%d\n",absent); printf("the absent vote is:%f\n",(float)absent/N); }