一篇讲解实时调度类及SMP!
实时调度类源码分析
Linux 实时进程与普通进程的根本不同之处,系统中有一个实时进程且可运行,调度器总是会选择它,除非另有一个优先级更高的实时进程。 SCHED_FIFO:没有时间片,在调度器被选择之后,可以运行任意长时间; SCHED_RR:有时间片,其值在进程运行时会减少。
实时调度实体sched_rt_entity数据结构及操作
进程的插入、选择、删除三种基本操作。
【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)


对称多处理器SMP
多处理器系统的工作方式分为非对称多处理(asym-metrical mulit-processing)和对称多处理(symmetrical mulit-processing,SMP)两种。 在对称多处理器系统中,所有处理器的地位都是相同的,所有的资源,特别是存储器、中断及I/O空间,都具有相同的可访问性,消除结构上的障碍。 多处理器系统上,内核必须考虑几个额外的问题,以确保良好的调度。
CPU负荷必须尽可能公平地在所有的处理器上共享。
进程与系统中某些处理器的亲合性(affinity)必须是可设置的。
内核必须能够将进程从一个CPU迁移到另一个。 linux SMP调度就是将进程安排/迁移到合适的CPU中去,保持各CPU负载均衡的过程。
SMP优点
增加吞吐时的一种划算方法;
由于操作系统由所有处理器共享,它们提供了一个单独的系统映像(容易管理);
对一个单独的问题应用多处理器(并行编程);
负载均衡由操作系统实现;
单处理器(UP)编程模型可用于一个SMP中;
对于共享数据来说,可伸缩;
所有数据可由所有处理器寻址,并且由硬件监视逻辑保持连续性;
由于通信经由全局共享内存执行,在处理器之间通信不必使用消息传送库;
SMP局限性
由于告诉缓存相关性、锁定机制、共享对象和其它问题,可伸缩性受限制;
需要新技术来利用多处理器,例如:线程编程和设备驱动程序编程等。
CPU域初始化
Linux内核中有一个数据结构struct sched_domain_topology_level用来描述CPU的层次关系。 内核对CPU的管理是通过bitmap来管理,并且定义possible、present、online、active这4种状态。
SMP负载均衡
SMP负载均衡机制从注册软中断开始,每次系统处理调度tick时会检查当前是否需要处 理SMP负载均衡。
负载均衡时机
周期性调用进程调度程序scheduler_tick()->trigger_load_balance()中,通过软中断触发负载均衡。
某个CPU上无可运行进程,__schedule()准备调度idle进程前,会尝试从其它CPU上拉一批进程过来。
两路4核8核心CPU,CPU调度域逻辑关系

分层角度分析
所有CPU一共分成撒个层次:SMT、MC、NUMA,每层都包含所有CPU,但是划分粒度不同。根据Cache和内存的相关性划分调度域,调度域内的CPU又划分一次调度组。越往下层调度域越小,越往上层调度域越大。进程负载均衡会尽可以在底层调度域内部解决,这样Cache利用率最优。 周期性负载均衡:CPU对应的运行队列数据结构记录下一次周期性负载均衡时间,当超过这个时间点后,将触发SCHED_SOFIRQ软中断来进行负载均衡。 用到SMP负载均衡模型的时机 内核运行中,还有部分情况需要用掉SMP负载均衡模型来确定最佳运行CPU:
进程A唤醒进程B时,try_to_wake_up()中会考虑进程B将在哪个CPU上运行;
进程调用execve()系统调用时;
fork出子进程,子进程第一次被调度运行。
Linux运行时调优:
Linux引入重要sysctls来在运行时对调度程序进行调优(单位ns) sched_child_runs_first: child在fork之后进行调度,为默认设备。如果设置为0,则先调度parent。 sched_min_granularity_ns:针对CPU密集型任务执行最低级别抢占粒度。 sched_latency_ns:针对CPU密集型任务进行目标抢占延迟。 sched_stat_granularity_ns:收集调度程序统计信息的粒度。
总结
本文主要介绍了实时调度类源码分析,包括实时调度数据结构及其相关操作(插入、选择、删除等);SMP的优缺点,负载均衡机制,CPU分层角度分析,linux运行时调优等相关参数介绍等。
