分区式存储管理算法

本文主要介绍了OS分区式存储管理的三种算法(FF BF WF),希望对您有所帮助

一. 实验目的

  1. 了解可变分区存储管理方式
  2. 掌握最佳适应,最坏适应,首次适应算法
  3. 实现三种算法
  4. 对比不同的方法的优点和缺点

二. 实验内容

  1. 首次适应算法
  2. 最佳适应算法
  3. 最坏适应算法

三. 实验环境

  1. 实践平台 windows
  2. 编写环境 java
  3. 编译器 idea

四. 实验设计原理

  1. 首次适应算法

    当接到内存申请时,遍历分区表,找到第一个满足长度的空闲区,将其分割并分配,此算法简单,可以快速分配决定,但空间利用率低。

  2. 最佳适应算法

    当接到内存申请时,遍历分区表,找到第一个能满足长度的最小空闲区,将其分割,此算法节约空间,因为尽量不分割大的空闲区,缺点是形成很多很小的空闲区。

  3. 最坏适应算法

    当接到内存申请时,遍历分区表,找到第一个能满足长度的最大空闲区,将其分割,该算法可以避免形成碎片,缺点是在分割了大的空闲区后,在遇到较大的申请内存时,无法满足分配。

五. 实验详细实现过程和算法流程

  1. 首先适应算法

  2. 最佳适应算法

  3. 最坏适应算法

六. 实验调试与结果分析

  1. 测试数据

    空闲块:起始地址 大小

    0 120 130 15 150 95 250 70 320 130 560 180

    work:80 15 70 130 45

  2. 首先适应

  3. 最佳适应

  4. 最坏适应

