网上资源虽多,但是要想把这两个算法的细节理解的透彻,还得是自己写
1.FIFO
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//主要数据结构
#define total_instrucion 15//总的页面访问次数
#define max_block_num 10//最大内存分配
int Access_Series[total_instrucion];//内存访问序列
char Lack[total_instrucion];//记录是否缺页
struct one_block {//一个物理块
int page_no;//物理块内的页面号
int cnt;//计数,用于确定最先进入的页面(FIFO)
}blocks[max_block_num];
int table[max_block_num][total_instrucion];//显示矩阵
void FIFO(int block_num){
int diseffect;//缺页数
for (int i = 0; i < total_instrucion; i++)
Lack[i] = 'N';//初始化不缺页
//数据结构blocks的初始化
for (int i = 0; i < block_num; i++) {
blocks[i].page_no = -1;//初始化页号为-1,当前有空闲页面
blocks[i].cnt = 0;//初始化计数
}
//开始访问页面
for (int i = 0; i < total_instrucion; i++) {
char full = 'T';//是否内存满
char hit = 'F';//是否命中
for (int j = 0; j < block_num; j++) {
if (blocks[j].page_no == Access_Series[i]) {//命中的情况
hit = 'T';
break;
}else if (blocks[j].page_no == -1) {//未命中,且内存未满的情况
blocks[j].page_no = Access_Series[i];
blocks[j].cnt = j + 1;
Lack[i] = 'Y';//缺页
diseffect++;
full = 'F';//内存未满
break;
}
}
if (full == 'T') {//内存已满
if (hit == 'F') {//若未命中
diseffect++;
Lack[i] = 'Y';
int target = -1;//选中替换目标
for (int j = 0; j < block_num; j++) {
blocks[j].cnt--;//发生页面置换
if (blocks[j].cnt == 0)
target = j;
}
blocks[target].page_no = Access_Series[i];
blocks[target].cnt = block_num;
}
}
for (int j = 0; j < block_num; j++)
table[j][i] = blocks[j].page_no;
}
/*输出运行过程及结果*/
printf("采用FIFO页面置换算法结果如下:");
printf("\n");
printf("页号:");
for (int i = 0; i < total_instrucion; i++)
printf("%3d", Access_Series[i]);
printf("\n");
printf("-----------------------------------------------------\n");
for (int i = 0; i < block_num; i++) {
printf("块%2d:", i+1);
for (int j = 0; j < total_instrucion; j++)
printf("%3d", table[i][j]);
printf("\n");
}
printf("-----------------------------------------------------\n");
printf("缺页:");
for (int i = 0; i < total_instrucion; i++)
printf("%3c", Lack[i]);
printf("\n");
printf("-----------------------------------------------------\n");
printf("\t缺页次数:%d\t缺页率:%d/%d\n", diseffect, diseffect, total_instrucion);
printf("-----------------------------------------------------\n");
}
int main(){
//初始化
//父进程随机产生内存访问页面序列,存于数组Acess_Series[total_instruction]中
srand((unsigned)time(NULL));
for (int i = 0; i < total_instrucion; i++)
Access_Series[i] = rand() % total_instrucion;
int block_num;
while(1){
printf("请输入分配的物理块数(-1退出):");
scanf("%d",&block_num);
if(block_num==-1) break;
FIFO(block_num);
}
return 0;
}
2.LRU
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//主要数据结构
#define total_instrucion 15//总的页面访问次数
#define max_block_num 10//最大内存分配
int Access_Series[total_instrucion];//内存访问序列
char Lack[total_instrucion];//记录是否缺页
struct one_block {//一个物理块
int page_no;//物理块内的页面号
int tim;//计时,用于确定最近最久未使用的页面(LRU)
}blocks[max_block_num];
int table[max_block_num][total_instrucion];//显示矩阵
void LRU(int block_num){
int diseffect;//缺页数
for (int i = 0; i < total_instrucion; i++)
Lack[i] = 'N';//初始化不缺页
//数据结构blocks的初始化
for (int i = 0; i < block_num; i++) {
blocks[i].page_no = -1;//初始化页号为-1,当前有空闲页面
blocks[i].tim = 0;//初始化计时
}
//开始访问页面
for (int i = 0; i < total_instrucion; i++) {
char full = 'T';//是否内存满
char hit = 'F';//是否命中
for (int j = 0; j < block_num; j++)
blocks[j].tim++;//计时器加1
for (int j = 0; j < block_num; j++) {
if (blocks[j].page_no == Access_Series[i]) {//命中的情况
hit = 'T';
blocks[j].tim=0;//刚刚访问,值变为0
break;
}else if (blocks[j].page_no == -1) {//未命中,且内存未满的情况
blocks[j].page_no = Access_Series[i];
blocks[j].tim=0;//刚刚访问,值变为0
Lack[i] = 'Y';//缺页
diseffect++;
full = 'F';//内存未满
break;
}
}
if (full == 'T') {//内存已满
if (hit == 'F') {//若未命中
diseffect++;
Lack[i] = 'Y';
int target = 0;//选中替换目标
for (int j = 1; j < block_num; j++) {
if (blocks[j].tim>blocks[target].tim)
target = j;
}
blocks[target].page_no = Access_Series[i];
blocks[target].tim=0;//刚刚访问,值变为0
}
}
for (int j = 0; j < block_num; j++)
table[j][i] = blocks[j].page_no;
}
/*输出运行过程及结果*/
printf("采用LRU页面置换算法结果如下:");
printf("\n");
printf("页号:");
for (int i = 0; i < total_instrucion; i++)
printf("%3d", Access_Series[i]);
printf("\n");
printf("-----------------------------------------------------\n");
for (int i = 0; i < block_num; i++) {
printf("块%2d:", i+1);
for (int j = 0; j < total_instrucion; j++)
printf("%3d", table[i][j]);
printf("\n");
}
printf("-----------------------------------------------------\n");
printf("缺页:");
for (int i = 0; i < total_instrucion; i++)
printf("%3c", Lack[i]);
printf("\n");
printf("-----------------------------------------------------\n");
printf("\t缺页次数:%d\t缺页率:%d/%d\n", diseffect, diseffect, total_instrucion);
printf("-----------------------------------------------------\n");
}
int main(){
//初始化
//父进程随机产生内存访问页面序列,存于数组Acess_Series[total_instruction]中
srand((unsigned)time(NULL));
for (int i = 0; i < total_instrucion; i++)
Access_Series[i] = rand() % total_instrucion;
int block_num;
while(1){
printf("请输入分配的物理块数(-1退出):");
scanf("%d",&block_num);
if(block_num==-1) break;
LRU(block_num);
}
return 0;
}