#pragma warning(disable:4996)
#include
#include
#define size_MAX 8//定义页架的个数(内存最大值)
#define R_max 30//访问序列的最大值
int leaf[size_MAX];//定义页架的数组
void initLeaf() {
for (int i = 0; i < size_MAX; i++)
leaf[i] = -1;
}//初始化页架,-1代表不存在页面
void printlack(int count) {
printf(“缺页的情况发生了%d次n”,count);
}//打印出缺页的次数
void creatleaf(int leaf_number, int rsize, int rs[])
{
for (int k = 0; k < rsize; k++)
{
rs[k] = rand() % leaf_number;
}
}//随机生成一个数组存放访问顺序以及访问呢的页面页号
void printleaf(int leaf_size) {
for (int i = 0; i < leaf_size; i++) {
printf(“第%d块页架存放的页号为%dn”, i, leaf[i]);
}
}//打印页架中存放的页号情况
void printr(int rsize, int rs[])
{
printf(“打印随机生成的页号:n”);
for (int i = 0; i < rsize; i++)
{
printf("%d “, rs[i]);
}
printf(”n");
}
int findmin(int Time[], int leaf_size) {
int j = 0;
for (int i = 0; i < leaf_size; i++)
{
if (Time[i] < Time[j])
j = i;
}
return j;
}
void FIFO(int leaf_size, int r_size, int rs[])
{
int count = 0;
printf(“FIFO算法:n”);
initLeaf();
int Time[size_MAX];//存放剩余存放次数
for (int i = 0; i < leaf_size; i++)
{
Time[i] = 0;
}//初始换每一个页架的剩余存放次数
for (int i = 0; i < r_size; i++)
{
int flag = 0;
for (int j = 0; j < leaf_size; j++)
{
if (rs[i] == leaf[j])
{
flag = 1;
printf(“页面中存在页号不需要置换n”);
}//页面中存在页号不需要置换
}
if (flag == 0)
{
count++;//页面不存在,缺页次数加一
for (int k = 0; k < leaf_size; k++)//对页面进行置换改变该页面的存在次数
{
if (Time[k] == 0)
{
Time[k] = leaf_size;
leaf[k] = rs[i];
break;
}
}
printleaf(leaf_size);
for (int j = 0; j < leaf_size; j++)//
{
if (Time[j] > 0) {
Time[j] = Time[j] - 1;
}
}
}
printf("-------n");
}
printlack(count);
}
void LRU(int leaf_size, int r_size, int rs[])
{
int count = 0;
printf(“LRU算法:n”);
initLeaf();
int Time[size_MAX];//存放剩余存放次数
for (int i = 0; i < leaf_size; i++)
{
Time[i] = 0;
}//初始换每一个页架的剩余存放次数
for (int i = 0; i < r_size; i++)
{
int flag = 0;
for (int j = 0; j < leaf_size; j++)
{
if (rs[i] == leaf[j])
{
flag = 1;
Time[j] = r_size;
printf(“页面中存在页号不需要置换n”);
}//页面中存在页号不需要置换
}
if (flag == 0)
{
count++;//页面不存在,缺页次数加一
int k = findmin(Time, leaf_size);
Time[k] = leaf_size;
leaf[k] = rs[i];
printleaf(leaf_size);
}
for (int j = 0; j < leaf_size; j++)//
{
Time[j] = Time[j] - 1;
}
printf("-------n");
}
printlack(count);
}
int main() {
int leaf_number;
int leaf_size;
int r_size;
int rs[R_max];
printf(“请输入:页面数范围 页架总数 页面访问次数:n”);
scanf("%d%d%d", &leaf_number, &leaf_size, &r_size);
creatleaf(leaf_number, r_size, rs);
printr(r_size, rs);
int choose;
printf(“请进行算法的选择:0代表FIFO算法 1代表LRU算法n”);
scanf("%d", &choose);
if (choose == 0)
{
FIFO(leaf_size, r_size, rs);
printf("n");
}
else
{
LRU(leaf_size, r_size, rs);
printf("n");
}
}



