나는 이해하려고 노력해 왔습니다.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 대기입니다.