用户线程 vs 内核线程

6

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

先感谢您的帮助。

Alex

1个回答

9
我听说,在Linux/Unix上,内核线程(例如系统调用)比用户线程执行得更快。这是一个大错特错的说法。
内核线程用于内核内部的“后台”任务,例如处理中断和将数据刷新到磁盘。大部分系统调用都在调用它们的进程上下文中由内核处理。
内核线程的调度方式与用户进程基本相同。一些内核线程具有高于默认优先级的优先级(在某些情况下可达实时优先级),但说它们“执行得更快”是误导性的。
当用户线程运行时,内核会被挂起,这是真的吗?当然。在单个CPU核心上,每次只能运行一个进程。
话虽如此,有许多情况可以使内核中断正在运行的任务并切换到另一个任务(可能是内核线程):
当计时器中断触发时。默认情况下,这每秒发生100次。
当任务进行阻塞系统调用(例如select()或read())时。
当任务中发生CPU异常(例如,内存访问故障)时。

在单个CPU上,原始的CPU周期被分时到许多内核线程的执行队列中。其中一些队列进一步被切片以运行众多用户线程。我说得对吗? - techie11
你所假设的层次结构(用户线程在内核线程下)并不存在。对于用户任务和内核线程,使用相同的进程优先级层次结构。此外,在每个调度时间片中,CPU会选择一个可运行的任务来运行——只要至少有一个可运行的进程,CPU就不会处于空闲状态。 - user149341
你错过了最重要的一点 - 当 I/O 中断到达驱动程序时,会使等待的线程变为就绪状态。这是使用抢占式多任务内核的主要原因 - 良好的 I/O 性能。 - Martin James
谢谢。在Solaris 8及更早版本中存在这样的层次结构。多个用户线程被复用在单个内核线程上。但自从Solaris 9以来,一个单独的用户线程对应一个内核线程。 - techie11
有些内核线程具有比默认优先级更高的优先级(在某些情况下甚至可以达到实时优先级)。这是否意味着内核线程的延迟时间比用户线程少?如果我们将用户空间线程声明为具有更高优先级的SCHED_FIFO,那么它会在内核线程之前调度吗? 一些内核线程具有比默认优先级更高的优先级(在某些情况下可达到实时优先级)。这是否意味着内核线程的延迟比用户线程更短?如果我们将用户空间线程声明为具有更高优先级的 SCHED_FIFO,是否会在内核线程之前安排? - ransh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接