【页面置换算法】LRC算法和FIFS算法
- 算法介绍
- FIFO:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。
- LRU(least recently used)是将近期最不会访问的数据给淘汰掉,LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低。LRU算法简单,存储空间没有被浪费,所以还是用的比较广泛的。
- 实现思路
- 数组作为内存块,另一个数组存储页号
- FIFS:
读入的页号首先在内存块中查找,没有查找到,当前物理块若为空,则调入页号,若非空,则按照先到先出的顺序,调入调出,若查找到页号,则继续查找下一个。
- LUR:
内存块为空时,先读入的页号进入内存块直到内存块满,将其等待时间都置为0,接下来的页号,如果在内存块中找到,则将该页号的等待时间置为0,若找不到,则查找内存块中等待时间最长的页号置换出去,新进来的页号等待时间置为0。然后将内存块中其余页号的等待时间都加1。
-
流程图:
-
lur:
FIFS:
- 代码
-
1 #include<iostream> 2 using namespace std; 3 //伪代码: 内存大小,作业号, 4 //物理块, 5 int a[100],len,b[100],i,j,n; 6 int c[100][2]; 7 8 void readn(int n){ 9 10 cout<<"请输入页面号(-1结束)"; 11 len=0; 12 int m=0; 13 while(m!=-1){ 14 cin>>a[len]; 15 m=a[len]; 16 len++; 17 } 18 len=len-1; 19 cout<<"输入完毕"<<endl; 20 // for( j=0;j<len;j++){ 21 // cout<<a[j]; 22 // } 23 } 24 25 void FIFO(int n,int a[]){ 26 int cnum=0; 27 for( j=0;j<n;j++){ 28 b[j]=a[j]; 29 30 } 31 //输出第一个b[n], 32 cout<<"当前物理块存放的页号:"; 33 for( j=0;j<n;j++){ 34 cout<<b[j]<<" "; 35 } 36 cout<<endl; 37 int x=0,flag=0,sum=0; 38 for( i=n-1;i<len;i++){ 39 40 for( j=0;j<n;j++){ 41 if(a[i]==b[j]) 42 break; 43 } 44 int q=x; 45 if(j>=n){ 46 b[x]=a[i]; 47 x=(x+1)%n; 48 49 flag=1; 50 sum++; 51 } 52 if(flag==1){ 53 cout<<"置换了b["<<q<<"]"<<endl; 54 } 55 cout<<"当前物理块存放的页号:"; 56 for( j=0;j<n;j++){ 57 cout<<b[j]<<" "; 58 } 59 cout<<endl; 60 flag=0; 61 } 62 //计算缺页率 63 cout<<"FIFO缺页次数:"<<sum+n<<endl; 64 cout<<"FIFO置换次数:"<<sum <<endl; 65 cout<<"FIFO缺页率:"<<(double)(sum+n)/len<<endl; 66 67 } 68 69 void LRU(int n,int a[]){ 70 71 int cnum=0; 72 for( j=0;j<n;j++){ 73 c[j][0]=a[j]; 74 c[j][1]=0; 75 } 76 //输出第一个b[n], 77 cout<<"当前物理块存放的页号:"; 78 for( j=0;j<n;j++){ 79 cout<<c[j][0]<<" "; 80 } 81 cout<<endl; 82 int x=0,flag=0,sum=0; 83 for( i=n-1;i<len;i++){ 84 //查找在不在内存里面 85 for( j=0;j<n;j++){ 86 if(a[i]==c[j][0]){ 87 c[j][1]=0;//将时间恢复为0 88 89 //等待的时间加1 90 for(int k=0;k<n;k++){ 91 if(c[k][0]!=a[i]){ 92 c[k][1]++; 93 } 94 } 95 break; 96 } 97 98 } 99 int q; 100 if(j>=n){//不在内存里面,找最久没用的 101 int tmp=c[x][1],zhen=x; 102 for(int l=0;l<n;l++){ 103 if(c[l][1]>tmp){ 104 tmp=c[l][1]; 105 zhen=l; 106 } 107 } 108 x=zhen; 109 q=x; 110 c[x][0]=a[i]; 111 c[x][1]=0; 112 for(int k=0;k<n;k++){ 113 if(c[k][0]!=a[i]){ 114 c[k][1]++; 115 } 116 } 117 x=(x+1)%n; 118 flag=1; 119 sum++; 120 } 121 if(flag==1){ 122 cout<<"置换了c["<<q<<"]"<<endl; 123 } 124 cout<<"当前物理块存放的页号:"; 125 for( j=0;j<n;j++){ 126 cout<<c[j][0]<<" "; 127 } 128 cout<<endl; 129 flag=0; 130 } 131 //计算缺页率 132 cout<<"LUR缺页次数:"<<sum+n<<endl; 133 cout<<"LUR置换次数:"<<sum <<endl; 134 cout<<"LUR缺页率:"<<(double)(sum+n)/len<<endl; 135 136 137 138 } 139 140 int main(){ 141 //物理块 142 cout<<"请输入物理块大小"; 143 cin>>n; 144 readn(n); 145 cout<<"FIFO算法:"; 146 FIFO(n,a); 147 cout<<endl; 148 cout<<"LRU算法:"; 149 LRU(n,a); 150 151 return 0; 152 }
- 运行结果