七. 源代码

  1. Table类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Table {
    public int address;//起始地址
    public int size;//大小
    public boolean isFree=false;//状态 是否为空闲区
    public Table(int address,int size){
    this.address = address;
    this.size = size;
    }
    public Table(int address,int size,boolean isFree){
    this.address = address;
    this.size = size;
    this.isFree = isFree;
    }
    public void outPut(){
    System.out.print(" "+this.address+" "+this.size+" ");
    if(!isFree){
    System.out.println("free");
    }else {
    System.out.println("busy");
    }
    }
    }
  2. TableList类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class TableList {
    public List<Table> TL;
    int n;
    public TableList(int n){
    this.n = n;//列表为n
    TL = new ArrayList<Table>();
    }
    //排序
    public void sort1() {
    Collections.sort(TL, new Comparator() {
    @Override
    public int compare(Object lhs, Object rhs) {
    Table data1 = (Table) lhs;
    Table data2 = (Table) rhs;
    return data1.address - data2.address;
    }
    });
    }
    public void sort2() {
    Collections.sort(TL, new Comparator() {
    @Override
    public int compare(Object lhs, Object rhs) {
    Table data1 = (Table) lhs;
    Table data2 = (Table) rhs;
    return data1.size - data2.size;
    }
    });
    }public void sort3() {
    Collections.sort(TL, new Comparator() {
    @Override
    public int compare(Object lhs, Object rhs) {
    Table data1 = (Table) lhs;
    Table data2 = (Table) rhs;
    return data2.size - data1.size;
    }
    });
    }
    //剔除 size 0
    public void tichu(){
    List<Table> new_TL = new ArrayList<Table>();
    for(int i =0 ;i<TL.size();i++){
    if(TL.get(i).size!=0){
    new_TL.add(TL.get(i));
    }
    }
    TL = new_TL;
    }
    //输出
    public void display(){
    System.out.println("index "+"address "+"size "+"status");
    for(int i=1;i<=TL.size();i++){
    System.out.print(" "+i+" ");
    TL.get(i-1).outPut();
    }
    }
    }
  3. 主类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入空闲块个数");
    int free_tab;
    free_tab = scanner.nextInt();
    TableList tablist = new TableList(free_tab);
    System.out.println("请输入起始地址和大小");
    for(int i=0;i<free_tab;i++){
    int a = scanner.nextInt();
    int b = scanner.nextInt();
    Table t = new Table(a,b);
    tablist.TL.add(t);
    }
    System.out.println("请输入work数");
    int work_num = scanner.nextInt();
    work = new int[work_num];
    System.out.println("请输入每个work大小");
    for(int i=0;i<work_num;i++){
    work[i] = scanner.nextInt();
    }
    System.out.println("请选择算法(1.首次适应算法 2.最佳适应算法 3.最差适应算法)");
    int syn = scanner.nextInt();
    if(syn==1)
    FF(tablist);
    else if(syn==2)
    BF(tablist);
    else if(syn==3)
    WF(tablist);
    }
  4. 主类-FF

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public static void FF(TableList tablist){
    for (int k : work) {
    boolean is_suc = false;
    tablist.n=tablist.TL.size();
    for (int j = 0; j < tablist.n; j++) {
    Table table = tablist.TL.get(j);
    if (!table.isFree && table.size >= k) {
    is_suc = true;
    int a = table.address;
    int b = k;
    Table jia = new Table(a, b, true);
    tablist.TL.add(jia);
    int c = table.address + k;
    table.address = c;
    table.size = table.size - k;
    break;
    }
    }
    if (!is_suc) {
    System.out.println("分配失败");
    tablist.tichu();
    tablist.sort1();
    tablist.display();
    return;
    }
    }
    System.out.println("分配成功");
    tablist.tichu();
    tablist.sort1();
    tablist.display();
    }
  5. 主类-BF

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public static void BF(TableList tablist){
    for (int k : work) {
    boolean is_suc = false;
    tablist.sort2();
    tablist.n=tablist.TL.size();
    for (int j = 0; j < tablist.n; j++) {
    Table table = tablist.TL.get(j);
    if (!table.isFree && table.size >= k) {
    is_suc = true;
    int a = table.address;
    int b = k;
    Table jia = new Table(a, b, true);
    tablist.TL.add(jia);
    int c = table.address + k;
    table.address = c;
    table.size = table.size - k;
    break;
    }
    }
    if (!is_suc) {
    System.out.println("分配失败");
    tablist.tichu();
    tablist.sort1();
    tablist.display();
    return;
    }
    }
    System.out.println("分配成功");
    tablist.tichu();
    tablist.sort1();
    tablist.display();
    }
  6. 主类-WF

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public static void WF(TableList tablist){
    for (int k : work) {
    boolean is_suc = false;
    tablist.n=tablist.TL.size();
    tablist.sort3();
    for (int j = 0; j < tablist.n; j++) {
    Table table = tablist.TL.get(j);
    if (!table.isFree && table.size >= k) {
    is_suc = true;
    int a = table.address;
    int b = k;
    Table jia = new Table(a, b, true);
    tablist.TL.add(jia);
    int c = table.address + k;
    table.address = c;
    table.size = table.size - k;
    break;
    }
    }
    if (!is_suc) {
    System.out.println("分配失败");
    tablist.tichu();
    tablist.sort1();
    tablist.display();
    return;
    }
    }
    System.out.println("分配成功");
    tablist.tichu();
    tablist.sort1();
    tablist.display();
    }

八. 感悟

通过这次实验了解了可变分区的相关知识,可变分区是系统不预先划分固定分区,有很大的灵活性,然后是三种分配策略,首先是首先适应法,这种算法简单,遍历时碰到的第一个满足大小的即可分配,缺点是空间利用率低;最佳适应算法,每次分配时都将块按大小从小到大排序,使其分配时可以分配最佳满足的块,这样利用率最佳,但是会造成很多空闲区,也叫作碎片;最坏适应算法,与最佳的区别是排序方式是从大到小,这样就可以避免最佳适应算法的碎片问题,但是会造成较大块无法分配内存。但是实验还有不完善之处,该实验只是完成了申请内存的过程,没有实现边申请边释放的过程,还有待改进。


分区式存储管理算法
http://kaikai12321.github.io/2022/10/23/分区式存储管理算法/
作者
Hou Kai
发布于
2022年10月23日
许可协议