1. 多处理器调度

多处理器系统分为以下几类:

  • 松耦合、分布式多处理器、集群 : 由一些列相对自治的系统组成,每个处理器都有自身的内存和I/O通道。
  • 专用处理器 :I/O处理器最为经典。此时,有一个通用的主处理器,专用处理器由主处理器控制 ,并为其服务。
  • 紧耦合多处理器 :由一系列共享同一个内存并受操作系统完全控制的处理器组成。

1.1 粒度

粒度大小 说明 同步间隔(指令)
单指令流中固有的并行 < 20
中等 一个单独应用中的并行处理/多任务处理 20 ~ 200
多道程序环境中并发进程的处理器 200 ~ 2000
极粗 在网络节点上进行分布式处理,形成一个计算环境 2000 ~ 1M
无约束 多个无关进程 不适用

无约束并行性

对于无约束并行(independent parallelism),进程间没有显式的同步。每个进程都代表独立的应用/作业(典型为分时应用)。

粗粒度、极粗粒度并行性

粗粒度(coarse)、极粗粒度(very coarse)并行,指在进程间存在同步,但这种同步的级别极粗。可以简单地处理为一组运行在多道程序单处理器上的并发进程。

中粒度并行性

典型情况下,为了达到中粒度并行性(medium-grain)的同步,在应用程序的线程之间,需要更高程度的合作、交互。

细粒度并行性

细粒度(fine-grain)并行性表示与线程中并行相比,更为复杂的使用情况。

1.2 设计问题

三个相互关联的设计问题:把进程分配到处理器、在单处理器上使用多道程序设计、一个进程的实际分派。所用的方法,通常取决于应用程序的粒度级和可用处理器的数量。

把进程分配到处理器

若假设多处理器结构统一(各性能基本持平),最简单的调度方法是把处理器视为一个资源池,并按照要求把进程分配到相应的处理器。

静态分配 :一个进程从被激活到完成,一直被分配给同一个处理器(需要为每个处理器维护一个专门的短程队列)

动态负载平衡 :该策略中,线程能在不同处理器对应的队列间转移

在单处理器上使用多道程序设计

如果每个进程在其生命周期中都被静态地分配给一个处理器,就应考虑处理器是否支持都到程序。

进程分派

与多处理器调度相关的最后一个设计问题是选择哪个进程运行。

1.3 进程调度

在大多传统的多处理器系统中,进程并不指定到一个专用的处理器。并非所有处理器都只有一个队列,或只使用某种类型的优先级方案,而是有多个基于优先级的队列,都送入相同的处理器池中。在任何情况下,都可把系统视为多服务器排队结构。

一般结论,对于双处理器,调度原则的选择不如在单处理器中重要。因此,在多处理器系统中使用简单的FCFS原则,或在静态优先级方案中使用FCFS就已足够。

1.4 线程调度

在多处理器线程调度和处理器分配的各种方案中,有四种重要方法:负载分配组调度专用处理器分配动态调度

负载分配

进程不分配到某个特定的处理器。系统维护一个就绪队列的全局队列,每个处理器只要空闲就从队列中选择一个线程。

三种不同的负载分配方案:

  • 先来先服务(FCFS)

  • 最少线程数优先

  • 可抢占的最少线程数优先

优点:

  • 负载在各处理器均匀分布,没有处理器空闲。
  • 无需集中调度程序,处理器可用,由操作系统为其选择下一个线程。

缺点:

  • 中心队列必须占据互斥访问的存储器区域(成百上千个处理器可能出现瓶颈)
  • 被抢占的线程可能不在同一个处理器上恢复执行,每个处理器配置Cache时,Cache效率很低
  • 如果所有处线程被视为公共的线程池,当一个程序的线程需要高度合作、无法同时访问处理器时,会严重影响性能

组调度

一组相关的线程基于一对一的原则,同时调度到一组处理器上运行。

优点:

  • 组内的进程相关/大致平等时,同步阻塞减少、只需要很少的进程切换,性能提高
  • 调度开销减少,一个决策影响许多处理器、进程

组分配与 & 加权组分配:

专用处理器分配

它与负载分配相反,它通过把线程指定到处理器来定义隐式的调度。采用池化思想,维护处理器池,每个程序开始执行时都分配给其与线程数等同数量的处理器,终止时,向处理器池交还资源。

