操作系统学习(一):浅析操作系统进程调度算法

简介: 操作系统学习(一):浅析操作系统进程调度算法

0、前置知识



0.1 调度性能指标

     

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

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


0.2 上下文切换

     

当一个进程停止时,他的寄存器将被保存在这个内存位置。通过恢复这些寄存器(将他们的值放回实际的物理寄存器中),操作系统可以恢复运行该进程。这种技术叫做上下文切换


1、进程调度算法简单介绍



1.1 先进先出(FIFO


先进先出(First In First Out)调度是我们可以实现的最基本的算法,有时也被称为先到先服务(First Come First Served或FCFS)。


优点:简单,易于实现。


举个例子看看为什么FIFO不好:假设A(100s)、B(10s)、C(10s)三个工作几乎同时来到系统,A稍微比B早一点,B稍微比C早一点,那么,一定要等到A完成后,B才有机会运行。所以系统平均周转时间为:

(100+110+120)/ 3 = 110 s


这个问题通常被称作护航效应,简单来说,就是一些耗时较少的潜在资源消费者被排在重量级资源消费者之后。


那么如何解决这个问题呢?咱们接着往下看:


1.2 最短任务优先(SJF)


最短任务优先(Shortest Job First)很好地解决了这个问题。它的策略为:先运行最短的任务,然后运行次短的任务。


当在只考虑平均周转时间的情况下,SJF显然比FIFO要好的多,同样是上面的例子,平均周转时间为:

10+20+100)/ 3 = 50 s


事实上,考虑到所有工作同时到达的假设,我们几乎可以证明SJF确实是最优的调度算法。然而,当我们考虑实际:工作可以随时到达,这又会出现什么情况呢?


我们再用一个例子来说明:假设 A 在 t = 0 时到达,且需要运行 100s。而 B 和 C 在 t = 10 到达,且各需要运行 10s。用SJF,平均周转时间为:


(100 + (90+10)+ (100+10))/ 3 = 103.33


可以看到,SJF遭遇了同样的护航问题。


1.3 最短完成时间优先(STCF)

   

事实上,当 B 和 C 到达时,调度程序当然可以做其他事情:它可以抢占(preempt)工作 A,并决定运行另一个工作,或许稍后继续工作 A。那么,为了解决刚才遭遇的护航问题,我们可以向SJF添加抢占:称为最短完成时间优先(Shortest Time-to-Completion First,STCF)或抢占式最短作业优先(Preemptive Shortest Job First ,PSJF)调度程序。

 

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


补充一点:几乎所有现代化的调度程序都是抢占式的(preemptive),非常愿意停止一个进程以运行另一个进程。这意味着调度程序采用了我们之前学习的机制。特别是调度程序可以进行上下文切换,临时停止一个运行进程,并恢复(或启动)另一个进程。


因此,在我们的例子中,STCF 将抢占 A 并运行 B 和 C 以完成。只有在它们完成后,才能调度 A 的剩余时间。平均周转时间为:

(120+10+20)/ 3 = 50 s


其实,考虑可抢占的假设,可以证明STCF为最优的调度算法。

那么,假如加入新的度量指标:响应时间呢?


还是使用刚才的例子:A 在时间 0 到达,B 和 C 在时间 10 达到,假如使用STCF,平均响应时间为:

(0 + 0 + 10)/ 3 = 3.33 s


而非抢占式的FIFO和SJF的响应时间都是0s,可以看出,STCF虽然有很好的周转时间,但对于响应时间和交互性上是糟糕的。就好像我们在终端按下回车,肯定不希望在10s之后才给我们显示内容。


为此,我们要引入一个新的调度算法。


1.4 轮转(RR)


轮转(RR)调度的基本思想很简单:RR 在一个时间片内运行一个工作,然后切换到运行队列中的下一个任务,而不是运行一个任务直到结束。它反复执行,直到所有任务完成。


请注意:时间片长度必须是时钟中断周期的倍数。


为了更详细地理解 RR,我们来看一个例子:假设 3 个任务 A(5s)、B (5s)和 C(5s) 在系统中同时到达。SJF 调度程序必须运行完当前任务才可运行下一个任务。相比之下,1s 时间片的 RR 可以快速地循环工作。


