2016-04-13 31 views
0

私は宿題を持っているので、Linuxカーネルにいくつかの機能を追加する必要があります。また、Red Hat 2.4.18に取り組んでいます。 私は、sched.cに機能set_user_nice見えた:Linuxカーネルの機能set_user_nice

p->static_prio = NICE_TO_PRIO(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); 
} 

、その後、我々はチェックif文で:

(NICE_TO_PRIO(nice) < p->static_prio) 

私は何かが足りないのですか? ありがとう

答えて

0

私はこの機能を新しいソースコードで探しました。この機能はkernel/sched/core.cで実装されていました。 私が話していた一部:

   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: 

だから、古いものと適切に算出した新たな優先順位の間に今の差分のように見えるん。

0

カーネルバージョンは2.4.18ですか?私はそのソースを見ていて、sched.cにset_user_niceが見えません。

とにかく、彼らは競争状態を処理していると思います。新しいプロセスの優先順位を設定してからプロセス自体が変更されるまでには可能です。彼らはそれが事実であるかどうかをチェックしている場合、タスクを再スケジューリングしています。

+0

そうではないと思います。それは私のバグのようだ。私はこの部分の新しいソースコードを私の答えに加えました –

関連する問題