LRU算法模拟器(基于Java和VUE前端实现)

目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


一、核心思路

在这里插入图片描述

在这里插入图片描述

二、代码源码

<template>

    <el-form
            :label-position="right"
            label-width="100px"
            :model="this.formData"
            style="max-width: 460px;"
            class="labelStyle"
    >
        <el-form-item label="执行页面序列">
            <el-input v-model="this.formData.pages" placeholder="输入页面以英文逗号分隔" />
        </el-form-item>
        <el-form-item label="物理块数" >
            <p>
                <el-input-number v-model="this.formData.blcoks" :min="1" :max="10"/>
            </p>
            <p style="margin-left: 10px">
                <el-button @click="LRU">运行</el-button>
            </p>
        </el-form-item>
        <el-form-item label="缺页中断次数:">
            <p style="color: white">{{this.formData.missNum}}</p>
        </el-form-item>
    </el-form>

    <el-table :data="tableData" style="width: 1150px" height="400" >
        <el-table-column  prop="0" label="序号" width="80" />
        <el-table-column v-for="(prop_name,index) in this.prop_list"
                         :key="index"
                         :prop="index+1"
                         :label="prop_name"
                         width="80">
        </el-table-column>
    </el-table>
</template>

<script>
    export default {
        name: "LRU",
        data:function () {
            return{
                // 输入参数
                formData:{
                    pages:'2,3,2,1,5,2,4,5,3,2,5,2',//页面序列
                    blcoks:1,//物理块数
                    missNum:0,//缺页中断次数
                },
                // LRU算法过程记录
                tableData:[],
                // 列名表
                prop_list:[],
                // 置换列表
                ex_list:[],
            }

        },
        methods:{
            // 生成列名表(根据输入的物理块数确定列名)
            deal_prop(){
                console.log(this.formData.blcoks);
                var name="物理块";
                var prop_name="";
                for(var i=1;i<=this.formData.blcoks;i++){
                    prop_name=name+i;
                    this.prop_list.push(prop_name);
                }
                console.log("this.prop_list",this.prop_list);

            },
            // 置换链表(用于置换内存中的页面)(位于链表首端的是最近最久未使用的,新来的放在链表尾部)
            exchange_list(num){
                // 查看带调入页面是否已在内存中
                var exit_flag=0;// 标志是否在内存中
                for(var i=0;i<this.ex_list.length;i++){
                    // 如果内存中有待调入页面
                    if(num==this.ex_list[i]){
                        exit_flag=1;
                        // 将待调入页面更新到链表末尾
                        this.ex_list.splice(i,1);//删除置换链表中的待调入页面
                        this.ex_list.push(num);//将待调入页面添加在末尾
                    }
                }
                // 如果内存没有
                if(!exit_flag){
                    // 查看是否有空闲空间
                    // 如果有空闲空间
                    if(this.ex_list.length<this.formData.blcoks){//(置换链表长度如果小于物理块数,说明还有空闲空间未使用)
                        this.ex_list.push(num);//在末尾加上待调入页
                    }
                    // 如果没有空闲空间
                    else{
                        // 删除最近最久未使用的页面,并添加待调入页面在链表末尾
                        this.ex_list.splice(0,1);//删除链表首端的页
                        this.ex_list.push(num);//在末尾加上待调入页
                    }

                }
                console.log("this.ex_list",this.ex_list);

            },
            // LRU算法
            LRU(){
                // 1.初始化列名
                this.deal_prop();

                // 2.将输入的页面序列拆分成数组
                var pages = this.formData.pages.split(',');

                // 3.记录页面置换的过程
                var free_flag=this.formData.blcoks;//标志空闲物理块个数
                // 循环处理执行页面序列
                for(var i=0;i<pages.length;i++){
                    // 内存中无页面(需初始化)
                    if(i==0){
                        // 产生一次缺页中断
                        this.formData.missNum++;
                        //创建一个空白记录对象(对象成员的个数与物理块数相同)
                        var obj={};
                        obj[0]=1;//序号属性
                        for(var v=0;v<this.prop_list.length;v++){
                            obj[v+1]='--';//对象按照物理块编号
                        }
                        console.log("obj",obj);
                        // 增加一次空白记录
                        this.tableData.push(obj);
                        // 让页面序列第一个页面进入内存中
                        this.tableData[0][i+1]="页面"+pages[i];
                        // 空闲物理块-1
                        free_flag--;
                        // 置换链表更新
                        this.exchange_list(pages[i]);
                    }
                    //内存中有页面
                    else{
                        // 检查待调入页是否已在内存中
                        var exit_flag=0;//标志待调入页是否已在内存中
                        // 遍历最后一次页面置换过程的记录,查看待调入页是否已在内存中
                        for(var p=0;p<this.formData.blcoks;p++){
                            var q="页面"+pages[i];
                            if(q==this.tableData[this.tableData.length-1][p+1]){
                                exit_flag=1;
                                break;
                            }
                        }
                        // 待调入页已在物理块中
                        if(exit_flag){
                            // 增加一条记录(根据已存在的最后一条记录为模板)
                            var len=this.tableData.length;
                            var obj=JSON.parse(JSON.stringify(this.tableData[len-1]));
                            this.tableData.push(obj);
                            //修改记录的序号
                            this.tableData[len][0]=this.tableData[len][0]+1;
                            // 更新置换链表
                            this.exchange_list(pages[i]);
                        }
                        // 待调入页不在物理块中
                        else{
                            // 产生一次缺页中断
                            this.formData.missNum++;
                            // 增加一条记录(根据已存在的最后一条记录为模板)
                            var len=this.tableData.length;
                            var obj=JSON.parse(JSON.stringify(this.tableData[len-1]));
                            this.tableData.push(obj);
                            //修改序号
                            this.tableData[len][0]=this.tableData[len][0]+1;

                            // 有空闲物理块
                            if(free_flag>0){
                                // 寻找空闲的物理块
                                for(var j=0;j<this.formData.blcoks;j++){
                                    if('--'==this.tableData[len][j+1]){
                                        // 将待调入页面放入空闲物理块中
                                        this.tableData[len][j+1]="页面"+pages[i];
                                        break;
                                    }
                                    console.log("有空闲")
                                }
                                //空闲物理块-1
                                free_flag--;
                                // 更新置换链表
                                this.exchange_list(pages[i]);
                            }
                            // 无空闲物理块,寻找符合置换条件的页面
                            else{
                                // 寻找最近最久未使用的页面所在的物理块
                                for(var j=0;j<this.formData.blcoks;j++){
                                    var z="页面"+this.ex_list[0];//置换链表首端即最近最久未使用的页面
                                    console.log("z",z);
                                    if(z==this.tableData[len][j+1]){
                                        this.tableData[len][j+1]="页面"+pages[i];
                                        // 更新置换链表
                                        this.exchange_list(pages[i]);
                                        break;
                                    }
                                }
                            }

                        }
                    }
                    console.log("this.tableData",this.tableData);
                    debugger;
                }

            },

        },
    }
