进程的调度

进程的调度

算法的本质是为了优化为了让进程更好地被OS调度,因此我们需要理解什么是调度,而不是一开始就明白调度算法有什么?

1.调度

个人觉得调度虽然是一种计算机机制,实际上也是一种思想:

比如:在资源有限的情况下,需要分配一定的额度,这时候你就需要考虑去如何分配,也就是如何去调度,例如加速器或者现实业务柜台,如果你是VIP就可以加速这个过程,加速这个调度,因此优先级这个概念在调度中也得以体系,又或者是小时候一台电脑每人人均1个小时的时代,这也是种资源分配的调度时间片,所以要通过生活去理解计算机实现的机制和思想非常重要.

回到计算机内部,计算机内部大量的进程,我们可以暂时地划分为I/O操作,内存读写操作,CPU执行,意味着调度根据性质也可以分类为I/O调度,内存调度,任务调度

人是不断学习的物种,而计算机的发明正意味着模仿人的行为诞生了,因此人工智能才得以诞生.人在面对调度分配的时候会采取一定的决策,这个决策在计算机内部也就被称为调度决策也就是计算机内部的调度器该如何对进程采取何种的措施来达到预期中的指标,因此调度需要衡量一些东西.


2.调度的指标

如同我们去衡量一个计算机性能的时候,调度也需要去衡量(果然世界是一样的,透过本质看问题).

  • 资源利用率:CPU利用率,内存利用率那些,资源无效分配的场景现实又不是没有.
  • 时间:时间也可以细分,每段时间都具备不同的意义,意味着阶段不同,比如响应时间,周转时间.完成时间
  • 公平性:计算机内部的进程就如同社会的现实,需要去考虑计算机内部进程的公平性问题
  • 吞吐量:吞吐量高表示单位时间内处理作业的速度很快,这个也很好理解
  • 能耗:这个也很重要我觉得,如果能耗很高调度一次,不如别调度了.

而面对不同的进程我们需要衡量的重点不一样!

  • 比如一些需要大量计算的计算器:机器学习等那种需要很高算力的,这时候就没必要考虑用户了,主要考虑就是时间和吞吐量.

所以调度其实是根据实际情况去衡量的,没有绝对最优的调度,只有合适环境下的调度.


3.调度的方式

在操作系统中,通常会使用三种不同的调度方式来管理进程的执行。这三种调度方式是:

  1. 长期调度(作业调度):长期调度负责从作业队列中选择适当的作业,并将其加载到内存中准备执行。它决定了哪些作业可以进入系统,并为它们分配系统资源。长期调度的目标是提高系统的吞吐量和资源利用率。
  2. 中期调度(内存调度):中期调度负责从内存中选择一些进程进行挂起或换出,以释放内存空间给其他进程使用。它的主要目标是优化内存的利用,避免过多的进程占用内存导致系统性能下降。
  3. 短期调度(CPU调度):短期调度决定了就绪队列中哪个进程可以获得CPU的执行权。它根据一定的调度算法,如轮转调度、优先级调度等,选择一个最优的进程来执行。短期调度的目标是提高系统的响应时间和公平性,以实现高效的进程执行。

因此进程的调度实际是一种短期调度,而我们的页面置换调度其实是一种中期调度,而长期调度一般会从CPU,I/O的角度做决策出发,因此磁盘的调度其实也算一种I/O调度,也就是一种长期调度其实说白了都是对资源的调度,因此我们会有一种相似的感觉尤其在面对这些调度算法的时候,总会觉得如此的神似.

  • 来回顾一下进程的状态,才明白调度是根据进程的什么状态进行调度的,或者说进程什么状态需要去调度:

    进程的状态

  1. 就绪状态(Ready):进程已经准备好执行,但还没有被分配到CPU。处于就绪状态的进程等待被调度执行。
  2. 运行状态(Running):进程当前正在CPU上执行。
  3. 阻塞状态(Blocked):进程因为等待某个事件(如I/O操作完成、信号等)而暂时无法继续执行,进入阻塞状态。
  4. 终止状态(Terminated):进程已经执行完成,等待被回收。

4.任务的调度流程

