2013-02-25 76 views
5

我是Linux内核的新手。 目前,我查看了空闲代码并进行了调查。 当处理器在他们自己的runqueue中没有任何taks时,它可能会进入空闲模式,特定的WFI(wating中断)。 (所有我提到的是关于ARM架构而不是X86,所以X86有些问题。) 在WFI状态下,可能其他处理器(不是空闲)想要将它们的任务传播给这个空闲的处理器(通过负载均衡) 。那时一个繁忙的处理器 使任务被模仿。在我看来,当任务被迁移时,空闲处理器应该唤醒immidiatley来处理任务。对?但是,我找不到任何代码唤醒空闲处理器的代码,但只发现了有关将任务注册到空闲处理器的runqueue的代码。创建新任务时,Linux内核如何唤醒空闲处理器?

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

请告诉我真相:)

回答

6

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

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

它与Linux(直接)无关。

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

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

其他相关机制cpufreqcpuidlekernel/power

真相总是客观/主观肯定不是全球。让我看看metric的真相,我可以告诉你的真相

0

创建线程后,只需设置如下代码的CPU标志。

= > thread's task_struct->flags |= PF_WAKE_UP_IDLE; 
+0

这是为了线程唤醒,而不是CPU唤醒。 Linux内核3.18及更高版本中不存在PF_WAKE_UP_IDLE标志。 – Zhifei 2017-03-16 08:00:14

0

看看select_task_rq_fair(),它是CFS :: select_task_rq()方法。 这是最有代表性的情况,其中调度程序唤醒用于重新平衡运行队列的空闲任务。

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的函数名称)。