【问题标题】:user threads v.s. kernel threads用户线程与内核线程
【发布时间】:2013-07-15 00:27:30
【问题描述】:

谁能帮助澄清我对内核线程的理解。我听说,在 Linux/Unix 上,内核线程(例如系统调用的线程)比用户线程执行得更快。但是,那些用户线程不是由内核调度并使用内核线程执行的吗?有人可以告诉我内核线程和用户线程之间有什么区别,除了他们可以访问不同的地址空间这一事实。它们之间还有什么区别?是不是在单处理器机器上,当用户线程运行时,内核会被挂起?

提前致谢,

亚历克斯

【问题讨论】:

    标签: multithreading linux-kernel kernel


    【解决方案1】:

    我听说,在 Linux/Unix 上,内核线程(例如系统调用的线程)的执行速度比用户线程快。

    这是一个非常不准确的说法。

    • 内核线程用于内核内部的“后台”任务,例如处理中断和将数据刷新到磁盘。大部分系统调用由内核在调用它们的进程的上下文中处理。

    • 内核线程的调度方式与用户进程大致相同。一些内核线程的优先级高于默认优先级(在某些情况下高达实时优先级),但说它们“执行得更快”是一种误导。

    是不是在单处理器机器上,当用户线程运行时,内核会被挂起?

    当然。在单个 CPU 内核上一次只能运行一个进程。

    话虽如此,在很多情况下内核可以中断正在运行的任务并切换到另一个任务(可能是内核线程):

    • 定时器中断触发时。默认情况下,每秒发生 100 次。
    • 当任务进行阻塞系统调用时(例如select()read())。
    • 当任务中发生 CPU 异常时(例如,内存访问错误)。

    【讨论】:

    • 所以在单个 CPU 上,原始 CPU 周期被时间切片为内核线程的许多执行队列。其中一些队列被进一步分割以运行大量用户线程。我说的对吗?
    • 您假设的层次结构(内核线程下的用户线程)不存在。相同的进程优先级层次结构用于用户任务和内核线程。此外,在每个调度时间段,CPU 都会选择一个符合条件的任务来运行——只要至少有一个可运行的进程,CPU 就不会空闲。
    • 您错过了最重要的一个 - 当驱动程序的 I/O 中断使等待线程准备好时。这是使用抢占式 mititasking 内核的主要原因 - 良好的 I/O 性能。
    • 谢谢。在 Solaris 8 和更早的版本中有这样的层次结构。多个用户线程在单个内核线程上多路复用。但是从 Solaris 9 开始,一个用户线程对应一个内核线程。
    • “某些内核线程的优先级高于默认优先级(在某些情况下达到实时优先级)”,这是否意味着内核线程的延迟比用户线程的延迟更小?如果我们将用户空间线程声明为具有更高优先级的 SCHED_FIFO,它不会在内核线程之前被调度吗?
    猜你喜欢
    • 2022-08-15
    • 2011-02-02
    • 2015-04-14
    • 2022-10-07
    • 2012-01-10
    • 2012-11-01
    • 1970-01-01
    • 2017-05-04
    • 2019-11-21
    相关资源
    最近更新 更多