操作系统实验之进程调度--先来先服务、优先级、时间片轮转

本实验使用java实现


1. PCB进程控制块
import lombok.Data;

/**
 * PCB  进程控制块
 *
 * @author 
 * @date 2020/12/13
 */
@Data
public class PCB {
    /**
     * 名称
     */
    private String name;
    /**
     * 到达时间
     */
    private int arrivalTime;
    /**
     * 服务时间
     */
    private int servicesTime;
    /**
     * 开始时间
     */
    private int startTime;
    /**
     * 完成时间
     */
    private int completionTime;
    /**
     * 周转时间
     */
    private int turnTime;
    /**
     * 平均周转时间
     */
    private float averTurnTime;

    /**
     * 优先级
     */
    private int priority;
    /**
     * 剩余时间
     */
    private int remainTime;

}

2. 先来先服务算法
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * FCFS 先进先出算法
 *
 * @author 
 * @date 2020/12/13
 */
public class FCFS {
    public static void main(String[] args) {
        int processNumber;
        int currentTime = 0;
        LinkedList<PCB> pcbLinkedList = new LinkedList<PCB>();
        LinkedList<PCB> waitPCBsList = new LinkedList<PCB>();
        LinkedList<PCB> completionPCBList = new LinkedList<PCB>();


        processNumber = inputVariable(pcbLinkedList);

        while (!pcbLinkedList.isEmpty()) {
            waitPCBsList.clear();
            for (PCB pcb : pcbLinkedList) {
                if (pcb.getArrivalTime() <= currentTime) {
                    waitPCBsList.add(pcb);
                }
            }

            if (waitPCBsList.isEmpty()) {
                currentTime++;
                continue;
            }

            PCB pcb = Collections.min(waitPCBsList, new Comparator<PCB>() {
                @Override
                public int compare(PCB o1, PCB o2) {
                    int o1ArrivalTime = o1.getArrivalTime();
                    int o2ArrivalTime = o2.getArrivalTime();
                    if (o1ArrivalTime == o2ArrivalTime) {
                        return 0;
                    }
                    return o1ArrivalTime > o2ArrivalTime ? 1 : -1;
                }
            });
            pcb.setStartTime(currentTime);
            currentTime += pcb.getServicesTime();
            pcb.setCompletionTime(currentTime);
            pcb.setTurnTime(currentTime - pcb.getArrivalTime());

            float averTime = (float) pcb.getTurnTime() / pcb.getServicesTime();
            pcb.setAverTurnTime(Float.parseFloat(
                    String.format("%.3f", averTime)
            ));

            System.out.println(pcb.getName() + "正在执行,开始时间为:" + (currentTime - pcb.getServicesTime())
                    + "    完成时间为:" + currentTime);

            Iterator<PCB> iterator = pcbLinkedList.iterator();
            while (iterator.hasNext()) {
                PCB next = iterator.next();
                if (next.getName().equals(pcb.getName())) {
                    iterator.remove();
                    completionPCBList.add(next);
                    break;
                }
            }
        }

        wholePrint(processNumber, completionPCBList);
    }

    private static int inputVariable(LinkedList<PCB> pcbLinkedList) {
        int processNumber;
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入进程数");
        processNumber = Integer.parseInt(scanner.nextLine());
        System.out.println("请输入进程名");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = new PCB();
            pcb.setName(scanner.nextLine());
            pcbLinkedList.add(pcb);
        }
        System.out.println("请依次输入进程的    到达时间 服务时间\n");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = pcbLinkedList.get(i);
            System.out.print(pcb.getName() + "        ");
            pcb.setArrivalTime(scanner.nextInt());
            pcb.setServicesTime(scanner.nextInt());
        }
        return processNumber;
    }

    private static void wholePrint(int processNumber, LinkedList<PCB> completionPCBList) {
        System.out.println("\n\n\n");
        System.out.print("总览    " +
                "name    arrivalTime    servicesTime    " +
                "startTime    completionTime     turnTime    " +
                "averTurnTime\n");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = completionPCBList.get(i);
            System.out.printf("       %s     %d     %d     %d     %d     %d     %.4f\n",
                    pcb.getName(), pcb.getArrivalTime(), pcb.getServicesTime(),
                    pcb.getStartTime(), pcb.getCompletionTime(), pcb.getTurnTime(),
                    pcb.getAverTurnTime());
        }
    }
}

