操作系统之 调度算法 (java)

1.理解操作系统进程管理中进行进程调度的过程和编程方法,创建进程控制块PCB。

2.理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。掌握几种调度算法。
理解几种进程调度的方式
用代码将几种进程调度的方式表现出来
(1)先到先服务:按照进程提交给系统的先后次序来进行调度。
(2)短作业优先:按照进程所要求的运行时间来衡量。
(3)时间片轮转:根据先来先服务排序,以一个时间片为单位,依次执行不同的进程。
(4)响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。
RP(响应比)=作业周转时间/作业运行时间=1+作业等待时间/作业运行时间

实验代码
实体类

package 实验一;

public class attribute {
    static  int runname=-1;//给当前进度起名字
    int Run_time;//需要运行时间
    int input_time;//输入时间
    int name=-1;//进程序号
    public  int getName() {
        return name;
    }
    public  void setName(int name) {
        this.name = name;
    }
    public attribute() {
    }
    public attribute( int input_time,int run_time) {
        this.Run_time = run_time;
        this.input_time = input_time;
        runname++;
        this.name=runname+0;

    }
    public int getRun_time() {
        return Run_time;
    }
    public void setRun_time(int run_time) {
        Run_time = run_time;
    }
    public int getInput_time() {
        return input_time;
    }
    public void setInput_time(int input_time) {
        this.input_time = input_time;
    }
}

工具类

package 实验一;
import java.util.Scanner;
public class utils {
    public static void OutputAttribute(attribute[] ab) {//输出
        int  time=ab[0].input_time;
        for (int i=0;i<ab.length;i++){
            if (ab[i].input_time>time){
                time=ab[i].input_time;
            }
            System.out.print("输入时间"+time+" ");
            time+=ab[i].Run_time;
            System.out.print("运行时间"+ab[i].Run_time+" ");
            System.out.print("运行进程为"+ab[i].name+" ");
            System.out.print("周转时间为"+(time-ab[i].input_time)+" ");
            System.out.println();
        }
    }
    public static void runattribute(attribute[] ab) {//运行调用
        System.out.println("请选择排序方式");
        Scanner in=new Scanner(System.in);
        int n=-1;
        while (n!=0){
            System.out.println("1,先到先服务  2,短作业优先 3,时间片转轮 4,RP级排序 ,0退出");
            n=in.nextInt();
            switch (n){
                case  1:  ab=InputTimesort(ab);OutputAttribute(ab);break;
                case  2:  ab=Short_jobs_take_precedence(ab,0,0);OutputAttribute(ab);break;
                case  3:  System.out.println("请输入时间片时间");
                    n=in.nextInt();
                    Time_slice_rotation(ab,n);break;
                case  4:  ab=priorityTimesort(ab,0,0);OutputAttribute(ab);break;
            }
        }
        return ;
    }
    private static attribute[] Time_slice_rotation(attribute[] ab, int n) {
        int[] Alltime=new int[ab.length];//完成需要时间
        for (int j = 0; j <ab.length ; j++) {
            Alltime[j] =ab[j].Run_time;
        }
        int[] complete_Alltime=new int[ab.length];//已完成时间
        int min_input_time=-1;
        int index;
        int complete=0;//完成个数
        int N=1;//
        while (complete<ab.length){
            index=-1;
            for (int i = 0; i <ab.length ; i++) {
                if (ab[i].input_time>=N*n){
                    continue;
                }
                if (Alltime[i]<=complete_Alltime[i]){
                    continue;
                }
                if (index==-1){
                    index=i;
                    min_input_time=ab[i].input_time;
                }
                if (ab[i].input_time<min_input_time){
                    index=i;
                }
            }
            if (index!=-1) {
                if (ab[index].input_time>N*n-n){
                    complete_Alltime[index] = N*n-ab[index].input_time;
                }else {
                    complete_Alltime[index] += n;
                }

                if (Alltime[index] <= complete_Alltime[index]) {
                    complete++;
                    complete_Alltime[index] = Alltime[index];
                }
                System.out.println("第" + N + "个时间片 运行进程" + ab[index].name + "进度为 " + complete_Alltime[index] + "/" + Alltime[index]);
            }else {
                System.out.println("第" + N + "个时间片 暂无进程进入");

            }
            N++;
        }
        return null;
    }

