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

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

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值