yield_task_fair()在linux调度程序中做了什么

时间:2016-06-28 13:59:58

标签: linux-kernel

这是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);
}

1 个答案:

答案 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/