CFS进程组的cpu带宽限制

前文我们分析了实时进程组的带宽限制,本文将顺着前文的思路继续分析cfs进程组的带宽限制,由此进一步体会linux进程调度设计的优雅细节。

1. 数据结构描述

1.1 struct task_group
这是描述进程组的数据结构,我们现在只列出带宽限制的相关成员:
在这里插入图片描述
(1)当前进程组在各CPU上的cfs调度实体描述,数组长度是CPU的颗数。
(2)当前进程组在各CPU上用于组织自己内部的就绪cfs调度实体的红黑树,数组长度也是CPU颗数。
(3)当前CPU的权重,用于调度实体之间按权重比例分配CPU时间。
(4)当前进程组在各CPU上的rt调度实体描述,数组长度是CPU颗数。
(5)当前进程组在各CPU上用于组织自己内部的就绪rt调度实体的链表数组,数组长度也是CPU颗数。在每一个rt_rq上,每一个优先级的进程用一个链表组织。
(6)描述对组内rt进程的带宽限制。
(7)描述对组内cfs进程的带宽限制。
1.2 struct cfs_bandwidth
在这里插入图片描述
(1)CPU带宽限制的监控周期,典型值100ms。
(2)100ms内当前进程组cfs进程允许运行的时间。
(3)peroid_timer是100ms监控周期定时器,slack_timer是unthrottle的5ms定时器。
(4)被throttle的cfs_rq链表。方便unthrottle的时候进行操作。

2. 带宽限制的初始化

2.1 根group的初始化
sched_init:
在这里插入图片描述
(1)初始化root进程组的三大调度器就绪队列cfs_rq/rt_rq/dl_rq
(2)设置root进程组的权重为1024。
(3)为root进程组设置带宽限制。防止cfs长时间占用cpu造成idle的饥饿。
2.2 新建group的初始化
sched_create_group–>alloc_fair_sched_group
在这里插入图片描述
(1)为本进程组在各cpu上用于组织就绪调度实体的红黑树数组分配内存空间。
(2)为本进程组在各cpu上用于描述自己的调度实体数组分配内存空间。
(3)本进程组的初始权重设置为1024。
(4)调用init_cfs_bandwidth初始化本进程组带宽限制的数据结构。
(5)为本进程组在各CPU上的就绪队列和调度实体分配内存空间。
(6)初始化本进程组在每一颗CPU上的就绪队列。
(7)为本进程组的就绪队列和调度实体赋初值。
下面分析带宽限制数据结构tg->cfs_bandwidth的初始化:
在这里插入图片描述
(1)本cfs_rq剩余可运行时间,在每次定时器回调函数中更新为quota值。
(2)本cfs_rq的限额时间,初始化为不限制。
(3)设定的定时器周期时间100ms:
static inline u64 default_cfs_period(void)
{
return 100000000ULL;
}
(4)有被throttle的cfs_rq挂入此链表,在定时器的回调函数中遍历此链表执行unthrottle cfs_rq操作。
(5)周期性更新本cfs_rq剩余可运行时间的高精度定时器及其callback。
(6)另一个高精度定时器slack_timer。用于dequeue路径上潜在的unthrottle。

3. CPU调度限制的执行

与实时调度器类似,cfs也会在更新当前运行进程的时间统计信息的时候去检查当前就绪队列是否需要throttle。
3.1 更新当前运行进程的时间信息

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值