NJUPT南邮

2023-10-31

  1. 设计可用于该实验的进程控制块,进程控制块至少包括进程号、状态和要求服务时间;
  2. 动态或静态创建多个进程;
  3. 模拟操作系统四种进程调度算法:先进先出、短作业优先、高优先级优先、高相应比优先中的任意两种。
  4. 调度所创建的进程并显示调度结果。
package EXP04;


public class JCB {
    String name;//进程名
    int arriveTime;//到达时间
    int serveTime;//服务时间
    int beginTime;//开始时间
    int finshTime;//结束时间
    int roundTime;//周转时间
    double aveRoundTime;//带权周转时间
    double clock=0;//在时间轮转调度算法中,记录该进程真实服务时间已经用时的时长
    int waitTime;//记录每个进程到达后的等待时间,只用于最高响应比优先调度算法中
    boolean firstTimeTag=false;//在RR算法中标识开始时间是否第一次计算

    public JCB(String name, int arriveTime, int serveTime,double priority) {
        super();
        this.name = name;
        this.arriveTime = arriveTime;
        this.serveTime = serveTime;
        this.waitTime=0;
    }

    public String toString() {
        String info=new String("进程名:P"+this.name);
        return info;
    }

}

package EXP04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;

public class processMenu {

    ArrayList<JCB> jcb;// 存放所有进程
    LinkedList<JCB> link;// 存放已经进入队列的进程
    ArrayList<JCB> new_jcb;// 存放按指定调度算法排序后的进程
    JCB nowProess;// 当前应执行进程

    public void init() {//初始化
        jcb = new ArrayList<JCB>();
        link = new LinkedList<JCB>();
        new_jcb = new ArrayList<JCB>();
        JCB p1 = new JCB("1", 0, 4,3);
        JCB p2 = new JCB("2", 1, 3,2);
        JCB p3 = new JCB("3", 2, 5,3);
        JCB p4 = new JCB("4", 3, 2,1);
        JCB p5 = new JCB("5", 4, 4,5);
        jcb.add(p1);jcb.add(p2);jcb.add(p3);jcb.add(p4);jcb.add(p5);
        //先将jcb排序,便于下面的算法实现,就不需要再定义一个标识进程是否已到达的boolean,即无需每次都从头开始扫描jcb容器,
        //而是用一个K记录下当前已经扫描到的位置,一次遍历即可,提高了算法效率。
        Collections.sort(jcb, new compareAt_St());
    }

    public void SJF() {// 短作业优先算法
        ProcessQueue pq=new ProcessQueue();
        pq.EnqueueLast();
        System.out.println("*****************************************************");
        System.out.println("短作业优先算法");
        while(!link.isEmpty()) {
            pq.DisplayQueue();//打印当前队列中的进程
            pq.Dequeue();//出队,一次一个
            pq.EnqueueLast();//已到达的进程入队
            Collections.sort(link, new compareSt());//队列中的进程还需按服务时间长度进行排序
        }
    }
    public void HRN() {//最高响应比优先调度算法
        ProcessQueue pq=new ProcessQueue();
        pq.EnqueueLast();
        System.out.println("*****************************************************");
        System.out.println("高相应比优先算法");
        while(!link.isEmpty()) {
            pq.DisplayQueue();//打印当前队列中的进程
            pq.Dequeue();//出队,一次一个
            pq.EnqueueLast();//已到达的进程入队
            Collections.sort(link, new comparePriority());//队列中的进程还需按响应比进行排序
        }
    }
    class ProcessQueue{
        int k = 0;// jcb中的进程遍历时的下标
        int nowTime = 0;// 当前时间
        double sliceTime;//轮转调度时间片
        int i=0;//记录当前出入队列的次数
        public void EnqueueLast() {//进程首次入队,可一次进多个,从队尾进入
            while (k < jcb.size()) {//当遍历完jcb中的所有进程时结束
                if (jcb.get(k).arriveTime <= nowTime) {//已经到达的进程按到达时间先后进入队列
                    link.addLast(jcb.get(k));
                    k++;
                } else {
                    break;//如果该进程还未入队,即先结束遍历,保留当前下标k值,注意:此处不要k--;
                }
            }
        }
        public void EnqueueFirst() {//进程首次入队,可一次进多个,从队首进入
            while (k < jcb.size()) {//当遍历完jcb中的所有进程时结束
                if (jcb.get(k).arriveTime <= nowTime) {//已经到达的进程按到达时间先后进入队列
                    link.addFirst(jcb.get(k));
                    k++;
                } else {
                    break;//如果该进程还未入队,即先结束遍历,保留当前下标k值,注意:此处不要k--;
                }
            }
        }
        public void Dequeue() {//进程出队,一次只出一个
            nowProess = link.removeFirst();//移除队列的队首元素并且返回该对象元素
            nowProess.beginTime = nowTime;//计算开始时间,即为上一个进程的结束时间
            nowProess.finshTime = nowProess.beginTime + nowProess.serveTime;//计算结束时间,该进程开始时间+服务时间
            nowProess.roundTime = nowProess.finshTime - nowProess.arriveTime;//计算周转时间
            nowProess.aveRoundTime = (double) nowProess.roundTime / nowProess.serveTime;//计算平均周转时间
            nowTime = nowProess.finshTime;//获得结束时间,即当前时间,方便判断剩下的进程是否已到达
            new_jcb.add(nowProess);//经处理过数据后加入new_jcb容器
            for(int i=0;i<link.size();++i) {
                link.get(i).waitTime++;//所有进入等待队列的进程等待时间+1,此处只为最高响应比算法所用
            }
        }
        public void Dequeue(double sliceTime) {//重载Dequeue方法,实现轮转调度算法的出队
            nowProess = link.removeFirst();//移除队列的队首元素并且返回该对象元素
            if(nowProess.firstTimeTag==false) {
                /*轮转调度进程可能会多次反复进出队列,不像FCFS和SJF的进程只会进出一次,所以计算开始时间可以设个标志位,让每个进程在
                 * 第一次执行时记录一遍即可*/
                nowProess.beginTime=nowTime;//进程开始执行的时间
                nowProess.firstTimeTag=true;//计算第一次即可,下次无需更新计算
            }
            nowTime+=sliceTime;//每次出队,用时一个时间片,更新当前时间
            nowProess.clock+=sliceTime;//更新当前出队列的进程已服务时间
            if(nowProess.clock>=nowProess.serveTime) {
                nowProess.finshTime=nowTime;//计算该进程完成时间
                nowProess.roundTime = nowProess.finshTime - nowProess.arriveTime;//计算周转时间
                nowProess.aveRoundTime = (double) nowProess.roundTime / nowProess.serveTime;//计算平均周转时间
                new_jcb.add(nowProess);//经处理过数据后加入new_jcb容器
                EnqueueFirst();//已到达的进程先入队
            }
            else {
                EnqueueFirst();//已到达的进程先入队
                link.addLast(nowProess);//上一轮出的再紧接着进入队尾
            }
        }
        public void DisplayQueue(){//队列中等候的进程
            i++;
            System.out.println("第"+i+"次队列中排队的进程:"+link);
        }
    }
    public void printProcess() {
        System.out.println("进程名\t到达时间\t服务时间\t开始时间\t完成时间\t周转时间\t带权周转时间");
        for (int i = 0; i < new_jcb.size(); ++i) {
            System.out.println("P"+new_jcb.get(i).name + "\t     " + new_jcb.get(i).arriveTime + "\t     " +
                    new_jcb.get(i).serveTime+ "\t     " + new_jcb.get(i).beginTime + "\t     " + new_jcb.get(i).finshTime +
                    "\t     "+ new_jcb.get(i).roundTime + "\t     " + String.format("%.2f",new_jcb.get(i).aveRoundTime));
        }
        new_jcb.clear();//清空new_jcb容器内的内容,方便存储各种算法的结果并展示
    }
}

class compareSt implements Comparator<JCB> {// 按服务时间升序
    public int compare(JCB arg0, JCB arg1) {
        return arg0.serveTime - arg1.serveTime;
    }
}

class compareAt_St implements Comparator<JCB> {// 按到达时间升序,若到达时间相同,按服务时间升序
    public int compare(JCB o1, JCB o2) {
        int a = o1.arriveTime - o2.arriveTime;
        if (a > 0)
            return 1;
        else if (a == 0) {
            return o1.serveTime > o2.serveTime ? 1 : -1;
        } else
            return -1;
    }
}
class comparePriority implements Comparator<JCB>{//按响应比升序排序

    public int compare(JCB o1, JCB o2) {
        double r1=(double)o1.waitTime/o1.serveTime;
        double r2=(double)o2.waitTime/o2.serveTime;
        return r1>r2?1:-1;
    }

}

package EXP04;

public class TestProcess {
    public static void main(String[] args) {
        processMenu pm=new processMenu();
        pm.init();//初始化容器
        pm.SJF();
        pm.printProcess();
        pm.HRN();
        pm.printProcess();
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NJUPT南邮 的相关文章

随机推荐

  • Montery 无法接收12.1更新问题的处理

    Monterey 无法接收12 1更新问题的处理 说干货 打开App Store 搜索Monterey 点击macOS Monterey上的 查看 或者 获取 如果进度条卡住 重启系统再试
  • java zip压缩文件中文文件名乱码

    使用java util zipoutputstream发现中文名出现乱码 一直试着使用new String filename getBytes GBK ISO 8859 1 还是无效 后来查阅资料 java util zipoutputst
  • 字符串分割的几种方法

    方法一 利用STL自己实现split 函数 常用 简单 直观 原型 vector
  • 转 欢迎使用CSDN-markdown编辑器

    https blog csdn net CSDNwei article details 51836182 Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义 谨记 声明可以多次 定义只能一次 函数的声明extern关键词是可
  • java正则表达式讲解

    工具集正则表达式 http www ostools net regex w w w w w w w w email邮箱 注 本文为转载文章本文实在是不错的 参考博客 http lavasoft blog 51cto com 62575 80
  • 【Jmeter服务器资源监控ServerAgent无法连接】

    问题 通过Jmeter对接口进行压测 需要监控服务器资源 但是发现PerfMon Metrics Collector一直提示ERROR java net ConnectException Connection refused connect
  • 【工作必备技能整理】openpyxl全套教程,提升工作效率【接力pandas】

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 openpyxl在我看来 就是用代码代替我们的双手 在EX
  • CocosCreator3.8研究笔记(一)windows环境安装配置

    一 安装Cocos 编辑器 1 下载Cocos Dashboard安装文件 Cocos 官方网站Cocos Dashboard下载地址 https www cocos com creator download9 下载完成后会得到CocosD
  • Git clone fetch-pack unexpected disconnect while reading sideband packet

    在执行 git clone 命令遇到以下错误 remote Enumerating objects 1252 done remote Counting objects 100 1252 1252 done remote Compressin
  • 原来牛客网练习题还能这么做?

    笔者最新更新牛客网练习题 笔者开头感想 如今大部分高校已经开学 当然笔者也不列外 但是由于疫情的原因 笔者被迫在家上网课学习 一脸忧愁 而这恰恰给了笔者自学的机会 相信笔者会加油滴 按照时间的步伐来追寻科班的脚步 C语言练习题集册见 1 牛
  • jsonp跨域,原生js和ajax实现百度,360,必应等浏览器搜索框的智能补全提示技术,带搜索功能的搜索框

    相信许多刚学前端的的同学 都曾对浏览器搜索框自动提示提示的功能挺好奇的 接下让我们一起揭露他的神秘面纱吧 相信学过javascript的同学都引用过外部的JavaScript吧 其实跨域就是动态的创建script标签 将script标签ur
  • Dynamics 365 APP -- 清晰定义你的系统职责范围

    今天我们来看看Dynamics 365 的一个新feature APP 对的 没错是APP 各位小伙伴肯定很诧异 难道Dynamics 365又推出了新版本的APP吗 如果各位这么想的话就中了博主的招了 因为博主故意放了一个烟雾弹 今天要讲
  • Windows下把CUDA程序生成dll库并在项目中调用dll中的函数

    如何把自己写的cuda代码生成dll库 方便集成到其他主项目中去进行调用呢 这里总结了一个基本流程 操作环境 Windows10 visual studio2017 cuda10 2 opencv4 2都已经安装并配置好了 主题1 cuda
  • 西门子PLC内部的数据类型大全

    西门子PLC的数据类型种类繁多 本文进行了收集 并指明了适用范围 长度 供需要进行数据采集和分析的朋友们参考 本表格整理自博图V14 不保证更高级版本不会新增数据类型 请使用中注意 类别 数据类型 长度 位 长度 字节 S7 300 400
  • php 递归面试题_8个PHP数组面试题,php数组试题

    8个PHP数组面试题 php数组试题 网上找的PHP数组题 准备自己做一遍并且记录下来 1 写函数创建长度为10的数组 数组中的元素为递增的奇数 首项为1 复制代码 代码如下 function arrsort first length ar
  • Python 十大装 B 语法【Python干货】

    Python 是一种代表简单思想的语言 其语法相对简单 很容易上手 不过 如果就此小视 Python 语法的精妙和深邃 那就大错特错了 本文精心筛选了最能展现 Python 语法之精妙的十个知识点 并附上详细的实例代码 如能在实战中融会贯通
  • Exception 处理之最佳实践

    作者 Gunjan Doshi 2003 11 19 译者注 本文算是一篇学习笔记 仅供学习参考使用 有不妥之处 还请指出 2003 12 04 本文是Exception处理的一篇不错的文章 从Java Exception的概念介绍起 依次
  • L3 Hive操作

    示例 1 建表 create table t dml detail id bigint sale date date province string city string product id bigint cnt double amt
  • Yarn的安装详解?Yarn的各种系统安装详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如何在不同系统环境中安装Yarn Yarn在各种系统的安装详解 Yarn的安装详细的教程 希望能帮助一些程序袁 工具 原料 电脑 Yarn Windows安装详解 1 可以
  • NJUPT南邮

    设计可用于该实验的进程控制块 进程控制块至少包括进程号 状态和要求服务时间 动态或静态创建多个进程 模拟操作系统四种进程调度算法 先进先出 短作业优先 高优先级优先 高相应比优先中的任意两种 调度所创建的进程并显示调度结果 package