1.普通线程调度-完全公平调度
这里对完全公平调度关键部分进行简要描述.
对可调度的每个线程,按其虚拟运行时间作为键值放置在一个红黑树结构上.
对每个线程,初始时给其提供一个调度间隔.
每当先可运行线程集合添加或移除线程时,内核会计算并设置一个整体调度间隔.
集合中的线程依据其权重占整体权重的比例,结合整体调度间隔计算得到该线程的调度间隔.
在定时中断处理中,会更新当前运行线程的实际运行时间,虚拟运行时间.
虚拟运行时间变化量依据实际运行时间变化量,线程权重进行计算.原则是越优先的线程同样的实际运行时间计算出来的虚拟运行时间越小.
定时中断处理中,检测若当前线程的连续实际运行时间已经达到其调度间隔时,会触发一次重新调度处理.每次重新调度处理中,从红黑树中选出虚拟运行时间最小的一个线程,让其替换当前进程投入运行.
重新调度处理中,会选出红黑树中虚拟运行时间最小的线程,让其抢占当前线程,投入运行.
完全公平调度下,可通过nice
系统调用调整进程静态优先级.
优先级越高的进程倾向于拥有更高的调度间隔,更低的虚拟运行时间增加速度.
2.实时线程调度-时间片轮转,FIFO
(1). 时间片轮转
a. 每个线程分配一个时间片,当前运行线程时间片用完后,插入所在优先级队列尾部,选择优先级队列首部线程投入运行.
b. 当更高优先级队列插入线程时,设置当前线程调度标志,以便其在尽快进行调度检测.从而选择更高优先级队列中线程投入运行.
(2). FIFO
a. 线程投入运行后,持续运行,直到自行放弃或执行完毕.
3.多核下线程调度
多核下,每个cpu
拥有一个运行队列.每个可运行线程只能存在于一个cpu
的运行队列中.
调度算法会在多个cpu
之间自动执行负载均衡.
允许通过系统调用设置线程cpu
亲和性,设置的结果是被设置线程只会在其亲和的cpu
上调度运行.