Linux Kernel调度管理之cfs_rq

cfs_rq是内核为普通进程设计的就绪队列:
/* CFS-related fields in a runqueue */
struct cfs_rq {
	struct load_weight load;
	unsigned int nr_running, h_nr_running;
	u64 exec_clock;
	u64 min_vruntime;
#ifndef CONFIG_64BIT
	u64 min_vruntime_copy;
#endif
	struct rb_root tasks_timeline;
	struct rb_node *rb_leftmost;
	/*
	 * 'curr' points to currently running entity on this cfs_rq.
	 * It is set to NULL otherwise (i.e when none are currently running).
	 */
	struct sched_entity *curr, *next, *last, *skip;
#ifdef	CONFIG_SCHED_DEBUG
	unsigned int nr_spread_over;
#endif
#ifdef CONFIG_SMP
	/*
	 * CFS load tracking
	 */
	struct sched_avg avg;
	u64 runnable_load_sum;
	unsigned long runnable_load_avg;
#ifdef CONFIG_FAIR_GROUP_SCHED
	unsigned long tg_load_avg_contrib;
#endif
	atomic_long_t removed_load_avg, removed_util_avg;
#ifndef CONFIG_64BIT
	u64 load_last_update_time_copy;
#endif

#ifdef CONFIG_FAIR_GROUP_SCHED
	/*
	 *   h_load = weight * f(tg)
	 *
	 * Where f(tg) is the recursive weight fraction assigned to
	 * this group.
	 */
	unsigned long h_load;
	u64 last_h_load_update;
	struct sched_entity *h_load_next;
#endif /* CONFIG_FAIR_GROUP_SCHED */
#endif /* CONFIG_SMP */

#ifdef CONFIG_FAIR_GROUP_SCHED
	struct rq *rq;	/* cpu runqueue to which this cfs_rq is attached */

	/*
	 * leaf cfs_rqs are those that hold tasks (lowest schedulable entity in
	 * a hierarchy). Non-leaf lrqs hold other higher schedulable entities
	 * (like users, containers etc.)
	 *
	 * leaf_cfs_rq_list ties together list of leaf cfs_rq's in a cpu. This
	 * list is used during load balance.
	 */
	int on_list;
	struct list_head leaf_cfs_rq_list;
	struct task_group *tg;	/* group that "owns" this runqueue */

#ifdef CONFIG_CFS_BANDWIDTH
	int runtime_enabled;
	u64 runtime_expires;
	s64 runtime_remaining;
	u64 throttled_clock, throttled_clock_task;
	u64 throttled_clock_task_time;
	int throttled, throttle_count;
	struct list_head throttled_list;
#endif /* CONFIG_CFS_BANDWIDTH */
#endif /* CONFIG_FAIR_GROUP_SCHED */
};
cfs_rq也是作为内嵌对象为rq队列的一个成员存在的。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
调度器初始化 cfs_rq 的源码位于 Linux 内核的 sched_init() 函数中。sched_init() 函数是在内核启动时被调用,用于初始化调度器和调度器相关的数据结构。该函数的定义在文件 kernel/sched/core.c 中。 以下是 sched_init() 函数中初始化 cfs_rq 的代码片段: ``` void __init sched_init(void) { ... for_each_possible_cpu(i) { struct rq *rq = cpu_rq(i); struct cfs_rq *cfs_rq = &rq->cfs; /* Initialize cfs_rq */ rq->nr_running = 0; rq->nr_uninterruptible = 0; cfs_rq->min_vruntime = (u64)(-(1LL << 20)); cfs_rq->tasks_timeline = RB_ROOT_CACHED; cfs_rq->load.weight = SCHED_LOAD_SCALE; cfs_rq->nr_running = 0; cfs_rq->nr_spread_over = 0; cfs_rq->last_weight = 0; cfs_rq->avg.load_sum = 0; cfs_rq->avg.util_sum = 0; cfs_rq->avg.runnable_sum = 0; cfs_rq->avg.load_avg = 0; cfs_rq->avg.util_avg = 0; cfs_rq->avg.runnable_avg = 0; cfs_rq->avg.last_update_time = sched_clock(); cfs_rq->next = cfs_rq->prev = cfs_rq; cfs_rq->h_load.next = cfs_rq->h_load.prev = NULL; cfs_rq->leaf_cfs_rq_list.next = cfs_rq->leaf_cfs_rq_list.prev = cfs_rq; init_rq_bintree(rq); atomic_set(&rq->nr_iowait, 0); rq->online = 1; rq->cpu_capacity_orig = capacity_orig_of(i); rq->cpu_capacity = rq->cpu_capacity_orig; rq->cpu_capacity_boosted = 0; rq->cpu_capacity_orig_boosted = 0; rq->idle_at_tick = 0; rq->last_schedule_tick = 0; rq->skip_clock_update = 0; rq->avg_idle = 0; rq->avg_idle_sum = 0; rq->avg_idle_mis = 0; rq->avg_idle_mis_sum = 0; rq->clock_update_flags = 0; rq->next_balance = jiffies + HZ; rq->next_task_fair = jiffies; rq->clock = 0; rq->clock_task = NULL; rq->idle_stamp = jiffies; rq->last_load_update_tick = jiffies; rq->nr_iowait = 0; rq->iowait_contrib = 0; rq->nr_iowait_last = 0; init_cfs_bandwidth(&cfs_rq->bandwidth); } ... } ``` 在上述代码中,通过 for_each_possible_cpu(i) 遍历每个 CPU,并分别初始化它们的 cfs_rq 数据结构。具体来说,调用 cpu_rq(i) 函数得到第 i 个 CPU 的 rq 对象,然后将 rq->cfs 指向的 cfs_rq 对象的各个成员初始化为默认值。其中包括 min_vruntime、tasks_timeline、load 等字段。这样,所有 CPU 的 cfs_rq 对象都被初始化完成,调度器初始化工作也就完成了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值