《操作系統》——內存管理和分配算法實現

《操作系統》課程實驗(四)

——內存管理和分配算法實現

頁面置換算法的好壞直接關係到系統運行的效率。本設計要求用高級語言編寫和調試一個簡單的內存頁面調度程序。通過本實驗可以加深理解有關最佳置換算法、先進先出置換算法和最近最久未使用置換算法的概念,並體會和了解這三種頁面置換算法的具體實施辦法

 

                                           7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

  1. 首先利用最佳置換算法求出理想狀態下的缺頁率。再將先進先出算法和 最近最久未使用算法與最佳置換算法做比較,說明哪個缺頁率較低。
  2. 3 假設所用的物理塊個數分別爲3和4。

 

編程語言:Java

開發工具:IntelliJ IDEA

  1. 實驗要求
  1. 物理塊用數組S[]表示,每次經過一個頁面,須顯示此時物理塊中的頁面。
  2. 設置計數變量count,記錄缺頁次數。統計缺頁率可用:置換次數/頁面總數求得。

 

  1. 實驗代碼
  1. 類名: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));

                }

            }

        }

    }



}

 

  1. 類名: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));

                    }

                }

            }

        }

    }

}

 

  1. 類名 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));

    }



}
  1. 實驗截圖

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章