目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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>