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');
}
/*页面置换算法,先近先出算法,就是个队列操作
*/
#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');
}
相关文章推荐
- C语言一个简单的商店管理系统
- 学生信息管理系统简单模拟(C语言实现)
- 用C语言实现简单的停车场管理
- 单链表的应用:用C语言实现简单的员工管理系统(新建、增、删、改、查、排序)
- C语言编写的简单的学生成绩管理系统
- C语言实现简单学生成绩管理系统
- 二叉树的应用:利用C语言编写简单的家谱管理系统
- 存储器管理之页面置换算法
- C语言实现简单学生管理系统
- 【C语言】简单图书管理系统
- C语言编写的简单的学生成绩管理系统
- 通过一个小例子来简单理解C语言中的内存空间管理
- C语言小项目(简单的学生成绩管理系统)
- c语言编写的简单信息管理系统
- Linux下C语言实现的简单使用线程向FIFO里写入与读取数据的例子
- Linux环境下C语言实现简单的基于文件的学生信息管理系统
- 一个大学C语言试题的简单实现--员工信息管理程序
- 关于目录及文件管理和简单正则表达式的两个实例
- 【操作系统-存储器管理】简单的clock置换算法的实现
- 学完C语言做了一个简单的“管理系统”!