2016-06-28 1 views
1

を行います今、私はこの機能をラインごとに何をするのか知りたい。すべての回答や完全な文書へのリンクは高く評価されます。)は、これがパスにあるCOMPLETELY FAIR SCHEDULERの実装では、Linuxのスケジューラ内の関数であるLinuxのスケジューラに

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
static void yield_task_fair(struct rq *rq) 
{ 

struct task_struct *curr = rq->curr; 

これは、それはコンテナしまうのです、現在実行中のタスクである

struct cfs_rq *cfs_rq = task_cfs_rq(curr); 

、sched.hでの構造体の定義を実行キューでのCFS関連のフィールドを取得し、現在の実行キューを取得します。現在のタスクの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; 
    } 

このタスクを次のスキップ候補として設定します。 Skipは、他の候補がないときに実行されます。どのように機能するかを理解するには、pick_next_entityをチェックしてください。

カーネルソースの完全なドキュメントについては
set_skip_buddy(se); 
} 

、(ctagsの+)のcscopeを試すか、素晴らしいWebインターフェイスhttp://lxr.free-electrons.com/

+0

あなたの答えのためにどうもありがとうございました!それは非常に有用です! ちょっとした質問です! –

+0

ちょっとした質問! 私はこの部分を理解しませんでした:clear_buddies(cfs_rq、se); あなたが送ったリンクを読みましたが、残念ながら理解できませんでした! 「バディ」とは何ですか?あなたはもっと機能を説明できますか? さらに...私は "update_curr(cfs_rq);"というコメントを理解できませんでした。 –

+0

バディは、 'set_last_buddy'、' set_next_buddy'、 'set_skip_buddy'を介して実行キュー内の特定のタスク(最後、次、スキップ)に割り当てられ、実行する次のタスクの選択に使用されます。 [pick_next_entityの実装](http://lxr.free-electrons.com/source/kernel/sched/fair.c#L3391)を理解してください。 'update_curr'は統計情報を保持するためのものであり、多くは関係ありません。 CPUアカウンティング(仮想化ではCPUクォータと見なされていますか?)や、ユーザー空間のprocfsなどで読み取ることができるデータを記録するための一般的なアップデートがあります。 –

関連する問題