其实进程的调度可能不光设计到进程之间的调度,因为进程本身是程序,需要占用一定的内存,所以内存相关的页面调度也是有可能的(比如内存使用率过大就会导致换页的情况),磁盘的调度情况也是可能出现(比如某个任务从磁盘调入内存),这么一说,你是不是觉得所有的都联系上了,因此一个任务完整的调度流程应该是设计了长调度,中调度,短调度的三种调度策略的.

  • 任务的调度(以下流程只是大概思路,并不完整或者准确,仅总结)
    1. 创建任务:系统接收到新的任务(作业或进程)时,将其创建并初始化为就绪状态。
    2. 任务入队:新创建的任务将被放入相应的就绪队列中,等待调度执行。
    3. 选择任务:调度器根据调度算法从任务队列中选择一个合适的任务进行调度。调度算法可能考虑任务的优先级、资源需求、调度策略等因素。
    4. 上下文切换:如果选中的任务与当前执行的任务不同,需要进行上下文切换。上下文切换涉及保存当前任务的上下文信息(寄存器状态、程序计数器等),加载新任务的上下文信息,并切换到新任务的执行环境。
    5. 执行任务:被选中的任务开始执行,使用分配给它的处理器资源。
    6. 监控任务:任务执行期间,系统可能会监控任务的执行情况,包括时间片的消耗、资源的使用情况等。
    7. 任务完成或等待:任务执行完毕或等待外部事件(如I/O操作、信号等),根据任务的状态进行相应的处理。
    8. 更新任务状态:根据任务的执行情况和调度策略,更新任务的状态(就绪、运行、阻塞、完成等),并将任务重新放回相应的队列。
    9. 重复调度:重复执行2至8步骤,循环进行任务的调度和执行。

5.进程的调度策略

每一个进程任务都具备自己相应的运行时间和到达时间,因此当前该调度哪个任务,被调度的任务需要多久的执行时间往往是进程所需要去衡量的两个方向

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

也有人称为先进先出策略,就是先进入就绪队列的先运行。

例如:现在有五个进程

进程 到达时间 执行时间 完成时间 周转时间 等待时间
P1 0 8 8 8 0
P2 1 4 12 11 7
P3 2 6 18 16 10
P4 3 2 20 17 14
P5 4 10 30 26 16
  • 周转时间是指从进程到达系统到进程完成的总时间。

    因此周转时间也就是 = 等待时间+执行时间。

5.2最短作业优先(SJF)

顾名思义,选择运行时间最短的先执行

这个问题需要考虑两个因素:

  • 提前预知短作业
  • 短作业到达的时间点不好预料

因此,实际上采取的策略是抢占式调度,一旦进入就绪队列中的进程需要运行的时间小于当前正在运行的进程,则进行抢占。

例如:有4个进程

进程 到达时间 执行时间 完成时间 周转时间 等待时间
P1 0 2 2 2 0
P2 1 4 10 9 5
P3 2 1 3 1 0
P4 3 3 6 3 0

5.3时间片轮转(RR)

这是一种比较公平的策略,就是每个进程分配相同的时间片,等时间片用完了就退出当前进程或者阻塞。

因此:时间片的时间是一个选择性的问题,通常来说是20ms - 50ms

因此,通常来说,时间片用完,会将此进程放入就绪队列,表面他还是可运行的(放到队尾).


5.4优先级调度

优先级的面向对象是面向谁的?

面向系统的,让系统认为哪一个进程的优先级高就先优先执行谁

那么优先级的评判标准是什么?

例如在交互式任务往往需要很快的响应,因为他会直接影响用户体验,而一些批处理任务不需要这么着急的处理,因此优先级就可以低,因此优先级的评判标准往往会根据任务的实际性质去评判

  • 因此根据任务性质的不同可以将任务放入不同性质的队列,就如同VIP,白金,普通玩家一样,有专门不同的接待区和等待区.

    因此队列也会有级别:被称之为多级队列

    • 而这种多级队列是我们事先预知的,对这种场景做出的一种决策,因此是静态的.
    • 因此如果在同一个优先级下(同一个队列下),该采取何种的策略,可以按照先进先出,或者最短作业,还是时间片轮转就由每个队列自行决定了
  • 多级反馈队列:

    上面的那种多级队列有一个明显的问题就是面对的场景是静态不变的,但是进程就跟人一样他存在变数!因此你不知道进程的优先级是否会降低或者会变高,也就是执行时间是否真的确定?毕竟如今的任务越来越复杂,运行时间往往是确定不了的

    当初的设计是这么考虑的,他们认为短作业的优先级普遍会高,所以会放入优先级高的队列当中,而由于短作业的性质,因此CPU分配的时间片相对来说就会短一些,而交互式任务一般都是短任务,所以,可以第一时间满足,因此优先级低的反而采用更长的时间片,这样就可能不会导致优先级低的队列中的进程发生饥饿,同样队列中的进程也会动态地去调制他们的优先级被送往优先级不同的队列,通常来讲,如果第一梯队(优先级较高)的情况下没有在短时间内完成任务就会被分配给下一个梯队的队列,这样也符合长作业在优先级更小的队列中执行的思想,因此多级反馈队列更适用于这种动态的场景之下.

多级队列


posted @   不会上猪的树  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示