一种极端形式的组调度:在一个应用程序执行期间,把一组处理器专门分配给这个应用程序。即当每个线程都被分配给一个处理器,相应的处理器专门用于处理对应的线程,直到应用程序运行结束。

动态调度

在执行期间,进程中线程数量可以改变。

当一个作业请求一个/多个处理器时:

  1. 如果有空闲的处理器,则使用它们来满足请求。
  2. 否则,如果发请求的作业都是新到达的,则从当前已分配了多个处理器的作业中分出一个处理器给这个作业。
  3. 如果这个请求的任务分配都不能得到满足,则它保持未完成状态,直到一个处理器可用 / 该作业取消了请求。

释放了一个/多个处理器时(包括作业离开):

  1. 为这些处理器扫描当前未得到满足的请求队列。给表中每个还没有处理器的作业(即所有处于等待专改的新到达的作业)分配一个处理器。然后再次扫描表,按FCFS原则分配剩下的处理器。

1.5 多核线程调度

随着单个芯片上的内核数量的增加,最小化访问片外存储器比最大化处理器利用率更优先。在最小化访问片外存储器方面,传统且主流的方法是利用局部缓存。

例如,AMD推土机芯片,在这种芯片的架构中,每个内核拥有一个独立的一级缓存,每对内核共享一个二级缓存,所有内核共享三级缓存。

当部分单非全部内核共享缓存时,调度期间线程分配给内核的方式对性能会有显著的影响。

我们假定共享共享二级缓存的两个内核相邻。最好的情况是:

  • 若两个线程要 共享 内存资源,则应将其分配给 相邻 的内核来 提高性能
  • 若两个线程 不共享 内存资源,则应将其分配到 不相邻 内核以实现 负载均衡

缓存共享需要考虑两方面的因素:

  • 合作共享资源:使得多个线程可以访问相同的内存区域(多线程应用、生产者-消费者线程交互)
  • 资源抢占:线程在相邻的内核上竞争缓存内存地址

2. 实时调度

两种实时调度方法:

  • 限时调度
  • 速率单调调度

2.1 背景

硬实时任务(hard real-time task) :必须满足最后期限的任务,否则会给系统带来不可接受的破坏 / 致命的错误。

软实时任务(soft real-time task) :有一个与之关联的最后期限,希望能满足这一期限,但并不强制。

非周期任务(aperiodic task) :有一个必须结束/开始的最后期限,或有一个关于开始时间、结束时间的约束条件。

周期任务(periodic task) :每隔周期T一次

2.2 特点

实时操作系统5方面需求表征:可确定性可响应性用户控制可靠性故障弱化操作

可确定性(deterministic)

在某种程度上是指它可以按照固定的、预先确定的时间/时间间隔执行操作。多个进程竞争使用资源、处理器时间时,没有哪个系统是完全可确定的。可确定性关注操作系统获知有一个中断之前的延迟。

可响应性(responsiveness)

可响应性关注在知道中断之后,操作系统为中断提供服务的时间。

用户控制(user control)

在实时系统中,允许用户细粒度地控制任务优先级必不可少。用户应能区分硬实时任务、软实时任务,并在每类中确定相对优先级。

可靠性(reliability)

在实时系统中比在非实时系统中更重要。实时系统是实时响应、控制事件的,性能的损失/降低可能产生灾难性的后果。

故障弱化操作(fail-soft operation)

指系统在故障时尽可能多地保存其性能和数据的能力。

故障弱化运行的一个重要特征:稳定性

  • 如果当它不可能满足所有任务的最后期限时,及时总是不能满足一些不太重要任务的最后期限,系统也将首先满足最重要的、优先级最高的任务的最后期限。

实时系统 常见功能:

  • 使用更为严格的优先级,以抢占式调度满足实时性要求
  • 中断延迟(运行 → 中断 时间)有界且相对较短
  • 有更精确、更可预测的时序特征

实时系统的核心是短任务调度程序。在设计这种调度程序时,公平性、最小平均响应时间不是最重要的,最重要的是所有硬实时任务都能在最后期限内完成,且尽可能多的软实时任务也能在最后期限内完成。

