操作系统实验三(页面置换算法)实验报告材料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三实验报告
实验源码:
#include "stdio.h"
#include <iostream.h>
#include <stdlib.h>
#define DataMax 100 // 常量DataMax
#define BlockNum 10 // 常量BlockNum
int DataShow[BlockNum][DataMax]; // 用于存储要显示的数组
bool DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示int Data[DataMax]; // 保存数据
int Block[BlockNum]; // 物理块
int count[BlockNum]; // 计数器
int N; // 页面个数
int M; // 最小物理块数
int ChangeTimes; // 缺页次数
void DataInput(); // 输入数据的函数
void DataOutput(); // 输出数据的函数
void FIFO(); // FIFO 函数
void Optimal(); // Optimal函数
void LRU(); // LRU函数
int main(int argc, char* argv[])
{
DataInput();
int menu;
while(true)
{
printf("\n* 菜单选择 *\n");
printf("*******************************************************\n");
printf("* 1-Optimal *\n");
printf("* 2-FIFO *\n");
printf("* 3-LRU *\n");
printf("* 4-返回上一级 *\n");
printf("* 0-EXIT *\n");
printf("*******************************************************\n");
scanf("%d",&menu);
switch(menu)
{
case 1:
Optimal();
break;
case 2:
FIFO();
break;
case 3:
LRU();
break;
case 0:
exit(0);
break;
case 4:
system("cls");
DataInput();
break;
}
if(menu != 1 && menu != 2 && menu != 3 && menu != 0 && menu !=4) { system("cls");
printf("\n请输入0 - 4之间的整数!\n");
continue;
}
}
return 0;
}
void DataInput()
{
int i,choice;
printf("请输入最小物理块数:");
scanf("%d",&M);
// 输入最小物理块数大于数据个数
while(M > BlockNum)
{
printf("物理块数超过预定值,请重新输入:");
scanf("%d",&M);
}
printf("请输入页面的个数:");
scanf("%d",&N);
// 输入页面的个数大于数据个数
while(N > DataMax)
{
printf("页面个数超过预定值,请重新输入:");
scanf("%d",&N);
}
printf("请选择产生页面访问序列的方式(1.随机 2.输入):");
scanf("%d",&choice);
switch(choice)
{
case 1:
// 产生随机访问序列
for(i = 0;i < N;i++)
{
Data[i] = (int)(((float) rand() / 32767) * 10); // 随机数大小在0 - 9之间
}
system("cls");
// 显示随机产生的访问序列
printf("\n随机产生的访问序列为:");
for(i = 0;i < N;i++)
{
printf("%d ",Data[i]);
}
printf("\n");
break;
case 2:
// 输入访问序列
printf("请输入页面访问序列:\n");
for(i = 0;i < N;i++)
scanf("%d",&Data[i]);
system("cls");
// 显示输入的访问序列
printf("\n输入的访问序列为:");
for(i = 0;i < N;i++)
{
printf("%d ",Data[i]);
}
printf("\n");
break;
default:
while(choice != 1 && choice != 2)
{
printf("请输入1或2选择相应方式:");
scanf("%d",&choice);
}
break;
}
}
void DataOutput()
{
int i,j;
// 对所有数据操作
for(i = 0;i < N;i++)
{
printf("%d ",Data[i]);
}
printf("\n");
for(j = 0;j < M;j++)
{
// 对所有数据操作
for(i = 0;i < N;i++)
{
if( DataShowEnable[j][i] )
printf("%d ",DataShow[j][i]);
else
printf(" ");
}
printf("\n");
}
printf("缺页次数: %d\n",ChangeTimes);
printf("缺页率: %d %%\n",ChangeTimes * 100 / N); }
// 最佳置换算法
void Optimal()
{
int i,j,k;
bool find;
int point;
int temp; // 临时变量,比较离的最远的时候用
int m = 1,n;
ChangeTimes = 0;
for(j = 0;j < M;j++)
{
for(i=0;i < N;i++)
DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据
}
}
for(i = 0;i < M;i++)
{
count[i] = 0 ; // 初始化计数器
}
// 确定当前页面是否在物理块中,在继续,不在置换
/////////////////////////////////////////////////////////////////////////// ////////
Block[0] = Data[0];
for(i = 1;m < M;i++)
{
int flag = 1;
for(n = 0; n < m;n++)
{
if(Data[i] == Block[n]) flag = 0;
}
if(flag == 0) continue;
Block[m] = Data[i];
m++;
}
/////////////////////////////////////////////////////////////////////////// ///////
// 对所有数据进行操作
for(i=0;i < N;i++)
{
// 表示块中有没有该数据
find = false;
for(j = 0;j < M;j++)
{
if( Block[j] == Data[i] )
{
find = true;
}
}
if( find ) continue; // 块中有该数据,判断下一个数据
// 块中没有该数据,最优算法
ChangeTimes++; // 缺页次数++
for(j = 0;j < M;j++)
// 找到下一个值的位置
find = false;
for( k = i;k < N;k++)
{
if( Block[j] == Data[k] )
{
find = true;
count[j] = k;
break;
}
}
if( !find ) count[j] = N;
}
// 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1
if( (i + 1) > M )
{
//获得要替换的块指针
temp = 0;
for(j = 0;j < M;j++)
{
if( temp < count[j] )
{
temp = count[j];
point = j; // 获得离的最远的指针
}
}
}
else point = i;
// 替换
Block[point] = Data[i];
// 保存要显示的数据
for(j = 0;j < M;j++)
{
DataShow[j][i] = Block[j];
DataShowEnable[i < M ? (j <= i ? j : i) : j][i] = true; // 设置显示数据
}
}
// 输出信息
printf("\nOptimal => \n");
DataOutput();
// 先进先出置换算法
void FIFO()
{
int i,j;
bool find;
int point;
int temp; // 临时变量
int m = 1,n;
ChangeTimes = 0;
for(j = 0;j < M;j++)
{
for(i = 0;i < N;i++)
{
DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据
}
}
for(i = 0;i < M;i++)
{
count[i] = 0; // 大于等于BlockNum,表示块中没有数据,或需被替换掉
// 所以经这样初始化(3 2 1),每次替换>=3的块,替换后计数值置1,// 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段}
// 确定当前页面是否在物理块中,在继续,不在置换
/////////////////////////////////////////////////////////////////////////// ////////
Block[0] = Data[0];
for(i = 1;m < M;i++)
{
int flag = 1;
for(n = 0; n < m;n++)
{
if(Data[i] == Block[n]) flag = 0;
}
if(flag == 0) continue;
Block[m] = Data[i];
m++;
}
/////////////////////////////////////////////////////////////////////////// ///////
// 对有所数据操作
for(i = 0;i < N;i++)
{
// 增加count
for(j = 0;j < M;j++)
{
count[j]++;
}
find = false; // 表示块中有没有该数据
for(j = 0;j < M;j++)
{
if( Block[j] == Data[i] )
{
find = true;
}
}
// 块中有该数据,判断下一个数据
if( find ) continue;
// 块中没有该数据
ChangeTimes++; // 缺页次数++
// 因为i是从0开始记,而M指的是个数,从1开始,所以i+1 if( (i + 1) > M )
{
//获得要替换的块指针
temp = 0;
for(j = 0;j < M;j++)
{
if( temp < count[j] )
{
temp = count[j];
point = j; // 获得离的最远的指针
}
}
}
else point = i;
// 替换
Block[point] = Data[i];
count[point] = 0; // 更新计数值
// 保存要显示的数据
for(j = 0;j < M;j++)
{
DataShow[j][i] = Block[j];
DataShowEnable[i < M ? (j <= i ? j : i) : j][i] = true; // 设置显示数据
}
}
// 输出信息
printf("\nFIFO => \n");
DataOutput();
}
// 最近最久未使用置换算法
void LRU()
{
int i,j;
bool find;
int point;
int temp; // 临时变量
int m = 1,n;
ChangeTimes = 0;
for(j = 0;j < M;j++)
{
for(i = 0;i < N;i++)
{
DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据
}
}
for(i = 0;i < M;i++)
{
count[i] = 0 ; // 初始化计数器
}
// 确定当前页面是否在物理块中,在继续,不在置换
/////////////////////////////////////////////////////////////////////////// ////////
Block[0] = Data[0];
for(i = 1;m < M;i++)
{
int flag = 1;
for(n = 0; n < m;n++)
{
if(Data[i] == Block[n]) flag = 0;
}
if(flag == 0) continue;
Block[m] = Data[i];
m++;
}
/////////////////////////////////////////////////////////////////////////// ///////
// 对有所数据操作
for(i = 0;i < N;i++)
{
// 增加count
for(j = 0;j < M;j++)
{
count[j]++;
}
find = false; // 表示块中有没有该数据
for(j = 0;j < M;j++)
{
if( Block[j] == Data[i] )
{
count[j] = 0;
find = true;
}
}
// 块中有该数据,判断下一个数据
if( find ) continue;
// 块中没有该数据
ChangeTimes++;
// 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1
if( (i + 1) > M )
{
//获得要替换的块指针
temp = 0;
for(j = 0;j < M;j++)
{
if( temp < count[j] )
{
temp = count[j];
point = j; // 获得离的最远的指针
}
}
}
else point = i;
// 替换
Block[point] = Data[i];
count[point] = 0;
// 保存要显示的数据
for(j=0;j<M;j++)
{
DataShow[j][i] = Block[j];
DataShowEnable[i < M ?(j <= i ? j : i) : j][i] = true; // 设置显示数据
}
}
// 输出信息
printf("\nLRU => \n");
DataOutput();
}
实验结果截图:
程序运行:
输入相应数据:
选择相应算法:最佳置换算法:
先进先出算法:
最近最久未使用算法:。

相关文档
最新文档