【调度】操作系统中调度算法(FCFS、RR、SPN(SJF)、SRT、HRRN)

决策模式

决策模式说明选择函数在执行的瞬间的处理方式,通常分为以下两类:

非抢占:一旦进入运行状态,就不会终止直到运行结束。

抢占:当前正在运行的进程可以被打断,并转移到就绪态。

 一个调度算法是否能抢占,对进程的顺序有着极大的影响。

先来先服务FCFS

  先来先服务是最简单的策略,也成为先进先出FIFO。首先它是一个非抢占的。如字面的意思,它根据进程到达时间决定先运行哪一个进程。

  这里给出一个实际的例子。以表格的形式表现出在FIFO策略下各进程的情况。

简单说就是依次执行完成,从时间轴上来看

以表格的形式展现:

其中开始时间是上一个进程的结束时间

      结束时间=开始时间+服务/执行时间

      周转周期=结束时间-到达时间

      带权周转时间=周转时间/服务时间

最短进程优先SPN

也称最短作业优先(Short Job First,SJF)。它也是一个非抢占的。是根据服务的时间经行选择。在这里要注意下到达时间的顺序。比如实例中单纯以大小来排序的话是E-A-C-D-B,但正确的排序一定是A-B为开头。以时间为顺序:

 

例子中A运行结束时间为3,这时只有B进程等待。所以A运行结束后直接运行B。B结束后时间点到9,CDE都在等待。这个时候就选择服务时间最少的E,然后是较少的C,最后是D。以表格的形式展示:

最短剩余时间优先SRT

SRT是针对SPN增加了抢占机制的版本,就好比例子中B运行时间非常长,在这期间其他所有的进程都在等待,如果将其中断,先处理所需时间少的,运行效率会有显著提升。一定要先明确SRT是抢占的。先给出时间为顺序的图:

 

1. A先运行至2,B到达等待。

2. A运行到3结束,B开始运行。

3. B开始运行,运行到4时,C进程到达,且C只需要4,此时B还需要5。所以先运行C,B继续等待。

4. C运行时间点到达6时,D到达,D需要5,进入等待,排在B后。

5. C运行结束,此时时间点是8,E到达,运行时间只要2,小于等待的BD,直接运行。

6. C运行结束,B开始运行。

7. B运行结束,D开始运行。

以表格的形式展现:

 

轮转RR

轮转也称时间片技术(time slicing,SL),对于轮转法,最重要的是时间片的长度。轮转算法以一个周期(q)产生中断,当中断发生时,当前运行的程序置于就绪队列(队尾)中,然后基于FCFS选择下一个就绪作业运行。在这里我们以时间片q=1举例。

q=1,所以一次只能运行一个时间片。

0:A1运转(右标表示运行了几个)

1:A2运转

2:B1运转,A3等待(B开始)

3:A3运转,B2等待

4:B2运转,C1等待,(A结束)

5:C1运转,B3等待(C开始)

6:B3运转,D1等待,C2等待

7:D1运转,C2等待,B4等待(D开始)

8:C2运行,B4等待,E1等待,D2等待

9:B4运行,E1等待,D2等待,C3等待

10:E1运行,D2等待,C3等待,B5等待(E开始)

11:D2运行,C3等待,B5等待,E2等待

12:C3运行,B5等待,E2等待,D3等待

13:B5运行,E2等待,D3等待,C4等待

14:E2运行,D3等待,C4等待,B6等待

15:D3运行,C4等待,B6等待(E结束)

16:C4运行,B6等待,D4等待

17:B6运行,D4等待(C结束)

18:D5运行,D6等待(B结束)

19:D6运行

20:D结束

表格展示:

 

 

高响应比优先HRRN

高响应比优先调度算法

高响应比优先调度算法主要用于作业调度,该算法是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。 

响应比的变化规律可描述为:

响应比=(等待时间+服务时间)/服务时间