</script>

<style>
    .labelStyle .el-form-item__label{
        color: white;
    }
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Java 实现,使用 LRU(Least Recently Used)算法计算页面置换的缺页率和缺页序列: ```java import java.util.*; public class LRUPageReplacement { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入内存块数:"); int numFrames = sc.nextInt(); int[] frames = new int[numFrames]; Arrays.fill(frames, -1); // 初始化为无效页 Map<Integer, Integer> pageLastUsed = new HashMap<>(); // 记录页最近使用时间 int numFaults = 0; // 缺页次数 List<Integer> pageFaults = new ArrayList<>(); // 记录缺页序列 System.out.print("请输入页面引用串(以空格分隔):"); String[] refStr = sc.next().split("\\s+"); for (String ref : refStr) { int page = Integer.parseInt(ref); boolean found = false; for (int i = 0; i < numFrames; i++) { if (frames[i] == page) { found = true; break; } } if (!found) { int leastUsedPage = -1; long minLastUsed = Long.MAX_VALUE; for (int i = 0; i < numFrames; i++) { int f = frames[i]; long lastUsed = pageLastUsed.getOrDefault(f, 0); if (lastUsed < minLastUsed) { leastUsedPage = i; minLastUsed = lastUsed; } } frames[leastUsedPage] = page; pageLastUsed.put(page, System.nanoTime()); numFaults++; pageFaults.add(page); } else { pageLastUsed.put(page, System.nanoTime()); } } double faultRate = (double) numFaults / refStr.length; System.out.printf("缺页率:%.2f%%\n", faultRate * 100); System.out.println("缺页序列:" + pageFaults); } } ``` 运行程序,输入内存块数和页面引用串,即可输出缺页率和缺页序列。例如,输入: ``` 请输入内存块数:3 请输入页面引用串(以空格分隔):1 2 3 4 1 2 5 1 2 3 4 5 ``` 输出: ``` 缺页率:33.33% 缺页序列:[1, 2, 3, 4, 5, 1, 2, 5, 3, 4] ``` 请注意,这只是一个简单的实现,可能存在性能问题和边界情况未处理。在实际应用中,需要根据具体情况进行优化和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值