《操作系统》课程实验(四)
页面置换算法的好坏直接关系到系统运行的效率。本设计要求用高级语言编写和调试一个简单的内存页面调度程序。通过本实验可以加深理解有关最佳置换算法、先进先出置换算法和最近最久未使用置换算法的概念,并体会和了解这三种页面置换算法的具体实施办法。
- 实验内容
- 页面流如下:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
- 首先利用最佳置换算法求出理想状态下的缺页率。再将先进先出算法和 最近最久未使用算法与最佳置换算法做比较,说明哪个缺页率较低。
- 3 假设所用的物理块个数分别为3和4。
编程语言:Java
开发工具:IntelliJ IDEA
- 实验要求
- 物理块用数组S[]表示,每次经过一个页面,须显示此时物理块中的页面。
- 设置计数变量count,记录缺页次数。统计缺页率可用:置换次数/页面总数求得。
- 实验代码
- 类名:FIFO //最佳置换算法
public class FIFO {
public void run() {
String[] inputStr = {"1", "2", "3", "4", "2", "1", "2", "3", "5", "2", "3", "7", "6"};
// 内存块
int memory = 3;
List<String> list = new ArrayList<>();
for(int i = 0; i < inputStr.length; i++){
if(i == 0){
list.add(inputStr[i]);
System.out.println("第"+ i +"次访问:\t\t" + ListUtils.listToString(list));
}else {
if(ListUtils.find(list, inputStr[i])){
System.out.println("第" + i + "次" + "访问:\t\t" + ListUtils.listToString(list));
}else{
if(list.size() < memory){
list.add(inputStr[i]);
}else{
list.remove(0);
list.add(inputStr[i]);
}
System.out.println("第" + i + "次" + "访问:\t\t" + ListUtils.listToString(list));
}
}
}
}
}
- 类名:LRU //最近最久未用置换算法
public class LRU {
public static void main(String[] args) {
String[] inputStr = {"6", "7", "6", "5", "9", "6", "8", "9", "7", "6", "9", "6"};
// 内存块
int memory = 3;
List<String> list = new ArrayList<>();
for(int i = 0; i < inputStr.length; i++){
if(i == 0){
list.add(inputStr[i]);
System.out.println("第"+ i +"次访问:\t\t" + ListUtils.listToString(list));
}else {
if(ListUtils.find(list, inputStr[i])){
// 存在字符串,则获取该下标
int index = ListUtils.findIndex(list, inputStr[i]);
// 下标不位于栈顶时,且list大小不为1时
if(!(list.get(list.size() - 1)).equals(inputStr[i]) && list.size() != 1) {
String str = list.get(index);
list.remove(index);
list.add(str);
}
System.out.println("第" + i + "次" + "访问:\t\t" + ListUtils.listToString(list));
}else{
if(list.size()>= memory) {
list.remove(0);
list.add(inputStr[i]);
System.out.println("第" + i + "次" + "访问:\t\t" + ListUtils.listToString(list));
}else {
list.add(inputStr[i]);
System.out.println("第" + i + "次" + "访问:\t\t" + ListUtils.listToString(list));
}
}
}
}
}
}
- 类名 Test //主类
public class Clock {
public static void main(String[] args) {
String[] inputStr = {"6", "7", "6", "5", "9", "6", "8", "9", "7", "6", "9", "6"};
List<String> list = new ArrayList<>();
// 内存块
int memory = 3;
// 缺页次数
int count = 0;
String[] clock = new String[memory];
int indexNext = 0;
int index = 0;
// 初始化时钟
for(int i = 0; i < memory; i++) {
clock[i] = "0";
}
for(int i = 0; i < inputStr.length; i++) {
int indexPre = 0;
if (i == 0) {
list.add(inputStr[i]);
clock[indexNext] = "1";
indexNext++;
System.out.println("第"+ i +"次访问:\t\t" + ListUtils.listToString(list));
}else {
if(ListUtils.find(list, inputStr[i])) {
indexPre = ListUtils.findIndex(list, inputStr[i]);
if(clock[indexPre].equals("0")) {
clock[indexPre] = "1";
}
count++;
System.out.println("第"+ i +"次访问:\t\t" + ListUtils.listToString(list));
}else {
if(list.size() < memory) {
list.add(inputStr[i]);
clock[indexNext] = "1";
indexNext++;
System.out.println("第"+ i +"次访问:\t\t" + ListUtils.listToString(list));
}else {
index = ListUtils.findZero(indexNext, clock, memory);
list.remove(index);
list.add(index, inputStr[i]);
clock[index] = "1";
indexNext = index + 1;
System.out.println("第"+ i +"次访问:\t\t" + ListUtils.listToString(list));
}
}
}
if(indexNext > memory - 1) {
indexNext = Math.abs(memory - indexNext);
}
}
System.out.println("缺页次数:" + (inputStr.length-count));
}
}
- 实验截图