【OSTEP】进程调度: 介绍 | Convoy护航效应 | 最短任务优先(SJF) | 最短完成时间优先(STCF) | 轮转 RR | 结合I/O

简介: 【OSTEP】进程调度: 介绍 | Convoy护航效应 | 最短任务优先(SJF) | 最短完成时间优先(STCF) | 轮转 RR | 结合I/O

💭 写在前面

本系列博客为复习操作系统导论的笔记,内容主要参考自:

  • Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne,
  • Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .



0x00 调度介绍(Scheduling: Introduction)

Workload assumptions:

1. Each job runs for the same amount of time.  (每项任务的运行时间相同)

2. All jobs arrive at the same time.  (所有任务在同一时间就位)

3. All jobs only use the CPU (i.e., they perform no I/O).  (所有任务只是用CPU)

4. The run-time of each job is known.    (每个任务的运行时间是已知的)

Performance metric(性能指标):

  • Turnaround time(运行周期): The time at which the job completes minus the time at which the job arrived in the system.  (完成任务所需的事件 减去 任务就位于系统的时间)

  • Waiting time(等待时间): The amount of time a process has been waiting in the ready queue (一个进程在准备队列中等待的时间)

Another metric is fairness(公平性)

  • Performance and fairness are often at odds in scheduling.(性能和公平性在调度中往往是不一致的)

0x01 Algorithm1:先进先出 (FIFO)

First Come, First Served (FCFS) (先到先得):

  • Very simple and easy to implement.  (简单且易于实施)

Example:

  • A arrived just before B which arrived just before C.
  • Each job runs for 10 seconds.

𝑨𝒗𝒆𝒓𝒂𝒈𝒆 𝒕𝒖𝒓𝒏𝒂𝒓𝒐𝒖𝒏𝒅 𝒕𝒊𝒎𝒆 =

0x02 护航效应(Convoy Effect)

FCFS -> Convoy,shit!

❓ 为什么 FIFO 没那么厉害? 因为会出现护航效应!即 车队效应!

一些好事较少的潜在资源消费者被排在重量级的资源消费者之后,这意味着需要等很长时间。

假设每个工作的运行时间 不再 相同,举个例子:

  • A 刚好在 B 之前就位,而 B 刚好在 C 之前到达。
  • A 跑了100秒,B 和 C 各跑了10 秒。

𝑨𝒗𝒆𝒓𝒂𝒈𝒆 𝒕𝒖𝒓𝒏𝒂𝒓𝒐𝒖𝒏𝒅 𝒕𝒊𝒎𝒆 =

❓ 到底什么是护航效应,为什么护航效应不好?

💡 举个例子:你去超市购物,只是买了个巧克力,但是只有一个收银台,排在你前面的人买了两购物车的东西,结账估计都得结10分钟,虽然你的巧克力只需要10秒就能结完了,但这是排队,你必须等,也就是你也得陪着你前面的人,等20分钟!就是这种感觉。你会感觉如何?这让人心态爆炸!

🔑 解决方案:你要么换个队伍(前提是有),要么就摆平心态好好等,深呼吸~ 心理暗示,一会就好,一会就好~~

Convoy Effec:假设有一个CPU密集型(大突发时间)进程,在准备队列中,其他几个进程的突发时间相对爆发时间较少,但有输入/输出(I/O)约束(经常需要I/O操作)。

然后会发生以下情况:

  • I/O绑定的进程首先被分配CPU时间。由于它们的CPU密集度较低。由于它们的CPU密集度较低,很快就会被执行,然后转到I/O队列。
  • 现在,CPU密集型进程被分配CPU时间。由于它的突发时间很高,它需要时间来完成。
  • 当CPU密集型进程被执行时,I/O绑定的进程。完成他们的I/O操作并被移回准备队列。
  • 然而,I/O绑定的进程要等待,因为CPU密集型进程仍未完成 ——  This leads to I/O devices being idle.  (这就导致了I/O设备的闲置)。

Convoy Effect (Continued):

  • 当CPU密集型进程结束时,它被送到I/O队列中,以便它可以访问I/O设备。
  • 同时,与I/O绑定的进程获得他们所需的CPU时间并移回I/O队列。
  • 然而,由于CPU密集型进程仍在访问I/O设备,他们不得不等待。因此,the CPU is sitting idle now (CPU现在是闲置的)

