2021-06-06 操作系统LRU算法C语言实现

操作系统LRU算法C语言实现

前言
本机为微软Surface pro4,为64位,所用操作系统为Windos 10。本机虚拟机版本为Oracle VM VirtualBox 6.1.8,所用操作系统是使用Ubuntu18.04,。Ubuntu的虚拟硬盘设置为200G,显存为128MB,内存为4GCPU2个,所用镜像源为清华大学软件镜像源。所使用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、按如下图示中标明顺序点击按钮执行即可(注:效果图如下)

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值