输出结果格式仿照教材,含Clock算法
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
#define MaxNumber 100
#define MAX_NUM 5
#define MAX_NUM_PROC 512
//进程结构体
struct CList
{
int data;
int flag;
}CLOCK_list[MAX_NUM];
int test[MAX_NUM_PROC][MAX_NUM_PROC];
int PageOrder[MaxNumber]; //页面序列
int Simulate[MaxNumber][MaxNumber];//存放输出的数组
int PageCount[MaxNumber]; //当前内存距离下一次出现的距离
int BlockNum; //物理块数
int PageNum; //页面个数
int LackNum; //缺页数
double LackPageRate; //缺页率
bool found; //页面是否命中
int timeOfLRU[MaxNumber]; //记录物理块中各个页面最近使用时间
int memoryPage[MaxNumber]; //虚拟队列
int choose;
//void input(); //输入
void initial(); //初始化物理块
void FIFO();
void OPT();
void LRU();
void CLOCK();
void chooseAlgorithm();//选择算法
void output(); //输出
int main() {
printf("请输入物理块数:");
scanf("%d",&BlockNum);
printf("请输入页面序列长度:");
scanf("%d",&PageNum);
printf("请输入页面序列:");
for (int i = 0; i < PageNum; i++)
{
//readData >> PageOrder[i];
scanf("%d",&PageOrder[i]);
}
chooseAlgorithm();
return 0;
}
void initial() {//初始化
int i, j, k;
int z = 0; //判断初始化物理块是否填满
bool found;
LackNum = BlockNum;
LackPageRate = 0.0;
for (int i = 0; i < PageNum; i++) {
PageCount[i] = 0; //初始化距离
memoryPage[i] = -1; //初始化队列
}
for (int i = 0; i < BlockNum; i++) {
for (int j = 0; j < PageNum; j++) {
Simulate[i][j] = -1;//初始化
}
}
for (int i = 0; i < PageNum; i++) {//初始化物理块
found = false;
timeOfLRU[i] = 0;
for (int j = 0; j < BlockNum; j++)
{
if (memoryPage[j] == PageOrder[i])//页面命中
{
found = true;
for (int w=0;w<=z;w++)
{
Simulate[w][i] = memoryPage[w];
}
}
}
if (!found) { //当有新的进程进入到队列时,便计算其对应的距离
memoryPage[z] = PageOrder[i];//小于物理块数时,页面顺序进入队列
for (int j = 0; j <= z; j++)
{
Simulate[j][i] = memoryPage[j];//保存当前序列的值
}
z++;
for (int k = 0; k < i; k++) {
timeOfLRU[k]++; //之前的页面对应的时间+1
}
}
else {
timeOfLRU[i] = 0; //重新更新为0,表示最近刚刚使用
}
if (z == BlockNum)
{ //物理块被填满,结束循环
break;
}
}
}
void OPT() {
cout << "OPT算法调度结果为:" << endl;
int i, j, s, k, m, t;
initial();
int distance; //表示队列每个值距离下一次访问的距离
int point; //指向最长时间未被访问的下标
for (i = BlockNum; i < PageNum; i++) {
found = false;
for (k = 0; k < BlockNum; k++) {
if (memoryPage[k] == PageOrder[i]) { //页面命中
found = true;
for(int w=0;w<BlockNum;w++)
{
Simulate[w][i] = memoryPage[w];
}
}
}
if (!found) {
LackNum++;
//计算当前队列每一页对应的下一次出现的距离
for (s = 0; s < BlockNum; s++) {
distance = 1;
for (t = i; t < PageNum; t++) { //向后找离他最远的
if (memoryPage[s] != PageOrder[t])
distance++;
else
break;
}
PageCount[s] = distance;//当前内存距离下一次出现的距离
}
//向后比较队列内最长时间不被访问的并淘汰,置换页面
point = 0;
for (m = 1; m < BlockNum; m++) {
if (PageCount[point] < PageCount[m])
point = m;
}
memoryPage[point] = PageOrder[i];
for (j = 0; j <= BlockNum; j++) {
Simulate[j][i] = memoryPage[j];//保存当前序列的值
}
}
}
output();
LackPageRate = (LackNum * 1.0) / PageNum;
//cout << "缺页数:: " << LackNum << endl;
//cout << "缺页率:: " << LackPageRate << endl;
}
void FIFO() {
cout << "FIFO算法调度结果为:" << endl;
initial();
int i, j, k;
int point = 0;
//分配内存
for (int i = BlockNum; i < PageNum; i++) {
found = false;
for (int k = 0; k < BlockNum; k++) {
if (memoryPage[k] == PageOrder[i]) { //页面命中
found = true;
// break;
}
Simulate[k][i] = memoryPage[k];
if(k==0&&found==true)
{
for(int w=1;w<BlockNum;w++)
{
Simulate[w][i] = memoryPage[w];
}
}
}
if (!found) { //如果页面不在队列中,则进行相应的处理
LackNum++; //缺页数加1
memoryPage[point] = PageOrder[i];//页面替换队列中最老的
for (int j = 0; j <= BlockNum; j++) {
Simulate[j][i] = memoryPage[j];//保存当前序列的值
}
point++;//后移
if (point == BlockNum)//当指向队尾时后,重新指向队首
point = 0;
}
}
output();//输出物理块状态
LackPageRate = (LackNum * 1.0) / PageNum;
//cout << "缺页数:: " << LackNum << endl;
//cout << "缺页率:: " << LackPageRate << endl;
}
void LRU() {
cout << "LRU算法调度结果为:" << endl;
int i, j, s, k;
initial();
int point;//指向最长时间未被访问的下标
for (i = 0; i < PageNum; i++)//从第一个开始扫描,确保时间记录无误
{
found = false;
for (k = 0; k < BlockNum; k++) {
if (memoryPage[k] == PageOrder[i]) //页面命中
found = true;
if(i>=BlockNum)
{
for(int w=0;w<BlockNum;w++)
{
Simulate[w][i] = memoryPage[w];
}
}
}
if (!found) {
LackNum++;
//向前比较队列内最长时间不被访问的并淘汰,置换页面
point = 0;
for (j = 1; j < BlockNum; j++) {
if (timeOfLRU[point] < timeOfLRU[j])
point = j;
}
for (s = 0; s < BlockNum; s++) {
if (memoryPage[s] != memoryPage[point])
timeOfLRU[s]++;
}
memoryPage[point] = PageOrder[i];
for (j = 0; j <= BlockNum; j++) {
Simulate[j][i] = memoryPage[j];//保存当前序列的值
}
timeOfLRU[point] = 0;
}
else {
//对命中块进行处理
for (s = 0; s < BlockNum; s++) {
if (memoryPage[s] != PageOrder[i])
timeOfLRU[s]++;
else
timeOfLRU[s] = 0;
}
}
}
output();
LackPageRate = (LackNum * 1.0) / PageNum;
//cout << "缺页数:: " << LackNum << endl;
//cout << "缺页率:: " << LackPageRate << endl;
}
void CLOCK()
{
cout << "CLOCK算法调度结果为:" << endl;
for(int i=0;i<BlockNum;i++)
{
CLOCK_list[i].data = 0;
CLOCK_list[i].flag = 0;
}
int index = 0;
for(int i=0;i<PageNum;i++)
{
int Found =0;
for(int j=0;j<BlockNum;j++)
{
if(CLOCK_list[j].data == PageOrder[i])
{
CLOCK_list[j].flag =1;
Found = 1;
break;
}
}
if(!Found)
{
int full = 0;
for(;index<BlockNum;index++)
{
if(CLOCK_list[index].flag ==0)
{
full = 1;
CLOCK_list[index].data = PageOrder[i];
CLOCK_list[index].flag =1;
index++;
break;
}
else
{
CLOCK_list[index].flag =0;
}
}
if(index == BlockNum)
index = 0;
if(!full)
{
CLOCK_list[0].data = PageOrder[i];
CLOCK_list[0].flag =1;
index++;
}
}
for(int j=0;j<BlockNum;j++)
{
test[j][i]=CLOCK_list[j].data;
}
}
for (int i = 0; i < PageNum; i++)
{
//cout<<" ";
cout << PageOrder[i] << " ";
}
printf("\n");
for(int j=0;j<BlockNum;j++)
{
for(int i=0;i<PageNum;i++)
{
if(test[j][i]==0)
{
printf(" ");
}
else
{
printf("%d ",test[j][i]);
}
}
printf("\n");
}
}
void chooseAlgorithm()
{
printf("请根据算法前ID选择你要用的算法:\n");
printf("**************************************\n");
printf("*****************0、退 出*************\n");
printf("*****************1、OPT***************\n");
printf("*****************2、FIFO**************\n");
printf("*****************3、LRU***************\n");
printf("*****************4、Clock*************\n");
printf("**************************************\n");
cin >> choose;
cout << endl;
if (choose == 1)
{
OPT();
chooseAlgorithm();
}
else if (choose == 2)
{
FIFO();
chooseAlgorithm();
}
else if (choose == 3) {
LRU();
chooseAlgorithm();
}
else if (choose == 4) {
CLOCK();
chooseAlgorithm();
}
else if (choose == 0) {
exit(0);
}
else
{
cout << "输入错误!请按照提示输入!" << endl;
chooseAlgorithm();
}
}
void output() {
int i, j;
for (i = 0; i < PageNum; i++) {
//cout<<" ";
cout << PageOrder[i] << " ";
}
cout << endl;
for (i = 0; i < BlockNum; i++) {
for (j = 0; j < PageNum; j++) {
if (Simulate[i][j] == -1) {
cout << " ";
}
else {
cout << Simulate[i][j]<< " ";
}
}
cout << endl;
}
}
//2 3 2 1 5 2 4 5 3 2 5 2
原参考:https://www.csdn.net/dwz/404?from=KMTEx,侵删