Mic*_*Lee 5 kernel arm scheduler irq
我是Linux Kernel的新手.目前,我查看了闲置代码,并提出质疑.当处理器在他们自己的runqueue中没有任何taks时,它可能进入空闲模式,特定WFI(中断的wating).(我所提到的只是ARM体系结构而不是X86.所以X86有些问题.)在保持WFI状态之后,也许其他处理器(非空闲)想要将他们的任务分散到这个空闲处理器(通过负载平衡).那时繁忙的处理器使任务变得很有意义.在我看来,当任务被移植时,空闲处理器应该唤醒immidiatley来处理任务.对?但是,我找不到任何唤醒空闲处理器的代码,但只找到了关于将任务注册到空闲处理器的runqueue的代码.
我想知道在给出新任务时唤醒处理器背后的机制是什么.或者它只是将任务从一个队列移动到另一个队列而不是让它被一些不可预测的IRQ唤醒?
请告诉我真相:)
WFI是ARM的特殊协处理器指令.例如,
ENTRY(cpu_arm946_do_idle)
mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
mov pc, lr
Run Code Online (Sandbox Code Playgroud)
它与Linux(直接)无关.
如果没有工作要做,有一项特殊idle任务可以WFI在ARM上运行指令.该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等.
的真相永远是客观/主观的,肯定不是全球.告诉我metric的真理,我可以告诉你真相.