Linux CFS调度器之虚拟运行时间vruntime

本文介绍了Linux中的 Completely Fair Scheduler (CFS) 调度器,重点解析了虚拟运行时间(vruntime)的概念及其在维护进程公平性中的作用。CFS通过红黑树组织进程,并根据vruntime选择调度进程。当进程运行、休眠、创建或退出时,会更新vruntime。文章详细阐述了更新vruntime的过程,包括delta_exec的计算和权重的调整,以确保不同优先级进程的合理调度。进程权重与优先级相关,权重大的进程在获得更多CPU时间的同时,vruntime增加速度较慢,防止进程饥饿问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CFS简介


Linux中大名鼎鼎的CFS调度器是专门为普通进程设计的调度器,CFS调度器的核心是虚拟运行时间vruntime。虚拟运行时间一方面跟进程运行时间有关,另一方面跟进程优先级有关,总的来说,进程占用CPU时间越长,进程优先级越低,其vruntime就越大。vruntime越小,代表CPU对进程的宠幸越少,那么后续就需要优先宠幸它;反之,vruntime越大,代表CPU对进程的宠幸越多,那么后续就需要对它做出一定的惩罚,减少对它的宠幸。CFS调度器就是要在各个进程间维持一种相对的公平,既不能过多宠幸某个进程,也不多过分亏欠某个进程,所有进程同属于一个大家庭,任何一个进程受到亏欠,都会影响整个大家庭。

所有的普通进程以vruntime为键值加入红黑树,vruntime越小,在红黑树的位置越靠左,vruntime越大,在红黑树的位置越考右。CFS调度器从最左边的进程开始调度,进程被调度后,vruntime增加,进程因而向右移动。

更新虚拟运行时间


update_curr函数更新虚拟运行时间,更新虚拟运行时间的时机有很多,主要有以下几种:

  • 定时器tick中断中
 task_tick_fair->entity_tick(cfs_rq, se, queued);->update_curr(cfs_rq);
  • 进程入CFS调度队列的时候
enqueue_task_fair->enqueue_entity(cfs_rq, se, flags);->update_curr(cfs_rq);
  • 进程出CFS调度队列的时候
dequeue_task_fair->dequeue_entity(cfs_rq, se, flags);->update_curr(cfs_rq);
  • 进程创建的时候
task_fork_fair->update_curr(cfs_rq);

更新虚拟运行时间的函数如下,逻辑并不复杂,我们下面详细分析:

static void update_curr(struct cfs_rq *cfs_rq)
{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值