这是linux调度程序中的一个函数,在路径中的COMPLETELY FAIR SCHEDULER的实现中:root / kernel / sched / fair.c (link to the file)
现在我想逐行了解这个功能是什么。任何回复或任何完整文档的链接将不胜感激。
static void yield_task_fair(struct rq *rq)
{
struct task_struct *curr = rq->curr;
struct cfs_rq *cfs_rq = task_cfs_rq(curr);
struct sched_entity *se = &curr->se;
/*
* Are we the only task in the tree?
*/
if (unlikely(rq->nr_running == 1))
return;
clear_buddies(cfs_rq, se);
if (curr->policy != SCHED_BATCH) {
update_rq_clock(rq);
/*
* Update run-time statistics of the 'current'.
*/
update_curr(cfs_rq);
/*
* Tell update_rq_clock() that we've just updated,
* so we don't do microscopic update in schedule()
* and double the fastpath cost.
*/
rq->skip_clock_update = 1;
}
set_skip_buddy(se);
}
答案 0 :(得分:0)
static void yield_task_fair(struct rq *rq)
{
获取当前的runqueue
struct task_struct *curr = rq->curr;
获取runqueue中的CFS相关字段,sched.h中的struct定义
struct cfs_rq *cfs_rq = task_cfs_rq(curr);
这是当前正在运行的任务,它的容器将是当前任务的task_struct
struct sched_entity *se = &curr->se;
/*
* Are we the only task in the tree?
*/
if (unlikely(rq->nr_running == 1))
return;
从下一个,最后一个跳过自己的分层清理,以便不再选择它 (见http://www.gossamer-threads.com/lists/linux/kernel/1329573)
clear_buddies(cfs_rq, se);
SCHED_BATCH用于非交互式任务。休息在代码注释中解释
if (curr->policy != SCHED_BATCH) {
update_rq_clock(rq);
/*
* Update run-time statistics of the 'current'.
*/
update_curr(cfs_rq);
/*
* Tell update_rq_clock() that we've just updated,
* so we don't do microscopic update in schedule()
* and double the fastpath cost.
*/
rq->skip_clock_update = 1;
}
将此任务设置为下一个跳过候选。当没有其他候选人时跳过。检查pick_next_entity以了解更多信息。
set_skip_buddy(se);
}
有关内核源代码的完整文档,请尝试使用cscope(+ ctags)或令人敬畏的Web界面http://lxr.free-electrons.com/