0

我花了很多时间弄清楚代码级别的功能,现在我真的很困惑。

首先在 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任务调度高手能否给个提示:>

4

2 回答 2

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
于 2012-06-19T21:51:00.663 回答
1

Linux 内核中实际上有两个调度程序,或者说是两个调度代码。有一个核心调度程序,您自己提到过,它称为 schedule(),它调用 __schedule()。schedule() 从内核中的许多点调用,例如在系统调用之后等。

还有另一个名为 scheduler_tick() [这也位于 core.c] 的调度程序代码,它是一个周期性调度程序,由计时器调用code(timer.c) 通过中断频率为 HZ,即 scheduler_tick() 在一秒内调用 HZ 次。HZ 取决于硬件,其值在 100-1024 之间变化。scheduler_tick() 调用处理器上当前任务所属的调度类的 task_tick()。

于 2013-02-19T10:44:39.347 回答