在Linux内核中挑选下一个任务

时间:2016-01-10 13:34:46

标签: linux-kernel scheduler

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

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

但是,我看到函数 __ 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)

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

1 个答案:

答案 0 :(得分:0)

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

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

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

接下来的任务已被选中&#34;在当前的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的两个定义之间有什么区别,即(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调试时使用。
  3.   

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