操作系统实验—进程调度算法(java)

这篇具有很好参考价值的文章主要介绍了操作系统实验—进程调度算法(java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

文章目录

前言

一、实验原理

二、实验步骤

1.创建PCB类

2.创建创建类

3.设计主窗口类

4.调度界面函数

5.算法类及其调度算法通用函数

6.进程调度算法函数

总结



前言

操作系统实验1:进程调度算法,步骤3、4在一个类中,步骤5、6在一个类中。


一、实验原理

(1)先到先服务调度算法:按照进程提交给系统的先后次序来进行调度。

(2)短作业优先调度算法:按照进程所要求的运行时间来衡量。

(3)时间片轮转调度算法:根据先来先服务排序,以一个时间片为单位,依次执行不同的进  程。

(4)优先权调度算法:按照进程的优先权来衡量。

实验要求:

操作系统实验—进程调度算法(java)

二、实验步骤

1.创建PCB类

代码如下:

package os.test1;

public class PCB {
    String name;    //进程名/进程标识符
    int runtime;   //进程运行时间
    int newruntime;    //进程剩余运行时间(时间片轮转要用)
    int arrivaltime;   //进程到达时间
    int newarrival;    //进程再次到就绪队列队首位置时间
    int priority;    //进程优先级
    int starttime;   //进程开始运行时间
    int endtime;     //进程运行结束时间
    int turntime;    //进程周转时间
    double dturntime;        //带权周转时间
    public PCB(String name,int priority,int runtime,int arrivaltime){
        this.name=name;
        this.priority=priority;
        this.runtime=runtime;
        this.arrivaltime=arrivaltime;
        this.starttime=0;
        this.endtime=0;
        this.turntime=0;
        this.dturntime=0;
        this.newarrival=arrivaltime;    //再次到达就绪队首位置默认为首次到达时间
        this.newruntime=runtime;     //刚开始剩余运行时间为运行时间
    }
}

2.创建创建类

主要负责PCB的创建和检测已经创建好的进程PCB。

代码如下:

package os.test1;

import java.util.ArrayList;

public class Create {
    public ArrayList<PCB> createPcb(ArrayList<PCB> pcbs, String name, int priority, int runtime, int arrivaltime){
        //新进程进数组
        PCB pcb=new PCB(name,priority,runtime,arrivaltime);
        pcbs.add(pcb);
        return pcbs;
    }
    public void check(ArrayList<PCB> pcbs){
        if(pcbs.isEmpty()){
            System.out.println("当前没有进程信息。");
            return;
        }
        for(PCB cur:pcbs){
            System.out.println("进程名:"+cur.name+",优先级:"+cur.priority+",需要运行时间:"+cur.runtime
            +",到达时间:"+cur.arrivaltime);
        }
    }

3.设计主窗口类

实现三个主功能添加进程、进程调度、查看进程。

代码如下:

public class Psch {
    public static void main(String args[]){
        ArrayList<PCB> pcbs=new ArrayList<PCB>();
        Psch.mainMenu(pcbs);
    }
    public static void mainMenu(ArrayList<PCB> pcbs){
        Create create=new Create();
        //测试用例
        PCB pcb=new PCB("a",2,7,3);
        PCB pcb2=new PCB("b",2,5,0);
        PCB pcb3=new PCB("f",5,3,7);
        PCB pcb4=new PCB("z",5,2,4);
        PCB pcb5=new PCB("u",7,2,9);
        pcbs.add(pcb);
        pcbs.add(pcb2);
        pcbs.add(pcb3);
        pcbs.add(pcb4);
        Scanner sc=new Scanner(System.in);
        int count1=1;
        while(count1==1){
            System.out.println("**************************");
            System.out.println("请输入你需要的服务:");
            System.out.println("1.添加新进程");
            System.out.println("2.选择调度算法");
            System.out.println("3.查看当前进程信息");
            System.out.println("0.退出");
            System.out.println("**************************");
            int num=sc.nextInt();
            switch (num){
                case 1:
                    String name;
                    int proirity;
                    int runtime;
                    int arrivaltime;
                    System.out.println("请输入进程名:");
                    name=sc.next();
                    System.out.println("请输入进程优先级:");
                    proirity=sc.nextInt();
                    System.out.println("进程进程运行时间:");
                    runtime=sc.nextInt();
                    System.out.println("进程进程到达时间:");
                    arrivaltime=sc.nextInt();
                    pcbs=create.createPcb( pcbs,name,proirity,runtime,arrivaltime);
                    break;
                case 2:
                    Psch.dispatchMenu(pcbs);
                    break;
                case 3:
                    create.check(pcbs);
                    break;
                case 0:
                    count1=0;
                    break;
                default:
                    System.out.println("输入错误,请重新输入!");
                    break;
            }
        }
    }

4.调度界面函数

实现主窗口类下的一个主要函数:调度界面函数。

代码如下:

public static void dispatchMenu(ArrayList<PCB> pcbs){
        Scanner sc=new Scanner(System.in);
        Algorithm al=new Algorithm();    //实例化算法类
        int count=1;
        while(count==1){
            PriorityQueue<PCB> useCase=al.initQueue(pcbs);
            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.退出");
            int num=sc.nextInt();
            switch(num){
                case 1:
                    al.FCFS(useCase);
                    break;
                case 2:
                    al.SJF(useCase);
                    break;
                case 3:
                    //定义时间片
                    System.out.println("请输入时间片大小:");
                    int timeR=sc.nextInt();
                    al.RR(useCase,timeR);
                    break;
                case 4:
                    al.PR(useCase);
                    break;
                case 5:
                    al.HRRN(useCase);
                    break;
                case 0:
                    count=0;
                    break;
                default:
                    System.out.println("输入错误,请重新输入!");
                    break;
            }
        }
    }
}

5.算法类及其调度算法通用函数

1.算法类数据

​
package os.test1;
import java.util.*;

public class Algorithm {
    private PCB min=null;     //满足运行条件的进程
    private int num=0;       //一批进程周转时间和
    private int start=0;    //更新系统开始时间
    private double nums=0;   //一批带权周转时间
    private int count=0;     //统计一批进程的进程个数
    private static Create create=new Create();  //实例化,以方便创建和增加进程


​

2.所有进程调度可用通用函数

代码如下:

//将传来的PCB数组转化成先以到达时间从小到大,再以进程大小从小到大排序而成的队列并返回
    public PriorityQueue<PCB> ArrivalAscPri(ArrayList<PCB> pcbs) {
        PriorityQueue<PCB> arrAscQueue = new PriorityQueue<>((x1,x2)->
        {return x1.arrivaltime!=x2.arrivaltime?x1.arrivaltime-x2.arrivaltime
                :x1.runtime-x2.runtime;});
        while (!pcbs.isEmpty())
            arrAscQueue.add(pcbs.remove(0));
        return arrAscQueue;
    }

    //复制数组中的对象,并使用ArrivalAscPri函数返回优先级队列
    public PriorityQueue<PCB> initQueue(ArrayList<PCB>pcbs) {
        ArrayList<PCB> useCase = new ArrayList<PCB>();
        for (PCB cur : pcbs){
            PCB temp=new PCB(cur.name,cur.priority,cur.runtime,cur.arrivaltime);
            useCase.add(temp);
        }
        PriorityQueue<PCB> arrAscQueue=ArrivalAscPri(useCase);
        return arrAscQueue;
    }

    //end进程已经运行完,打印这个进程的信息
    public void endPrint(PCB end){
        System.out.println("进程名:"+end.name+",优先级:"+end.priority+",运行时间:"+end.runtime+",到达时间:"+
                end.arrivaltime+",开始时间:"+end.starttime+",结束时间:"+end.endtime+",周转时间:"+end.turntime+
                ",带权周转时间:"+end.dturntime);
    }

    //所有进程都运行完了,打印平均周转时间和平均带权周转时间并重置数据成员参数
    public void endFun(){
        System.out.println("平均周转时间:"+(double)this.num/this.count+",平均带权周转时间:"+this.nums/this.count);
        this.start=0;
        this.nums=0;
        this.count=0;
        this.num=0;
        this.min=null;
    }
   //进程已经结束,更新进程开始时间,结束时间,周转时间,带权周转时间,更新nums,num,start(下一 
    个进程开始时间)
    public void operation(){
        start = start > min.arrivaltime ? start : min.arrivaltime;
        min.starttime = start;
        min.endtime = min.starttime + min.runtime;
        min.turntime = min.endtime - min.arrivaltime;
        min.dturntime = (double) min.turntime / min.runtime;
        endPrint(min);
        num += min.turntime;
        nums += min.dturntime;
        start = min.endtime;
    }

6.进程调度算法函数

1.先来先服务算法(FCFS)

代码如下:

 //先来先服务算法
    public void FCFS(PriorityQueue<PCB> arrAscQueue){
        while(!arrAscQueue.isEmpty()){
            min=arrAscQueue.remove();  //直接根据优先级队列顺序打印(先到先打印,同时到运行时间小先打印)
            operation();
            count++;
        }
        this.endFun();   //所有进程调度完成
    }

2.短作业优先算法(SJF)

代码如下:

//短作业优先算法
    public void SJF(PriorityQueue<PCB>arrAscQueue){
        //根据运行时间大小实现短作业优先级就绪队列
        PriorityQueue<PCB> arrivedAscQueue=new PriorityQueue<PCB>((x1,x2)->{return x1.runtime-x2.runtime;});
        while(!arrAscQueue.isEmpty()||!arrivedAscQueue.isEmpty()){
            //如果就绪队列为空并且start进程可开始运行时间小于arrAscQueue的队首元素到达时间,就进一个入就绪队列
            if(arrivedAscQueue.isEmpty()&&!arrAscQueue.isEmpty()&&start<arrAscQueue.peek().arrivaltime)
                arrivedAscQueue.add(arrAscQueue.remove());
           if(!arrivedAscQueue.isEmpty()) {   //运行就绪队列的队首元素
                min=arrivedAscQueue.remove();
                operation();
                count++;
            }
            //到达时间小于下一进程开始时间就进就绪队列
            while(!arrAscQueue.isEmpty()&&start>=arrAscQueue.peek().arrivaltime){
                arrivedAscQueue.add(arrAscQueue.remove());
            }
        }
        endFun();
    }

3.时间片轮转算法(RR)

代码如下:

 //根据剩余运行时间运行完min进程打印并设置其值和数据成员值
    //只用于时间片轮转算法
    public void operationRR(int minTime){
        min.endtime = start + minTime;
        min.turntime = min.endtime - min.arrivaltime;
        min.dturntime = (double) min.turntime / min.runtime;
        endPrint(min);
        num += min.turntime;
        nums += min.dturntime;
        start = min.endtime;
    }
    //时间片轮转算法
    public void RR(PriorityQueue<PCB>arrAscQueue,int timeR) {
        PriorityQueue<PCB> newArrAscQueue= new PriorityQueue<PCB>((x1,x2)->{return x1.newarrival-x2.newarrival;});
       //如果有,先把前面先到达的进程并且连续运行时间小于时间片的运行完
        while(!arrAscQueue.isEmpty()&&arrAscQueue.peek().runtime<=timeR){
            min=arrAscQueue.remove();
            operation();
            count++;
        }
        while(!arrAscQueue.isEmpty()||!newArrAscQueue.isEmpty()){
            while(!arrAscQueue.isEmpty()&&start>=arrAscQueue.peek().arrivaltime)
                newArrAscQueue.add(arrAscQueue.remove());
            //找出符合算法的进程运行
            if(newArrAscQueue.isEmpty()||
                    (!arrAscQueue.isEmpty()&&newArrAscQueue.peek().newarrival>=arrAscQueue.peek().arrivaltime)
            )
                min=arrAscQueue.remove();
            else
                min=newArrAscQueue.remove();
            if(min.runtime==min.newruntime) {
                start=start>min.arrivaltime?start:min.arrivaltime;
                min.starttime = start;
            }
            int minTime=Math.min(min.runtime,min.newruntime);
            if(minTime<=timeR){
                operationRR(minTime);
                count++;
            }
            else{
                start+=timeR;
                min.newruntime-=timeR;
                min.newarrival+=(newArrAscQueue.size()+1)*timeR;
                newArrAscQueue.add(min);
            }
        }
        endFun();
    }

4.动态优先级算法(PR)

代码如下:

 //比较器,实现动态优先级队列
    public class DynamicPriDecComparator implements Comparator<PCB> {
        @Override
        public int compare(PCB o1, PCB o2) {
            return (start - o2.arrivaltime + o2.priority) - (start - o1.arrivaltime + o1.priority);
        }
    }
    //更新动态优先级(start会改变)
    public void updatePR(PriorityQueue<PCB> PRqueue){
        PriorityQueue<PCB> temp=new PriorityQueue<>(new DynamicPriDecComparator());
        while(!PRqueue.isEmpty())
            temp.add(PRqueue.remove());
        while(!temp.isEmpty())
            PRqueue.add(temp.remove());
    }
    public void PR(PriorityQueue<PCB> arrAscQueue){
        //优先级从大到小为高到低
        PriorityQueue<PCB> newpriDecQueue= new PriorityQueue<PCB>(new DynamicPriDecComparator());
        while(!arrAscQueue.isEmpty()||!newpriDecQueue.isEmpty()){
            //只有进程可开始时间大于arrAscQueue队首元素到达时间才进就绪队列
            while(!arrAscQueue.isEmpty()&&start>=arrAscQueue.peek().arrivaltime)
                newpriDecQueue.add(arrAscQueue.remove());
            //选出符合运行条件的进程
            if(newpriDecQueue.isEmpty())
                min=arrAscQueue.remove();
            else
                min=newpriDecQueue.remove();
            operation();
            count++;
            updatePR(newpriDecQueue);
        }
        endFun();
    }

5.高响应比算法(HRRN)

代码如下:

    //😊比较器,实现高响应比优先级队列
    public class RpDecComparator implements Comparator<PCB> {
        @Override
        public int compare(PCB o1, PCB o2) {
            return (double)(start - o2.arrivaltime )/o2.runtime > (double)(start - o1.arrivaltime )/o1.runtime
                    ?1:-1;
        }
    }

    //更新响应比并更新队列
    public void updateHRR(PriorityQueue<PCB> HRRqueue){
        PriorityQueue<PCB> temp=new PriorityQueue<>(new RpDecComparator());
        while(!HRRqueue.isEmpty())
            temp.add(HRRqueue.remove());
        while(!temp.isEmpty())
            HRRqueue.add(temp.remove());
    }
    //高响应比优先算法
    public void HRRN(PriorityQueue<PCB> arrAscQueue) {
        PriorityQueue<PCB> newrpDecQueue= new PriorityQueue<PCB>(new RpDecComparator());
        while(!arrAscQueue.isEmpty()||!newrpDecQueue.isEmpty()){
            while(!arrAscQueue.isEmpty()&&start>=arrAscQueue.peek().arrivaltime)
                newrpDecQueue.add(arrAscQueue.remove());
            if(newrpDecQueue.isEmpty())
                min=arrAscQueue.remove();
            else
                min=newrpDecQueue.remove();
            operation();
            updateHRR(newrpDecQueue);   //更新响应比并更新队列
            count++;
        }
        endFun();
    }

总结

已经测试过了,和各位伙伴一起进步!文章来源地址https://www.toymoban.com/news/detail-441952.html

到了这里,关于操作系统实验—进程调度算法(java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统-进程调度实验报告

    1.实现四种不同及进程调度算法: 先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。 2. 按照下表

    2024年02月06日
    浏览(39)
  • 计算机操作系统实验:进程调度实验

    前言 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 总结 计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时

    2024年02月07日
    浏览(51)
  • 「 操作系统 」聊聊进程调度算法

    图文并茂!谈谈进程调度那些算法 Cone 进程调度/页面置换/磁盘调度算法 xiaolinCoding 图解经典的进程调度算法 飞天小牛肉 进程调度算法是操作系统中非常重要的一部分,它决定了操作系统中各个进程的执行顺序和时间片。在单核CPU下,任何时刻都只可能有一个程序在执行,比

    2024年02月04日
    浏览(59)
  • 【操作系统之进程调度算法习题】

    在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短作业优先调度算法。现有如下所示的作业序列, 注意 1.具有三道作业的批处理系统指的是内存最多能有3个作业; 2.表格样式是考试时候的格式,练习时候也按这个格式练习各作业的周

    2024年02月11日
    浏览(46)
  • 操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

    1. mygdb 侧调试命令: 2. 第三关.txt : 1.概述:0号进程和1号进程间进程调度过程 (1)从 system_call 函数进入相应的系统调用函数 在两个进程运行 alarm 和 pause 函数时,到执行 alarm 和 pause 系统调用时,都会进入到system_call函数,在下图第一处划线位置根据系统调用号,调用相应的

    2024年02月11日
    浏览(179)
  • 操作系统进程调度算法——先来先服务、时间片轮转、优先级调度算法

    (1)算法内容: 先来先服务调度算法是一种最简单的调度算法,可以应用于高级调度也可以运用于低级调度。高级调度时,FCFS调度算法按照作业进入后备作业队列的先后顺序选择作业进入内存,即先进入后备作业队列的作业被优先选择进入内存,然后为选中的作业创建进程

    2023年04月21日
    浏览(41)
  • 用代码模拟操作系统进程调度算法(Python)

     引言 近日,在学习完操作系统的进程调度部分后,我萌生了一个有趣的想法:通过编写代码来模拟进程调度算法,以加深自己对这一知识点的理解。于是,我花了一整天的时间投入到了这个突发奇想的实践中。  背景 进程调度是操作系统中的重要概念,它决定了如何合理地

    2024年02月06日
    浏览(53)
  • 操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(51)
  • 【操作系统】期末速成之计算题:进程调度算法

    先来先服务是非抢占式的算法 一个🌰 例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用先来先服务调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。 进程 到达时间 运行时间 P1 0 7 P2 2 4

    2024年02月11日
    浏览(40)
  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包