操作系统之LRU算法(C语言)
#include<stdio.h> #include<conio.h> int a[20],b[5][20],c[20]; //a存放访存序列,b存放整个输出的单元中的数,c用来最后输出
的缺页的下方的*号
int num1,num2,count; void printit(int a)/*输出边框*/
{
printf("|");
for(int i=0;i<a-1;i++)
printf("---+");
printf("---|");
}
void init() //b数组的初始化,全赋初值-1 {
int i,j;
for(i=0;i<5;i++)
for(j=0;j<20;j++)
b[i][j]=-1;
}
void init1() //c数组的初始化,全赋初值-1 {
int i;
for(i=0;i<20;i++)
{
c[i]=-1;
}
}
void LRU()
{
int i,j,k;
int flag=0;
count=1;
init(); //b数组的初始化
b[0][0]=a[0]; //将序列的第一个元素赋给b[0][0]
c[0]=1;
for(j=1;j<num1;j++)
{
flag=0; //标志量,若访问的页号在内存则flag=0,反之则为1
for(i=0;i<num2;i++) //将序列中的该数与对应b数组中的前一列中的每一个数比较
{
if(a[j]==b[i][j-1]) //若到相等的,则说明该页在内存中
{
for(k=i;k>0;k--)
{
b[k][j]=b[k-1][j-1]; //前一列这点的前面元素错位移到下一列
}
for(k=i+1;k<num2;k++) ////前一列这点的前面元素平行移到下一列
{
b[k][j]=b[k][j-1];
}
b[0][j]=a[j]; //并将序列中的该数赋给这一列的第一个元素
flag=1; //标志量置为1;跳过下面的if语句,回到大得for循环
break;
}
}
if(flag==0) //内存中不到序列中的该数
{
for(i=num2-1;i>0;i--)
{
b[i][j]=b[i-1][j-1]; // 则前一列错位移往这j列,该列中最后一个数被挤掉
}
b[0][j]=a[j]; //并将序列中的该数赋给这一列的第一个元素
count++; //缺页次数加1
c[j]=1; //对应的c数组中的该单元被置为1,方便后来输出*号
}
}
}
int main()
{
int i,j,k;
double s;
printf("\t\t***************操作系统课程大实验****************\t\t\n");
printf("\t\t************最近最少LRU页面调度算法**************\t\t\n");
printf("\t\t************ 班级: 09计本(3)班 **************\t\t\n");
printf("\t\t***** 姓名: 杨瑱 方名 吴培桃 齐晓娟 *********\t\t\n ");
c语言算法书籍start:
init1();
printf("请输入访存的次数:");
scanf("%d",&num1);
printf("请输入这%d个访存序列:",num1);
for(i=0;i<num1;i++)
scanf("%d",&a[i]);
printf("请输入分配的物理块数:");
scanf("%d",&num2);
printf("\t\t运行的结果为:\n");
printit(num1);
printf("\n");
for(j=0;j<num1;j++)
printf("|%2d ",a[j]);
printf("|\n");
printit(num1);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论