轮转调度算法和动态优先级调度算法

在多道程序环境下,内存中着多个进程,进程数目往往多于处理机数目,这时候我们就要针对该问题设计某种算法,动态地将处理机分配给处于就绪状态的一个进程。进程的调度算法有很多,例如先来先服务调度算法(FCFS),短作业优先算法(SJF),时间片轮转算法(RR)和优先级算法,这里我将通过代码的方式主要介绍轮转调度算法(RR)和动态优先级调度算法.

       首先介绍下轮转调度算法:

        A.轮转法的基本原理:

           在轮转法(RR)法中,系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让其执行一个时间片片。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理机时间。

       B.进程切换时机:

          在轮转调度算法中,应在何时进行进程的切换,可分成两种情况:1.若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,在调度就绪队列中队首的进程运行,并启动一个新的时间片。2.在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。

       C.时间片大小的确定:

          在轮转算法中,时间片的大小对系统性能有着很大的影响。若选择很小的时间内片,将有利于短作业,因为它能在该时间片内完成。但时间片小,意味着会频繁地执行进程调度和进程上下文的切换,这无疑会增加系统的开销。反之,若事件片选择的太长,且为使每个进程都能在一个时间片内完成,轮转算法便退化为FCFS算法,无法满足短作业和交互式用户的需求。一个较为可取的时间片大小是略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成,从而可以获得很小的响应时间。

        D.算法流程图:

                                 

         E.实现代码:


 
 
  1. class PCBRR{
  2. public int id;
  3. public int everyTimeCount;
  4. public int alreadyCpuTime;
  5. public int stillNeedCpuTime;
  6. public PCBRR(int id, int everyTimeCount, int alreadyCpuTime, int stillNeedCpuTime) {
  7. super();
  8. this.id = id;
  9. this.everyTimeCount = everyTimeCount;
  10. this.alreadyCpuTime = alreadyCpuTime;
  11. this.stillNeedCpuTime = stillNeedCpuTime;
  12. }
  13. @ Override
  14. public String toString( ) {
  15. return "进程号:" + this.id + " 已占有的CPU时间:" + this.alreadyCpuTime + " 还需的CPU时间:"
  16. + this.stillNeedCpuTime+ " 每次轮转的时间片数:"+ this.everyTimeCount;
  17. }
  18. }
  19. private static void RoundRobin() {
  20. LinkedList<PCBRR> pcbs = new LinkedList<PCBRR>();
  21. System. out.println( "请输入进程数目:");
  22. int num = scanner.nextInt();
  23. System. out.println( "系统为这" + num + "个进程随机分配优先级数和运行所需的CPU数.以下是进程的详细情况:");
  24. for ( int i = 0; i < num; i++) {
  25. //产生n个进程(id号,每次轮转的时间片数,已占用的CPU时间片数,仍需要的时间片数)
  26. pcbs.addLast( new PCBRR(i,random.nextInt( 5) + 1, 0, random.nextInt( 30) + 1));
  27. }
  28. Iterator iterator = pcbs.iterator();
  29. while (iterator.hasNext()) {
  30. System. out.println(iterator.next());
  31. }
  32. System. out.println();System. out.println();
  33. System. out.println( "下面开始进行轮转法进程调度算法---------------");
  34. LinkedList<Integer> donePCB = new LinkedList<Integer>();
  35. int current = 1;
  36. while(pcbs.size()> 0)
  37. {
  38. System. out.println( "当前正在执行第" + (current++) + "次时间片");
  39. PCBRR pcbrr=pcbs.removeFirst();
  40. System. out.println( "将要执行的进程为 ----"+pcbrr);
  41. pcbrr.alreadyCpuTime++;
  42. pcbrr.stillNeedCpuTime--;
  43. if(pcbrr.stillNeedCpuTime<= 0) //进程总体运行结束
  44. {
  45. donePCB.addLast(pcbrr.id);
  46. }
  47. else if(pcbrr.alreadyCpuTime>=pcbrr.everyTimeCount)
  48. { //进程已经运行完其所分配的每次轮转时间片,将其放在轮转队尾
  49. pcbrr.alreadyCpuTime= 0;
  50. pcbs.addLast(pcbrr);
  51. }
  52. //进程位运行完其所分配的每次轮转时间片,下面仍将继续运行该进程
  53. else {
  54. pcbs.addFirst(pcbrr);
  55. }
  56. System. out.println( "执行完这个时间片后系统轮转队列中的所有进程的情况如下:");
  57. if(pcbs.size()> 0)
  58. {
  59. Iterator temp = pcbs.iterator();
  60. while (temp.hasNext()) {
  61. System. out.println(temp.next());
  62. }
  63. }
  64. else
  65. System. out.println( "空");
  66. System. out.println( "已经完成的进程有:(用进程号表示)");
  67. Iterator itera = donePCB.iterator();
  68. if (!itera.hasNext()) {
  69. System. out.println( "无");
  70. System. out.println();System. out.println();
  71. System. out.println();System. out.println();
  72. continue;
  73. }
  74. while (itera.hasNext()) {
  75. System. out.print(itera.next()+ " ");
  76. }
  77. System. out.println();System. out.println();
  78. System. out.println();System. out.println();
  79. }
  80. System. out.println( "轮转法进程调度算法结束---------------");
  81. }

         接下来介绍动态优先级调度算法:

            A.基本原理;               

     动态优先级调度算法是指在创建进程之初,先赋予其一个优先级,然后其值随着进程的推进或等待时间的增加而改变,以便获得更好的调度性能。例如,可以规定在就绪队列中的进程随其等待的时间的正常,使其优先级相应提高。若所有的进程都具有相同的优先级初值,则最先进入就绪队列的进程会因为其优先级变得最高,而优先获得处理机,这相当于FCFS算法。若所有的就绪进程具有各不相同的优先级初值,那么对于优先级初值低的进程,在等待了足够的时间后,也可以获得处理机。

            B.算法流程图:

                                        

                 C.实现代码:


 
 
  1. class PCBPM implements Comparable {
  2. public int id;
  3. public int pority;
  4. public int cputime;
  5. public PCBPM(int id, int pority, int cputime) {
  6. super();
  7. this.id = id;
  8. this.pority = pority;
  9. this.cputime = cputime;
  10. }
  11. @Override
  12. public int compareTo(Object obj) {
  13. PCBPM pcb = (PCBPM) obj;
  14. if (pcb.pority >= this.pority)
  15. return 1;
  16. return -1;
  17. }
  18. @Override
  19. public String toString() {
  20. return "进程号:" + this.id + " 优先级:" + this.pority + " 所需的CPU时间:" + this.cputime;
  21. }
  22. }
  23. private static void PriorityMethod() {
  24. TreeSet<PCBPM> pcbs = new TreeSet<PCBPM>();
  25. System.out.println( "请输入进程数目:");
  26. int num = scanner.nextInt();
  27. System.out.println( "系统为这" + num + "个进程随机分配优先级数和运行所需的CPU数.以下是进程的详细情况:");
  28. for (int i = 0; i < num; i++) {
  29. pcbs.add( new PCBPM(i, random.nextInt( 60) + 1, random.nextInt( 20) + 1));
  30. }
  31. Iterator iterator = pcbs.iterator();
  32. while (iterator.hasNext()) {
  33. System.out.println(iterator.next());
  34. }
  35. System.out.println();System.out.println();
  36. System.out.println( "下面开始进行优先权进程调度算法---------------");
  37. int current = 1;
  38. LinkedList<Integer> donePCB = new LinkedList<Integer>();
  39. while (pcbs.size() > 0) {
  40. System.out.println( "当前正在执行第" + (current++) + "次时间片");
  41. PCBPM pcb = pcbs.pollFirst();
  42. System.out.println( "将要执行的进程为 ----" + pcb);
  43. pcb.cputime--;
  44. pcb.pority -= 3;
  45. if (pcb.cputime <= 0)
  46. donePCB.addLast(pcb.id);
  47. else
  48. pcbs.add(pcb);
  49. System.out.println( "执行完这个时间片后系统优先进程队列中的所有进程的情况如下:");
  50. if (pcbs.size() > 0) {
  51. Iterator temp = pcbs.iterator();
  52. while (temp.hasNext()) {
  53. System.out.println(temp.next());}}
  54. else
  55. System.out.println( "空");
  56. System.out.println( "已经完成的进程有:(用进程号表示)");
  57. Iterator itera = donePCB.iterator();
  58. if (!itera.hasNext()) {
  59. System.out.println( "无");
  60. System.out.println();System.out.println();
  61. System.out.println();System.out.println();
  62. continue;
  63. }
  64. while (itera.hasNext()) {
  65. System.out. print(itera.next()+ " ");
  66. }
  67. System.out.println();System.out.println();
  68. System.out.println();System.out.println();
  69. }
  70. System.out.println( "优先权进程调度算法结束
  71. ---------------");}
               


    接下来是一些整合工作,我按照以下的流程方式将两种调度算法进行整合:

      程序入口和相关静态对象的代码如下:


 
 
  1. public static Scanner scanner = new Scanner(System. in);
  2. public static Random random = new Random();
  3. public static void main(String[] args) {
  4. System. out.println( "请选择进程调度的方法:");
  5. System. out.println( "1).优先权法 2).轮转法");
  6. int choice = scanner.nextInt();
  7. if (choice == 1)
  8. PriorityMethod();
  9. else
  10. RoundRobin();
  11. }


      实验结果截图:

         1).对于轮转调度算法:

。。。。。。。(由于截图过多,这里仅显示开头和结尾数据)



        2).对于动态优先级调度算法:

  


