操作系统课设——页面置换算法的模拟

本课设主要实现FIFO算法和LRU算法,虽然实现了功能,但是个人感觉代码可以优化,而且采用的主存块数是3,如果主存块数修改了,那么代码也需要修改,这是我课设不足之处,望大神来指教!

下面是我的代码

#include <stdio.h>
#include <stdlib.h>

#define PAGE_NUM 3    //主存块数
#define SERIAL_NUM 12    //访问序列的次数

int serial[SERIAL_NUM] = {6,7,6,5,9,6,8,9,7,6,9,6}; //初始化访问序列
int page_num[PAGE_NUM] = {-1,-1,-1};    //初始化主存块中的序列

void FIFO()
{
    int serial_temp[SERIAL_NUM];
    int page_temp[PAGE_NUM];
    int i,j,k,m,a,c;
    int flag = 0;     //记录有多少
    int count = 0;   //记录缺页次数
    /*赋值给新的数组,防止原数据被改动*/
    for(a = 0; a < SERIAL_NUM; a++)
    {
        serial_temp[a] = serial[a];
    }
    for(a = 0; a < PAGE_NUM; a++)
    {
        page_temp[a] = page_num[a];
    }
    /*算法模拟*/
    for(i = 0; i < SERIAL_NUM; i++)
    {
        flag = 0;
        c = 10;
        //判断主存块有多少空
        for(j = 0; j < PAGE_NUM; j++)
        {
            if(page_temp[j] == -1)
            {
                flag++;
            }
        }
        //三个主存块有空
        while(flag != 0)
        {
            for(k = 0; k <= 3 - flag; k++)
            {
                if(page_temp[k] == serial_temp[i])
                {
                    c = k;
                    break;
                } 
            }
            if(page_temp[k] != serial_temp[i])
            {
                c = 10;
                page_temp[3 - flag] = serial_temp[i];
            }
            break;
        }
        //三个主存块都满
        if(flag == 0)
        {
            for(k = 0; k < PAGE_NUM; k++)
            {
                if(page_temp[k] == serial_temp[i])
                {
                    c = 222;
                }
            }
            if(c != 222)
            {
                page_temp[0] = page_temp[1];
                page_temp[1] = page_temp[2];
                page_temp[2] = serial_temp[i];
            }
        }
        
        for(m = 0; m < PAGE_NUM; m++)   //输出
        {
            printf("    %d",page_temp[m]);
        }
        if(c == 222 || c != 10)
        {
            printf("   不缺页!");
        }
        else
        {
            printf("    缺页!");
            count++;
        }
        printf("     缺页次数为%d次!\n",count);
    }
    
}
void LRU()
{
    int serial_temp[SERIAL_NUM];
    int page_temp[PAGE_NUM];
    int a,k,i,c,j,m,cc;
    int flag;
    int count = 0;
    int count_1 = 0;
    /*赋值给新的数组,防止原数据被改动*/
    for(a = 0; a < SERIAL_NUM; a++)
    {
        serial_temp[a] = serial[a];
    }
    for(a = 0; a < PAGE_NUM; a++)
    {
        page_temp[a] = page_num[a];
    }
    /*算法模拟*/
    for(i = 0; i < SERIAL_NUM; i++)
    {
        flag = 0;
        c = 10;
        cc=10;
        for(j = 0; j < PAGE_NUM; j++)
        {
            if(page_temp[j] == -1)
            {
                flag++;
            }
        }
        //主存块有空位
        while(flag != 0)
        {
            for(k = 0; k < 3 - flag; k++)
            {
                if(page_temp[k] == serial_temp[i])
                {
                    c = k;
                }
            }
            count_1= 3 - flag;
                if(10 == c && count_1 == 0)
                {
                    page_temp[0] = serial_temp[i];
                }
                if(10 == c && count_1 == 2)
                {
                    page_temp[2] = page_temp[1];
                    page_temp[1] = page_temp[0];
                    page_temp[0] = serial_temp[i];
                }
                if(10 == c && count_1 ==1)
                {
                    
                    page_temp[1] = page_temp[0];
                    page_temp[0] = serial_temp[i];
                }
                if(c !=10) 
                {
                    if(count_1 == 1)
                    {
                        page_temp[0] = serial_temp[i];
                    }
                    if(count_1 == 2)
                    {
                        if(1 == c)
                        {
                            page_temp[1] = page_temp[0];
                            page_temp[0] = serial_temp[i];
                        }
                    }

                }
                break;
        }
        //满
        if(0 == flag)
        {
            for(k = 0; k < PAGE_NUM; k++)
            {
                if(page_temp[k] == serial_temp[i])
                {
                    c = 222;
                    cc = k;
                    break;
                }
            }
            //无重复
            if(c != 222)
            {
                page_temp[0] = serial_temp[i];
                page_temp[1] = serial_temp[i - 1];
                page_temp[2] = serial_temp[i - 2];
            }
            //第一个重复
            if(0 == cc)
            {
                page_temp[0] = serial_temp[i];
            }
            //第2个重复
            if(1 == cc)
            {
                page_temp[1] = page_temp[0];
                page_temp[0] = serial_temp[i];
            }
            //第三个重复
            if(2 == cc)
            {
                page_temp[2] = page_temp[1];
                page_temp[1] = page_temp[0];
                page_temp[0] = serial_temp[i];
            }
        }
        
        for(m = 0; m < PAGE_NUM; m++)   //输出
        {
            printf("    %d",page_temp[m]);
        }
        if(c == 222 || c != 10 || 1 == c || 2 == c)
        {
            printf("   不缺页!");
        }
        else
        {
            printf("    缺页!");
            count++;
        }
        printf("缺页次数为%d次!\n",count);
    }
}
void interface() //界面函数
{
    system("clear");
    printf("     \n");
    printf("                  |------页面置换算法模拟------|\n");
    printf("                  |-------1.选FIFO算法-------|\n");
    printf("                  |-------2.选 LRU算法-------|\n");
    printf("                  |-------3. 退出 ---------|\n");

    while(1)
    {
        int select;
        printf("请输入你想选择的数字!\n");
        scanf("%d",&select);
        getchar();
        switch(select)
        {
            case 1:
            {
                system("clear");
                printf("FIFO算法结果如下:\n");
                FIFO();
                printf("按回车键返回!\n");
                getchar();
                interface();
                break;
            }
            case 2:
            {
                system("clear");
                printf("LRU算法结果如下:\n");
                LRU();
                printf("按回车键返回!\n");
                getchar();
                interface();
                break;
            }
            case 3:
            {
                system("clear");
                printf("谢谢使用!\n");
                exit(1);
                break;
            }
            default:
            {
                printf("请输入正确的数字!\n");
                printf("即将返回主界面!\n");
                sleep(1);
                sleep(1);    //延时
                interface();
                break;
            } 
        }
    }
}
int main()
{
    interface();
    return 0;
}