3. 优先级
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * PSA 优先级调度算法
 *
 * @author 
 * @date 2020/12/13
 */
public class PSA {
    public static void main(String[] args) {
        int processNumber;
        int currentTime = 0;
        LinkedList<PCB> pcbLinkedList = new LinkedList<PCB>();
        LinkedList<PCB> waitPCBsList = new LinkedList<PCB>();
        LinkedList<PCB> completionPCBList = new LinkedList<PCB>();


        processNumber = inputVariable(pcbLinkedList);

        while (!pcbLinkedList.isEmpty()) {
            waitPCBsList.clear();
            for (PCB pcb : pcbLinkedList) {
                if (pcb.getArrivalTime() <= currentTime) {
                    waitPCBsList.add(pcb);
                }
            }

            PCB pcb = Collections.min(waitPCBsList, new Comparator<PCB>() {
                @Override
                public int compare(PCB o1, PCB o2) {
                    int o1Priority = o1.getPriority();
                    int o2Priority = o2.getPriority();
                    if (o1Priority == o2Priority) {
                        return 0;
                    }
                    return o1Priority > o2Priority ? 1 : -1;
                }
            });
            pcb.setStartTime(currentTime);
            currentTime += pcb.getServicesTime();
            pcb.setCompletionTime(currentTime);
            pcb.setTurnTime(currentTime - pcb.getArrivalTime());

            float averTime = (float) pcb.getTurnTime() / pcb.getServicesTime();
            pcb.setAverTurnTime(Float.parseFloat(
                    String.format("%.3f", averTime)
            ));

            System.out.println(pcb.getName() + "正在执行,开始时间为:" + (currentTime - pcb.getServicesTime())
                    + "    完成时间为:" + currentTime);

            Iterator<PCB> iterator = pcbLinkedList.iterator();
            while (iterator.hasNext()) {
                PCB next = iterator.next();
                if (next.getName().equals(pcb.getName())) {
                    iterator.remove();
                    completionPCBList.add(next);
                    break;
                }
            }
        }

        wholePrint(processNumber, completionPCBList);
    }

    private static int inputVariable(LinkedList<PCB> pcbLinkedList) {
        int processNumber;
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入进程数");
        processNumber = Integer.parseInt(scanner.nextLine());
        System.out.println("请输入进程名");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = new PCB();
            pcb.setName(scanner.nextLine());
            pcbLinkedList.add(pcb);
        }
        System.out.println("请依次输入进程的    到达时间 服务时间 优先级\n");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = pcbLinkedList.get(i);
            System.out.print(pcb.getName() + "        ");
            pcb.setArrivalTime(scanner.nextInt());
            pcb.setServicesTime(scanner.nextInt());
            pcb.setPriority(scanner.nextInt());
        }
        return processNumber;
    }

    private static void wholePrint(int processNumber, LinkedList<PCB> completionPCBList) {
        System.out.println("\n\n\n");
        System.out.print("总览    " +
                "name    arrivalTime    servicesTime    " +
                "startTime    completionTime     turnTime    " +
                "averTurnTime   priority\n");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = completionPCBList.get(i);
            System.out.printf("       %s     %d     %d     %d     %d     %d     %.4f    %d\n",
                    pcb.getName(), pcb.getArrivalTime(), pcb.getServicesTime(),
                    pcb.getStartTime(), pcb.getCompletionTime(), pcb.getTurnTime(),
                    pcb.getAverTurnTime(), pcb.getPriority());
        }
    }
}

