三种页面置换算法C实现

原创 2016年06月01日 19:23:40
#include "stdio.h"
#include "stdlib.h"

typedef struct item
{
    int num;        //页号
    int time;        //等待时间,LRU算法会用到这个属性
}Pro;

int pageNum;        //系统分配给作业的主存中的页面数
int memoryNum;        //可用内存页面数

void print(Pro *page1);        //打印当前主存中的页面
int  Search(int num1, Pro *memory1);    //在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
int Max(Pro *memory1);
int optimal(int num,int tag,Pro *memory1,Pro *page1);

int main(void)
{
    int i;
    int curmemory;        //调入主存中的页面个数
    int missNum;        //缺页次数
    float missRate;        //缺页率
    char c;                //得到用户的输入字符,来选择相应的置换算法

    Pro *page;            //作业页面集
    Pro *memory;        //内存页面集

    printf("输入系统分配给作业的主存中的页面数:");
    scanf("%d", &pageNum);    
    printf("输入内存页面数:");
    scanf("%d", &memoryNum);
    
    page= (Pro*)malloc(sizeof(Pro)*pageNum);
    memory= (Pro*)malloc(sizeof(Pro)*memoryNum);

    for(i=0;i<pageNum;i++)
    {
        printf("第 %d 个页面号为:", i);
        scanf("%d", &page[i].num);
        page[i].time=0;            //等待时间开始默认为0
    }

    do{
        for(i=0;i<memoryNum;i++)        //初始化内存中页面
        {
            memory[i].num=-1;                //页面为空用-1表示
            memory[i].time=-1;                //
        }     

        printf("*****f:FIFO页面置换*****\n");
        printf("*****o:OPT页面置换*****\n");
        printf("*****l:LRU页面置换*****\n");
        printf("*****请选择操作类型(f,o,l),按其它键结束******\n");
        fflush(stdin);
        scanf("%c", &c);
        
        i = 0;
        curmemory = 0;

        if(c=='f')            //FIFO页面置换
        {
            missNum = 0;            

            printf("FIFO页面置换情况:   \n");
            for(i=0;i<pageNum;i++)
            {
                if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面
                {
                    missNum ++;
                    memory[curmemory].num=page[i].num;
                    print(memory);
                    curmemory = (curmemory+1)%memoryNum;
                }
            }//end for
            missRate = (float)missNum/pageNum;
            printf("缺页次数:%d   缺页率:  %f\n", missNum, missRate);

        }//end if

        if(c=='o')            //OPT页面置换
        {
            missNum = 0;            

            printf("OPT页面置换情况:   \n");
            for(i=0;i<pageNum;i++)
            {
                if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面
                {
                    if(i<memoryNum)
                        curmemory = i;
                    else
                        curmemory = optimal(page[i].num,i,memory,page);
                    missNum ++;
                    memory[curmemory].num=page[i].num;
                    print(memory);
                    curmemory = (curmemory+1)%memoryNum;
                }
            }//end for
            missRate = (float)missNum/pageNum;
            printf("缺页次数:%d   缺页率:  %.2f%%\n", missNum, missRate*100);


        }//end if

        if(c=='l')            //LRU页面置换
        {
            missNum = 0;            

            printf("LRU页面置换情况:   \n");
            for(i=0;i<pageNum;i++)
            {
                for(int j=0;j<memoryNum;j++)
                {
                    if(memory[j].num>=0)
                        memory[j].time++;
                }
                if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面
                {
                    missNum ++;
                //    printf("%d \n",curmemory);
                    if(i<3)
                        curmemory = i;
                    else
                        curmemory = Max(memory);

                    memory[curmemory].num=page[i].num;
                    memory[curmemory].time = 0;
                    print(memory);
                    curmemory = (curmemory+1)%memoryNum;
                }
                else
                {
                    curmemory = Search(page[i].num,memory);
                    memory[curmemory].time=0;
                    curmemory = (curmemory+1)%memoryNum;
                }

            }//end for
            missRate = (float)missNum/pageNum;
            printf("缺页次数:%d   缺页率:  %.2f%%\n", missNum, missRate*100);



        }//end if

    }while(c=='f'||c=='l'||c=='o');


    return 0;
}


void print(Pro *memory1)//打印当前的页面
{
    int j;

    for(j=0;j<memoryNum;j++)
        printf("%d ", memory1[j].num);
    printf("\n");
}

//在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
int  Search(int num1,Pro *memory1  )
{
    int j;

    for(j=0;j<memoryNum;j++)
    {
        if(num1==memory1[j].num)
            return j;            
    }
    return -1;
}  
int Max(Pro *memory1)
{
    int max = 0;

    for(int k=1;k<memoryNum;k++)
    {
        if(memory1[k].time > memory1[max].time)
            max = k;
    }
    return max;
}

int optimal(int num,int tag,Pro *memory1,Pro *page1)
{
    int k,j,min[100],min_k;
    for(k=0;k<memoryNum;k++)
        min[k] = 500;
    for(k=0;k<memoryNum;k++)
    {
        j = tag;
        do{
    
            j++;
            if(j>20)
                break;
        }while(page1[j].num!=memory1[k].num);
        if(j<min[k])
        {
    
            min[k] = j;
        }
    }
    int max = 0;
    for(int t=1;t<memoryNum;t++)
    {
        if(min[t]>min[max])
            max = t;
    }
    return max;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

操作系统之——页面置换算法C语言实现

// 页面置换算法.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdlib.h" #include "stdio.h" #inclu...

gmp大数运算库 window下安装配置和使用(上)

GMP大数运算库,是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数。它本身并没有精度限制,只取决于机器的硬件情况。GMP 的主要目标应用领域是密码学的应用和研究、 ...

操作系统页面置换算法之最优置换(OPT)算法

定义        最优置换算法(OPT)是指,其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人们目前还无...

页面替换算法

来自http://59.64.80.152/vod/2739346/content/003003004001/default.htm   目前。在虚拟存储器常用的页面替换算法有如下几种: 1、 随机...

FIFO(First-In First-Out)先进先出页面置换算法详解

FIFO(First-In First-Out)先进先出页面置换算法:FIFO淘汰算法总是淘汰最先装入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。该算法实现只需把一个进程已调入内存的页面,按...

页面置换算法-先进先出(FIFO)

在多种页面置换算法中, 先进先出是相对简单的算法, 并且效果也不是最好的. 该算法的思路就是当物理内存不够时, 将最先请求到内存中的数据置换出去以空出位置置换入新的数据. 先进先出置换算法会出现bel...

最佳(Optimal)置换算法模拟

定义        最佳(Optimal)置换算法是指,其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人们...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)