您的位置:首页 > 编程语言 > C语言/C++

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

2010-06-23 23:15 316 查看
一个先近先出置换算法,一个最近最久未使用算法,模拟一下过程。

/*页面置换算法,先近先出算法,就是个队列操作

*/

#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');

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: