学校布置作业,敲了好久代码,真的好累!

这里把时间片定为2 大家有需要的就参考参考 本人学艺不精.....

Main函数 调用方法

public class Main {public static void main(String[] args) {cal RR = new cal();RR.input();}
}

程序块类

public class pcb {private String name;private int needtime;int arrivetime = 0;private Integer cputime = 0;private String state;private int round = 0;private int count = 0;public pcb() {}public pcb(String name, int needtime) {this.name = name;this.needtime = needtime;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getNeedtime() {return needtime;}public void setNeedtime(int needtime) {this.needtime = needtime;}public Integer getCputime() {return cputime;}public void setCputime(Integer cputime) {this.cputime = cputime;}public String getState() {return state;}public void setState(String state) {this.state = state;}public int getRound() {return round;}public void setRound(int round) {this.round = round;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}}

方法类

public class cal {public static void input() {Scanner sc = new Scanner(System.in);System.out.println("please input the number of processes:");int input = sc.nextInt();pcb[] pcb1 = new pcb[input];//创建pcb数组List Wait = new ArrayList<String>();     //创建等待队列List Ready = new ArrayList<String>();     //创建就绪队列List Done = new ArrayList<String>(); //创建完成队列List Sout = new ArrayList<String>();  //定义一个列表 用于排序System.out.println("input name and needtime:");int round = 2;//创建时间片大小int i;for (i = 0; i < input; i++) {String a = sc.next();//输入名字Sout.add(a);int b = sc.nextInt();//输入需要的时间pcb1[i] = new pcb(a, b);//创建数组  按照input的数量}pcb temp = new pcb();for (i = 0; i < input - 1; i++) {    //排列,按照arrivetime 先到达的排在前面int j;for (j = 0; j < input - 1 - i; j++) {if (pcb1[j].arrivetime > pcb1[j + 1].arrivetime)//冒泡排序{temp = pcb1[j];pcb1[j] = pcb1[j + 1];pcb1[j + 1] = temp;}}}int nowtime = pcb1[0].arrivetime;  //现在的时间--直接从第一个pcb块到达的时间开始for (i = 0; i < input; i++) {if (pcb1[i].arrivetime >= nowtime) {         //如果现在的时间大于到达时间就进入就绪队列Ready.add(pcb1[i].getName());  //往就绪队列中添加名字pcb1[i].setState("W");//就绪队列的W} else {                                      //否则进入等待队列Wait.add(pcb1[i].getName());   //往等待队列中添加名字 String类型pcb1[i].setState("W");//等待队列的W}}//运行的次数等于?//当大家需要的时间都为0的时候,结束循环.while(true){check(input,Ready,Done,Sout,pcb1,round);int c = 0;//这是一个伟大的算法 先定义一个变量用于计数for (int j = 0; j < input; j++) {if(pcb1[j].getNeedtime()==0){c+=1;//如果所有的时间块的needtime都为0了,就可以结束了}//顶级理解}if(c==input){break;}}}public static void check(int input,List Ready,List Done,List Sout,pcb[] pcb1,int round) {int r1 = 0;//把就绪队列中第一个抽出来 用于进入运行态int j;for (j = 0; j < input; j++) {if (Ready.get(0).equals(pcb1[j].getName())) {r1 = j;}}pcb1[r1].setState("R");//把状态设为RSystem.out.println("Name  cputime  needtime  count  round  state");   //输出排序后的进程for (j = 0; j < input; j++) {for (int i = 0; i < input; i++) {//遍历一下 取出与排列数组索引对应的程序块if (Sout.get(j).equals(pcb1[i].getName())){System.out.print("  " + pcb1[i].getName() + "     ");//获取名字System.out.print(pcb1[i].getCputime() + "      ");//获取占用cpu的时间System.out.print(pcb1[i].getNeedtime() + "        ");//获取需要使用的时间System.out.print(pcb1[i].getCount() + "         ");//获取使用cpu的轮数System.out.print(round + "         ");//输出时间片System.out.println(pcb1[i].getState());}}}Ready.remove(pcb1[r1].getName());//删除掉 就绪 队列中第一个Sout.remove(pcb1[r1].getName());//删除掉 排列 队列中对应就绪的元素 因为这个环节要用到他 后续要把它拿到第一位if(Ready.size()!=0){Sout.remove(Ready.get(0));//先把下一个要进入使用的删除}Integer realtime = 0;//定义一个变量 用于判断如果时间片没用完进程块就结束的情况 实际占用cpu的时间if (pcb1[r1].getNeedtime() - round >= 0) {realtime = round;} else if (pcb1[r1].getNeedtime() - round < 0) {realtime = pcb1[r1].getNeedtime();}pcb1[r1].setNeedtime(pcb1[r1].getNeedtime() - realtime);//设置还需要的时间 减去时间片if (realtime == round) {pcb1[r1].setCputime(pcb1[r1].getCputime() + round);} else if (realtime == 1) {                //设置Cpu占用时间pcb1[r1].setCputime(pcb1[r1].getCputime() + realtime);}if (pcb1[r1].getNeedtime() > 0) {Ready.add(pcb1[r1].getName());//如果需要时间仍然大于0 就重新添加回就绪队伍pcb1[r1].setState("W");} else {pcb1[r1].setState("F");Ready.remove(pcb1[r1].getName());Done.add(pcb1[r1].getName());}pcb1[r1].setCount(pcb1[r1].getCount() + 1);Sout.add(pcb1[r1].getName());if(Ready.size()!=0){Sout.add(0,Ready.get(0));//添加回去}System.out.println("就绪队列:" + Ready);System.out.println("完成队列:" + Done);if (Ready.size() == 0) {System.out.println("\n");System.out.println("最终结果:");System.out.println("Name  cputime  needtime  count  round  state");   //输出排序后的进程for (j = 0; j < input; j++) {for (int i = 0; i < input; i++) {//遍历一下 取出与排列数组索引对应的程序块if (Sout.get(j).equals(pcb1[i].getName())){System.out.print("  " + pcb1[i].getName() + "     ");//获取名字System.out.print(pcb1[i].getCputime() + "      ");//获取占用cpu的时间System.out.print(pcb1[i].getNeedtime() + "        ");//获取需要使用的时间System.out.print(pcb1[i].getCount() + "         ");//获取使用cpu的轮数System.out.print(round + "         ");//输出时间片System.out.println(pcb1[i].getState());}}}System.out.println("就绪队列:" + Ready);System.out.println("完成队列:" + Done);}}

Java 操作系统实验 时间片轮转法相关推荐