2.3 实时调度

静态表调度法(static table-driven scheduling)

执行关于可行调度的静态分析。分析的结果是一个调度,它确定在运行时一个任务何时须开始执行。

适用于周期性任务,输入为周期性到达时间、执行时间、周期性的最后结束期限、每个任务的相对优先级。

静态优先级抢占调度法(static priority-driven preemptive scheduling)

执行一个静态分析,但未指定制度,而是通过给任务指定优先级,使得可以使用传统的基于优先级的抢占式调度程序。

基于动态规划的调度法(dynamic planning-based scheduling)

在运行时动态地确定可行性,而非开始运行前离线地确定。到达任务仅能满足其他时间约束才能被接受、执行。可行性分析结果是一个调度/规划,用于确定何时分配任务。

动态尽力调度法(dynamic best effort scheduling)

不执行可行性分析。系统试图满足最后期限,并终止已经开始运行但错过最后期限的进程。

当前许多商用实时系统使用的方法,一个任务到达时,根据任务特性赋予其优先级,并通常使用某种形式的 时限调度(deadline scheduling),如最早最后期限调度。

2.4 限期调度

大多数当代实时操作系统的设计目标是尽快启动实时任务,因此强调快速中断处理、任务分派。实时应用程序本身并不关注绝对速度,二负按住在最优价值的时间内完成任务,它按照优先级来提供依据,而并不以最有价值的时间来完成需求。

实时任务调度的方法,所需最常见的信息:

  • 就绪时间 :任务开始准备执行的时间。
  • 启动最后期限 :任务必须开始的时间。
  • 完成最后期限 :任务必须完成的时间。
  • 处理时间 :从执行任务直到完成任务所需的时间。
  • 资源需求 :任务在执行过程中所需的资源集(处理器以外的资源)。
  • 优先级 :度量任务的相对重要性。
  • 子任务结构 :一个任务可分解为一个必须执行的子任务、一个可选执行的子任务。

2.5 速率单调调度

速率单调调度(Rate Monotonic Scheduling, RMS),可解决周期性任务多任务调度冲突。

RMS基于任务的周期给它们指定优先级。在RMS中,最短周期的任务具有最高优先级,依次递减。

若将任务优先级视为速率的函数,则它是一个单调递增函数,“速率单调调度” 因此得名。

2.6 优先级反转

**优先级反转(priority inversion)**是在任何基于优先级的可抢占调度方案中都会出现的现象。

当一个低优先级任务被某个资源(设备/信号量)所阻塞,且一个高优先级的任务也要被同一个资源阻塞,就会发生优先级反转。高优先级任务被置为阻塞态,低优先级任务使用、释放资源后,高优先级任务才会被唤醒。

无界限优先级反转(unbounded priority inversion):这种情况下,优先级反转的持续时间不仅取决于处理共享资源的时间,还却决于其他不相关任务的不可预测行为。

优先级继承(priority inheritance):优先级较低的任务继承任何与其共享同一个资源的优先级较高的任务的优先级。当高优先级任务在资源上阻塞时,立即改变优先级。资源被低优先级任务释放,这一改变结束。

优先级置顶(priority ceililng):优先级与每个资源相关联,资源的优先级:比使用该资源的具有最高优先级的用户的优先级
务也要被同一个资源阻塞,就会发生优先级反转。高优先级任务被置为阻塞态,低优先级任务使用、释放资源后,高优先级任务才会被唤醒。

无界限优先级反转(unbounded priority inversion):这种情况下,优先级反转的持续时间不仅取决于处理共享资源的时间,还却决于其他不相关任务的不可预测行为。

优先级继承(priority inheritance):优先级较低的任务继承任何与其共享同一个资源的优先级较高的任务的优先级。当高优先级任务在资源上阻塞时,立即改变优先级。资源被低优先级任务释放,这一改变结束。

优先级置顶(priority ceililng):优先级与每个资源相关联,资源的优先级:比使用该资源的具有最高优先级的用户的优先级

