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

来源:互联网 发布:大数据分析师怎么样 编辑:程序博客网 时间:2024/05/29 11:01

本课设主要实现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;}

0 0
原创粉丝点击