接前一篇文章:Linux内核进程管理子系统有什么第八十二回 —— 进程调度(9)
本文内容参考:
Linux内核进程管理专题报告_linux rseq-优快云博客
《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超
《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社
特此致谢!
上一回继续依次详解每一个调度类,讲解了rt调度类,本回讲解仅剩的一个也是最重要的一个调度类 —— fair_sched_class。
完全公平调度类
前文书已经给出了完全公平调度类fair_sched_class的定义,在kernel/sched/fair.c中,代码如下:
/*
* All the scheduling class methods:
*/
DEFINE_SCHED_CLASS(fair) = {
.enqueue_task = enqueue_task_fair,
.dequeue_task = dequeue_task_fair,
.yield_task = yield_task_fair,
.yield_to_task = yield_to_task_fair,
.check_preempt_curr = check_preempt_wakeup,
.pick_next_task = __pick_next_task_fair,
.put_prev_task = put_prev_task_fair,
.set_next_task = set_next_task_fair,
#ifdef CONFIG_SMP
.balance = balance_fair,
.pick_task = pick_task_fair,
.select_task_rq = select_task_rq_fair,
.migrate_task_rq = migrate_task_rq_fair,
.rq_online = rq_online_fair,
.rq_offline = rq_offline_fair,
.task_dead = task_dead_fair,
.set_cpus_allowed = set_cpus_allowed_common,
#endif
.task_tick = task_tick_fair,
.task_fork = task_fork_fair,
.prio_changed = prio_changed_fair,
.switched_from = switched_from_fair,
.switched_to = switched_to_fair,
.get_rr_interval = get_rr_interval_fair,
.update_curr = update_curr_fair,
#ifdef CONFIG_FAIR_GROUP_SCHED
.task_change_group = task_change_group_fair,
#endif
#ifdef CONFIG_UCLAMP_TASK
.uclamp_enabled = 1,
#endif
};
完全公平调度类(fair_sched_class)也称CFS调度类,是最为常见、用得最多的调度类。它用于管理普通进程的调度,其调度方式又被称为完全公平调度(Completely Fair Scheduler,CFS),而这也是其名字的由来。
当然,所谓的完全公平是理论上的,所有的进程(任务)同时执行,每个进程占用等份的一小部分CPU时间。实际的硬件环境中,这种假设是不可能满足的,而且进程间由于优先级不同,本身就不应该平均分配,因此CFS引入了虚拟运行时间(virtual runtime)的概念。
虚拟运行时间是CFS挑选进程的标准,由实际时间结合进程优先级转换而来,由struct task_struct中的se.vruntime字段表示,vruntime小的进程优先执行。
这里要将一下完全公平调度算法及其原理:
首先,需要记录下进程(任务)的运行时间。CPU会提供一个时钟,过一段时间就触发一个时钟中断。就像日常的钟表或手表一样,每1秒滴答一下,在系统中这一次滴答叫一个Tick。CFS会为每一个进程安排一个虚拟运行时间vrumtime(上边提到的)。
如果一个任务在运行,随着时间的增长,也就是一个个tick的到来,进程的vrumtime将不断增大。没有得到执行的人物的vruntime不变。
显然,那些vruntime少的任务,受到了不公平的对待。那么就优先运行这样的任务,弥补其所受的不公正待遇。
这类比于把一筐鸡蛋平均放到N个篮子里边,先大概分一下,之后看着哪个篮子中的鸡蛋少,就多放点;哪个篮子中的鸡蛋多,就少放点或者干脆不放。如此经过多轮,虽然不能保证每个篮子中的鸡蛋数量绝对一致,但至少也差不多。
在此基础上,再结合优先级(以及权重)的概念。类比于还是N个蓝子,但这些篮子可不都一样大了,而是有大有小。这回鸡蛋就不能按照个数分配了,而是要按照比例来。大个的篮子中多放,小个的篮子中少放。这样一来,虽然大篮子里的鸡蛋比小篮子里的鸡蛋数量多很多,但也认为是公平的。应用到进程上来,优先级高的进程权重大,多分配运行时间;优先级低的进程权重小,少分配运行时间。
总结:
- 功能
fair_sched_class是"Completely Fair Scheduler"(完全公平调度)的调度类。它用于处理普通任务的调度,试图在所有任务之间公平地分配CPU时间。
- 特点
完全公平调度(CFS)旨在提供一种公平的调度方式,以避免任务饥饿,并尽量均匀地分配CPU时间。CFS使用红黑树来跟踪任务的执行情况,并基于虚拟运行时间来决定调度顺序。
至此,各个调度类就从整体上讲解完了。
更多内容请看下回。
152

被折叠的 条评论
为什么被折叠?



