7.2 调度指标: T周转时间 = T完成时间 - T到达时间
7.3 先进先出(FIFO):
Example_1: 工作平均周转时间为(10+20+30)/3=20
Example_2: 工作平均周转时间为(100+110+120)/3=120
7.4 最短任务优先(SJF):
Example_1: 工作平均周转时间为(10+20+120)/3=50
Example_2: 工作平均周转时间为(100+(110-10)+(120-10))/3=103.33
7.5 最短完成时间优先(STCF):
每当新工作进入系统时,它就会确定剩余工作和新工作中,谁的剩余时间最少,然后调度该工作
Example_1: 工作平均周转时间为((20-10)-(30-10)+120)/3=50
7.6 响应时间: T响应时间 = T首次运行 - T达到时间
7.7轮转(Round-Robin):
RR在一个时间片内运行一个工作,然后切换到运行队列中的下一个任务,而不是运行一个任务直到结束,它反复执行,直到所有任务完成;时间片的长度必须是时钟中断周期的倍数;
SJF算法平均相应时间:(0 + 5 + 10) / 3 = 5
RR平均响应时间:(0 + 1 +2) / 3 = 1;
可以看出时间片长短对于RR是至关重要的,越短,RR在时间片上的响应时间上表现越好,而太短是有问题的,因为上下文切换的成本将影响整体性能
7.8结合IO
让我们假设有两项工作 A 和 B,每项工作需要 50ms 的 CPU时间。但是,有一个明显的区别:A 运行 10ms,然后发出 I/O 请求(假设 I/O 每个都需要10ms),而 B 只是使用 CPU 50ms,不执行 I/O。调度程序先运行 A,然后运行 B(见图 7.8)。
假设我们正在尝试构建 STCF 调度程序。这样的调度程序应该如何考虑到这样的事实,即 A 分解成 5 个 10ms 子工作,而 B 仅仅是单个 50ms CPU 需求?显然,仅仅运行一个工作,然后运行另一个工作,而不考虑如何考虑 I/O 是没有意义的。
一种常见的方法是将 A 的每个 10ms 的子工作视为一项独立的工作。因此,当系统启动时,它的选择是调度 10ms 的 A,还是 50ms 的 B。对于 STCF,选择是明确的:选择较短的一个,在这种情况下是 A。然后,A 的工作已完成,只剩下 B,并开始运行。然后提交 A的一个新子工作,它抢占 B 并运行 10ms。这样做可以实现重叠(overlap),一个进程在等待另一个进程的 I/O 完成时使用 CPU,系统因此得到更好的利用