在linux任务调度程序中,定期调用哪些函数来进行调度工作?

时间:2012-06-19 21:45:04

标签: linux task scheduler

我花了很多时间在代码级别找出函数,现在我真的很困惑。

首先在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)已被调用。

显然,似乎有一个基于hrtick的定时器用于定期激活调度算法。但奇怪的是,在core.c文件中,我真的找不到定时器如何配置为定期调用__schedule()schedule()。我没有看到计时器被配置为调用此函数。

是否使用了其他功能? linux任务调度专家可以给我一个提示:>

2 个答案:

答案 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()。