2016-06-28 13 views
1

dies eine Funktion in Linux-Scheduler ist, bei der Umsetzung der Completely Fair Scheduler, der auf dem Weg ist: root/kernel/Sched/fair.c (link to the file)was tut yield_task_fair() tun in Linux Scheduler

Jetzt möchte ich wissen, was diese Zeile Zeile für Zeile bedeutet. Jede Antwort oder jeder Link zu einer vollständigen Dokumentation wird geschätzt.

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

Antwort

0
static void yield_task_fair(struct rq *rq) 
{ 

aktuelle Runqueue Get

struct task_struct *curr = rq->curr; 

Erhalten CFS verwandte Bereiche in Runqueue, struct Definition in sched.h

struct cfs_rq *cfs_rq = task_cfs_rq(curr); 

Dies ist die derzeit laufende Aufgabe, es ist Container würde Die Aufgabe der Task ist

struct sched_entity *se = &curr->se; 

    /* 
    * Are we the only task in the tree? 
    */ 
    if (unlikely(rq->nr_running == 1)) 
     return; 

Hierarchical Bereinigung von sich ab dem nächsten, letzten, überspringen, damit es nicht wieder aufgenommen hat (siehe http://www.gossamer-threads.com/lists/linux/kernel/1329573)

clear_buddies(cfs_rq, se); 

SCHED_BATCH ist für nicht-interaktive Aufgaben. Rest wird in Codekommentaren erläutert

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; 
    } 

Legen Sie diese Aufgabe als nächsten Überspringungskandidaten fest. Überspringen wird ausgeführt, wenn kein anderer Kandidat vorhanden ist. Überprüfen Sie pick_next_entity, um mehr darüber zu erfahren, wie es funktioniert.

set_skip_buddy(se); 
} 

Die vollständige Dokumentation der Kernel-Quellen, versuchen cscope (+ ctags) oder die ehrfürchtige Web-Interface http://lxr.free-electrons.com/

+0

Ihnen sehr für Ihre Antwort danken! Es ist sehr hilfreich! nur ein paar kleine Fragen! –

+0

nur ein paar kleine Fragen! Ich habe diesen Teil nicht verstanden: clear_buddies (cfs_rq, se); Ich habe den Link gelesen, den du geschickt hast, aber leider nicht verstanden! Was ist "Kumpel"? und kannst du die Funktion mehr erklären? zusätzlich ... Ich habe den Kommentar für "update_curr (cfs_rq);" –

+0

Buddies sind bestimmte Aufgaben in der Runqueue - last, next und skip -, die über die Aufrufe 'set_last_buddy',' set_next_buddy' und 'set_skip_buddy' zugewiesen und dann bei der Auswahl der nächsten auszuführenden Aufgabe verwendet werden. Versuchen Sie, die [Implementierung von pick_next_entity] (http://lxr.free-electronics.com/source/kernel/sched/fair.c#L3391) zu verstehen. 'update_curr' dient nur zur Pflege von Statistiken und spielt keine Rolle - z. für CPU-Abrechnungen (gesehene CPU-Quoten in der Virtualisierung?) und allgemeine Updates für die Aufzeichnung von Daten, die Sie beispielsweise über procfs im Userspace lesen können. –