基于JAVA的进程调度算法

Theonly

发布日期: 2018-11-03 00:24:18 浏览量: 603
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

一、需求分析

在Java开发环境下,模拟进程调度算法,其中该算法所需要的具体功能为:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。

算法的具体描述为:每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数、需要的运行时间及到达时间可以事先人为地指定(也可以由随机数产生)。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。

二、概要设计

为了符合题目需求,该工程主要有三个实现类:

  • Process(进程类),主要用来实例化各个不同的进程

  • ProcessBlock(进程控制块类),用来为每个进程分配PCB,该类实例化后为进程类的类成员变量

  • ProcessControl(进程控制类),为主类,用来调度进程。

其中,在进程调度中,声明了三个队列,分别为待插入进程队列(按到达时间从小到大排序),就绪队列(按优先级从大到小排序,按照到达时间先后进行排序),完成队列。都ArrayList<Process>类型变量。

调度算法描述:

  1. 程序开始时随机为初始化5个进程(程序太多不容易观察运行结果)

  2. 声明时间变量t,while循环下调度程序一直运行,每运行一次,t++

  3. 然后循环判断待插入队列队首进程是否到达,若到达,则将该进程插入到就绪队列中,并从待插入队列删除该进程;若没有到达,则从该循环中跳出

  4. 然后从就绪队列中取出队首进程并分配时间片。当该进程时间片用完后,判断该进程是否已经完成,若完成,则将该进程插入到完成队列;若没有完成,则将该进程的优先级减一并重新插入到就绪队列中

  5. 一直重复该循环,一直到待插入队列和就绪队列都为空为止

三、详细设计

3.1 设计思想

采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。

3.2 模块设计

所使用的数据结构(简化,仅成员变量,具体请见源码)

  1. public class ProcessBlock {
  2. private String name; //进程名
  3. private int priority; //优先数 1-10
  4. private int arriveTime; //到达时间 1-50
  5. private int needTime; //需要时间 1-20
  6. private int waitTime; //等待时间 1-20
  7. private int alreadyUseTime; //已占用CPU时间
  8. private char status; //进程状态 W, R, F
  9. }
  10. public class Process {
  11. private ProcessBlock pcb;
  12. }
  13. public class ProcessControl {
  14. private final static int uTime = 1; // 时间片
  15. private static int time = 0; // 模拟时间
  16. ArrayList<Process> processA = new ArrayList();// 待插入的进程 ArrayList<Process> processB = new ArrayList();// 就绪队列
  17. ArrayList<Process> processFinish = new ArrayList();// 完成队列
  18. }
  • 输入子模块

    系统自动随机产生5个进程,并且随机对它们进行初始化,并按照进程产生的创建的时间进行排序插入到待插入队列中

  • 进程调度子模块

    采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)对就绪队列中的进程进行进程调度

  • 输出子模块

    系统每调度进程一次,都会产生输出,将正在运行中的进程和就绪队列,完成队列中的进程信息全部打印出来

四、调试分析

  • 遇到的问题

    当进程太多时,输出结果非常多,不利于分析系统调度算法的正确性

  • 解决方案

    将进程数量相应的减少之后,使输出结果相应的减少之后,使可分析程度保证在可接受的范围之内。

  • 调试结果(输出结果太多,仅部分输出结果)

  1. >各进程到达信息表:
  2. >0 name-> process4,priority-> 10,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 0,waitTime-> 0,status-> W
  3. >1 name-> process1,priority-> 2,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
  4. >2 name-> process2,priority-> 5,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 0,waitTime-> 0,status-> W
  5. >3 name-> process0,priority-> 5,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
  6. >4 name-> process3,priority-> 4,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 0,waitTime-> 0,status-> W
  7. >时间:
  8. >1
  9. >正在运行的进程:
  10. >name-> process4,priority-> 10,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 0,waitTime-> 0,status-> R
  11. >就绪队列
  12. >完成队列
  13. ----------------------------------------------------------------
  14. >时间:
  15. >2
  16. >正在运行的进程:
  17. >name-> process4,priority-> 9,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 1,waitTime-> 0,status-> R
  18. >就绪队列
  19. >name-> process2,priority-> 5,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 0,waitTime-> 0,status-> W
  20. >name-> process1,priority-> 2,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
  21. >完成队列
  22. ----------------------------------------------------------------
  23. >时间:
  24. >3
  25. >正在运行的进程:
  26. >name-> process4,priority-> 8,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 2,waitTime-> 0,status-> R
  27. >就绪队列
  28. >name-> process2,priority-> 5,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 0,waitTime-> 1,status-> W
  29. >name-> process0,priority-> 5,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 0,waitTime-> 0,status-> W
  30. >name-> process1,priority-> 2,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 0,waitTime-> 1,status-> W
  31. >完成队列
  32. ----------------------------------------------------------------
  33. >时间:
  34. >39
  35. >正在运行的进程:
  36. >name-> process1,priority-> 0,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 6,waitTime-> 2,status-> R
  37. >就绪队列
  38. >name-> process3,priority-> 0,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 8,waitTime-> 0,status-> W
  39. >完成队列
  40. >name-> process4,priority-> -1,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 8,waitTime-> -1,status-> F
  41. >name-> process0,priority-> -1,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
  42. >name-> process2,priority-> -1,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 9,waitTime-> -1,status-> F
  43. ----------------------------------------------------------------
  44. >时间:
  45. >40
  46. >正在运行的进程:
  47. >name-> process3,priority-> 0,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 8,waitTime-> 1,status-> R
  48. >就绪队列
  49. >完成队列
  50. >name-> process4,priority-> -1,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 8,waitTime-> -1,status-> F
  51. >name-> process0,priority-> -1,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
  52. >name-> process2,priority-> -1,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 9,waitTime-> -1,status-> F
  53. >name-> process1,priority-> -1,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
  54. ----------------------------------------------------------------
  55. >时间:
  56. >41
  57. >正在运行的进程:
  58. >就绪队列
  59. >完成队列
  60. >name-> process4,priority-> -1,arriveTime-> 1,needTime-> 8,alreadyUseTime-> 8,waitTime-> -1,status-> F
  61. >name-> process0,priority-> -1,arriveTime-> 3,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
  62. >name-> process2,priority-> -1,arriveTime-> 2,needTime-> 9,alreadyUseTime-> 9,waitTime-> -1,status-> F
  63. >name-> process1,priority-> -1,arriveTime-> 2,needTime-> 7,alreadyUseTime-> 7,waitTime-> -1,status-> F
  64. >name-> process3,priority-> -1,arriveTime-> 10,needTime-> 9,alreadyUseTime-> 9,waitTime-> -1,status-> F
  65. >1.5用户使用说明
  66. >由于该程序是在java环境下编写的,故用户请在eclipse开发工具中打开项目,并运行该项目即可。
上传的附件 cloud_download 基于JAVA的进程调度算法.zip ( 29.95kb, 22次下载 )
error_outline 下载需要4点积分

发送私信

班主任最经典的一句话;整栋楼里就咱们班最吵

4
文章数
6
评论数
最近文章
eject