【问题标题】:Picking the next task in Linux Kernel在 Linux 内核中选择下一个任务
【发布时间】:2016-01-10 13:34:46
【问题描述】:

从驱动程序中的随机位置选择当前 CPU 将执行的下一个任务(进程)的最安全方法是什么?

我看到 struct task_struct(来自 sched.h)包含一个 next_task 成员,并认为执行该任务的一个好方法是使用 current 宏,并使用该成员来选择下一个。

但是,我看到函数 __schedule() 以不同的方式执行该任务 - 使用 cpu_rq 之类的函数...

那么,什么是正确的方法以及方法之间的区别?

顺便说一句,我看到了“当前”任务的两种不同定义。

  1. 在 sched.h 中:#define current (0+current_set[smp_processor_id()])

  2. current.h 中更受欢迎的一个:#define current get_current() 返回percpu_read_stable(current_task)

对于我最初的解决方案,这两个听起来都不错,但是怎么可能有两个同名的宏呢?它们之间有什么区别?

【问题讨论】:

    标签: linux-kernel scheduler


    【解决方案1】:

    选择当前 CPU 将执行的下一个任务(进程)的最安全的方法是什么,
    司机的随机位置

       /* random place in a driver */
        msleep_interruptible(20);
    

    注意:记得#include <linux/delay.h>

    下一个任务现在已被“挑选”在当前 CPU 上运行。 :-)

    更严肃地说,
    不涉及调度程序,
    驾驶员无法准确确定(在所有操作条件下)
    将在 CPU 上安排的下一个任务。


    我看到 struct task_struct(来自 sched.h)包含一个 next_task 成员,并认为执行该任务的一个好方法是使用当前宏获取当前任务,并使用该成员选择下一个一。

    next_task 指针仅用于维护系统中所有任务的全局链表。
    不要混淆为要安排的下一个任务或类似的任务。

    参考:
    - introduction to Linux Processes
    -details of the process descriptor and the task structure


    current 的 2 个定义,即 (0+current_set[smp_processor_id()]percpu_read_stable(current_task),有什么区别?

    目前(Linux 内核 4.4),
    以下 2 是 current 的唯一与架构无关的定义

    1. (current_thread_info()->task)

      • 保存在堆栈上以便快速检索。
      • 在正常操作模式下默认使用。
    2. syscall(__NR_gettid);

      • 触发系统调用以查找当前进程的 tid/pid。
      • 当内核启用了 lockdep 调试时使用。

    这两个都返回task_struct
    包含当前 CPU 上活动的当前任务的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2020-03-15
      • 1970-01-01
      • 2019-05-10
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多