4. RR时间片轮转
import java.util.LinkedList;
import java.util.Scanner;

/**
 * RR   轮盘调度算法
 *
 * 0 4
 * 1 3
 * 2 4
 * 3 2
 * 4 4
 * @author 
 * @date 2020/12/13
 */
public class RR {
    public static void main(String[] args) {
        int processNumber;
        int currentTime = 0;
        LinkedList<PCB> pcbLinkedList = new LinkedList<>();
        LinkedList<PCB> waitPcbsList = new LinkedList<>();
        LinkedList<PCB> completionPcbsList = new LinkedList<>();

        processNumber = inputVariable(pcbLinkedList);

        while (completionPcbsList.size() < processNumber) {
            readyPcb(currentTime, pcbLinkedList, waitPcbsList);

            if (waitPcbsList.isEmpty()) {
                currentTime += 1;
                continue;
            }
            while (waitPcbsList.size() > 0) {
                PCB pcb = waitPcbsList.getFirst();
                pcb.setRemainTime(pcb.getRemainTime() - 1);
                currentTime++;
                pcb.setCompletionTime(currentTime);

                waitPcbsList.removeFirst();
                if (pcb.getRemainTime() > 0) {
                    waitPcbsList.addLast(pcb);
                } else {
                    pcb.setTurnTime(pcb.getCompletionTime() - pcb.getArrivalTime());
                    pcb.setAverTurnTime((float) pcb.getTurnTime() / pcb.getServicesTime());
                    completionPcbsList.add(pcb);
                }
                readyPcb(currentTime, pcbLinkedList, waitPcbsList);
            }
        }

        wholePrint(processNumber, completionPcbsList, pcbLinkedList);
    }

    private static void readyPcb(int currentTime, LinkedList<PCB> pcbLinkedList, LinkedList<PCB> waitPcbsList) {
        for (PCB pcb : pcbLinkedList) {
            if (pcb.getArrivalTime() <= currentTime
                    && pcb.getRemainTime() > 0
                    && !waitPcbsList.contains(pcb)) {
                waitPcbsList.addFirst(pcb);
            }
        }
    }

    private static int inputVariable(LinkedList<PCB> pcbLinkedList) {
        int processNumber;
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入进程数");
        processNumber = Integer.parseInt(scanner.nextLine());
        System.out.println("请输入进程名");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = new PCB();
            pcb.setName(scanner.nextLine());
            pcbLinkedList.add(pcb);
        }
        System.out.println("请依次输入进程的    到达时间 服务时间\n");
        for (int i = 0; i < processNumber; i++) {
            PCB pcb = pcbLinkedList.get(i);
            System.out.print(pcb.getName() + "        ");
            pcb.setArrivalTime(scanner.nextInt());
            int serverTime = scanner.nextInt();
            pcb.setServicesTime(serverTime);
            pcb.setRemainTime(serverTime);
        }
        return processNumber;
    }

    private static void wholePrint(int processNumber, LinkedList<PCB> completionPcbList, LinkedList<PCB> pcbLinkedList) {
        System.out.println("\n\n\n");
        System.out.print("总览    " +
                "name    arrivalTime    servicesTime    " +
                "completionTime     turnTime    " +
                "averTurnTime\n");

        for (int i = 0; i < processNumber; i++) {
            PCB pcb1 = pcbLinkedList.get(i);
            int indexOf = completionPcbList.indexOf(pcb1);

            PCB pcb = completionPcbList.get(indexOf);
            System.out.printf("       %s     %d     %d     " +
                            "%d     %d     %.4f\n",
                    pcb.getName(), pcb.getArrivalTime(), pcb.getServicesTime(),
                    pcb.getCompletionTime(), pcb.getTurnTime(),
                    pcb.getAverTurnTime());
        }
    }
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值