    private static attribute[] Short_jobs_take_precedence(attribute[] ab,int i,int Begin) {
        int min_Run_time=-1;
        int min_input_time=i;
        int index=-1;
        //获取运行时间之前的运行时间最短的
        for (int j = Begin; j <ab.length ; j++) {
            if (ab[j].input_time<=i){
                    if (min_Run_time==-1){
                        index=j;
                        min_Run_time=ab[j].Run_time;
                    }else {
                        if(min_Run_time>ab[j].Run_time){
                            index=j;
                            min_Run_time=ab[j].Run_time;
                        }
                    }
            }
        }
        if(index==-1){
             min_Run_time=ab[Begin].Run_time;
             min_input_time=ab[Begin].input_time;
             index=Begin;
            for (int j = Begin; j <ab.length ; j++) {
                if (ab[j].input_time<min_input_time){
                    min_input_time=ab[j].input_time;
                    index=j;
                    min_Run_time=ab[j].Run_time;
                }else {
                    if (ab[j].input_time==min_input_time){
                            if(min_Run_time<ab[j].Run_time){
                                min_input_time=ab[j].input_time;
                                index=j;
                                min_Run_time=ab[j].Run_time;
                            }
                        }
                    }
                }
            }
        swat(ab,Begin,index);
        if (Begin+1==ab.length){
            return ab;
        }
        Short_jobs_take_precedence(ab,(min_input_time>i?min_input_time:i)+min_Run_time,Begin+1);
        return ab;
    }
    public static void swat(attribute[] ab,int i, int index) {//交换位置
        attribute a=ab[i];
        ab[i]=ab[index];
        ab[index]=a;
    }
    private static attribute[] InputTimesort(attribute[] ab) {//输入时间排序
        for (int i=0;i<ab.length;i++){
            int min=i;
            for (int J=i;J<ab.length;J++){
                if(ab[J].getInput_time()<ab[i].getInput_time()){
                    min=J;
                }
            }
            swat(ab,i,min);
        }
        return ab;
    }
    private static attribute[] priorityTimesort(attribute[] ab,int i,int Begin) {//响应比排序
        int min_Run_time=-1;
        int min_input_time=i;
        int min_priority=0;
        int index=-1;
        //获取运行时间之前的优先级最高的
        for (int j = Begin; j <ab.length ; j++) {
            if (ab[j].input_time<=min_input_time){
                if (min_Run_time==-1){
                    index=j;
                    min_Run_time=ab[j].Run_time;
                    min_priority=(ab[j].input_time-i)/ab[j].Run_time;
                }else {
                    if(min_priority>(ab[j].input_time-i)/ab[j].Run_time){//优先级比我大
                        index=j;
                        min_Run_time=ab[j].Run_time;
                        min_priority=(ab[j].input_time-i)/ab[j].Run_time;
                    }
                }
            }
        }
        if(index==-1){
            min_Run_time=ab[Begin].Run_time;
            min_input_time=ab[Begin].input_time;
            index=Begin;
            for (int j = Begin; j <ab.length ; j++) {
                if (ab[j].input_time<min_input_time){//运行时间在我之前直接换
                    min_input_time=ab[j].input_time;
                    index=j;
                    min_Run_time=ab[j].Run_time;
                }else {
                    if (ab[j].input_time==min_input_time){
                        if(min_input_time<ab[j].Run_time){//运行时间小直接换
                            min_input_time=ab[j].input_time;
                            index=j;
                            min_Run_time=ab[j].Run_time;
                        }
                    }
                }
            }
        }
        swat(ab,Begin,index);
        if (Begin+1==ab.length){
            return ab;
        }
        priorityTimesort(ab,(min_input_time>i?min_input_time:i)+min_Run_time,Begin+1);
        return ab;
    }
}

测试类

package 实验一;
public class dispatch {
    public static void main(String[] args) {
        attribute[] ab = {new attribute(1, 5),
                new attribute(2, 5),
                new attribute(10, 5),
                new attribute(16, 15),
                new attribute(14, 25)};
        utils.runattribute(ab);//选择排序方式
    }
}

实验结果

在这里插入图片描述
下一篇操作系统之银行家算法

因为测试数据少 所以有点重复
可以自行去运行,代码还是木有问题的
如果本文章对你有用 记得点赞哦 ( ̄∇ ̄)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzsaixuexi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值