《操作系统》——内存管理和分配算法实现

《操作系统》课程实验(四)

——内存管理和分配算法实现

页面置换算法的好坏直接关系到系统运行的效率。本设计要求用高级语言编写和调试一个简单的内存页面调度程序。通过本实验可以加深理解有关最佳置换算法、先进先出置换算法和最近最久未使用置换算法的概念,并体会和了解这三种页面置换算法的具体实施办法

 

                                           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. 实验截图

 

 

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