多核同构SMP--调度算法分析

随着智能化产品的需求不断提高,慢慢的单芯片单核处理器已经不能满足我们的需求,于是就在一个芯片上集成两个或多个核心,进而转向了多核处理器的发展,多核处理器具有更高的计算密度和更强的并行处理能力,所以它也是大趋势。多核处理器从硬件的角度来区分,又分为同构和异构:

  • 多核同构处理器:一个处理器的多个核心的体系架构是一样的,如:T113
  • 多核异构处理器:一个处理器中包含不同体系架构的核心,如:STM32MP157

多核处理器从软件的角度来区分,又分为SMP和AMP:

  • SMP:又称对称多处理(Symmetric multiprocessing),只有一个操作系统(OS)实例上运行多个核心,一个OS同等的管理各个内核,为各个内核分配工作负载,系统中所有的内核平等地访问内存资源和外设资源。
  • AMP:又称非对称多处理(Asymmetric Multi-Processing),每个核心运行自己的OS或同一OS的独立实例,或者说不运行OS,如运行裸机,每个内核有自己独立的内存空间,也可以和其它内核共享部分内存空间,每个核心相对独立地运行不同的任务,但是有一个核心为主要核心,它负责控制其它核心以及整个系统的运 行,而其它核心负责“配合”主核心来完成特定的任务。

本篇文章围绕SMP展开讲解。

什么是SMP

对称多处理器结构 , 英文名称为 “Symmetrical Multi-Processing” , 简称SMP。SMP又称为UMA, 全称"Uniform Memory Access", 中文名称"统一内存访问架构"。

在 " 对称多处理器结构 " 的 系统中 , 所有的处理器单元的地位都是平等的 , 一般指的是服务器设备上 , 运行的 多个 CPU , 没有 主次/从属 关系,都是平等的。

这些处理器共享所有的设备资源, 所有的资源对处理器单元具有相同的可访问性, 如: 内存, 总线等,多个CPU处理器共享相同的物理内存, 每个CPU访问相同的物理地址, 所消耗的时间是相同的;

SMP Scheduler Algorithm

SMP的优缺点

优点:避免了结构障碍, 其最大的特点是所有的资源共享。

缺点:SMP架构的系统, 扩展能力有限, 有瓶颈限制。如: 内存瓶颈限制, 每个CPU处理器必须通过相同的总线访问相同的内存资源, 如果CPU数量不断增加, 使用同一条总线, 就会导致内存访问冲突; 这样就降低了CPU的性能;

操作系统如何满足SMP

  1. 公平共享: CPU的负载, 需要公平地共享, 不能出现某个CPU空闲, 造成资源浪费。
  2. 可设置线程(进程)与CPU亲和性: 可以为某些类型的线程(进程)与指定的处理器设置亲和性, 可以针对性地匹配线程(进程)与处理器。
  3. 线程(进程)迁移: 可以将线程(进程)在不同的CPU处理器之间进行迁移 。

总结:操作系统的SMP对称多处理器结构调度,核心就是将线程(进程)迁移到合适的处理器上, 并且可以保持各个处理器的负载均衡。

SMP调度方式

作者总结SMP的调度算法可以分为三种:

线程(进程)默认核心0运行,可以指定亲和性:

  1. 当用户创建线程(进程)时,可以指定挂在到指定核心运行。当任务挂在到指定核心,那么该任务只能在该核心上运行。
  2. 当用户创建线程(进程)时,没有指定挂在到指定核心运行,线程(进程)默认挂在到核心0。该任务核心0上运行。

SMP Scheduler Algorithm

问题:

  • 优点:可以规定某个核心专注的做某一件事或某一类事。
  • 缺点:核心0的负载会很大,它需要调度其他核心不调度的任务。

适用场景:

  • 项目需要指定核心专一处理某一件事情的时候,可以使用这种调度算法

线程(进程)默认均分到不同核心,可以指定亲和性。

  1. 当用户创建线程(进程)时,可以指定挂在到指定核心运行。当任务挂在到指定核心,那么该任务只能在该核心上运行。
  2. 当用户创建线程(进程)时,没有指定挂在到指定核心运行,系统会判断每个核心的任务数,将该任务放在任务数最少的核心中。

SMP Scheduler Algorithm

问题:

  • 优点:将任务平分给每个核心,每个核心的负载会相对均衡。
  • 缺点:可能存在某个核心分配的任务都是比较轻的,某个核心分配的任务比较重。导致核心中的任务比较轻的,会更加容易进入空闲状态,核心中的任务比较重的,可能会一直处于忙碌状态,这样也会导致每个核心的负载不均衡。

适用场景:

  • 项目中,所有的任务的复杂程度都差不多,可以均分到每个核心上,这样可以提高系统性能。

线程(进程)根据核心负载获取任务调度,可以指定亲和性。

  1. 当用户创建线程(进程)时,可以指定挂在到指定核心运行。当任务挂在到指定核心,那么该任务只能在该核心上运行。
  2. 当用户创建线程(进程)时,没有指定挂在到指定核心运行,将该任务挂载一个总任务队列中,当某个核心调度空闲时,就从总任务队列中获取一个任务运行。运行完毕之后归还给总任务队列。

SMP Scheduler Algorithm

问题:

  • 优点:根据每个核心的负载,均分整个系统的任务调度,提供了每个核心的利用率。
  • 缺点:调度算法比较复杂

适用场景:

  • 项目中不需要关心任务的具体运行到那个核心。

总结

  • 上述的调度算法,只有第三种满足:①公平共享;②可设置线程(进程)与CPU亲和性;③线程(进程)迁移。
  • 调度算法,第一种和第二种,只满足三个条件的某一部分。
  • 不用的调度适用于不同的场景,需要根据实际的需求选择相应的调度算法。