您的位置:首页 > 其它

操作系统课设——页面置换算法的模拟

2016-12-24 22:58 309 查看
本课设主要实现FIFO算法和LRU算法,虽然实现了功能,但是个人感觉代码可以优化,而且采用的主存块数是3,如果主存块数修改了,那么代码也需要修改,这是我课设不足之处,望大神来指教!

下面是我的代码#include <stdio.h>
#include <stdlib.h>

#define PAGE_NUM 3 //主存块数
#define SERIAL_NUM 12 //访问序列的次数

int serial[SERIAL_NUM] = {6,7,6,5,9,6,8,9,7,6,9,6}; //初始化访问序列
int page_num[PAGE_NUM] = {-1,-1,-1}; //初始化主存块中的序列

void FIFO()
{
int serial_temp[SERIAL_NUM];
int page_temp[PAGE_NUM];
int i,j,k,m,a,c;
int flag = 0; //记录有多少
int count = 0; //记录缺页次数
/*赋值给新的数组,防止原数据被改动*/
for(a = 0; a < SERIAL_NUM; a++)
{
serial_temp[a] = serial[a];
}
for(a = 0; a < PAGE_NUM; a++)
{
page_temp[a] = page_num[a];
}
/*算法模拟*/
for(i = 0; i < SERIAL_NUM; i++)
{
flag = 0;
c = 10;
//判断主存块有多少空
for(j = 0; j < PAGE_NUM; j++)
{
if(page_temp[j] == -1)
{
flag++;
}
}
//三个主存块有空
while(flag != 0)
{
for(k = 0; k <= 3 - flag; k++)
{
if(page_temp[k] == serial_temp[i])
{
c = k;
break;
}
}
if(page_temp[k] != serial_temp[i])
{
c = 10;
page_temp[3 - flag] = serial_temp[i];
}
break;
}
//三个主存块都满
if(flag == 0)
{
for(k = 0; k < PAGE_NUM; k++)
{
if(page_temp[k] == serial_temp[i])
{
c = 222;
}
}
if(c != 222)
{
page_temp[0] = page_temp[1];
page_temp[1] = page_temp[2];
page_temp[2] = serial_temp[i];
}
}

for(m = 0; m < PAGE_NUM; m++) //输出
{
printf(" %d",page_temp[m]);
}
if(c == 222 || c != 10)
{
printf(" 不缺页!");
}
else
{
printf(" 缺页!");
count++;
}
printf(" 缺页次数为%d次!\n",count);
}

}
void LRU()
{
int serial_temp[SERIAL_NUM];
int page_temp[PAGE_NUM];
int a,k,i,c,j,m,cc;
int flag;
int count = 0;
int count_1 = 0;
/*赋值给新的数组,防止原数据被改动*/
for(a = 0; a < SERIAL_NUM; a++)
{
serial_temp[a] = serial[a];
}
for(a = 0; a < PAGE_NUM; a++)
{
page_temp[a] = page_num[a];
}
/*算法模拟*/
for(i = 0; i < SERIAL_NUM; i++)
{
flag = 0;
c = 10;
cc=10;
for(j = 0; j < PAGE_NUM; j++)
{
if(page_temp[j] == -1)
{
flag++;
}
}
//主存块有空位
while(flag != 0)
{
for(k = 0; k < 3 - flag; k++)
{
if(page_temp[k] == serial_temp[i])
{
c = k;
}
}
count_1= 3 - flag;
if(10 == c && count_1 == 0)
{
page_temp[0] = serial_temp[i];
}
if(10 == c && count_1 == 2)
{
page_temp[2] = page_temp[1];
page_temp[1] = page_temp[0];
page_temp[0] = serial_temp[i];
}
if(10 == c && count_1 ==1)
{

page_temp[1] = page_temp[0];
page_temp[0] = serial_temp[i];
}
if(c !=10)
{
if(count_1 == 1)
{
page_temp[0] = serial_temp[i];
}
if(count_1 == 2)
{
if(1 == c)
{
page_temp[1] = page_temp[0];
page_temp[0] = serial_temp[i];
}
}

}
break;
}
//满
if(0 == flag)
{
for(k = 0; k < PAGE_NUM; k++)
{
if(page_temp[k] == serial_temp[i])
{
c = 222;
cc = k;
break;
}
}
//无重复
if(c != 222)
{
page_temp[0] = serial_temp[i];
page_temp[1] = serial_temp[i - 1];
page_temp[2] = serial_temp[i - 2];
}
//第一个重复
if(0 == cc)
{
page_temp[0] = serial_temp[i];
}
//第2个重复
if(1 == cc)
{
page_temp[1] = page_temp[0];
page_temp[0] = serial_temp[i];
}
//第三个重复
if(2 == cc)
{
page_temp[2] = page_temp[1];
page_temp[1] = page_temp[0];
page_temp[0] = serial_temp[i];
}
}

for(m = 0; m < PAGE_NUM; m++) //输出
{
printf(" %d",page_temp[m]);
}
if(c == 222 || c != 10 || 1 == c || 2 == c)
{
printf(" 不缺页!");
}
else
{
printf(" 缺页!");
count++;
}
printf("缺页次数为%d次!\n",count);
}
}
void interface() //界面函数
{
system("clear");
printf(" \n");
printf(" |------页面置换算法模拟------|\n");
printf(" |-------1.选FIFO算法-------|\n");
printf(" |-------2.选 LRU算法-------|\n");
printf(" |-------3. 退出 ---------|\n");

while(1)
{
int select;
printf("请输入你想选择的数字!\n");
scanf("%d",&select);
getchar();
switch(select)
{
case 1:
{
system("clear");
printf("FIFO算法结果如下:\n");
FIFO();
printf("按回车键返回!\n");
getchar();
interface();
break;
}
case 2:
{
system("clear");
printf("LRU算法结果如下:\n");
LRU();
printf("按回车键返回!\n");
getchar();
interface();
break;
}
case 3:
{
system("clear");
printf("谢谢使用!\n");
exit(1);
break;
}
default:
{
printf("请输入正确的数字!\n");
printf("即将返回主界面!\n");
sleep(1);
sleep(1); //延时
interface();
break;
}
}
}
}
int main()
{
interface();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: