三种页面置换算法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...

5种页面置换算法的实现

前几天做了一个有关页面替换算法的题,要求如下: 1 简介 要求实现多种页面替换算法,然后利用随机产生的引用串测试其性能。 2 页面替换算法    我们做如下假设: • 虚拟内存页面总...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

三种页面置换算法

这次要写的是三种页面置换算法,最佳置换算法、先进先出算法和最近最久未使用算法。这里只是大概介绍一下每个算法,和自己编程的思想。如果看的感觉比较模糊,可以网上百度一下“页面置换算法”具体看一看,我就不再...

操作系统页面置换算法c++

操作系统页面置换算法 页面置换算法: 功能:选择被置换的物理页面 目标:尽可能减少页面的调入调出次数 把未来不再访问或者短期内不访问的页面调出 页面锁定:(以下部分) ...
  • TH_NUM
  • TH_NUM
  • 2016年03月21日 18:06
  • 1810

简单的页面置换算法分析

本文主要分析操作系统中涉及到的一些常见的置换算法,并不对涉及的操作系统内容过多介绍。这些算法在其他的计算机应用中也有体现,基本原理都是一致的,可参考理解。 一、前提说明本文主要针对一个例子进行说明,以...

操作系统实验之页面置换算法(OPT、FIFO、LRU)C++简单实现

南邮操作系统实验之页面置换算法(OPT、FIFO、LRU)C++简单实现

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

什么是FIFO         该算法总是淘汰最新进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰,该算法简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针...

页面置换算法模拟程序

#include#include #include #include #define  L  20//页面走向长度最大为20int M;        //内存块struct Pro//定义一个结构体...

页面置换算法

页面置换算法的概念:     出现缺页异常,则需调入新页面二内存已满时,置换算法选择被置换的物理页面。尽可能减少页面的调如调出次数,把未来不再访问或短期内不访问的页面调出。 页面锁定framelo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三种页面置换算法C实现
举报原因:
原因补充:

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