计算机操作系统三种页面置换算法的实现

计算机操作系统三种页面置换算法的实现

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int page_trend[505];//页面走向
int page_sum=0;//页面个数
int physical_block;//物理块个数
int blockstate[505];//每个物理块状态
int ready_sum=0;//已经装入页面的个数
int num_break=0;//中断次数
int num_exchange=0;//置换次数
double break_rate=0;//缺页中断率
double exchange_rate=0;//页面置换率
void Optimal()
{ 
    printf("\n页面置换情况为:\n/*\n");
    for(int i=0; i<page_sum; i++)
    { 
        int flag=0;
        for(int j=0; j<physical_block; j++)
        { 
            if(page_trend[i]==blockstate[j])
            { 
                printf("命中!(%d)\n",page_trend[i]);
                flag=1;
                break;
            }
        }
        if(flag==1) continue;
        if(flag==0)
        { 
            num_break++;
            printf("发生缺页中断!");
            if(ready_sum==physical_block)
            { 
                int num,maxposition=-1;
                for(int j=0; j<physical_block; j++)
                { 
                    int flagg=0;
                    for(int k=i+1; k<page_sum; k++)
                    { 
                        if(blockstate[j]==page_trend[k])
                        { 
                            flagg=1;
                            if(k>maxposition)
                            { 
                                maxposition=k;
                                num=j;
                            }
                            break;
                        }
                    }
                    if(flagg==0) num=j,maxposition=9999;
                }
                num_exchange++;
                printf("发生页面置换!将%d调出内存,将%d调入内存。 %d--->%d\n", blockstate[num],page_trend[i],page_trend[i],blockstate[num]);
                blockstate[num]=page_trend[i];
            }
            else if(ready_sum<physical_block)
            { 
                printf("页面调入!将%d页面调入内存。\n",page_trend[i]);
                blockstate[ready_sum]=page_trend[i];
                ready_sum++;
            }
        }
    }
    printf("*/\n");
    break_rate=(double)num_break/(double)page_sum;
    exchange_rate=(double)num_exchange/(double)page_sum;
    printf("缺页中断次数为%d 缺页率为%lf\n页面置换次数为%d 页面置换率为%lf\n换页号在程序中给出。\n",num_break,break_rate,num_exchange,exchange_rate);
}
void FIFO()
{ 
    printf("\n页面置换情况为:\n/*\n");
    int num=0;
    for(int i=0; i<page_sum; i++)
    { 
        int flag=0;
        for(int j=0; j<physical_block; j++)
        { 
            if(page_trend[i]==blockstate[j])
            { 
                printf("命中!(%d)\n",page_trend[i]);
                flag=1;
                break;
            }
        }
        if(flag==1) continue;
        if(flag==0)
        { 
            num_break++;
            printf("发生缺页中断!");
            if(ready_sum==physical_block)
            { 
                num_exchange++;
                printf("发生页面置换!将%d调出内存,将%d调入内存。 %d--->%d\n", blockstate[num],page_trend[i],page_trend[i],blockstate[num]);
                blockstate[num]=page_trend[i];
                num=(num+1)%physical_block;
            }
            else if(ready_sum<physical_block)
            { 
                printf("页面调入!将%d页面调入内存。\n",page_trend[i]);
                blockstate[ready_sum]=page_trend[i];
                ready_sum++;
            }
        }
    }
    printf("*/\n");
    break_rate=(double)num_break/(double)page_sum;
    exchange_rate=(double)num_exchange/(double)page_sum;
    printf("缺页中断次数为%d 缺页率为%lf\n页面置换次数为%d 页面置换率为%lf\n换页号在程序中给出。\n",num_break,break_rate,num_exchange,exchange_rate);
}
void LRU()
{ 
    printf("\n页面置换情况为:\n/*\n");
    for(int i=0; i<page_sum; i++)
    { 
        int flag=0;
        for(int j=0; j<physical_block; j++)
        { 
            if(page_trend[i]==blockstate[j])
            { 
                printf("命中!(%d)\n",page_trend[i]);
                flag=1;
                break;
            }
        }
        if(flag==1) continue;
        if(flag==0)
        { 
            num_break++;
            printf("发生缺页中断!");
            if(ready_sum==physical_block)
            { 
                int num,minposition=999;
                for(int j=0; j<physical_block; j++)
                { 
                    int flagg=0;
                    for(int k=i-1; k>=0; k--)
                    { 
                        if(blockstate[j]==page_trend[k])
                        { 
                            flagg=1;
                            if(k<minposition)
                            { 
                                minposition=k;
                                num=j;
                            }
                            break;
                        }
                    }
                    if(flagg==0) num=j,minposition=-1;
                }
                num_exchange++;
                printf("发生页面置换!将%d调出内存,将%d调入内存。 %d--->%d\n", blockstate[num],page_trend[i],page_trend[i],blockstate[num]);
                blockstate[num]=page_trend[i];
            }
            else if(ready_sum<physical_block)
            { 
                printf("页面调入!将%d页面调入内存。\n",page_trend[i]);
                blockstate[ready_sum]=page_trend[i];
                ready_sum++;
            }
        }
    }
    printf("*/\n");
    break_rate=(double)num_break/(double)page_sum;
    exchange_rate=(double)num_exchange/(double)page_sum;
    printf("缺页中断次数为%d 缺页率为%lf\n页面置换次数为%d 页面置换率为%lf\n换页号在程序中给出。\n",num_break,break_rate,num_exchange,exchange_rate);
}
int main()
{ 
    memset(page_trend,-1,sizeof(page_trend));
    memset(blockstate,-1,sizeof(blockstate));
    int a;
    printf("请选择输入方式:\n输入页面走向和物理块大小(0)\n输入代码逻辑地址、页面和物理块大小(1)\n");
    scanf("%d",&a);
    if(a==0)
    { 
        printf("输入页面走向(ctrl+z结束输入):\n");
        while(~scanf("%d",&page_trend[page_sum]))
        { 
            page_sum++;
        }
        printf("输入物理块个数:\n");
        scanf("%d",&physical_block);
        printf("物理块中是否已装入某些页面? 是(1) 否(0)\n");
        scanf("%d",&a);
        if(a==1)
        { 
            printf("输入已经装入的页面,不得超过%d个页面(ctrl+z结束输入):\n",physical_block);
            while(~scanf("%d",&blockstate[ready_sum]))
            { 
                ready_sum++;
            }
        }
        printf("选择页面置换算法: 最佳置换算法 (0) 先进先出算法(1) 最近最久未使用算法(2)\n");
        scanf("%d",&a);
        if(a==0) Optimal();
        else if(a==1) FIFO();
        else if(a==2) LRU();
    }
    else if(a==1)
    { 
        int page_size,position,block_size;
        printf("输入页面大小:\n");
        scanf("%d",&page_size);
        printf("输入物理块大小:\n");
        scanf("%d",&block_size);
        physical_block=block_size/page_size;
        printf("输入代码的逻辑地址序列:\n");
        while(~scanf("%d",&position))
        { 
            page_trend[page_sum]=position/page_size;
            page_sum++;
        }
        printf("物理块中是否已装入某些页面? 是(1) 否(0)\n");
        scanf("%d",&a);
        if(a==1)
        { 
            int k;
            printf("输入已经装入的程序的逻辑地址,不得超过%d个(ctrl+z结束输入)\n",physical_block);
            while(~scanf("%d",&k))
            { 
                blockstate[ready_sum]=k/page_size;
                ready_sum++;
            }
        }
        printf("选择页面置换算法:最佳置换算法 (0) 先进先出算法(1) 最近最久未使用算法(2)\n");
        scanf("%d",&a);
        if(a==0) Optimal();
        else if(a==1) FIFO();
        else if(a==2) LRU();
    }
    return 0;
}

    原文作者:ShilongLi01
    原文地址: https://blog.csdn.net/weixin_48673014/article/details/117748924
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