操作系统进程调度算法

16 篇文章 0 订阅

1.先进先出算法(FCFS)

    public  static void FCFS(){
        //先来先服务
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
         Queue<process> queue=new LinkedList<>();//内存队列
        Collections.sort(result);
        for(process newProcess:result){
            queue.offer(newProcess);
        }
        process tmp=queue.peek();//第一个输出的值
        tmp.StartTime=tmp.InTime;
        tmp.FinishTime=tmp.ServerTime+tmp.StartTime;
        tmp.TurnaroundTime=tmp.FinishTime-tmp.InTime;
        tmp.AddTurnaroundTime=(double)tmp.TurnaroundTime/(double) tmp.ServerTime;
        PrintForm();
        Print(tmp);
        while (!queue.isEmpty()){
            process tmpe=queue.poll();
            if(queue.isEmpty()){
                break;
            }
            process top=queue.peek();
            if(tmpe.FinishTime>top.InTime){
            top.StartTime=tmpe.FinishTime;
            } else{
                top.StartTime=top.InTime;
            }
            top.FinishTime=top.StartTime+top.ServerTime;
            top.TurnaroundTime=top.FinishTime-top.InTime;
            top.AddTurnaroundTime=(double)top.TurnaroundTime/(double) top.ServerTime;
            Print(top);
        }
        AverNum();
    }

2.短作业优先调度(SPF)非抢占式

public  static void SPF(){
        //短进程优先
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
        Collections.sort(result);
        int temover = result.get(0).InTime;
        PrintForm();
        for (int i = 0; i < result.size(); i++) {

                int effect = effective(temover,i);  //查看进来了几个进程
                SpfSort(i,effect); //对进来的进程对短进程排序
                temover=InitOther(i,temover);

        }
        AverNum();//计算周转时间和带权周转时间
    }

3.高响应比(或者稍微改一下就是高优先权,非抢占式)

public  static void HPF() {
        //高优先级优先
        if (result == null) {
            throw new RuntimeException("请输入进程");
        }
        Collections.sort(result);
        PrintForm();
        int temover = result.get(0).InTime;
        for (int i = 0; i < result.size(); i++) {
                int effect = effective(temover, i);  //查看进来了几个进程
                HpfSort(i, effect, temover); //对进来的进程进行优先级排序
                temover=InitOther(i,temover);

        }
        AverNum();  //计算周转时间和带权周转时间
    }

4.时间片轮转(RR)

 public  static void RR(){
        //时间片轮转
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
        Collections.sort(result);

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输出系统时间片:");
        int RR = scanner.nextInt();
            PrintForm();
        Queue<Integer> queue1=new LinkedList<>();
        int timeover = result.get(0).InTime;  //记录上个进程结束时间
        int[] serviceTem = new int[result.size()]; //存放所有的进程估计运行时间的,开始全为0.
        int i = 1; //看队列进了几个进程了
        queue1.offer(0); //排完序,肯定先执行第一个.

        while(!queue1.isEmpty() || i < result.size()){
            int cur = RR;
            if(queue1.isEmpty()) {
                for (int tep = 0; tep < result.size(); tep++) {
                    if (serviceTem[tep] == 0) {
                        queue1.offer(tep);
                        i = i + 1;
                        timeover=result.get(tep).InTime;
                        break;
                    }
                }
            }
            //出队,进行执行
            int tem = queue1.poll();
            if(serviceTem[tem] == 0){  //当数组里估计运行时间为0的话,那就是第一次初始化,可以赋一下初始值.
                result.get(tem).StartTime = timeover;
            }
            while(cur != 0){   //模拟实现加时间片轮转,执行RR次,直到相等或用完。
                if(serviceTem[tem] != result.get(tem).ServerTime){
                    ++serviceTem[tem];
                    timeover++;
                }
                if(serviceTem[tem] == result.get(tem).ServerTime) {
                    result.get(tem).FinishTime =timeover;
                    result.get(tem).TurnaroundTime=result.get(tem).FinishTime-result.get(tem).InTime;
                    result.get(tem).AddTurnaroundTime=(double)result.get(tem).TurnaroundTime/result.get(tem).ServerTime;
                    Print(result.get(tem));
                    break;
                }
                cur--;
            }
            //i记录进程个数,去遍历所有进程,看还有那个没进入,如果进程到了,就插入队列.
            if(i < result.size()) {
                int j = i;
                for (; j < result.size(); j++) {
                    if (result.get(j).InTime <= timeover) {
                        queue1.offer(j);
                        i = i + 1;
                    }
                }
            }
            //如果当前进程没有执行完,就在进入队列.
            if(serviceTem[tem] != result.get(tem).ServerTime) {
                queue1.offer(tem);
            }
        }
        AverNum();
    }

以上就是四种调度算法的函数,我在这里在附上全部代码吧,有课设实验的拿去用。

package Experiment;

import java.util.*;

