操作系统页面置换算法模拟

1.最佳淘汰算法(OPT)

2.先进先出的算法(FIFO)

3.最近最久未使用算法(LRU)


#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
int memory[4];//内存,存放页面位置
int seq[205];//指令的执行顺序
int seq_page[205];//用于OPT算法,存放各条指令所在的页面位置
int P[4];//用于FIFO算法,存储装入主存中的页面的页号
int k=0;//用于FIFO算法,指示当前调入新页时应淘汰页在页号表中的位置
int Q[4];//用于LRU算法,页面淘汰队列
int tail;//用于LRU算法,指示队尾
int S, F;
void OPT(int n)//最佳页面替换算法
{
    
int i, count, j, longest=-1;
    
int t[4]={0};
    i
=n+1;
    count
=0;
    
//查找最长时间需要访问的页面,longest中保存最远页面在seq_page[]中的位置
    while (i<200 && count<4){
        
if (seq_page[i]==memory[0&& t[0]==0){
            count
++;
            longest
=i;
            t[
0]=1;
        }
        
else if (seq_page[i]==memory[1&& t[1]==0){
            count
++;
            longest
=i;
            t[
1]=1;
        }
        
else if (seq_page[i]==memory[2&& t[2]==0){
            count
++;
            longest
=i;
            t[
2]=1;
        }
        
else if (seq_page[i]==memory[3&& t[3]==0){
            count
++;
            longest
=i;
            t[
3]=1;
        }
        i
++;
    }
    
//页面置换
    if (i<200){//count==4
        for (j=0;j<4;j++){
            
if (seq_page[longest]==memory[j]){
                memory[j]
=seq[n]/10;
                
break;
            }
        }
    }
    
else{//count<4
        if (longest==-1){//如果内存中的页面都不会再被使用,则取内存中任意页面置换
            memory[0]=seq[n]/10;
        }
        
else{
            
for (j=0;j<4;j++){
                
if (t[j]==0){
                    memory[j]
=seq[n]/10;
                    
break;
                }
            }
        }
    }
    
return;
}
void FIFO(int n)//先进先出页面替换算法
{
    memory[k]
=seq[n]/10;
    k
=(k+1)%4;
}
void LRU(int n)//最近最少使用页面替换算法
{
    
int i, t;
    memory[Q[
0]]=seq[n]/10;
    t
=Q[0];
    
for (i=0;i<=2;i++){
        Q[i]
=Q[i+1];
    }
    Q[
3]=t;
}
int main()
{
    
int page, foundpage;
    
int n1, n2, n3, j, i, x, t;
    
double f;
    tail
=-1;
    memset(memory, 
-1sizeof(memory));
    S
=F=0;
    
for (i=0;i<4;i++){
        Q[i]
=-1;
    }
    
//产生指令执行序列
    i=0;
    n1
=rand()%160;
    
for (j=1;j<=2;j++){
        
if (n1+j<160){
            seq[i
++]=n1+j;
        }
    }
    
while (i<200){
        n2
=rand()%n1;
        
for (j=1;j<=2;j++){
            
if (n2+j<160){
                seq[i
++]=n2+j;
            }
        }
        n3
=rand()%(158-n2)+n2;
        
for (j=1;j<=2;j++){
            
if (n3+j<160){
                seq[i
++]=n3+j;
            }
        }
    }
    
//OPT
    for (i=0;i<200;i++){
        seq_page[i]
=seq[i]/10;
    }
    
//按顺序执行每条指令
    for (i=0;i<200;i++){
        page
=seq[i]/10;//计算所在页面
        foundpage=0;
        
for (j=0;j<4;j++){
            
if (memory[j]==page){//成功访问
                S++;
                foundpage
=1;
                
//LRU
                x=-1;
                
while (memory[Q[++x]]!=page);
                
for (t=x;t<=tail-1;t++){
                    Q[t]
=Q[t+1];
                }
                Q[tail]
=j;
                printf(
"NO %3d: %3d suc     memory: %2d %2d %2d %2d      Queue: %d %d %d %d\n", i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]],  memory[Q[1]],  memory[Q[2]],  memory[Q[3]]);
                
break;
            }
            
else if (memory[j]==-1){//内存块为空
                memory[j]=page;
                S
++;
                foundpage
=1;
                
//FIFO
                P[k]=j;
                k
=(k+1)%4;
                
//LRU
                Q[++tail]=j;
                printf(
"NO %3d: %3d suc     memory: %2d %2d %2d %2d      Queue: %d %d %d %d\n",i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]],  memory[Q[1]],  memory[Q[2]],  memory[Q[3]]);
                
break;
            }
        }
        
if (foundpage==0){//缺页情况
            
//OPT(i);
            
//FIFO(i);
            LRU(i);
            F
++;
            printf(
"NO %3d: %3d fat     memory: %2d %2d %2d %2d      Queue: %d %d %d %d\n",i, seq_page[i], memory[0], memory[1], memory[2], memory[3], memory[Q[0]],  memory[Q[1]],  memory[Q[2]],  memory[Q[3]]);    
        }
    }
    f
=(double)F/(S+F);
    printf(
"success %3d, fault %3d, total %3d, page fault rate %.2lf.\n", S, F, S+F, f);
    
return 0;
}

 

posted @ 2011-10-29 16:55  Charliee  阅读(821)  评论(0编辑  收藏  举报