【操作系统 · 调度】多处理器 实时调度相关推荐

  1. 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 )

    文章目录 一.调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 二. 实时调度类 rt_sched_class 源码 一.调度类 ( 停机调度类 | 限期调度 ...

  2. 【Linux 内核】实时调度类 ⑤ ( 实时调度类 rt_sched_class 源码分析 | 结构体字段及函数指针分析 )

    文章目录 一.rt_sched_class 结构体变量类型 sched_class 二.next 字段值 三.enqueue_task 函数指针值 四.dequeue_task 函数指针值 五.yie ...

  3. 【Linux 内核】实时调度类 ⑦ ( 实时调度类核心函数源码分析 | dequeue_task_rt 函数 | 从执行队列中移除进程 )

    文章目录 一.dequeue_task_rt 函数 ( 从执行队列中移除进程 ) 二.update_curr_rt 函数 ( 更新调度信息 ) 本篇博客中 , 开始分析 struct sched_cl ...

  4. 【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )

    文章目录 一.enqueue_task_rt 函数 ( 插入进程到执行队列 ) 二.pick_next_task_rt 函数 ( 从执行队列中选择优先级最高的进程 ) 本篇博客中 , 开始分析 str ...

  5. 【Linux 内核】实时调度类 ② ( 实时调度实体 sched_rt_entity 源码分析 | run_list、timeout、watchdog_stamp、time_slice 字段 )

    文章目录 一.sched_rt_entity 源码分析 1.run_list 字段 2.timeout 字段 3.watchdog_stamp 字段 4.time_slice 字段 5.back 字段 ...

  6. 处理机调度之实时调度

    3.4实时调度 3.4.1实现实时调度的基本条件 1.提供必要的信息 就绪时间:该任务成为就绪状态的时间. 开始截止时间或完成截止时间:只需知道一个. 处理时间:从开始执行到完成所需时间. 资源要求: ...

  7. linux什么是实时调度,Linux 实时调度 示例

    在上一篇博文中进行了原理性分析之后,本文举出一个实例进行分析(假设所有的cpu处于同一个cpuset中). 当前系统中cpu的情况如下如所示: 说明:0~99代表的是进程的实时优先级,cpu的状态与该 ...

  8. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转

    本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...

  9. Linux---进程调度及CFS调度器

    Linux的调度算法 (1)O(N)调度器 O(N)调度器发布于1992年,从就绪队列中比较所有进程的优先级,然后选择一个最高优先级的进程作为下一个调度进程. 优点:操作简单,便于理解. 缺点:时间消 ...

  10. Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

最新文章

  1. 使用Nginx-rtmp-module搭建hls直播
  2. 一训练就显存爆炸?Facebook 推出 8 比特优化器,两行代码拯救你的显存
  3. 抛出java类型异常的方法_Java Streams:抛出异常的优雅方法
  4. Unix domain socket 简介(进程间通信,进程通信)
  5. bci测试如何整改_EMC测试不合格,应该这样整改
  6. 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III
  7. topsis综合评价法_DRG如何评价临床医师绩效——以肿瘤科为例
  8. Python HTTP Error 403: Forbidden
  9. c oracle案例,Oracle 19c CRS重启案例记录
  10. 计算机视觉图像去噪原理,AI笔记: 计算机视觉之图像滤波去噪: 原理、方法和效果比较...
  11. Bugku 社工——初步收集
  12. 国内开源镜像站地址汇总
  13. ERP系统操作难吗?
  14. Maven的作用通俗介绍
  15. OpenJudge 百练 2787 算24
  16. 主题 12:实践案例集锦之设计理念
  17. 基于java的BP神经网络-初步调超参的体会
  18. 花生壳动态域名详细试用方法
  19. Microchip的10M以太网解决方案
  20. 有哪些好用的高考志愿填报APP

热门文章

  1. PCB Web版SI9000阻抗计算器
  2. 阿里巴巴Java开发编码规范—注释规约
  3. web前端编程实现福彩投注站彩票投注助手
  4. 【JAVA程序设计】(C00039)基于ssm的企业工资管理系统
  5. JDBC单独了解一下
  6. c盘瘦身(c盘瘦身最简单的方法win10)
  7. .npy文件打开方式
  8. java后台管理项目策划书_12款适合做Java后台管理系统的项目
  9. 中国住户收入调查(CHIP)数据及问卷(1988-2008年)
  10. 关于主机后面板耳机插孔有声音前面板没有声音的处理办法