class process implements Comparable<process>{
    public String Name;//标识符
    public int InTime;//进入内存时间
    public int ServerTime;//服务时间
    public int priority;//优先级
    public int StartTime;//开始时间
    public int FinishTime;//完成时间
    public int TurnaroundTime=0;//周转时间
    public Double AddTurnaroundTime=0.0;//带权周转时间

    @Override
    public int compareTo(process o) {
        return this.InTime - o.InTime;
    }
}
public class Test {
    public static List<process> result=new ArrayList<>();//进程

    public  static void Input(){
        //初始化进程属性
        System.out.println("请输入你要插入进程数");
        Scanner sc=new Scanner(System.in);
        int count=sc.nextInt();
        for(int i=0;i<count;i++){
           process pro=new process();
            System.out.println("请输入标识");
            pro.Name=sc.next();
            System.out.println("请输入进入时间");
            pro.InTime=sc.nextInt();
            System.out.println("请输入服务时间");
            pro.ServerTime=sc.nextInt();
            System.out.println("请输入优先级");
            pro.priority=sc.nextInt();
            result.add(pro);
        }
    }
    public  static void Menu(){
        //菜单
        System.out.println("*************************");
        System.out.println("请输入你想进行的操作:    *");
        System.out.println("1.录入进程属性           *");
        System.out.println("2.按照先来先服务的算法   *");
        System.out.println("3.按照短作业优先的算法   *");
        System.out.println("4.按照高优先级优先算法   *");
        System.out.println("5.按照时间片轮转的算法   *");
        System.out.println("0.退出                  *");
        System.out.println("*************************");
    }
    private static void PrintForm(){
        System.out.println("进程标识符  进入时间  服务时间  开始时间  完成时间  周转时间  带权值周时间");
    }
    public  static void Print(process pro){

        System.out.println(pro.Name+"              "
                +pro.InTime+"         "
                +pro.ServerTime+"         "
                +pro.StartTime+"         "
                +pro.FinishTime+"         "
                +pro.TurnaroundTime+"           "
                +pro.AddTurnaroundTime);
    }
    public  static void FCFS(){
        //先来先服务
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
         Queue<process> queue=new LinkedList<>();//内存队列
        Collections.sort(result);
        for(process newProcess:result){
            queue.offer(newProcess);
        }
        process tmp=queue.peek();//第一个输出的值
        tmp.StartTime=tmp.InTime;
        tmp.FinishTime=tmp.ServerTime+tmp.StartTime;
        tmp.TurnaroundTime=tmp.FinishTime-tmp.InTime;
        tmp.AddTurnaroundTime=(double)tmp.TurnaroundTime/(double) tmp.ServerTime;
        PrintForm();
        Print(tmp);
        while (!queue.isEmpty()){
            process tmpe=queue.poll();
            if(queue.isEmpty()){
                break;
            }
            process top=queue.peek();
            if(tmpe.FinishTime>top.InTime){
            top.StartTime=tmpe.FinishTime;
            } else{
                top.StartTime=top.InTime;
            }
            top.FinishTime=top.StartTime+top.ServerTime;
            top.TurnaroundTime=top.FinishTime-top.InTime;
            top.AddTurnaroundTime=(double)top.TurnaroundTime/(double) top.ServerTime;
            Print(top);
        }
        AverNum();
    }
    public  static void SpfSort(int start, int end){ //根据服务时间排序
        for(int i = start; i < end; i++){
            for(int j = i + 1; j < end; j++){
                if(result.get(i).ServerTime> result.get(j).ServerTime){
                    process tem = result.get(i);
                    result.set(i,result.get(j));
                    result.set(j, tem);
                }
            }
        }
    }
    public  static void HpfSort(int start, int end, int temover){//根据优先级排序
        for(int i = start; i < end; i++){
            for(int j = i + 1; j < end; j++){
                int now =  (temover - result.get(i).InTime + result.get(i).ServerTime) / result.get(i).ServerTime;
                int next = (temover - result.get(j).InTime + result.get(j).ServerTime) / result.get(j).ServerTime;
                if(next > now){//值越大优先
                    process tem = result.get(i);
                    result.set(i,result.get(j));
                    result.set(j, tem);
                }
            }
        }
    }
    public  static int effective(int temover, int start){ //查看短进程有效值
        int end;  //去返回有效值的下标
        for(end = start; end < result.size(); end++){
            if(result.get(end).InTime > temover){
                break;
            }
        }
        return end;
    }
    public  static void AverNum(){
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
        int Turnsum=0;
        double AddTurnsum=0.0;
        for(int i=0;i<result.size();i++){
            Turnsum+=result.get(i).TurnaroundTime;
            AddTurnsum+=result.get(i).AddTurnaroundTime;
        }
        double AverTurn=(double) Turnsum/result.size();
        double AverAddTurn=AddTurnsum/result.size();
        System.out.println("平均周转时间为:"+AverTurn);
        System.out.println("加权平均周转时间为:"+AverAddTurn);
    }
    public  static void SPF(){
        //短进程优先
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
        Collections.sort(result);
        int temover = result.get(0).InTime;
        PrintForm();
        for (int i = 0; i < result.size(); i++) {

                int effect = effective(temover,i);  //查看进来了几个进程
                SpfSort(i,effect); //对进来的进程对短进程排序
                temover=InitOther(i,temover);

        }
        AverNum();//计算周转时间和带权周转时间
    }
    public  static void HPF() {
        //高优先级优先
        if (result == null) {
            throw new RuntimeException("请输入进程");
        }
        Collections.sort(result);
        PrintForm();
        int temover = result.get(0).InTime;
        for (int i = 0; i < result.size(); i++) {
                int effect = effective(temover, i);  //查看进来了几个进程
                HpfSort(i, effect, temover); //对进来的进程进行优先级排序
                temover=InitOther(i,temover);

        }
        AverNum();  //计算周转时间和带权周转时间
    }
    public  static void RR(){
        //时间片轮转
        if(result == null){
            throw new RuntimeException("请输入进程");
        }
        Collections.sort(result);

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输出系统时间片:");
        int RR = scanner.nextInt();
            PrintForm();
        Queue<Integer> queue1=new LinkedList<>();
        int timeover = result.get(0).InTime;  //记录上个进程结束时间
        int[] serviceTem = new int[result.size()]; //存放所有的进程估计运行时间的,开始全为0.
        int i = 1; //看队列进了几个进程了
        queue1.offer(0); //排完序,肯定先执行第一个.

        while(!queue1.isEmpty() || i < result.size()){
            int cur = RR;
            if(queue1.isEmpty()) {
                for (int tep = 0; tep < result.size(); tep++) {
                    if (serviceTem[tep] == 0) {
                        queue1.offer(tep);
                        i = i + 1;
                        timeover=result.get(tep).InTime;
                        break;
                    }
                }
            }
            //出队,进行执行
            int tem = queue1.poll();
            if(serviceTem[tem] == 0){  //当数组里估计运行时间为0的话,那就是第一次初始化,可以赋一下初始值.
                result.get(tem).StartTime = timeover;
            }
            while(cur != 0){   //模拟实现加时间片轮转,执行RR次,直到相等或用完。
                if(serviceTem[tem] != result.get(tem).ServerTime){
                    ++serviceTem[tem];
                    timeover++;
                }
                if(serviceTem[tem] == result.get(tem).ServerTime) {
                    result.get(tem).FinishTime =timeover;
                    result.get(tem).TurnaroundTime=result.get(tem).FinishTime-result.get(tem).InTime;
                    result.get(tem).AddTurnaroundTime=(double)result.get(tem).TurnaroundTime/result.get(tem).ServerTime;
                    Print(result.get(tem));
                    break;
                }
                cur--;
            }
            //i记录进程个数,去遍历所有进程,看还有那个没进入,如果进程到了,就插入队列.
            if(i < result.size()) {
                int j = i;
                for (; j < result.size(); j++) {
                    if (result.get(j).InTime <= timeover) {
                        queue1.offer(j);
                        i = i + 1;
                    }
                }
            }
            //如果当前进程没有执行完,就在进入队列.
            if(serviceTem[tem] != result.get(tem).ServerTime) {
                queue1.offer(tem);
            }
        }
        AverNum();
    }
    public  static int InitOther(int i,int temover){
    if (temover >= result.get(i).InTime) {
        result.get(i).StartTime = temover;
        result.get(i).FinishTime = result.get(i).StartTime + result.get(i).ServerTime;
        temover = result.get(i).FinishTime;
        result.get(i).TurnaroundTime=result.get(i).FinishTime-result.get(i).InTime;
        result.get(i).AddTurnaroundTime=(double)result.get(i).TurnaroundTime/result.get(i).ServerTime;
        Print(result.get(i));
        return temover;
    } else {
        result.get(i).StartTime = result.get(i).InTime;
        result.get(i).FinishTime = result.get(i).StartTime + result.get(i).ServerTime;
        temover = result.get(i).FinishTime; //记住他的结束时间.
        result.get(i).TurnaroundTime=result.get(i).FinishTime-result.get(i).InTime;
        result.get(i).AddTurnaroundTime=(double)result.get(i).TurnaroundTime/result.get(i).ServerTime;
        Print(result.get(i));
        return  temover;
    }

}
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int choose=1;
        while(choose !=0){
            Menu();
            choose=scan.nextInt();
            if(choose == 0){
                return;
            } else if(choose==1){
               Input();
            } else if(choose == 2){
                FCFS();
            } else if(choose == 3){
               SPF();
            } else if(choose == 4){
                HPF();
            } else if(choose == 5){
                RR();
            } else{
                System.out.println("输入错误");
                continue;
            }

        }
    }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值