博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cpu子系统的组调度
阅读量:4215 次
发布时间:2019-05-26

本文共 2895 字,大约阅读时间需要 9 分钟。

组调度属于cgroup中的cpu子系统cpu子系统的所有操作都在cpu_cgrp_subsys 中有定义struct cgroup_subsys cpu_cgrp_subsys = {	.css_alloc	= cpu_cgroup_css_alloc,	.css_online	= cpu_cgroup_css_online,	.css_released	= cpu_cgroup_css_released,	.css_free	= cpu_cgroup_css_free,	.css_extra_stat_show = cpu_extra_stat_show,	.fork		= cpu_cgroup_fork,	.can_attach	= cpu_cgroup_can_attach,	.attach		= cpu_cgroup_attach,	.legacy_cftypes	= cpu_legacy_files,	.dfl_cftypes	= cpu_files,	.early_init	= true,	.threaded	= true,};我们这里以css_alloc 为例static struct cgroup_subsys_state *cpu_cgroup_css_alloc(struct cgroup_subsys_state *parent_css){	struct task_group *parent = css_tg(parent_css);	struct task_group *tg;	if (!parent) {		/* This is early initialization for the top cgroup */		return &root_task_group.css;	}	#创建调度组	tg = sched_create_group(parent);	if (IS_ERR(tg))		return ERR_PTR(-ENOMEM);	return &tg->css;}struct task_group *sched_create_group(struct task_group *parent){	struct task_group *tg;		tg = kmem_cache_alloc(task_group_cache, GFP_KERNEL | __GFP_ZERO);	if (!tg)		return ERR_PTR(-ENOMEM);	#可见这里分别为fair和rt申请调度组	if (!alloc_fair_sched_group(tg, parent))		goto err;	if (!alloc_rt_sched_group(tg, parent))		goto err;	return tg;err:	sched_free_group(tg);	return ERR_PTR(-ENOMEM);}int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent){	struct sched_entity *se;	struct cfs_rq *cfs_rq;	int i;	#分别问cfs_rq和se申请内存	tg->cfs_rq = kzalloc(sizeof(cfs_rq) * nr_cpu_ids, GFP_KERNEL);	if (!tg->cfs_rq)		goto err;	tg->se = kzalloc(sizeof(se) * nr_cpu_ids, GFP_KERNEL);	if (!tg->se)		goto err;	tg->shares = NICE_0_LOAD;	init_cfs_bandwidth(tg_cfs_bandwidth(tg));	#为每个cpu 初始化cfs_rq和se	for_each_possible_cpu(i) {		cfs_rq = kzalloc_node(sizeof(struct cfs_rq),				      GFP_KERNEL, cpu_to_node(i));		if (!cfs_rq)			goto err;		se = kzalloc_node(sizeof(struct sched_entity),				  GFP_KERNEL, cpu_to_node(i));		if (!se)			goto err_free_rq;		#主要是初始化		init_cfs_rq(cfs_rq);		init_tg_cfs_entry(tg, cfs_rq, se, i, parent->se[i]);		init_entity_runnable_average(se);	}}当进程要加入组调度是会调用attachstatic void cpu_cgroup_attach(struct cgroup_taskset *tset){	struct task_struct *task;	struct cgroup_subsys_state *css;	#将cgroup_taskset 中的所有task通过sched_move_task 将进程迁移到组调度中	cgroup_taskset_for_each(task, css, tset)		sched_move_task(task);}void sched_move_task(struct task_struct *tsk){#分别调用调度器的dequeue_task函数迁出task,然后在调用enqueue_task加入调度组	if (queued)		dequeue_task(rq, tsk, queue_flags);	if (running)		put_prev_task(rq, tsk);	sched_change_group(tsk, TASK_MOVE_GROUP);	if (queued)		enqueue_task(rq, tsk, queue_flags);	if (running)		set_curr_task(rq, tsk);}这里以enqueue_task 为例static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags){	if (!(flags & ENQUEUE_NOCLOCK))		update_rq_clock(rq);	if (!(flags & ENQUEUE_RESTORE))		sched_info_queued(rq, p);	#这里最终调用fair的enqueue_task_fair 来加入组调度的fair的rq中	p->sched_class->enqueue_task(rq, p, flags);}

转载地址:http://znnmi.baihongyu.com/

你可能感兴趣的文章
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>
【linux】.fuse_hiddenXXXX 文件是如何生成的?
查看>>
【LKM】整合多个LKM为1个
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
SparkStreaming 如何保证消费Kafka的数据不丢失不重复
查看>>
Spark Shuffle及其调优
查看>>
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>
Hive调优
查看>>
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>