FIFO调度器的问题

  • FIFO:当短任务必须等待任务时,周转时间和等待时间会非常大(因为有车队效应)。

想一想新的调度器?

  • SJF(最短任务优先)。选择具有最小运行时间的任务。

为了解决这个问题,需要放宽假设条件(工作必须保持运行直到完成为止)。我们还需要调度程序本身的一些机制。

0x03 Algorithm 2:最短任务优先(SJF)

Run the shortest job first, then the next shortest, and so on

  • Non-preemptive scheduler

Example:

  • A 刚好在 B 之前就位,而 B 刚好在 C 之前到达。
  • A 跑了 100 秒,B 和 C 各跑了 10 秒。

𝑨𝒗𝒆𝒓𝒂𝒈𝒆 𝒕𝒖𝒓𝒏𝒂𝒓𝒐𝒖𝒏𝒅 𝒕𝒊𝒎𝒆 =

SJF with Late Arrivals from B and C

让我们放宽假设2: Jobs can arrive at any time.

举个例子:

  • A在 t=0 时到达,需要运行100秒。
  • B和C在 t=10 时到达,各自需要运行10秒。

𝑨𝒗𝒆𝒓𝒂𝒈𝒆 𝒕𝒖𝒓𝒏𝒂𝒓𝒐𝒖𝒏𝒅 𝒕𝒊𝒎𝒆 =

这三项工作的平均时间是 103.33。从图中可以看出,即使 B 和 C在 A 到达不久之后到达,他们仍然是要被迫等待 A完成,同样是遭遇了护航问题。

0x04 Algorithm3:最短完成时间优先(STCF)

Add preemption to SJF → Shortest Time-to-Completion First (STCF).

  • Also known as Preemptive Shortest Job First (PSJF) or Shortest Remaining Time First (SRTF).

向 SJF 添加抢占的行为,称为 最短完成时间优先(STCF),或称为抢占式最短作业优先(PSJF)调度程序

每当新工作进入系统时,他就会确定剩余工作和新工作中谁的剩余时间最少,然后调度该工作。

STCF 最短完成时间优先:

  • 确定剩余工作和新工作。
  • 安排剩余时间最少的工作。

举个例子:

  • A在 t = 0 时到达,需要运行100秒。
  • B 和 C 在 t =10 时到达,各自需要运行10秒。

𝑨𝒗𝒆𝒓𝒂𝒈𝒆 𝒕𝒖𝒓𝒏𝒂𝒓𝒐𝒖𝒏𝒅 𝒕𝒊𝒎𝒆 =

0x05 SJF之弊端:确定下一个CPU突发长度 (Determining Next CPU Burst Length)

SJF is optimal in that it gives minimum average waiting and turnaround time for a given set of processes(SJF是最优的,因为它为给定的流程集提供了最小的平均等待和周转时间的时间)

  • Moving a short process before a long one decreases the waiting time of the short processes more than it increases the waiting time of the long process. (将一个短流程移到一个长流程之前,会减少短流程的等待时间,而不是增加长流程的等待时间。进程的等待时间比增加长进程的等待时间要多)
  • The difficulty is knowing the length of the CPU burst ➔ can estimate the length困难在于知道CPU突发的长度 ➔ 可以估计长度 )

估算可以通过使用以前的CPU爆发的长度,使用指数平均法(Exponential Averaging)来完成:

指数平均法的例子:

预测下一个 CPU 突发长度:

0x06 新度量指标:响应时间(Response Time)

The time from when the job arrives to the first time it is scheduled.

📚 响应时间定义从任务到达系统到首次运行的时间:

响应时间 = 首次运行 - 到达时间

遗憾的是, STCF和相关方法在响应时间上不是很理想。

举个例子,如果三个工作同时到达,第三个工作必须等待前两个工作全部运行后才能运行。这种方法虽然有很好的周转时间,但是对于响应时间和交互性来说是非常糟糕的。假设你在终端前输入,不得不等待十秒才能看到系统回应,只是因为其他一些工作已经在你之前被调度,你肯定会觉得很不爽。

How can we build a scheduler that is sensitive to response time?

因此,为了解决这个问题,我们该如何构建响应时间敏感的调度程序?

0x07 Algorithm4:轮转(RR)

为了解决刚才的问题,我们将介绍一种新的调度算法,我们称之为 轮转 (Round-Robin),简称为

