C语言两个简单的存储器管理的页面置换算法(FIFO and LRU) Page-Replacement Algorithm

来源:互联网 发布:视频转换手绘软件 编辑:程序博客网 时间:2024/06/06 21:40

一个先近先出置换算法,一个最近最久未使用算法,模拟一下过程。

 

 

/*页面置换算法,先近先出算法,就是个队列操作
*/
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

//内存可提供的页面的个数
#define MEMERY_PAGE_NUM 3

//FIFO页面置换算法的数据结构
struct FIFOQueue
{
    int number;                    //数据个数
    int data[MEMERY_PAGE_NUM];    //数据(页面代号)
}fifo;

//初始化操作
void Init();

//一组对对列的操作
//加入对列
void Add(int pageID);
//在对列中找指定的数据
int Find(int pageID);
//打印操作
void PrintQueue();

int main()
{
    Init();
    //随机10个数据测试
    time_t t;
    srand(unsigned(time(&t)));
    int i;
    int tmp;
    for(i = 0;i<10;++i)
    {
        tmp = rand()%10;
        Add(tmp);
        PrintQueue();
    }
    return 0;
}

void Init()
{
    fifo.number = 0;
    int i;
    for(i = 0;i<MEMERY_PAGE_NUM;i++)
    {
        fifo.data[i] = -1;
    }
}

void Add(int pageID)
{
    printf("加入页面%d/n",pageID);
    if(fifo.number < MEMERY_PAGE_NUM)
    {
        fifo.data[fifo.number++] = pageID;
    }
    else
    {
        //内存中已经有欲找页面时,不用进行页面置换操作。
        if(!Find(pageID))            //欲找的页面不存在内存中
        {
            //数据左移一个单位,右加新数据
            int i;
            for(i = 0;i<MEMERY_PAGE_NUM-1;i++)
            {
                fifo.data[i] = fifo.data[i+1];
            }
            //加入新数据
            fifo.data[i] = pageID;
        }
    }
}

int Find(int pageID)
{
    int i;
    for(i = 0;i<MEMERY_PAGE_NUM;i++)
    {
        if(fifo.data[i] == pageID)
        {
            return 1;
        }
    }
    return 0;
}

void PrintQueue()
{
    printf("****************当前内存中的页号**************/n");
    int i;
    putch('|');
    for(i = 0;i<MEMERY_PAGE_NUM;i++)
    {
        if(fifo.data[i] == -1)
            printf("  |");
        else
            printf("%d  |",fifo.data[i]);
    }
    putch('/n');
}

 

 

//最近未使用页面轩换算法

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

//指定内存可容页面数
#define MEMERY_PAGE_NUM 5

//定义一个特殊的队列
struct LRUQueue
{
    int number;
    int data[MEMERY_PAGE_NUM];
}lru;

//初始化操作
void Init();

//定义一组操作
void Add(int pageID);
int Find(int pageID);
void Update(int pos);

void PrintQueue();

int main()
{
    Init();
    //随机10个数据测试
    time_t t;
    srand(unsigned(time(&t)));
    int i;
    int tmp;
    for(i = 0;i<10;++i)
    {
        tmp = rand()%10;
        Add(tmp);
        PrintQueue();
    }
    return 0;
}

void Add(int pageID)
{
    printf("加入内存页面%d/n",pageID);
    if(lru.number < MEMERY_PAGE_NUM)
    {
        int pos = Find(pageID);
        if(pos)
        {
            Update(pos);
        }
        else
        {
            lru.data[lru.number++] = pageID;
        }
    }
    else
    {
        int pos = Find(pageID);
        if(pos)
        {
            Update(pos);
        }
        else
        {
            //数据左移一个单位,右加新数据
            int i;
            for(i = 0;i<MEMERY_PAGE_NUM-1;i++)
            {
                lru.data[i] = lru.data[i+1];
            }
            //加入新数据
            lru.data[i] = pageID;
        }
    }
}

int Find(int pageID)
{
    int i;
    for(i = 0;i<MEMERY_PAGE_NUM;i++)
    {
        if(lru.data[i] == pageID)
        {
            return i;
        }
    }
    return 0;
}

void Update(int pos)
{   
    int tmp = lru.data[pos];
    int i;
    for(i = pos;i < lru.number; ++i)
    {
        lru.data[i] = lru.data[i+1];
    }
    lru.data[lru.number-1] = tmp;
}

void Init()
{
    lru.number = 0;
    int i;
    for(i = 0;i<MEMERY_PAGE_NUM;i++)
    {
        lru.data[i] = -1;
    }
}

void PrintQueue()
{
    printf("****************当前内存中的页号**************/n");
    int i;
    putch('|');
    for(i = 0;i<MEMERY_PAGE_NUM;i++)
    {
        if(lru.data[i] == -1)
            printf("  |");
        else
            printf("%d  |",lru.data[i]);
    }
    putch('/n');
}