SJF的平均响应时间是:(0+5+10)/ 3 = 5 s


RR的平均响应时间是:(0+1+2)/ 3 = 1 s


如你所见,时间片长度对于 RR 是至关重要的。越短,RR 在响应时间上表现越好。然而,时间片太短是有问题的:突然上下文切换的成本将影响整体性能。因此,系统设计者需要权衡时间片的长度,使其足够长,以便摊销(amortize)上下文切换成本,而又不会使系统不及时响应。


可是,如果再回过头来看周转时间,我们会发现,RR几乎是最差的。但这并不奇怪,如果周转时间是我们的指标,那么 RR 确实是最糟糕的策略之一。直观地说,这应该是有意义的:RR 所做的正是延伸每个工作,只运行每个工作一小段时间,就转向下一个工作。而因为周转时间只关心作业何时完成。


2、多考虑一些情况



2.1 结合I/O

     

交互式作业正在执行 I/O 时,其他 CPU 密集型作业将运行,从而更好地利用处理器。


2.2 工作长度未知

     

事实上,在一个通用的操作系统中,操作系统通常对每个作业的长度知之甚少。因此,我们如何建立一个没有这种先验知识的 SJF/STCF?更进一步,我们如何能够将已经看到的一些想法与 RR 调度程序结合起来,以便响应时间也变得很好?这就是我们接下来要讲的问题:多级反馈队列(MLFQ)调度方法  操作系统学习(二):浅析多级反馈队列MLFQ


3、小结


     

按照我们介绍的顺序,几种调度算法可以这样串起来:


a2ea1260cf5d40238bfaeaa25c234731.png


3.1 各自的优缺点


       FIFO        优点:简单      


                       缺点:平均周转时间长(护航问题)


       SJF          优点:作业同时到达时,平均周转时间短


                        缺点:作业不同时到达时,同样面临护航问题


       STCF       优点:作业不同时到达时,平均周转时间短


                        缺点:响应时间长


       RR            优点:响应时间短


                        缺点:平均周转时间长


4、提到的其他技术



4.1 摊销(amortization)

     

摊销可以减少成本。


当系统某些操作有固定成本时,通常会使用摊销技术(amortization)。通过减少成本的频度(即执行较少次的操作),系统的总成本就会降低。例如,如果时间片设置为 10ms,并且上下文切换时间为 1ms,那么浪费大约 10%的时间用于上下文切换。如果要摊销这个成本,可以把时间片增加到 100ms。在这种情况下,不到 1%的时间用于上下文切换,因此时间片带来的成本就被摊销了。


4.2 重叠(overlap)


如有可能,重叠(overlap)操作可以最大限度地提高系统的利用率。重叠在许多不同的领域很有用,包括执行磁盘 I/O 或将消息发送到远程机器时。在任何一种情况下,开始操作然后切换到其他工作都是一个好主意,这也提高了系统的整体利用率和效率。


相关文章
|
12天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
6天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
10天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
32 3
|
12天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
12天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
11天前
|
算法 调度 UED
深入浅出操作系统调度策略
【10月更文挑战第33天】在数字时代的心脏,操作系统扮演着至关重要的角色。本文将探讨操作系统的核心功能之一——进程调度策略的设计与影响。我们将从理论到实践,通过浅显易懂的语言和具体代码示例,揭示如何通过不同的调度算法来优化系统性能和用户体验。无论你是技术新手还是资深开发者,这篇文章都将为你提供新的视角和深入的理解。
|
11天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理的艺术
【10月更文挑战第33天】本文旨在揭示操作系统中进程管理的神秘面纱,带领读者从理论到实践,探索进程调度、同步以及通信的精妙之处。通过深入浅出的解释和直观的代码示例,我们将一起踏上这场技术之旅,解锁进程管理的秘密。
19 0
|
13天前
|
算法 Linux 调度
深入理解操作系统之进程调度
【10月更文挑战第31天】在操作系统的心脏跳动中,进程调度扮演着关键角色。本文将深入浅出地探讨进程调度的机制和策略,通过比喻和实例让读者轻松理解这一复杂主题。我们将一起探索不同类型的调度算法,并了解它们如何影响系统性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇理解操作系统深层工作机制的大门。
23 0
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
11天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。