Time-slicing Scheduling(时间片调度)

  • Each process gets a small unit of CPU time (time quantum), usually 10-100 milliseconds. After this time has elapsed, the process is preempted and added to the end of the ready queue.(每个进程得到一个小单位的CPU时间(时间量子),通常为10-100ms。在这个时间过后,该进程被抢占并添加到就绪队列的末端。)
  • The length of a time slice must be a multiple of the timer-interrupt period.(时间片长度必须是时钟中断周期的倍数)

轮转轮转,顾名思义,就是轮着运行,RR 在一个时间片(time slice,有时称为调度因子)内运行一个工作,然后切换到运行队列中的下一个任务,而不是一股脑地运行一个任务直到结束。它反复执行,直到所有任务完成。

因此, RR 有时被称为时间切片(time-slicing),请注意,时间片长度必须是时钟中断周期的倍数。因此,如果时钟中断是每 10ms 中断一次,则时间片可以是 10ms, 20ms 或 10ms 任何其他倍数。

如果在准备队列中有 n 个进程,time quantum 是 q,那么每个进程最多可以获得1/n的CPU时间,每次最多可以获得q个时间单位的分块单位。没有进程的等待时间超过(n-1) x q个时间单位。

表现(Performance):

  • q large → FCFS。
  • q small → 相对于上下文切换而言,q 必须得大。

RR 是公平的,但在衡量标准上地表现并不理想,比如周转时间或等待时间。

0x08 时间片的长度是关键(The Length of Time Slice is Critical.)

较短的时间片

  • 更好的响应时间。
  • 上下文切换的成本 将主导整体性能。

较长的时间片

  • 摊销(amortize)了切换的成本
  • 响应时间更差

🔺 总结: Deciding on the length of the time slice presents a trade-off to a system designer

(决定时间片的长度对系统设计者来说是需要 权衡利弊 的)

Time Quantum vs Turnaround Time(时间量子与周转时间):

平均周转时间不一定随着时间量子的增加而改善。如果时间量子太大,RR调度就变成FCFS策略。80%的CPU突发事件应短于时间量子。

0x09 结合 I/O (Incorporating I/O)

首先,我们将放宽假设3,All programs perform I/O (所有程序都执行 I/O )

举个例子:

  • A 和 B 各需要50ms的CPU时间。
  • A 运行了 10ms,然后发出一个 I/O 请求。(每个I/O需要10ms)
  • B 只是使用了 50ms 的CPU,没有执行任何 I/O。
  • 调度器先运行A,然后再运行B。

重叠(overlap):

 

这样我们就看到了调度程序可能如何结合 I/O,通过将每个 CPU 突发作为一项工作,调度程序确保 "交互" 的进程正常运行。当这些交互式作业正在执行 I/O 时,其他 CPU 密集型作业将运行,从而更好地利用处理器。

当一个工作发起一个 I/O 请求时:

  • 工作被阻断,等待 I/O 完成
  • 调度器应该在 CPU 上安排另一个工作

当 I/O 完成的时:

  • 一个中断被提出
  • 操作系统将该进程从阻塞状态移回准备状态

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.10.1
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces

A. Silberschatz, P. Galvin, and G. Gagne,

Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

相关文章
|
11月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
331 0
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
741 0
|
数据可视化 项目管理
甘特图是什么?任务进程管理神器
甘特图是项目管理中的可视化工具,通过时间轴与任务列表展现项目进度和任务分配,支持任务间的依赖关系和里程碑设置,适用于项目管理、团队协作、日常任务安排及科研计划等多种场景,有效提升项目管理和团队协作效率。
2439 4
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。
|
调度 开发者
深入理解操作系统之进程调度
在计算机科学领域,操作系统是核心的一环,它管理着计算机硬件资源,并提供接口供上层软件运行。本文将通过深入浅出的方式,探讨操作系统中至关重要的一个概念——进程调度。我们将从基础理论出发,逐步展开讲解进程调度的原理和实现,并配以实际代码示例,旨在帮助读者更好地理解和掌握这一主题。文章不仅适合初学者建立基础,也适合有一定基础的开发者深化理解。
|
Java Linux API
[JavaEE]———进程、进程的数据结构、进程的调度
操作系统,进程任务,PCB,PID,内存指针,文件描述符表,进程的调度,并发编程,状态,优先级,记账信息,上下文
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
1426 5