【问题标题】:Kernel preemption on same priority tasks相同优先级任务的内核抢占
【发布时间】:2013-07-24 10:56:38
【问题描述】:

有人可以通过明确的解释或任何参考链接帮助我理解,内核如何处理具有相同优先级的任务的抢占。假设我有三个任务 A、B 和 C 分配了高优先级

任务(A) { 高优先级 读取异步消息 }

任务(B) { 高优先级 发送异步消息 }

任务(C) { 高优先级 绘制过程 }

在这种情况下,将考虑处理哪个 Task 以及如何抢占它?

【问题讨论】:

    标签: linux-kernel kernel scheduling


    【解决方案1】:

    一般调度顺序是

    1. 内核直接在内核上下文中调用函数schedule(),或者在设置TIF_NEED_RESCHED 标志并且内核从中断上下文返回时调用。
    2. 此函数调用pick_next_task() 来接收任务,该任务将抢占当前正在运行的任务。
    3. pick_next_task() 按优先级降序调用每个调度程序类'pick_next_task(),直到其中一个返回任务。请注意,优先级是指类的优先级(例如软实时或正常),而不是进程的优先级。
    4. CFS 的方法(正常进程的调度程序)是为每个进程提供等量的虚拟运行时间。虚拟运行时间是一个进程的真实运行时间,以其优先级(进程的优先级)加权。所以 CFS 类返回具有较少虚拟运行时的任务。

    对于调度程序,无论进程在做什么,它发送或接收什么消息都无关紧要。因此,一般情况下,如果您的进程具有相同的优先级,则运行时间较短的进程将在下一次 schedule() 调用时抢占另一个进程。

    【讨论】:

    • 谢谢拉森。 CFS 如何评估进程的虚拟运行时。它是否取决于进程使用的资源。我想了解 CFS 的这个选择标准,以找出进程虚拟运行时
    • 另外两点 :) 1) 这是否意味着用户分配的优先级不会被考虑用于任务选择 2) 两个任务是否有可能具有相同的虚拟运行时
    • 0。运行时间仅取决于处理器时间量,进程运行。它在定时器中断处理程序中增加。 1. 进程优先级用作实际运行时的权重。因此,具有更高优先级的进程将获得更高的实际运行时间。 2. 是的,有可能。在这种情况下,调度程序可以选择其中任何一个。
    • CFS schedular 提到了这个 USER_Priority、NICE_VALUE 和任务的 rt_priority 这些有什么关系?那么最终派生的(最小)vruntime是任务调度考虑的吗?
    • 我不知道,USER_Priority 是什么。 Nice值,也称为niceness,是-20..19范围内的值。更大的价值意味着更少的优先权。只有 root 允许设置负值。 rt_priority 是实时优先级。对于实时进程,这是一个 0..100 范围内的值。对于非实时进程,niceness 直接映射在 rt_priority 的 101..140 范围内。 CFS 调度非实时进程。我可以建议您阅读有关日程安排的内容。 Robert Love 在 Linux 内核开发中提供了关于这个主题的一个很好的章节。
    猜你喜欢
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2019-08-15
    • 2014-11-26
    相关资源
    最近更新 更多