【问题标题】:In linux task scheduler, what function is called periodically to do the scheduling work?在linux任务调度器中,定期调用什么函数来做调度工作?
【发布时间】:2012-06-19 21:45:04
【问题描述】:

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

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

【问题讨论】:

    标签: linux task scheduler


    【解决方案1】:

    不需要什么特别的。定时器只是触发一个中断,中断逻辑已经处理了当你从中断返回时要运行哪个任务。例如,参见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
    

    【讨论】:

    • 哦,谢谢你,大卫。我从来没有处理过这种汇编代码。所以似乎在中断处理程序中,函数 schedule() 会被调用?那么这是有道理的
    • 是的,当内核从中断返回用户空间时,它必须决定返回哪个进程。这可能需要调用调度程序。
    • 我明白了。太感谢了。没有任何提示,我永远不会得到这个。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2017-03-15
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多