当前位置:   article > 正文

先来先服务(FCFS)的简单模拟实现(java)_先来先服务调度算法的模拟

先来先服务调度算法的模拟

目录

一、算法原理

 1.先来先服务(FCFS)

2.非抢占式短作业优先(SPF)

3.抢占式短作业优先(SJF)

4.高响应比优先调度算法(HRRN)

二、实验示例

三、具体代码

四、结果展示


一、算法原理

几种常用的调度算法原理

 1.先来先服务(FCFS)

       当作业调度采用该算法时,系统将按作业先后到达的次序来进行调度,或者说它是优先选择等待时间长的作业,将他们调入内存,而不管作业执行时间的长短,只有当该进程执行完或发生某事件而阻塞后,进程调度程序才将处理机分配给其它进程。

2.非抢占式短作业优先(SPF)

        以作业的长短来计算优先级,作业越短优先级越高,优先级越高的进程先执行,但是这种算法不是抢占式的,即如果有进程正在执行不能抢占处理机,而是要等进程执行完毕才能去调度优先级较高的进程先执行。

3.抢占式短作业优先(SJF)

       原理与SPF基本相同,但是不同的是SJF是抢占式的,即如果有一个进程的执行时间比当前正在执行的进程的剩余时间少的话就抢占当前的进程

4.高响应比优先调度算法(HRRN)

为每一个作业(进程)引入一个动态优先级,这个动态优先级随时间而增大,每当一个进程执行完毕或约到阻塞时就要通过这个算法计算出下一个要执行的作业

计算公式为:优先权=(等待时间+要求服务时间)/要求服务时间

二、实验示例

下面以FCFS为举例展示

  process

          Arrival Time       

           Brust Time

                    p1

                         0

                       3

                    p2

                         2

                        6

                    p3

                         4

                        4

                    p4

                         6

                         5

                    p5

                         8

                         2

分别计算出上表5个进程完成时间、周转时间、带权周转时间,并计算出平均周转时间和平均带权周转时间。

周转时间 = 完成时间 - 到达时间

带权周转时间 = 周转时间 / 完成一个进程需要的时间

三、具体代码

  1. import java.util.Scanner;
  2. public class ThreadDispatch {
  3. public static void FCFS(work[] works){
  4. System.out.println("先来先服务模拟开始。。。。");
  5. work w;
  6. for(int i = 0;i < works.length;i++){//按照冒泡排序按照到达时间进行升序排列
  7. for (int j = 0; j < works.length - i - 1; j++) {
  8. if(works[j].arrivalTime > works[j+1].arrivalTime){
  9. w = works[j];
  10. works[j] = works[j+1];
  11. works[j+1] = w;
  12. }
  13. }
  14. }
  15. double totalTime = 0;//记录时间
  16. double[] turnTimes = new double[works.length];//记录每个进程的周转时间
  17. double[] weightTurnTimes = new double[works.length];//记录每个进程的带权周转时间
  18. for (int i = 0; i < works.length; i++) {
  19. System.out.println("当前时间: " + totalTime + ", " + works[i].processName + "开始运行" + "* * * * * *,运行时间为:" + works[i].burstTime);
  20. totalTime += works[i].burstTime;//完成时间
  21. double turnTime = totalTime-works[i].arrivalTime;//周转时间
  22. turnTimes[i] = turnTime; //记录每个进程的周转时间
  23. double weightTurnTime = turnTime/works[i].burstTime;//带权周转时间
  24. weightTurnTimes[i] = weightTurnTime;
  25. System.out.println("完成时间:" + totalTime + "\t周转时间:" + turnTime + "\t带权周转时间: " + weightTurnTime);
  26. System.out.println("\n");
  27. }
  28. double tempTurnTimes = 0; //为计算平均周转时间
  29. for (int i = 0; i < weightTurnTimes.length; i++) {
  30. tempTurnTimes += turnTimes[i];
  31. }
  32. double tempweightTurnTimes = 0; //为计算平均带权周转时间
  33. for (int i = 0; i < weightTurnTimes.length; i++) {
  34. tempweightTurnTimes += weightTurnTimes[i];
  35. }
  36. System.out.println("平均周转时间为:" + tempTurnTimes/works.length + ",平均带权周转时间为:" + tempweightTurnTimes/works.length);
  37. }
  38. public static void main(String[] args) {
  39. Scanner scan = new Scanner(System.in);
  40. System.out.print("输入要执行的进程个数:");
  41. int n = scan.nextInt();
  42. work[] works = new work[n];
  43. System.out.println("请分别输入processName arrivalTime burstTime");
  44. for(int i = 0;i < n;i++){
  45. String name = scan.next();
  46. double time1 = scan.nextDouble();
  47. double time2 = scan.nextDouble();
  48. works[i] = new work(name,time1,time2);
  49. }
  50. // System.out.println("展示线程的信息:");
  51. // for(int i = 0;i<n;i++){
  52. // System.out.println(works[i].processName + " " + works[i].arrivalTime + " " + works[i].burstTime);
  53. // }
  54. FCFS(works);
  55. }
  56. }
  57. class work{
  58. String processName; //进程名
  59. double arrivalTime; //一个作业或进程到达的时间
  60. double burstTime; //进程执行需要的时间
  61. public work(String processName,double arrivalTime,double burstTime){
  62. this.arrivalTime = arrivalTime;
  63. this.burstTime = burstTime;
  64. this.processName = processName;
  65. }
  66. }

四、结果展示

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/582400
推荐阅读
相关标签
  

闽ICP备14008679号