一、c语言实现页面调度算法LRU(最近最久未使用算法)
这是我第一次写这个东西哟,还是个在校学生,学的不好,如果有啥错的可以发信息给我哟,一块努力一块进步,奥利给!哈哈哈!虽然写代码的过程不是那么快乐,但是写正确后的喜悦是值得的,加油陌生人!!!
1.首先先来介绍一下什么是LRU算法:
因为我们的内存大小是有限的所以我们不可能将将我们的程序所有的都加载到内存中去运行,这时候我们会为我们的程序划分内存块,然后通过调度算法按一定的策略,将内存中的一些我们暂时用不到的一些页面号,进行调出内存中,然后将我们要用到的掉进来。ulr只是其中的一种算法来实现页面的调度而已。
LRU算法:就是在我们分配的内存满的时候,将内存中,最近最久没有使用的页面调出,将我们要用到的页面调进去。
具体的代码如下:
2.下面是我自己想的算法,希望对你们有帮助:
- a[] //用来存放内存块个数及每个块所有的页面
- b[]//存放用户要访问的页面的顺序串
- 先将a[]赋值-1,表示没有页面调入内存块
- 检查a[]中是否有需要调入的页面
- 如果有,将这个元素放到队尾,其他元素向前移动
- 如果没有,检查a[]中是否还有空的内存块
- 如果有直接调入内存块就好了
- 如果没有,选择LRU算法进行调度,具体的调度方式为保证头为最久最近未使用即可(这是这个算法最关键的一点)
假设访问串为:1 2 3 1 4 6 7 2
分配四个物理块
则结果应该为:
1 2 3 1 4 6 7 2
1 1 1 2 2 3 1 4
-1 2 2 3 3 1 4 6
-1 -1 3 1 1 4 6 7
-1 -1 -1 -1 4 6 7 2
LRU代码如下:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
void lru(){
int pagenum;//用来接收用户输入的访问串的个数
printf("这是LRU页面置换算法\n");
printf("请输入您要访问页面串的个数:");
scanf("%d",&pagenum);
int a[pagenum];//存放用户输入的页面号
int storagenum;//存放用户给的内存块的块数
printf("请输入访问串");
for(int i=0;i<pagenum;i++){
scanf("%d",&a[i]);
}
printf("请输入您要给的物理块个数");
scanf("%d",&storagenum);
int b[storagenum];//存放内存块对应的页面号
for(int j=0;j<storagenum;j++){//循环将初始化内存块进行赋值,赋值为-1表示未空
b[j]=-1;
}
int k=0;
int queyenum=0;//记录缺页的个数
float queyelv;//记录缺页率
int temp;//用来当做中间转换变量
for(k;k<pagenum;k++){
int h=0;
for(h;h<storagenum;h++){
//判断是否在内存块中,如果在就将后面的向前移动,保证第一个始终为最近最久未使用
if(b[h]==a[k]){
break;
}
}
if(h==storagenum){//相等说明页面不在内存块中
//判断内存块是否有空的
queyenum++;
int x=0;
for(x;x<storagenum;x++){
if(b[x]==-1){
break;
}
}
if(x==storagenum)//说明内存块没有空的了,采取lru算法进行调页,将前面的向前移,然后将新调入的页放入队尾
{
int y=0;
for(y;y<storagenum-1;y++){
b[y]=b[y+1];
}
b[y]=a[k];
}
else{
b[x]=a[k];
}
}
else{//页面在内存块中,将其放到队尾,它后面的向前移动
temp=a[k];
for(h;h<storagenum-1;h++)
{
b[h]=b[h+1];
}
b[h-1]=temp;
}
//进行打印输出
printf("访问页面为%d\n",a[k]);
printf("内存块的顺序为:");
for(int r=0;r<storagenum;r++){
printf("%d",b[r]);
}
printf("\n");
}
printf("\n");
queyelv=(float)queyenum/pagenum;
printf("缺页率为%.2f",queyelv);
}
int main(){
lru();
}
结果如下图:

3983



被折叠的 条评论
为什么被折叠?



