70,037
社区成员
发帖
与我相关
我的任务
分享
#include"StdAfx.h"
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#define M 3 //内存物理块数
#define N 20 //虚拟内存尺寸
int P; //工作集的起始位置
int nin; //记录缺页次数
//用于CLOCK算法的页面定义
typedef struct page_clock
{
int num;
int visit;
}Page_clock;
//用于改进的CLOCK算法的页面定义
typedef struct page
{
int num; //页面号
int visit; //是否访问
int modify; //是否修改
}Page;
Page_clock b_clock[M]; //内存单元数 Clock
Page b[M]; //updating_clock
int opt[M]; //opt
int ran[M]; //random replacement
int fifo[M]; //FIFO
int c[M][N]; //存储每个阶段状态
//.................
//..................
//..................//此处省略很多行
//Clock算法初始化
void Init_Clock(Page_clock *b_clock)
{
nin=0;
int i,j;//从这里开始提示各种莫名其妙的错误,怎么回事
for(i=0;i<M;i++)
{
b_clock[i].num=-1;
b_clock[i].visit=0;
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
c[i][j]=-1;
}
}
}
//改进的Clock算法初始化
void Init_updatingClock(Page *b)
{
nin = 0;
int i, j;
for(i = 0;i < M;i++)
{
b[i].num = -1;
b[i].visit = 0;
b[i].modify = 0;
}
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
c[i][j] = -1;
}
}
}
//Clock算法
void Clock(int fold,Page_clock *b_clock)
{
int i, val = -1, p = 0; //p为查询指针
for (i = 0;i < M;i++)
{
if (fold == b_clock[i].num)
val = i;
}
//页面在内存中
if (val >= 0)
{
b_clock[val].visit = 1;
for(i = 0;i < M;i++)
{
if (i != val)
{
b_clock[i].visit = 0;
}
}
}
else
{
nin++;
//初始化内存
for (i = 0;i < M;i++)
{
if (b_clock[i].num == -1)
{
val = i;
break;
}
}
while (val < 0)
{
if (b_clock[p].visit == 0)
val = p;
else
b_clock[p].visit = 0;
p = (p + 1) % M;
}
b_clock[val].num = fold;
b_clock[val].visit = 1;
for(i = 0;i < M;i++)
{
if (i != val)
{
b_clock[i].visit = 0;
}
}
}
}
//改进的Clock算法
void Updating_Clock(int fold,int modiff, Page *b)
{ int i, p = -1; //p是查询指针
int val = -1;
//找是否在内存中
for(i = 0;i < M;i++)
{
if (fold == b[i].num)
val = i;
}
if (val >= 0)
{
b[val].visit = 1; //被访问
b[val].modify = modiff;
for(i = 0;i < M;i++)
{
if (i != val)
{
b[i].visit = 0;
}
}
}
else
{
nin++;
//初始化内存
for (i = 0;i < M;i++)
{
if (b[i].num == -1)
{
val = i;
break;
}
}
while (val < 0)
{
//第一步扫描
for (i = 0;i < M;i++)
{
p = (p + 1) % M;
if ((b[p].modify == 0) && (b[p].visit == 0))
{
val = p;
break;
}
}
//第二步扫描
if (val < 0)
{
for (i = 0;i < M;i++)
{
p = (p + 1) % M;
if ((b[p].modify == 1) && (b[p].visit == 0))
{
val = p;
break;
}
else
{
b[p].visit = 0;
}
}
}
}
//找到后,其他设置为未访问
b[val].num = fold;
b[val].modify = modiff;
b[val].visit = 1;
for(i = 0;i < M;i++)
{
if (i != val)
{
b[i].visit = 0;
}
}
}
}
//主程序
void main()
{
int a[N];
int mo[N];
int i,j;
//产生随机访问串及是否修改串
P = 1;
int e, m, prop, t;
printf("请输入工作集中包含的页数e和工作集移动率m:\n");
scanf("%d %d",&e,&m);
t = 50;
generate_list(a, e, m, t);
printf("请输入页面被修改的概率(*100):\n");
scanf("%d",&prop);
generate_modify(mo, e, prop);
//Clock算法实现
Init_Clock(b_clock);
for(i = 0;i < e;i++)
{
Clock(a[i],b_clock);
for(j = 0;j < M;j++)
{
c[j][i] = b_clock[j].num;
}
}
printf("Clock算法的内存状态为:\n");
print(e, a);
nin = nin - M;
printf("缺页次数为:%d\n缺页率:%.2f\n",nin,nin * 1.0 / e);
printf("\n");
//改进的Clock算法实现
Init_updatingClock(b);
for(i = 0;i < e;i++)
{
Updating_Clock(a[i], mo[i], b);
for(j = 0;j < M;j++)
{
c[j][i] = b[j].num;
}
}
printf("改进的Clock算法的内存状态为:\n");
print(e, a);
for(j = 0;j < e;j++)
{
printf(" %2d ",mo[j]); //是否修改序列串
}
printf(" \n");
print_format(e);
nin = nin - M;
printf("缺页次数为:%d\n缺页率:%.2f\n",nin,nin * 1.0 / e);
printf("\n");
}
void Init_Clock(Page_clock *b_clock)
{
int i,j;//从这里开始提示各种莫名其妙的错误,怎么回事[/color]
nin=0;//c语言先声明
for(i=0;i<M;i++)
{
b_clock[i].num=-1;
b_clock[i].visit=0;
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
c[i][j]=-1;
}
}
}
//改进的Clock算法初始化
void Init_updatingClock(Page *b)
{
int i, j;
nin = 0;//先声明
for(i = 0;i < M;i++)
{
b[i].num = -1;
b[i].visit = 0;
b[i].modify = 0;
}
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
c[i][j] = -1;
}
}
}
//Clock算法
void Clock(int fold,Page_clock *b_clock)
{
int i, val = -1, p = 0; //p为查询指针
for (i = 0;i < M;i++)
{
if (fold == b_clock[i].num)
val = i;
}
//页面在内存中
if (val >= 0)
{
b_clock[val].visit = 1;
for(i = 0;i < M;i++)
{
if (i != val)
{
b_clock[i].visit = 0;
}
}
}
else
{
nin++;
//初始化内存
for (i = 0;i < M;i++)
{
if (b_clock[i].num == -1)
{
val = i;
break;
}
}
while (val < 0)
{
if (b_clock[p].visit == 0)
val = p;
else
b_clock[p].visit = 0;
p = (p + 1) % M;
}
b_clock[val].num = fold;
b_clock[val].visit = 1;
for(i = 0;i < M;i++)
{
if (i != val)
{
b_clock[i].visit = 0;
}
}
}
}
//改进的Clock算法
void Updating_Clock(int fold,int modiff, Page *b)
{ int i, p = -1; //p是查询指针
int val = -1;
//找是否在内存中
for(i = 0;i < M;i++)
{
if (fold == b[i].num)
val = i;
}
if (val >= 0)
{
b[val].visit = 1; //被访问
b[val].modify = modiff;
for(i = 0;i < M;i++)
{
if (i != val)
{
b[i].visit = 0;
}
}
}
else
{
nin++;
//初始化内存
for (i = 0;i < M;i++)
{
if (b[i].num == -1)
{
val = i;
break;
}
}
while (val < 0)
{
//第一步扫描
for (i = 0;i < M;i++)
{
p = (p + 1) % M;
if ((b[p].modify == 0) && (b[p].visit == 0))
{
val = p;
break;
}
}
//第二步扫描
if (val < 0)
{
for (i = 0;i < M;i++)
{
p = (p + 1) % M;
if ((b[p].modify == 1) && (b[p].visit == 0))
{
val = p;
break;
}
else
{
b[p].visit = 0;
}
}
}
}
//找到后,其他设置为未访问
b[val].num = fold;
b[val].modify = modiff;
b[val].visit = 1;
for(i = 0;i < M;i++)
{
if (i != val)
{
b[i].visit = 0;
}
}
}
}
