我是Linux内核的新手。 目前,我查看了闲置代码,并提出质疑。 当处理器在他们自己的队列中没有任何设施时,它可能会 进入空闲模式,特定WFI(中断等待)。 (我所提到的只是ARM架构而不是X86。所以X86出了问题。) 在WFI状态下,也许其他处理器(不是闲置)想要传播 他们的任务是空闲处理器(通过负载平衡)。那个繁忙的处理器 让任务变得愚蠢。在我看来,当任务被移植时,空闲处理器 应该唤醒immidiatley来处理任务。对?但是,我无法找到 任何代码唤醒空闲处理器但只找到关于将任务注册到空闲处理器的runqueue的代码。
我想知道在给出新任务时唤醒处理器背后的机制是什么。 或者它只是将任务从一个队列移动到其他队列而不是让它被唤醒 一些不可预测的IRQ?
请告诉我真相:))
答案 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任务,如果没有其他任务,则会安排。如果WFI
由idle
完成,则当没有工作要做时,某些驱动程序会中断(可能是计时器)。在SMP情况下,如果有其他进程可以迁移,它将不会转到idle
;调度程序检查这个。如果负载变高,则繁忙的处理器需要wake
其他负载;对于带有中断的 ARM 。通常,此处理位于 arch / arch /kernel/process.c 中。例如, x86 有default_idle()
。我不知道 x86 如何工作的具体细节,但您可以查看来源。
对于你的问题在创建新任务时,linux内核如何唤醒处理器空闲?,答案是它没有。只有fork()
(以及一些类似的函数)才能创建新任务;最初来自init
任务,然后是其中一个孩子。如果您有一个cron
作业,它将在计时器转到sleep/idle
之前安排一个计时器。此计时器将唤醒系统,重新计划cron
,然后cron
将调用fork()
,以创建新任务。
其他相关机制有cpufreq
,cpuidle
,kernel/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的函数名)。