  1. 时间片轮转调度 java_操作系统- 实验一  模拟处理机调度的时间片轮转法(Java实现)...

    实验一  模拟处理机调度的时间片轮转法 一.实验目的:用c/c++模拟时间片轮转法 二.实验内容:输入进程的个数,每个进程的名称及每个进程需要工作的时间,本实验中假定对CPU时间片设置为一个时间单位, ...

  2. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

  3. 【南邮操作系统实验】银行家算法Java版

    这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...

  4. 计算机操作系统实验之进程调度(一)轮转调度法(C语言)

    计算机操作系统实验之进程调度(一)轮转调度法(C语言) 实验目的 实验内容与基本要求 轮转调度法的基本原理 实现思路及功能分析 算法流程图 全部代码 工程图 ProcessScheduling.h P ...

  5. java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...

    实验:动态分区式存储管理 实验内容: 编写程序模拟完成动态分区存储管理方式的内存分配和回收.实验具体包括:首先确定内存空闲分配表:然后采用最佳适应算法完成内存空间的分配和回收:最后编写主函数对所做工作 ...

  6. 操作系统课程设计--模拟时间片轮转法

    课程设计题目 设计一个按照时间片轮转法实现处理机调度的程序. 实验内容 (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块的格式如下表所示,且参数意义也相同. 进程名 链 ...

  7. 操作系统课程设计-时间片轮转法

    一.课程设计题目及内容 设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下: (1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表.进程控制块的 ...

  8. 时间片轮转RR进程调度算法(操作系统实验 C+)

    时间片轮转RR进程调度算法 1.实验目的 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变.进程调度的策略及对系统性能的评价方法. 2.实验内容 问题描述: 设计程序模拟进程的时间片轮转R ...

  9. 操作系统-轮转法(时间片轮转法)

    轮转法(时间片轮转法) 简介 在轮转算法中,系统根据先来先服务策略,将所有的就绪进程排成一个就绪队列.并可设置每隔一定的时间间隔即可产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给 ...

最新文章

  1. 虚拟化技术原理与实现 pdf_多进程的实现原理-多道技术
  2. MySQL 数据库救火:磁盘爆满了,怎么办?
  3. Git-本地库与中央库
  4. Yum介绍与常见用法
  5. Windows 安装kafka-python库
  6. arcgis加载经纬度信息并导入91地图
  7. vb整合多个excel表格到一张_vba实现excel多表合并
  8. t’触发器真值表和状态方程_t触发器(d触发器真值表)
  9. linux无法连接共享文件夹,linux下samba服务器共享文件windows无法访问
  10. Week7 B - TT 的旅行日记
  11. Power BI 企业邮箱账户注册
  12. 双显示器LOL加载游戏提示error无法初始化图形设备解决方法
  13. 2020进博会品牌第一自行车辐轮王助力中国新时代健康建设大业
  14. xgb.cv进行交叉验证
  15. 缓存服务器 之 Linux下缓存服务器的应用
  16. 定义一个数组存储10个上面描述的小怪兽,每个小怪兽的名字为(小怪兽+数组下标)
  17. 博思得打印机如何打印序列号标签
  18. 支付宝基金转招商证券转场内基金条件
  19. 唯众职教学生实训系统
  20. htmlcss小白标签篇

热门文章

  1. 将cmder安装到windows xp上
  2. Python的解包知识
  3. java 对象查找_Java如何从数组中查找对象元素?
  4. Python3 File flush() 方法、 Python3 File write() 方法
  5. 天行数据的开放API接口
  6. 有关QJ_Filecenter在vue中的使用和组件封装
  7. Python的rabbitMQ
  8. 高等数学一:函数与极限二:对数列极限定义的理解
  9. VUE 创建组件并且引用
  10. pytorch中的一维数组,是列向量还是行向量?