多核同构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的优缺点
优点:避免了结构障碍, 其最大的特点是所有的资源共享。
缺点:SMP架构的系统, 扩展能力有限, 有瓶颈限制。如: 内存瓶颈限制, 每个CPU处理器必须通过相同的总线访问相同的内存资源, 如果CPU数量不断增加, 使用同一条总线, 就会导致内存访问冲突; 这样就降低了CPU的性能;
操作系统如何满足SMP
- 公平共享: CPU的负载, 需要公平地共享, 不能出现某个CPU空闲, 造成资源浪费。
- 可设置线程(进程)与CPU亲和性: 可以为某些类型的线程(进程)与指定的处理器设置亲和性, 可以针对性地匹配线程(进程)与处理器。
- 线程(进程)迁移: 可以将线程(进程)在不同的CPU处理器之间进行迁移 。
总结:操作系统的SMP对称多处理器结构调度,核心就是将线程(进程)迁移到合适的处理器上, 并且可以保持各个处理器的负载均衡。
SMP调度方式
作者总结SMP的调度算法可以分为三种:
线程(进程)默认核心0运行,可以指定亲和性:
- 当用户创建线程(进程)时,可以指定挂在到指定核心运行。当任务挂在到指定核心,那么该任务只能在该核心上运行。
- 当用户创建线程(进程)时,没有指定挂在到指定核心运行,线程(进程)默认挂在到核心0。该任务核心0上运行。
问题:
- 优点:可以规定某个核心专注的做某一件事或某一类事。
- 缺点:核心0的负载会很大,它需要调度其他核心不调度的任务。
适用场景:
- 项目需要指定核心专一处理某一件事情的时候,可以使用这种调度算法
线程(进程)默认均分到不同核心,可以指定亲和性。
- 当用户创建线程(进程)时,可以指定挂在到指定核心运行。当任务挂在到指定核心,那么该任务只能在该核心上运行。
- 当用户创建线程(进程)时,没有指定挂在到指定核心运行,系统会判断每个核心的任务数,将该任务放在任务数最少的核心中。
问题:
- 优点:将任务平分给每个核心,每个核心的负载会相对均衡。
- 缺点:可能存在某个核心分配的任务都是比较轻的,某个核心分配的任务比较重。导致核心中的任务比较轻的,会更加容易进入空闲状态,核心中的任务比较重的,可能会一直处于忙碌状态,这样也会导致每个核心的负载不均衡。
适用场景:
- 项目中,所有的任务的复杂程度都差不多,可以均分到每个核心上,这样可以提高系统性能。
线程(进程)根据核心负载获取任务调度,可以指定亲和性。
- 当用户创建线程(进程)时,可以指定挂在到指定核心运行。当任务挂在到指定核心,那么该任务只能在该核心上运行。
- 当用户创建线程(进程)时,没有指定挂在到指定核心运行,将该任务挂载一个总任务队列中,当某个核心调度空闲时,就从总任务队列中获取一个任务运行。运行完毕之后归还给总任务队列。
问题:
- 优点:根据每个核心的负载,均分整个系统的任务调度,提供了每个核心的利用率。
- 缺点:调度算法比较复杂
适用场景:
- 项目中不需要关心任务的具体运行到那个核心。
总结
- 上述的调度算法,只有第三种满足:①公平共享;②可设置线程(进程)与CPU亲和性;③线程(进程)迁移。
- 调度算法,第一种和第二种,只满足三个条件的某一部分。
- 不用的调度适用于不同的场景,需要根据实际的需求选择相应的调度算法。