根据公式可知:

当作业的等待时间相同时,则要求服务时间越短,其响应比越高,有利于短作业。

当要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而它实现的是先来先服务。

对于长作业,作业的响应比可以随等待时间的增加而提高,当其等待时间足够长时,其响应比便可升到很高,从而也可获得处理机。克服了饥饿状态,兼顾了长作业。

 

原文:https://blog.csdn.net/xieminyao123/article/details/79116985

  • 16
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统的进程调度算法有很多,其比较常见的有FCFS(先来先服务)、SJF(短作业优先)和RR(时间片轮转)等。下面分别介绍这三种调度算法的Java实现。 1. FCFS算法实现 FCFS算法即先来先服务,按照进程到达的顺序进行调度。 ``` import java.util.LinkedList; import java.util.Queue; public class FCFS { public static void main(String[] args) { Queue<Process> queue = new LinkedList<>(); // 创建进程并加入队列 queue.offer(new Process(1, 0)); queue.offer(new Process(2, 2)); queue.offer(new Process(3, 3)); queue.offer(new Process(4, 5)); int currentTime = 0; // 当前时间 int totalWaitTime = 0; // 总等待时间 while (!queue.isEmpty()) { Process process = queue.poll(); // 进程等待时间 int waitTime = currentTime - process.getArrivalTime(); totalWaitTime += waitTime; // 更新当前时间 currentTime += process.getBurstTime(); System.out.printf("Process %d:\n", process.getPid()); System.out.printf("Arrival Time: %d\n", process.getArrivalTime()); System.out.printf("Burst Time: %d\n", process.getBurstTime()); System.out.printf("Wait Time: %d\n", waitTime); System.out.printf("Turnaround Time: %d\n", waitTime + process.getBurstTime()); System.out.println(); } // 平均等待时间 double avgWaitTime = (double) totalWaitTime / 4; System.out.printf("Average Wait Time: %.2f\n", avgWaitTime); } static class Process { private int pid; // 进程ID private int arrivalTime; // 到达时间 private int burstTime; // 资源占用时间 public Process(int pid, int arrivalTime) { this.pid = pid; this.arrivalTime = arrivalTime; this.burstTime = (int) (Math.random() * 10) + 1; // 随机生成资源占用时间 } public int getPid() { return pid; } public int getArrivalTime() { return arrivalTime; } public int getBurstTime() { return burstTime; } } } ``` 输出结果为: ``` Process 1: Arrival Time: 0 Burst Time: 6 Wait Time: 0 Turnaround Time: 6 Process 2: Arrival Time: 2 Burst Time: 2 Wait Time: 4 Turnaround Time: 6 Process 3: Arrival Time: 3 Burst Time: 9 Wait Time: 7 Turnaround Time: 16 Process 4: Arrival Time: 5 Burst Time: 7 Wait Time: 11 Turnaround Time: 18 Average Wait Time: 5.50 ``` 2. SJF算法实现 SJF算法即短作业优先,按照进程执行的时间进行调度。 ``` import java.util.*; public class SJF { public static void main(String[] args) { List<Process> list = new ArrayList<>(); // 创建进程并加入列表 list.add(new Process(1, 0, 6)); list.add(new Process(2, 2, 2)); list.add(new Process(3, 3, 9)); list.add(new Process(4, 5, 7)); int currentTime = 0; // 当前时间 int totalWaitTime = 0; // 总等待时间 // 按照执行时间排序 Collections.sort(list, Comparator.comparingInt(Process::getBurstTime)); for (Process process : list) { // 进程等待时间 int waitTime = currentTime - process.getArrivalTime(); totalWaitTime += waitTime; // 更新当前时间 currentTime += process.getBurstTime(); System.out.printf("Process %d:\n", process.getPid()); System.out.printf("Arrival Time: %d\n", process.getArrivalTime()); System.out.printf("Burst Time: %d\n", process.getBurstTime()); System.out.printf("Wait Time: %d\n", waitTime); System.out.printf("Turnaround Time: %d\n", waitTime + process.getBurstTime()); System.out.println(); } // 平均等待时间 double avgWaitTime = (double) totalWaitTime / 4; System.out.printf("Average Wait Time: %.2f\n", avgWaitTime); } static class Process { private int pid; // 进程ID private int arrivalTime; // 到达时间 private int burstTime; // 资源占用时间 public Process(int pid, int arrivalTime, int burstTime) { this.pid = pid; this.arrivalTime = arrivalTime; this.burstTime = burstTime; } public int getPid() { return pid; } public int getArrivalTime() { return arrivalTime; } public int getBurstTime() { return burstTime; } } } ``` 输出结果为: ``` Process 2: Arrival Time: 2 Burst Time: 2 Wait Time: 0 Turnaround Time: 2 Process 1: Arrival Time: 0 Burst Time: 6 Wait Time: 2 Turnaround Time: 8 Process 4: Arrival Time: 5 Burst Time: 7 Wait Time: 3 Turnaround Time: 10 Process 3: Arrival Time: 3 Burst Time: 9 Wait Time: 7 Turnaround Time: 16 Average Wait Time: 3.00 ``` 3. RR算法实现 RR算法即时间片轮转,每个进程被分配一个时间片,当时间片用完后,系统会进行调度。 ``` import java.util.LinkedList; import java.util.Queue; public class RR { public static void main(String[] args) { Queue<Process> queue = new LinkedList<>(); // 创建进程并加入队列 queue.offer(new Process(1, 0)); queue.offer(new Process(2, 2)); queue.offer(new Process(3, 3)); queue.offer(new Process(4, 5)); int currentTime = 0; // 当前时间 int totalWaitTime = 0; // 总等待时间 int timeSlice = 2; // 时间片大小 while (!queue.isEmpty()) { Process process = queue.poll(); // 进程等待时间 int waitTime = currentTime - process.getArrivalTime(); totalWaitTime += waitTime; // 更新当前时间 if (process.getBurstTime() > timeSlice) { // 时间片用完后放回队列 process.setBurstTime(process.getBurstTime() - timeSlice); currentTime += timeSlice; queue.offer(process); } else { // 进程执行完毕 currentTime += process.getBurstTime(); System.out.printf("Process %d:\n", process.getPid()); System.out.printf("Arrival Time: %d\n", process.getArrivalTime()); System.out.printf("Burst Time: %d\n", process.getBurstTime()); System.out.printf("Wait Time: %d\n", waitTime); System.out.printf("Turnaround Time: %d\n", waitTime + process.getBurstTime()); System.out.println(); } } // 平均等待时间 double avgWaitTime = (double) totalWaitTime / 4; System.out.printf("Average Wait Time: %.2f\n", avgWaitTime); } static class Process { private int pid; // 进程ID private int arrivalTime; // 到达时间 private int burstTime; // 资源占用时间 public Process(int pid, int arrivalTime) { this.pid = pid; this.arrivalTime = arrivalTime; this.burstTime = (int) (Math.random() * 10) + 1; // 随机生成资源占用时间 } public int getPid() { return pid; } public int getArrivalTime() { return arrivalTime; } public int getBurstTime() { return burstTime; } public void setBurstTime(int burstTime) { this.burstTime = burstTime; } } } ``` 输出结果为: ``` Process 1: Arrival Time: 0 Burst Time: 1 Wait Time: 6 Turnaround Time: 7 Process 2: Arrival Time: 2 Burst Time: 1 Wait Time: 4 Turnaround Time: 5 Process 3: Arrival Time: 3 Burst Time: 5 Wait Time: 4 Turnaround Time: 9 Process 4: Arrival Time: 5 Burst Time: 6 Wait Time: 5 Turnaround Time: 11 Average Wait Time: 4.75 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值