注:笔记是对fengsigaoju大佬的实现页面置换算法一文((35条消息) JAVA实现页面置换算法(OPT,FIFO,LRU)_fengsigaoju的博客-CSDN博客_页面置换算法代码java)的学习,侵删。
初学一个月JAVA,如有不足请指出。
先上代码:
import java.io.BufferedInputStream;
import java.util.*;
public class Main {
private int n;//内储页框
private int m;//访问次数
private int F;//没能直接找到的次数,(F/m)为缺页率
private Listlist=null;//访问地址走向
private Mapmap=null;
public Main(){
F=0;
map=new HashMap();//存储每一个内储页框所存的内容
Scanner cin=new Scanner(new BufferedInputStream(System.in));
System.out.println("请输入用户访问页地址走向");
list=new ArrayList();
String s=cin.nextLine();
String []s1=s.split(" ");
m=s1.length;
for (int i=0;imin){
index=t;//更新值
min=j-i;
}
break;
}
}
if (j==m){//如果到最后
index=t;
min=j-i;
}
}
map.remove(index);
map.put(index,k);//修改表内元素
}
}
}
System.out.println("误码率为:"+F*1.0/m);
}
public void FIFO(){//先进先出置换算法
Queueq=new linkedList();
for (int i=0;ilinkedlist=new linkedList();
int start=0;
for (int i=0;i0;j--){
if (list.get(j)==map.get(t)){
num++;
}
if(min
不得不说,就我而言的话,我认为这段代码还是写的很棒滴。
第四种方法LFU是我自己加的,写的不是特别好,但是满足了教科书所要求的四种方法。
至于CLOCK算法,有空了再更。
接下来是对这段代码的理解:
一、使用到的代码:
1.第一行的import BufferedInputStream对于初学者来说有点深入了,当此行去掉,将原有的
Scanner cin=new Scanner(new BufferedInputStream(System.in));
改为
Scanner cin=new Scanner(System.in);
也可正常运行;
2.List
List list=new ArrayList();
这句代码可以让我们调用List接口里的内置函数,例如add,get。
3.HashMap
哈希表是一个非常实用的类型,主要特征是有key-value键值对,单从这一点容易让人联系到Python中的字典,但功能远比其丰富。
很多的内置函数都是可以从字面判断出来的:
containsValue(k)在表中查找是否有k的value。
size()返回键值对的数量。
put() 添加或者修改键值对。
remove()移出键值对,返回值为删除的值。
get()返回键所对应的值。
4.Queue
q.offer:在queue中有两种添加方法,add以及offer。两者区别是add在队列满时报错,而offer会返回false,而其他区别目前本人还没有发现。
q.remove:和pop一样是删除头元素,在空队列时,remove报错,pop返回null。
5.linkedlist
链表,算是非常常见的类型吧,这里就不多赘述了。
二、阅读代码遇到的问题
1、阅读LRU()的时候那个temp指针把我弄晕了。。。后来上编译器才发现这两个if里头的temp压根不一样。。。可见编译器的重要性了
三、总结
总的来说还是比较基础的代码,学校实验真是难的一批,写写这方面的笔记找找灵感。本来想写长一点的结果女朋友叫我帮她写Python去。。
这是学了一个月的菜鸡的笔记,有错误还请大佬指正。
一天后更:
果然写笔记是有帮助的,今天实验一下子就打通思路了。
还有就是对前文的一些错误进行纠错。



