操作系统页面置换算法【LFU】在物理内存块中寻找被置换页面时出错了,望指教!

赖念安 2019-12-07 04:54:21
本人新手一枚,想用C语言实现LFU算法,结果发现所编写的算法在物理内存块(即下面代码中的Q[i])中寻找所要被置换出去的页面时出现了下面【结果截图】中标注的错误:

【结果截图】


本人用的是DEV-C++编译器编写代码。其中输入输出语法一部分是C语言的,一部分是C++的,稍显不规范,但无大碍。
希望论坛里的大佬们能指点迷津,不胜感激!

【源代码】如下:

#include<iostream>
#include<cmath>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<stack>
#include<time.h>
#define Max 1024
using namespace std;
int len;
int str[Max];///页面号序列
int block;///系统为进程分配的物理块
int que[Max];///模拟队列
int error=0;///error是缺页次数
int exchange=0;///exchange是置换次数,其实置换次数就是在分配的物理块未装满前一旦内存中找不到需要的页面,则计算缺页次数
///所以这样思考就可以知道:exchange=error-block

struct Page
{
int sta;///内存位当前状态,指示该内存物理块block是否是空闲块,
///若是空闲块,则其值为-1,若非空闲块,则其值为被调入的页面号

int A;///访问位,在Clock和改进型的Clock算法中,A只取0或1,0代表未被访问;1代表已被访问过
///在最少使用算法(LFU)中,A可以用来记录访问次数

int M;///修改位
int tim;///距离上一次访问时长
int dis;///距离上一次访问距离
} Q[Max];

void init()//初始化函数
{
printf("请输入页面号序列长度:");
cin>>len;
srand (time(NULL));
printf("随机页面访问序列:");
for(int i=1; i<=len; i++)
{
str[i]=rand()%50;
printf("%d ",str[i]);
}
printf("\n请输入系统为进程分配的物理块:");
cin>>block;
for(int i=0; i<=block; i++)
que[i]=-1;///初始值置为-1代表当前物理块为空
}

bool inblock_LFU(int num)//查找确定所要访问的页面是否已经调入内存中
{
for(int i=1; i<=block; i++)
{
if(Q[i].sta == str[num])//若所要访问的页在内存中,返回值为true
{
Q[i].A++;//若所要访问的页在内存中,则直访问内存中的该页,因此,此处应该要将相应的物理内存块的A值加 1
return true;
}
}
return false;//所要访问的页不在内存中,返回值为flase
}

int Search_LFU()//Search的功能是:找到 访问位A的数值 最小的那一页(即访问次数最少的那一页), 将之换出
{
int jmin,min=2;
for(jmin=1;jmin<=block;jmin++)
{
if(Q[jmin].A<=min)
{min=Q[jmin].A;}
}
return jmin;//选择A值最小的页,将之换出
}

void LFU()
{
printf("选择使用LFU算法进行页面置换\n");
init();
int j;

for(int i=1; i<=block; i++)
{
Q[i].sta=-1;//给进程分配的内存物理块的状态位sta一开始统一被赋值为-1,表示该块为空闲块
Q[i].A=0; //现在还没把页面调入内存,所以应该统一将内存物理块的的访问位置0以表示该页还没被访问过
}

for(int i=1; i<=len; i++)
{
printf("\n%2d :当前需访问的页面为 %3d :",i,str[i]);
if(inblock_LFU(i))///页面已存在于内存中
{
printf("该页面已存在于内存中\n",i);
printf(" 不需要将内存中的页面换出 :") ;
}

else if(Q[block].sta!=-1)///页面未存在于内存中并且内存已满,需要置换
{
exchange++;//exchange是页面置换次数
error++;
printf("产生缺页中断\n");
printf(" 将页面%4d换入内存后得到 :",str[i]);
j=Search_LFU();
Q[j].sta=str[i];
Q[j].A++;//只要是访问了该页,则该页的访问位A就应该加 1,因此,此处应该要将Q[k].A加 1
}

else ///内存未满,并且页面未存在于内存中
{
error++;
printf("产生缺页中断\n");
printf(" 将页面%4d调入内存后得到 :",str[i]);
for(int k=1;k<=block;k++)
{
if(Q[k].sta==-1){
Q[k].sta=str[i];
Q[k].A++;//只要是访问了该页,则该页的访问位A就应该加 1,因此,此处应该要将Q[k].A加 1
break;
}
}
}

for(int k=1;k<=block;k++)
{
printf("[%3d] ",Q[k].sta);
//printf("A=%d",Q[k].A);
}
puts("");
}
printf("\n缺页次数:%3d ; 缺页率=缺页次数/访问序列长度=%d/%d=%.2f", error,error,len,(float)error/len);
printf("\n置换次数:%3d ; 置换率=置换次数/访问序列长度=%d/%d=%.2f",exchange,exchange,len,(float)exchange/len);
puts("");
printf("LFU算法执行结束\n\n");
}

//下面是主函数main///////////////////////////////////////////////////////////////

int main()
{
LFU();
return 0;
}

...全文
326 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赖念安 2019-12-07
  • 打赏
  • 举报
回复
我个人觉得可能是Search函数出了问题,但不知道问题到底出在哪儿,也没有好的解决办法

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