2016-04-13 15 views
0

Ich habe eine Hausaufgabe, müssen wir einige Funktionen zum Linux-Kernel hinzufügen, und wir arbeiten an Red Hat 2.4.18. Ich sehe in sched.c, Funktion set_user_nice:Linux-Kernel-Funktion set_user_nice

void set_user_nice(task_t *p, long nice) 
{ 
    unsigned long flags; 
    prio_array_t *array; 
    runqueue_t *rq; 

    if (TASK_NICE(p) == nice || nice < -20 || nice > 19) 
     return; 
    /* 
    * We have to be careful, if called from sys_setpriority(), 
    * the task might be in the middle of scheduling on another CPU. 
    */ 
    rq = task_rq_lock(p, &flags); 
    if (rt_task(p)) { 
     p->static_prio = NICE_TO_PRIO(nice); 
     goto out_unlock; 
    } 
    array = p->array; 
    if (array) 
     dequeue_task(p, array); 
    p->static_prio = NICE_TO_PRIO(nice); 
    p->prio = NICE_TO_PRIO(nice); 
    if (array) { 
     enqueue_task(p, array); 
     /* 
     * If the task is running and lowered its priority, 
     * or increased its priority then reschedule its CPU: 
     */ 
     if ((NICE_TO_PRIO(nice) < p->static_prio) || (p == rq->curr)) 
      resched_task(rq->curr); 
    } 
out_unlock: 
    task_rq_unlock(rq, &flags); 
} 

Ich verstehe nicht, was genau den Code überprüft, in dem letzten if-Anweisung, weil einige Zeilen darüber, haben wir diese Linie:

p->static_prio = NICE_TO_PRIO(nice); 

und dann, in der if-Anweisung überprüfen wir:

(NICE_TO_PRIO(nice) < p->static_prio) 

Bin ich etwas fehlt? Danke

Antwort

0

OK, also habe ich in einem neueren Quellcode nach dieser Funktion gesucht und diese Funktion in kernel/sched/core.c implementiert. Der Teil ich sprach:

   old_prio = p->prio; 
3585   p->prio = effective_prio(p); 
3586   delta = p->prio - old_prio; 
3587 
3588   if (queued) { 
3589     enqueue_task(rq, p, ENQUEUE_RESTORE); 
3590     /* 
3591     * If the task increased its priority or is running and 
3592     * lowered its priority, then reschedule its CPU: 
3593     */ 
3594     if (delta < 0 || (delta > 0 && task_running(rq, p))) 
3595       resched_curr(rq); 
3596   } 
3597 out_unlock: 

So ist es, wie jetzt die diff zwischen dem alten scheinen und die neue Priorität richtig berechnet.

0

Ist 2.4.18 die Kernel-Version? Ich schaue mir diese Quelle an und sehe set_user_nice nicht in sched.c.

Wie auch immer, ich denke, dass sie dort eine Race Condition behandeln. Es ist möglich, dass zwischen dem Zeitpunkt, an dem die neue Prozesspriorität festgelegt wurde, der Prozess selbst diese geändert hat. Sie überprüfen also, ob das der Fall ist, und planen die Aufgabe gegebenenfalls neu.

+0

Ich denke, das war nicht der Fall. Es scheint mir ein Fehler zu sein. Ich habe den neueren Quellcode dieses Teils in meine Antwort eingefügt –