操作系统LRU算法C语言实现
前言
本机为微软Surface pro4
,为64
位,所用操作系统为Windos 10
。本机虚拟机版本为Oracle VM VirtualBox 6.1.8
,所用操作系统是使用Ubuntu18.04
,。Ubuntu的虚拟硬盘设置为200G
,显存为128MB
,内存为4G
,CPU
2个,所用镜像源为清华大学软件镜像源。所使用linux
内核为linux-5.11.8
。
注意事项
(1)本LRU
算法的实现思路是借鉴网上的相关资源,并非原创。
(2)本篇博客代码只实现LRU
算法的置换显示,采用了固定化的方式。
LRU算法介绍
LRU
算法:是为虚拟页式存储管理服务的,LRU
算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
Linux下C语言实现LRU算法的代码
1、使用文件编辑器在主目录下创建一个名为OS3
的文件夹。
2、打开Geany
程序,然后点击新建按钮,创建一个新文件。
(注:创建完成界面如下)
3、在新建的文件中书写程序。(注:程序如下)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 全局变量
char stack[5] ={0}; //栈
char visit_pages[11] = {'3', '5', '0', '5', '1', '0', '8', '2', '5', '1', '3'}; //访问轨迹
// 打印栈元素
void print_stack()
{
int m;
// 打印栈元素
for (m=0; m<5; m++) {
if (stack[m] == NULL) {
printf(" -");
} else {
printf(" %c", stack[m]);
}
}
printf("\n\n");
}
//移动栈值
void change_stack(int index, int i)
{
int temp, k;
//将栈底元素保存后,依次往前覆盖
temp = stack[index];
for (k=index; k<5; k++) { //相等下标值之后,往前覆盖
if (index != 0) {//只有当栈不满时,可直接跳出循环
if (stack[k+1] == NULL) {
break;
}
}
if (k+1 < 5) {
stack[k] = stack[k+1];
}
}
// 两种不同情况使用不同赋值
if (index != 0) {
if (k == 5) {
k = 4;
}
stack[k] = temp; //冒泡到顶部
stack[k] = visit_pages[i]; //替换顶部值
} else {
stack[4] = temp; //冒泡到顶部
stack[4] = visit_pages[i]; //替换顶部值
}
}
int main()
{
int i, j, k;
int index; //下标
int temp; //值中间量
//栈赋值
for (i=0; i<5; i++) {
stack[i] = NULL;
}
printf("初始值: \n");
print_stack(); //初始栈打印
for (i=0; i<strlen(visit_pages); i++) {
for (j=0; j<5; j++) {
if (stack[j] == NULL) {
stack[j] = visit_pages[i];
break;
}
if (stack[j] == visit_pages[i]) {//栈内有访问元素
if (j+1 < 5 && stack[j+1] == NULL || j == 4) { //访问的元素为顶部元素,且其再顶部元素为NULL,or, 访问元素为栈顶元素,跳出循环
break;
}
change_stack(j, i); //移动栈值
} else if (j == 4 && stack[j] != visit_pages[i]) {//栈内无访问元素
change_stack(0, i); //移动栈值
}
}
printf("---> %c:\n", visit_pages[i]);
print_stack();
}
return 0;
}
4、将程序文件命名lru.c
为保存到OS3
文件下。(注:如图所示)
LRU算法实现效果如下
1、按如下图示中标明顺序点击按钮执行即可(注:效果图如下)