。。。。。。。(由于截图过多,这里仅显示开头和结尾数据)




PS:自发表了第一篇的银行家算法的博文,慢慢有了阅读量,小小的成就感爆棚,之后就顺手写下操作系统中比较重要的两种进程调度算法,动手写代码,对算法的理解肯定是有帮助的。最后,还是那句话,博客小白还望各位大佬不吝赐教~

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
时间片轮转调度算法的代码如下: ```python class Process: def __init__(self, pid, arrival_time, burst_time): self.pid = pid self.arrival_time = arrival_time self.burst_time = burst_time self.remaining_time = burst_time def execute(self, time_slice): if self.remaining_time > time_slice: self.remaining_time -= time_slice return time_slice else: time_executed = self.remaining_time self.remaining_time = 0 return time_executed def round_robin_scheduling(processes, time_slice): n = len(processes) remaining_processes = processes.copy() current_time = 0 waiting_time = 0 turnaround_time = 0 while remaining_processes: current_process = remaining_processes.pop(0) if current_process.arrival_time > current_time: current_time = current_process.arrival_time time_executed = current_process.execute(time_slice) current_time += time_executed if current_process.remaining_time == 0: waiting_time += current_time - current_process.arrival_time - current_process.burst_time turnaround_time += current_time - current_process.arrival_time else: remaining_processes.append(current_process) avg_waiting_time = waiting_time / n avg_turnaround_time = turnaround_time / n return avg_waiting_time, avg_turnaround_time ``` 静态优先级调度算法的代码如下: ```python class Process: def __init__(self, pid, arrival_time, burst_time, priority): self.pid = pid self.arrival_time = arrival_time self.burst_time = burst_time self.priority = priority def execute(self): self.burst_time -= 1 def static_priority_scheduling(processes): n = len(processes) remaining_processes = processes.copy() current_time = 0 waiting_time = 0 turnaround_time = 0 while remaining_processes: remaining_processes.sort(key=lambda x: (x.priority, x.arrival_time)) current_process = remaining_processes.pop(0) if current_process.arrival_time > current_time: current_time = current_process.arrival_time current_process.execute() current_time += 1 if current_process.burst_time == 0: waiting_time += current_time - current_process.arrival_time - current_process.priority turnaround_time += current_time - current_process.arrival_time else: remaining_processes.append(current_process) avg_waiting_time = waiting_time / n avg_turnaround_time = turnaround_time / n return avg_waiting_time, avg_turnaround_time ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值