操作系统页面调度问题(这里只给出了FIFO、LRU、OPT) 纯c++数组模拟 略low

目前在上实验课,理论以后在进行补充。以下只放上纯模拟的代码。

其实模拟还是很好模拟的,三者仅仅只是发生缺页时调度方法不同,尤其是LRU和OPT两者代码只有一个地方不同,区别之处就在于LRU是向前找,而OPT算法则是向后找。以下以序列{2,3,2,1,5,2,4,5,3,2,5,2} 12个数为例。想要用户输入可以在主函数里写个输入,定义一个全局的数组长度即可。系统内存的块则用的数组b来代表,也可自己设置数组b的长度,大体同上。

//栾兆威 16171120
#include <bits/stdc++.h>
using namespace std;
int a[]={2,3,2,1,5,2,4,5,3,2,5,2}; //12个
int b[3]={-1,-1,-1};  //只分配了三个块

void LRU(){
    int cnt = 0,kk = 0;
    memset(b,-1,sizeof(b));
    for(int i=0;i<12;i++){
        if(kk<3){ //前三个页调入内存
            bool flag = false;
            for(int j = 0;j < i ;j++){ //看看内存块中是否已经存在
                    if(a[i]==b[j]){
                        flag = true;
                        break;
                    }
            }
            if(flag==false){
            b[kk] = a[i];
            cnt++;
            kk++;
            }
        }
        else{
            bool flag = false;
            for(int j = 0;j < 3;j++){
                if(a[i]==b[j]){
                        //cout<<"~~~~~~~"<<a[i]<<endl;
                    flag = true;
                    break;
                }
            }
            //造成缺页
            if(flag == false){
                int tmp = 0;
                bool vis[3];
                memset(vis,false,sizeof(vis));
                for(int j = i;j >=0;j--){//向前找
                    for(int k=0;k<3;k++){
                        if(a[j]==b[k]){
                            vis[k]=true;
                            tmp++;
                            break;
                        }
                    }
                    if(tmp==2)
                        break;
                }
                for(int j = 0;j<3;j++){
                    if(vis[j]==false){
                        cnt++;
                        b[j]=a[i];
                        break;
                    }
                }
            }
        }
        cout<<a[i]<<": [";
        for(int j=0;j<3;j++){
            if(b[j]==-1)
                cout<<"* ";
            else
                cout<<b[j]<<" ";
        }
        cout<<"]"<<endl;
    }
    cout<<"缺页数为:  "<<cnt<<endl;
}
void OPT(){
   int cnt = 0,kk = 0;
    memset(b,-1,sizeof(b));
    for(int i=0;i<12;i++){
        if(kk<3){
            bool flag = false;
            for(int j = 0;j < i ;j++){
                    if(a[i]==b[j]){
                        flag = true;
                        break;
                    }
            }
            if(flag==false){
            b[kk] = a[i];
            cnt++;
            kk++;
            }
        }
        else{
            bool flag = false;
            for(int j = 0;j < 3;j++){
                if(a[i]==b[j]){
                        //cout<<"~~~~~~~"<<a[i]<<endl;
                    flag = true;
                    break;
                }
            }
            //造成缺页
            if(flag == false){
                int tmp = 0;
                bool vis[3];
                memset(vis,false,sizeof(vis));
                for(int j = i+1;j <12;j++){//向后找
                    for(int k=0;k<3;k++){
                        if(a[j]==b[k]){
                            vis[k]=true;
                            tmp++;
                            break;
                        }
                    }
                    if(tmp==2)
                        break;
                }
                for(int j = 0;j<3;j++){
                    if(vis[j]==false){
                        cnt++;
                        b[j]=a[i];
                        break;
                    }
                }
            }
        }
        cout<<a[i]<<": [";
        for(int j=0;j<3;j++){
            if(b[j]==-1)
                cout<<"* ";
            else
                cout<<b[j]<<" ";
        }
        cout<<"]"<<endl;
    }
    cout<<"缺页数为:  "<<cnt<<endl;

}
void FIFO(){
    int cnt = 0,t = 0;
    for(int i = 0;i <12 ;i++){
        bool flag = false;
        for(int j = 0;j < 3;j++){
            if(a[i]==b[j]){
                flag=true;
                break;
            }
        }
        if(flag==false){//缺页
            cnt++;
            b[t]=a[i];
            t++;
            if(t==3)
                t=0;
        }
        cout<<a[i]<<": [";
        for(int j=0;j<3;j++){
            if(b[j]==-1)
                cout<<"* ";
            else
                cout<<b[j]<<" ";
        }
        cout<<"]"<<endl;
    }
     cout<<"缺页数为:  "<<cnt<<endl;
}
int main(){
    cout<<"先进先出淘汰算法:"<<endl;
    cout<<"*********************"<<endl;
    FIFO();
    cout<<"*********************"<<endl;
    cout<<endl;
    cout<<"最近最久未用淘汰算法:"<<endl;
    cout<<"*********************"<<endl;
    LRU();
    cout<<"*********************"<<endl;
    cout<<endl;
     cout<<"最佳淘汰算法淘汰算法:"<<endl;
    cout<<"*********************"<<endl;
    OPT();
    cout<<"*********************"<<endl;
    cout<<endl;

    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值