(上)实现进程调度算法|操作系统

(1)要求
<1>.有录入界面,动态录入进程个数,进程标识符,进入时间,服务时间,优先级,系统时间片长短等信息.
<2>.有算法选择界面,能够选择不同的调度算法.
<3>.有输出界面,输出不同调度算法下诸进程的进程标识符,进入时间,服务时间,开始时间,完成时间,周转时间,带权周转时间,及一组进程的平均周转时间及平均带权周转时间.
<4>.实现4大算法:先来先服务进程优先,短进程进程优先,高优先级优先,时间片轮转.

(2)我的思想(初始化)

我在看到这个题的时候,因为我学的是java,就想这建一个静态的内部进程类,里面放着进程信息,像各进程的名字,进入时间,服务时间等.
然后在进程集这个类里面创建一个进程数组就OK了。用的时候直接初始化就行了。
然后就是写各种调度算法就是写4个方法就ok了。

package ProcessScheduling;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class process {
    static class proces {
       public String name;   //进程标识符
       public int insertTime;   //进入时间
         public int serviceTime;  //服务时间
      public   int startTime;  //开始时间
        public  int overTime;  //完成时间
        public int turnoverTime; //周转时间
        public double turnAroundTime; //带权周转时间

    }
    proces[] processes;
    public  void  init(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("你要输入的进程数");
        int amount = scanner.nextInt();
        processes = new proces[amount];
        for(int i = 0; i < amount; i++){
            System.out.println("第" + (i+1) + "进程是:");
            System.out.println("你的进程名是:");
            processes[i] = new proces();
            processes[i].name = scanner.next();
            System.out.println("你的进入时间是:");
            processes[i].insertTime = scanner.nextInt();
            System.out.println("你的估计运行时间是");
            processes[i].serviceTime = scanner.nextInt();
        }
    }

(3) 先来先服务算法
这个算法我的想法也很简单,就是按进入时间排序,4个算法每次肯定先执行进程时间第一个.所以我可以定义一个temover变量去记每次变量结束时间.
然后后面的进程就只有2中情况:
(1)进入时间小于这个temover就直接用temover作这个进程的开始时间
(2)进入时间大于这个temover,那么久还没进来,所以开始时间还是自已的进入时间

先排序我直接用的直接选择排序,简单方便,直接去进行引用的交换.

 public void FCFS(){   //先来先服务进程调度算法
        sort();
        int temover = 0; //记住每次进程的结束时间.作为下次的开始时间.
        for(int i = 0; i < processes.length; i++){
            if(i == 0){
                processes[i].startTime = processes[i].insertTime;
                processes[i].overTime = processes[i].startTime + processes[i].serviceTime;
                temover = processes[i].overTime; //记住他的结束时间.
            }else{
                //如果上一个结束时间比这个进程进入时间大,则这个进程已经进入,
                // 需要等待到temover时间才能开始,直接使用temover作为这个进程的开始时间
                if(temover >= processes[i].insertTime){
                processes[i].startTime = temover;
                processes[i].overTime = processes[i].startTime + processes[i].serviceTime;
                temover = processes[i].overTime;
            }else{
                    //否则这个进程还没有进入,需要等到这个进程的进入时间才能开始
                processes[i].startTime = processes[i].insertTime;
                processes[i].overTime = processes[i].startTime + processes[i].serviceTime;
                temover = processes[i].overTime; //记住他的结束时间.
            }
        }
        computationTime();  //计算周转时间和带权周转时间
      }
    }
    public void computationTime(){  //计算周转时间和带权周转时间
        for(int i = 0; i < processes.length; i++){
            processes[i].turnoverTime = processes[i].overTime - processes[i].insertTime;
            processes[i].turnAroundTime = (double)processes[i].turnoverTime / processes[i].serviceTime;
        }
    }
     public void sort(){  //根据进入时间直接选择排序
        for(int i = 0; i < processes.length; i++){
            for(int j = i + 1; j < processes.length; j++){
                if(processes[i].insertTime > processes[j].insertTime){
                    proces tem = processes[i];
                    processes[i] = processes[j];
                    processes[j] = tem;
                }
            }
        }
    }

(2)短进程优先算法

这个算法,其实和先来先服务差不了多少,就还是进入时间先排序,肯定先执行先进来的,然后才是短进程优先,然后就来去看在第一个进程结束前有几个进程进来,进来就按短进程优先去排序,去执行最短的.

 public void SJF() { //短进程优先算法
        sort();
        int temover = processes[0].insertTime;
        for (int i = 0; i < processes.length; i++) {
                int effect = effective(temover,i);  //查看进来了几个进程
                sort1(i,effect); //对进来的进程对短进程排序
                if (temover >= processes[i].insertTime) {
                    processes[i].startTime = temover;
                    processes[i].overTime = processes[i].startTime + processes[i].serviceTime;
                    temover = processes[i].overTime;
                } else {
                    processes[i].startTime = processes[i].insertTime;
                    processes[i].overTime = processes[i].startTime + processes[i].serviceTime;
                    temover = processes[i].overTime; //记住他的结束时间.
                }
            }
            computationTime();  //计算周转时间和带权周转时间
    }
public void sort(){  //根据进入时间直接选择排序
        for(int i = 0; i < processes.length; i++){
            for(int j = i + 1; j < processes.length; j++){
                if(processes[i].insertTime > processes[j].insertTime){
                    proces tem = processes[i];
                    processes[i] = processes[j];
                    processes[j] = tem;
                }
            }
        }
    }
    public int effective(int temover, int start){ //查看短进程有效值
        int end;  //去返回有效值的下标
        for(end = start; end < processes.length; end++){
            if(processes[end].insertTime > temover){
                break;
            }
        }
        return end;
    }
    public void sort1(int start, int end){ //根据服务时间排序
        for(int i = start; i < end; i++){
            for(int j = i + 1; j < end; j++){
                if(processes[i].serviceTime > processes[j].serviceTime){
                    proces tem = processes[i];
                    processes[i] = processes[j];
                    processes[j] = tem;
                }
            }
        }
    }

思想出来了题就好写了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值