一、课程设计目的 通过请求页式管理方式中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请 求页式存储管理中的页面置换算法。 容 二、课程设计内容 模拟实现 OPT(最佳置换)、FIFO 和 LRU 算法,并计算缺页率。 示 三、要求及提示 本题目必须单人完成。 1、首先用随机数生成函数产生一个“指令将要访问的地址序列”,然后将地址序列变换 成相应的页地址流(即页访问序列),再计算不同算法下的命中率。 2、通过随机数产生一个地址序列,共产生 400 条。其中 50%的地址访问是顺序执行的, 另外 50%就是非顺序执行。且地址在前半部地址空间和后半部地址空间均匀分布。具体产 生方法如下: 1) 在前半部地址空间,即[0,199]中随机选一数 m,记录到地址流数组中(这是 非顺序执行); 2) 接着“顺序执行一条指令”,即执行地址为 m+1 的指令,把 m+1 记录下来; 3) 在后半部地址空间,[200,399]中随机选一数 m’,作为新指令地址; 4) 顺序执行一条指令,其地址为 m’+1; 5) 重复步骤 1~4,直到产生 400 个指令地址。 3、将指令地址流变换成页地址(页号)流,简化假设为: 1) 页面大小为 1K(这里 K 只是表示一个单位,不必是 1024B); 2) 用户虚存容量为 40K; 3) 用户内存容量为 4 个页框到 40 个页框; 6 4) 用户虚存中,每 K 存放 10 条指令,所以那 400 条指令访问地址所对应的页地 址(页号)流为:指令访问地址为[0,9]的地址为第 0 页;指令访问地址为[10, 19]的地址为第 1 页;……。按这种方式,把 400 条指令组织进“40 页”,并 将“要访问的页号序列”记录到页地址流数组中。 4、循环运行,使用户内存容量从 4 页框到 40 页框。计算每个内存容量下不同页面置换 算法的命中率。输出结果可以为: 页框数 OPT 缺页率 FIFO 缺页率 LRU 缺页率 [4] OPT:0.5566 FIFO:0.4455 LRU:0.5500 [5] OPT:0.6644 FIFO:0.5544 LRU:0.5588 …… …… …… …… [39] OPT:0.9000 FIFO:0.9000 LRU:0.9000 [40] OPT:1.0000 FIFO:1.0000 LRU:1.0000 注 1:在某一次实验中,可能 FIFO 比 LRU 性能更好,但足够多次的实验表明 LRU 的平均性能比 FIFO 更好。 注 2:计算缺页率时,以页框填满之前和之后的总缺页次数计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值