6

我是 Linux 内核的新手。目前,我查看了空闲代码并有一个问题。当处理器在自己的运行队列中没有任何任务时,它可能会进入空闲模式,特定的 WFI(等待中断)。(我提到的只是关于 ARM 架构而不是 X86。所以 X86 出了点问题。)在保持 WFI 状态之后,也许其他处理器(不是空闲的)想要将他们的任务分散到这个空闲的处理器上(通过负载平衡)。当时一个繁忙的处理器使任务迁移。在我看来,迁移任务时,空闲处理器应该立即唤醒以处理任务。正确的?但是,我找不到任何唤醒空闲处理器的代码,但只找到了有关将任务注册到空闲处理器的运行队列的代码。

我想知道在给出新任务时唤醒处理器背后的机制是什么。或者它只是将任务从一个队列移动到另一个队列,而不是让它直到被一些不可预测的 IRQ 唤醒?

请告诉我真相:)

4

4 回答 4

6

WFI是 ARM 的特殊协处理器指令。例如,

 ENTRY(cpu_arm946_do_idle)
         mcr     p15, 0, r0, c7, c0, 4           @ Wait for interrupt
         mov     pc, lr

它与Linux(直接)无关。

如果没有工作要做,则有一个特殊idle任务可以在 ARM 上运行指令。WFIidle任务是最低优先级的 Linux 任务,如果没有其他任务,则会被调度。如果WFI由 完成idle,则某些驱动程序将在没有工作可做时中断(可能是计时器)。idle在SMP情况下,如果有其他进程可以迁移就不会去;调度程序检查这一点。如果负载变高,则繁忙的处理器需要wake其他处理器;在带有中断的ARM的情况下。通常这种处理在arch/ arch /kernel/ process.c中。例如x86default_idle(). 我不知道x86的细节有效,但您可以查看源代码。

对于您的问题,当新任务创建时,linux内核如何唤醒空闲处理器?,答案是没有。只有fork()(和一些类似的功能)可以创建新任务;最初来自init任务,然后是其中一个孩子。如果你有cron工作,它会在它去之前安排一个计时器sleep/idle。此计时器将唤醒系统,重新安排cron,然后cron调用fork(), 来创建新任务。

其他相关机制为cpufreq,cpuidlekernel/power

真相总是客观的/主观的,当然不是全球性的。告诉我真相metric,我可以告诉你真相

于 2013-02-26T18:17:07.120 回答
0

只需在创建线程后像下面的代码一样设置 CPU 的标志。

 = > thread's task_struct->flags |= PF_WAKE_UP_IDLE;
于 2014-07-02T06:28:53.533 回答
0

look at select_task_rq_fair(), which is CFS::select_task_rq() method. This is most representative case where the scheduler wakes up the idle task for re-balancing run-queues.

于 2014-10-16T13:27:18.627 回答
0

smp_send_reschedule()将发送IPI_RESCHEDULE到空闲的处理器。这将把它从wfi. 它是从几个地方调用的,一个例子是wake_up_process -> try_to_wake_up -> try_to_wake_up -> ttwu_queue -> ttwu_queue_remote(来自内核 3.4 的函数名称)。

于 2015-07-17T11:01:44.000 回答