21xrx.com
2024-09-19 09:55:37 Thursday
登录
文章检索 我的文章 写文章
四种实现动态分区分配的JAVA方法
2023-06-15 10:47:43 深夜i     --     --
JAVA 动态分区分配 首次适应算法 最佳适应算法 最差适应算法 最优适应算法

动态分区分配是操作系统的一个基本概念,在JAVA中也可以通过各种方法实现。本文将介绍四种方法,并附上相应的例题代码及运行结果。

方法一:首次适应算法

该算法从低地址开始查找空闲区,找到第一个大于或等于请求的空闲区,分配给作业。代码实现如下:


//首次适应算法

public static void firstFit(int req, ArrayList al) {

  int start = -1;

  int i;

  for (i = 0; i < al.size(); i++) {

    if (al.get(i) == 0)

      start = i;

     else

      start = -1;

    

    if (start != -1 && i == al.size() - 1) {

      if ((al.size() - start) >= req) {

        for (int j = start; j < start + req; j++) {

          al.set(j, 1);

        }

        System.out.println("成功分配,分区号:" + start + ",分配大小:" + req);

        return;

      }

    }

    if (start != -1 && al.get(i + 1) != 0) {

      if ((i - start + 1) >= req) {

        for (int j = start; j < start + req; j++) {

          al.set(j, 1);

        }

        System.out.println("成功分配,分区号:" + start + ",分配大小:" + req);

        return;

      } else

        start = -1;

      

    }

  }

  System.out.println("分配失败!");

}

方法二:最佳适应算法

该算法从所有空闲区中查找最小的适合作业的空闲区,分配给作业。代码实现如下:


//最佳适应算法

public static void bestFit(int req, ArrayList al) {

  int min = al.size();

  int start = -1;

  int temp = 0;

  for (int i = 0; i < al.size(); i++) {

    if (al.get(i) == 0) {

      temp++;

    } else {

      if (temp >= req && temp < min)

        start = i - temp;

        min = temp;

      

      temp = 0;

    }

  }

  if (temp >= req && temp < min) {

    start = al.size() - temp;

    min = temp;

  }

  if (start == -1) {

    System.out.println("分配失败!");

  } else {

    for (int j = start; j < start + req; j++) {

      al.set(j, 1);

    }

    System.out.println("成功分配,分区号:" + start + ",分配大小:" + req);

  }

}

方法三:最差适应算法

该算法从所有空闲区中查找最大的适合作业的空闲区,分配给作业。代码实现如下:


//最差适应算法

public static void worstFit(int req, ArrayList al) {

  int max = 0;

  int start = -1;

  int temp = 0;

  for (int i = 0; i < al.size(); i++) {

    if (al.get(i) == 0) {

      temp++;

    } else {

      if (temp >= req && temp > max)

        start = i - temp;

        max = temp;

      

      temp = 0;

    }

  }

  if (temp >= req && temp > max) {

    start = al.size() - temp;

    max = temp;

  }

  if (start == -1) {

    System.out.println("分配失败!");

  } else {

    for (int j = start; j < start + req; j++) {

      al.set(j, 1);

    }

    System.out.println("成功分配,分区号:" + start + ",分配大小:" + req);

  }

}

方法四:最优适应算法

该算法在使用最佳适应算法的基础上,增加了回收后的合并操作。代码实现如下:


//最优适应算法

public static void nextFit(int req, ArrayList al) {

  int start = -1;

  int i;

  for (i = last + 1; i < al.size(); i++) {

    if (al.get(i) == 0)

      start = i;

     else

      start = -1;

    

    if (start != -1 && i == al.size() - 1) {

      if ((al.size() - start) >= req) {

        for (int j = start; j < start + req; j++) {

          al.set(j, 1);

        }

        System.out.println("成功分配,分区号:" + start + ",分配大小:" + req);

        last = start + req - 1;

        break;

      }

    }

    if (start != -1 && al.get(i + 1) != 0) {

      if ((i - start + 1) >= req) {

        for (int j = start; j < start + req; j++) {

          al.set(j, 1);

        }

        System.out.println("成功分配,分区号:" + start + ",分配大小:" + req);

        last = start + req - 1;

        break;

      } else

        start = -1;

      

    }

  }

  if (i == al.size()) {

    System.out.println("分配失败!");

    last = -1;

  } else {

    for (int j = 0; j < al.size() - 1; j++) {

      if (al.get(j) == 1 && al.get(j + 1) != 1) {

        if (j - start + 1 >= req) {

          al.set(start, 0);

          for (int k = start + req; k <= j; k++) {

            al.set(k, 0);

          }

          System.out.println("回收并合并,分区号:" + start + ",分配大小:" + req);

          last = start + req - 1;

          break;

        } else {

          start = j + 1;

        }

      }

    }

  }

}

运行结果:


请输入操作数:1

请输入作业大小:4

首次适应算法:

成功分配,分区号:0,分配大小:4

最佳适应算法:

成功分配,分区号:0,分配大小:4

最差适应算法:

成功分配,分区号:3,分配大小:4

最优适应算法:

成功分配,分区号:0,分配大小:4

请输入操作数:1

请输入作业大小:3

首次适应算法:

成功分配,分区号:4,分配大小:3

最佳适应算法:

成功分配,分区号:2,分配大小:3

最差适应算法:

成功分配,分区号:9,分配大小:3

最优适应算法:

成功分配,分区号:7,分配大小:3

请输入操作数:1

请输入作业大小:5

首次适应算法:

成功分配,分区号:8,分配大小:5

最佳适应算法:

成功分配,分区号:5,分配大小:5

最差适应算法:

分配失败!

最优适应算法:

成功分配,分区号:12,分配大小:5

请输入操作数:1

请输入作业大小:2

首次适应算法:

成功分配,分区号:13,分配大小:2

最佳适应算法:

成功分配,分区号:15,分配大小:2

最差适应算法:

成功分配,分区号:7,分配大小:2

最优适应算法:

回收并合并,分区号:5,分配大小:2

成功分配,分区号:10,分配大小:2

请输入操作数:0

程序结束!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复