《操作系統》課程實驗(四)
頁面置換算法的好壞直接關係到系統運行的效率。本設計要求用高級語言編寫和調試一個簡單的內存頁面調度程序。通過本實驗可以加深理解有關最佳置換算法、先進先出置換算法和最近最久未使用置換算法的概念,並體會和了解這三種頁面置換算法的具體實施辦法。
- 實驗內容
- 頁面流如下:
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));
}
}
- 實驗截圖