我花了很多时间在代码级别找出函数,现在我真的很困惑。
首先在core.c中,函数__schedule()
或schedule()
似乎是最有希望的函数。通常在__schedule()
中,我发现代码hrtick_clear(rq)
似乎是一个计时器。然后在__schedule()
中,将调用函数next = pick_next_task(rq)
,它将尝试查找要安排的下一个任务。对于正常任务,使用CFS算法。然后我进入了fair.c文件来检查pick_next_task_fair函数。通过跟踪该功能,我看到hrtick_start(rq, delta)
已被调用。
__schedule()
或schedule()
。我没有看到计时器被配置为调用此函数。
是否使用了其他功能? linux任务调度专家可以给我一个提示:>
答案 0 :(得分:3)
不需要特别的东西。定时器只是触发一个中断,并且中断逻辑已经必须处理从中断返回时确定要运行的任务。例如,请参阅entry_32.S中处理中断返回的代码:
358 ENTRY(resume_userspace)
359 LOCKDEP_SYS_EXIT
360 DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
361 # setting need_resched or sigpending
362 # between sampling and the iret
363 TRACE_IRQS_OFF
364 movl TI_flags(%ebp), %ecx
365 andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
366 # int/exception return?
367 jne work_pending
368 jmp restore_all
369 END(ret_from_exception)
...
615 work_pending:
616 testb $_TIF_NEED_RESCHED, %cl
617 jz work_notifysig
618 work_resched:
619 call schedule
答案 1 :(得分:1)
实际上有两个调度程序,或者说Linux内核中有两个调度代码。有一个核心调度程序,您自己提到称为schedule(),它调用__schedule()。 schedule()从内核中的许多点调用,比如在系统调用之后等。
还有另一个调度程序代码,其名称为scheduler_tick()[这也位于core.c中],它是一个定期调度程序,由定时器代码(timer.c)通过频率为HZ的中断调用,即scheduler_tick()在一秒钟内被称为HZ时间。 HZ取决于硬件,其值在100-1024之间变化。 scheduler_tick()调用处理器上当前任务所属的调度类的task_tick()。