首页 > 系统相关 >进程的调度

进程的调度

时间:2023-06-08 09:55:55浏览次数:31  
标签:优先级 队列 调度 任务 时间 进程

进程的调度

算法的本质是为了优化为了让进程更好地被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分配的时间片相对来说就会短一些,而交互式任务一般都是短任务,所以,可以第一时间满足,因此优先级低的反而采用更长的时间片,这样就可能不会导致优先级低的队列中的进程发生饥饿,同样队列中的进程也会动态地去调制他们的优先级被送往优先级不同的队列,通常来讲,如果第一梯队(优先级较高)的情况下没有在短时间内完成任务就会被分配给下一个梯队的队列,这样也符合长作业在优先级更小的队列中执行的思想,因此多级反馈队列更适用于这种动态的场景之下.

多级队列


标签:优先级,队列,调度,任务,时间,进程
From: https://www.cnblogs.com/looktheworld/p/17465315.html

相关文章

  • 1.进程的创建
    进程概念程序存放在磁盘上的指令和数据的有序集合(文件)静态的 进程执行一个程序所分配的资源的总称动态的 进程和程序内容区别   进程包含的内容:BSS段:存放程序中未初始化的全局变量数据段:已初始化的全局变量代码段:程序执行代码堆(heap):malloc等函数分配内存栈......
  • windows查看java进程, 终止进程命令
    查看:tasklist| findstr "java"终止:taskkill/pid20388/f/f表示强制终止......
  • Linux分析进程占用内存最高和占用CPU最高 的 命令
    Linux分析进程占用内存最高和占用CPU最高这里只显示最高的前5个,如果想显示更多的话,可以自己修改:查看占用内存最高的5个进程psaux|sort-k4nr|head-n5查看占用cpu最高的5个进程psaux|sort-k3nr|head-n5......
  • 几种跨进程通信的机制
    概述由于不同的进程在运行过程中处于不同的用户空间,无法相互感知,因此就诞生IPC;信息的传播需要介质,几种跨进程通信的机制就是使用了不同的介质,由于介质的不同,所以传输的方式,传输的频率、传输的数据和适用范围都有不同;文件放在物理磁盘上的文件作为不同进程都能访问到的东西,可以......
  • 进程间的通信
    进程间的通信1.进程的简单通信既然是进程间的通信,那至少得具备两方,根据信息的流动,可以分为发送方和接收方,在网络通信中也有客户端,服务端之称,我们只需要笼统地理解这种设计观念就行通信的方式有什么??单向双向(还有半双工)同步(会阻塞,有前置条件,一问一答)异步(发......
  • 线程与进程
    一、线程与进程的区别1、进程是程序的一次执行过程,是程序运行的基本单位2、进程是比线程更小的执行单位,一个进程可以产生多个线程,多个线程共享进程的堆和方法区,每个线程都有自己独立的栈和程序计数器,因此线程之间切换的开销比进程切换小 二、并发与并行并发:同一时间段内,多......
  • Linux系统下如何保持进程在SSH客户端断开后仍继续运行?
    使用场景在Linux系统中,在执行一些运行时间比较长的任务时,必须等待执行完毕才能断开SSH连接或关闭客户端软件,否则可能会导致执行中断。本文介绍两种保障程序在您退出登录后持续运行的方法。方法1:使用nohup命令1.命令格式nohup,可以使运行的命令忽略SIGHUP信号。因此,即使退出登录......
  • 常见的进程信号
    进程的管理主要是指进程的关闭和重启。我们一般关闭或重启软件,都是关闭或者重启它的程序,而不是直接操作进程的。比如,要重启apache服务,一般使用命令servicehttpdrestart重启apache的程序。那么,可以直接通过管理进程来关闭或重启apache吗?答案是肯定的,这时候就要依赖进程的信号S......
  • Python 多进程之间共享变量
    原文地址:https://blog.51cto.com/alwaysbeta/5162851Python多线程之间共享变量很简单,直接定义全局global变量即可。而多进程之间是相互独立的执行单元,这种方法就不可行了。不过Python标准库已经给我们提供了这样的能力,使用起来也很简单。但要分两种情况来看,一种是Process......
  • k8s nodeName调度
    nodeName调度nodeName是节点选择约束的最简单形式,但是由于其限制,通常很少使用它。nodeName是PodSpec的领域。pod.spec.nodeName将Pod直接调度到指定的Node节点上,会【跳过Scheduler的调度策略】,该匹配规则是【强制】匹配。可以越过Taints污点进行调度。nodeName用于选择节点的一......