动态分区分配(java) 操作系统实验

四种方法就不多介绍了,别的可以看,只是学生作品记录,做的地方还有许多不足
1.比如说当剩余空间Space的start = end相等时没有删除该剩余空间,反正是不想想了
2.还有的就是main方法只能理解过后才明白它在干什么,不能很清晰的设计程序步骤
3.ps:应付作业,我真可恶啊

package OS.Memory.T2;

import java.util.*;

public class Memory {
    public static void main(String[] args) {
        Memory memory = new Memory(20);
        memory.addZone(4, 7);
        memory.addZone(12, 17);
        memory.calculateRest();
        memory.showSpaces();
        memory.allocation(3);
        memory.allocation(5);
    }

    private int size;
    //仅在领近算法时有用到
    private int pointer;
    private LinkedList<Zone> zones;
    private List<Space> rest;

    //占用空间类
    class Zone {
        //分区始址
        private int start;
        //分区终址
        private int end;
        //空闲状态
        private boolean isFree;

        public int getStart() {
            return start;
        }

        public void setStart(int start) {
            this.start = start;
        }

        public int getEnd() {
            return end;
        }

        public void setEnd(int end) {
            this.end = end;
        }

        public Zone(int start, int end) {
            this.start = start;
            this.end = end;
        }

    }

    //    剩余空间类
    class Space {
        private int sstart;
        private int send;

        public Space(int sstart, int send) {
            this.sstart = sstart;
            this.send = send;
        }

        public int getSstart() {
            return sstart;
        }

        public void setSstart(int sstart) {
            this.sstart = sstart;
        }

        public int getSend() {
            return send;
        }

        public void setSend(int send) {
            this.send = send;
        }

        public Space() {
        }

        @Override
        public String toString() {
            return "Space{" +
                    "sstart=" + sstart +
                    ", send=" + send +
                    '}';
        }
    }

    // 判断zones已经占用的空间后 计算剩余空间
    public void calculateRest() {
        sortZones();
        int length = zones.size();
        rest = new ArrayList<>(length + 1);

        int restI = 0;
        int restJ = 0;
        for (int i = 0; i < length; i++) {
            Zone tmp = zones.get(i);
            if (tmp.getStart() == 0) {
                continue;
            } else {
                restJ = tmp.getStart();
            }
            rest.add(new Space(restI, restJ));

            if (tmp.getEnd() == size) {
                break;
            } else {
                restI = tmp.getEnd();
            }

        }
        Space space = new Space(restI, size);
        rest.add(space);
    }

    //最佳适应算法调用 其余不调用
    public void sortSpacesDesc() {
        Collections.sort(rest, new Comparator<Space>() {
            @Override
            public int compare(Space o1, Space o2) {
                return (o1.getSend() - o1.getSstart()) > (o2.getSend() - o2.getSstart()) ? 1 : -1;
            }
        });
    }

    //最坏适应算法调用 其余不调用
    public void sortSpacesASC() {
        Collections.sort(rest, new Comparator<Space>() {
            @Override
            public int compare(Space o1, Space o2) {
                return (o1.getSend() - o1.getSstart()) > (o2.getSend() - o2.getSstart()) ? -1 : 1;
            }
        });
    }

    public void sortZones() {
        Collections.sort(zones, new Comparator<Zone>() {
            @Override
            public int compare(Zone o1, Zone o2) {
                int start1 = o1.getStart();
                int start2 = o2.getStart();
                return start1 > start2 ? start1 : (start1 == start2) ? 1 : -1;
            }
        });
    }

    public void addZone(int start, int end) {
        int startI = 0;
        int endJ = 0;
        for (int i = 0; i < zones.size(); i++) {
            Zone tmp = zones.get(i);
            startI = tmp.getStart();
            endJ = tmp.getEnd();
            if ((endJ < start) || (startI > end)) {
                continue;
            } else {
                System.out.println("插入失败");
                break;
            }
        }
        Zone zone = new Zone(start, end);
        zones.add(zone);

    }

    public void showSpaces() {
        System.out.println("剩余空间始地址|剩余空间终址");
        for (int i = 0; i < rest.size(); i++) {
            System.out.println("起点:" + rest.get(i).getSstart() + "\t\t终点:" + rest.get(i).getSend());
        }
    }

    public Memory() {
        this.size = 100;
        this.pointer = 0;
        this.zones = new LinkedList<>();
    }

    public Memory(int size) {
        this.size = size;
        this.pointer = 0;
        this.zones = new LinkedList<>();
    }

    public void allocation(int size) {
        System.out.println("即将占用" + size + "大小内存");
        System.out.println("1.FirstFit(首次适应) 2.NextFit(邻近适应) 3.BestFit(最佳适应) 4.WorstFit(最坏适应)");
        System.out.print("请选择分配算法:");
        Scanner in = new Scanner(System.in);
        int algorithm = in.nextInt();
        switch (algorithm) {
            case 1:
                fristFit(size);
                break;
            case 2:
                nextFit(size);
                break;
            case 3:
                bestFit(size);
                break;
            case 4:
                worstFit(size);
                break;
            default:
                System.out.println("请重新选择!");
        }
    }

    //首次适应算法
    private void fristFit(int size) {
        for (int i = 0; i < rest.size(); i++) {
            Space tmp = rest.get(i);
            if (tmp.getSend() - tmp.getSstart() >= size) {
                tmp.setSstart(tmp.getSstart() + size);
                showSpaces();
                break;
            }
        }
    }

    // 循环首次适应算法
    private void nextFit(int size) {
        for (int i = pointer; i < rest.size(); i++) {
            Space tmp = rest.get(i);
            if (tmp.getSend() - tmp.getSstart() >= size) {
                tmp.setSstart(tmp.getSstart() + size);
                pointer = i;
                showSpaces();
                break;
            }
        }

    }

    //最佳适应算法
    private void bestFit(int size) {
        sortSpacesDesc();
        for (int i = 0; i < rest.size(); i++) {
            Space tmp = rest.get(i);
            if (tmp.getSend() - tmp.getSstart() >= size) {
                tmp.setSstart(tmp.getSstart() + size);
                showSpaces();
                break;
            }
        }

    }

    // 最坏适应算法
    private void worstFit(int size) {
        sortSpacesASC();
        for (int i = 0; i < rest.size(); i++) {
            Space tmp = rest.get(i);
            if (tmp.getSend() - tmp.getSstart() >= size) {
                tmp.setSstart(tmp.getSstart() + size);
                showSpaces();
                break;
            }
        }
    }
}

上一篇:JavaScript踩坑解构赋值


下一篇:java操作es之rest风格基本操作