当新任务创建时,linux内核如何唤醒处理器?

时间:2013-02-25 01:22:11

标签: kernel arm scheduler irq

我是Linux内核的新手。 目前,我查看了闲置代码,并提出质疑。 当处理器在他们自己的队列中没有任何设施时,它可能会 进入空闲模式,特定WFI(中断等待)。 (我所提到的只是ARM架构而不是X86。所以X86出了问题。) 在WFI状态下,也许其他处理器(不是闲置)想要传播 他们的任务是空闲处理器(通过负载平衡)。那个繁忙的处理器 让任务变得愚蠢。在我看来,当任务被移植时,空闲处理器 应该唤醒immidiatley来处理任务。对?但是,我无法找到 任何代码唤醒空闲处理器但只找到关于将任务注册到空闲处理器的runqueue的代码。

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

请告诉我真相:))

4 个答案:

答案 0 :(得分: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 中。例如, x86 default_idle()。我不知道 x86 如何工作的具体细节,但您可以查看来源。

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

其他相关机制有cpufreqcpuidlekernel/power等。

真相总是客观/主观,当然不是全球。向我显示{{1>}的真相,我可以向您显示真相

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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的函数名)。