【问题标题】:kernel threads and user threads priorities内核线程和用户线程优先级
【发布时间】:2017-05-04 17:45:56
【问题描述】:

我们尝试评估在用户或内核中执行一些与硬件相关的任务是否更好。 该任务必须响应中断并执行一些将数据复制到物理(映射)内存空间的任务。

据我了解,在用户空间或内核中都可以完成相同的任务。

唯一悬而未决的问题是内核线程优先级是否高于用户线程优先级。

我们将pthread 用于用户空间或kthread 用于内核线程。

所以,我的问题是:

当两个线程都准备好时,内核线程的优先级是否高于用户线程?

编辑: 如果 kthread_create 是使用 SCHED_FIFO 创建的并赋予优先级 x, 并且 pthread_create 是使用 SCHED_FIFO 创建并赋予优先级 y, 而且pthread的优先级高于kthread,kthread还会在用户线程之前进入调度器吗?

谢谢!

【问题讨论】:

    标签: linux multithreading kernel


    【解决方案1】:

    用户线程必须始终被内核模式线程抢占,因为内核模式线程需要响应硬件事件。这是由于操作系统设计造成的。

    内核线程的优先级高于用户线程,因为内核线程用于为应用程序提供特权服务。

    除此之外,内核还使用它们来跟踪系统上正在运行的所有内容、分配给哪个进程的资源的多少以及对它们进行调度。

    如您所知,用户空间中存在的每个线程都有一个对应的内核线程,因此如果系统范围(内核)中进程的线程具有足够高的优先级,它们将同时被调度在多个 CPU 上.意味着其他内核线程将被这个代表用户空间运行的内核线程抢占。

    【讨论】:

    • 谢谢,我编辑了上面的帖子,提出了一个价格更高的问题:“如果 pthread 高于 kthread,kthread 还会在用户线程之前进入调度程序吗?”
    • @ransh 我已经修改了我的答案,但简而言之,cpu 将首先安排更高优先级的线程。
    • 谢谢,如果我理解正确,如果用户线程的优先级高于内核线程,它将首先被调度。谢谢
    【解决方案2】:

    Linux 系统中的进程由struct task_struct 结构表示。 现在对于内核线程 p->mm 来说,进程的地址空间为 NULL,它的活动地址空间由 p->active_mm 表示。因此,当一个内核线程被调度进来时,它的next->active_mm 将被设置为被调度出去的任务的prev->active_mm。这有助于最大限度地减少切换地址空间时的 TLB 刷新。

    特定于架构的常量 PROC_CHANGE_PENALTY 定义了 cpu 亲和性,从而为同一 cpu 中的进程提供了优势,也使内核线程优先于用户线程(它们的 ->mm != NULL 并且需要开销)。

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2012-05-15
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      相关资源
      最近更新 更多