try_to_wake_up()은 CPU 실행 대기열에 작업을 어디에 추가합니까?

try_to_wake_up()은 CPU 실행 대기열에 작업을 어디에 추가합니까?

나는 이해하려고 노력해 왔습니다.Linux 커널의 try_to_wake_up() 함수조금 더 나은. 개념적으로 프로세스를 깨우려면 프로세스를 CPU 실행 대기열에 추가해야 한다고 생각하지만, 이것이 어디서 발생하는지 파악하는 데 어려움을 겪고 있습니다.

    //try_to_wake_up()

    if (p == current) {
        /* I omitted some comments here*/

        success = 1;
        cpu = task_cpu(p);        //task_cpu(p) returns READ_ONCE(p->cpu);
        trace_sched_waking(p);    //This is just a logging call
        p->state = TASK_RUNNING; 
        trace_sched_wakeup(p);    //Another logging call
        goto out;
    }

그래서작업CPU()CPU 실행 큐는 전혀 수정되지 않은 것 같아서 태그를 살펴보기로 했더니 호출이 되네요.ttwu_stat():

/*I omitted some intermediate code here*/
out:
    if (success)
        ttwu_stat(p, cpu, wake_flags);
    preempt_enable();

    return success;

그런데 제가 보러 갔을 때ttwu_stat(), 이는 이것에 대한 일련의 호출인 것 같습니다.__schedstat_inc입력 매개변수에 매크로를 추가하기만 하면 됩니다.

그렇다면... 실제로 task_struct* p를 CPU 실행 대기열에 추가하는 곳은 어디입니까?

어떤 아이디어라도 감사하겠습니다.

감사해요.

답변1

인용한 코드 블록은 생략된 주석에 언급된 것처럼 특별한 경우입니다.

         * We're waking current, this means 'p->on_rq' and 'task_cpu(p)
         * == smp_processor_id()'. Together this means we can special
         * case the whole 'p->on_rq && ttwu_remote()' case below
         * without taking any locks.

깨워야 할 작업은 현재 작업이므로 이미 실행 큐( p->on_rq)에 있으므로 실행 큐에 추가할 필요가 없습니다.

실행 대기열에 작업을 추가하는 프로세스더 아래로:

    cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags);

그러면 작업이 실행 대기열에 추가되고 작업이 예약된 CPU가 반환되므로 필요한 경우 마이그레이션을 처리할 수 있습니다.

#ifdef CONFIG_SMP조건은 설명이 필요합니다. SMP가 지원되지 않는 경우 다중 작업할 수 없다동시에 실행하면 현재 작업을 깨울 수 없다는 것을 알고 있으므로 처리해야 하는 유일한 경우는 I/O 대기입니다.

관련 정보