multithreading - 用户线程 vs.内核线程

标签 multithreading linux-kernel kernel

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

提前致谢,

亚历克斯

最佳答案

I heard that, on Linux/Unix, kernel threads(such as those of system calls) get executed faster than user threads.



这是一个很大程度上不准确的说法。
  • 内核线程用于内核内部的“后台”任务,例如处理中断和将数据刷新到磁盘。大部分系统调用由内核在调用它们的进程的上下文中处理。
  • 内核线程的调度方式与用户进程大致相同。一些内核线程的优先级高于默认优先级(在某些情况下高达实时优先级),但说它们“执行得更快”是一种误导。

  • Is it true that on a single processor box, when user thread is running, kernel will be suspended?



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

    话虽如此,在许多情况下,内核可以中断正在运行的任务并切换到另一个任务(可能是内核线程):
  • 当定时器中断触发时。默认情况下,这每秒发生 100 次。
  • 当任务进行阻塞系统调用时(例如 select()read() )。
  • 当任务中发生 CPU 异常时(例如,内存访问错误)。
  • 关于multithreading - 用户线程 vs.内核线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17683067/

    相关文章:

    linux - 多线程处理和并行处理到底有什么区别?

    java - 在方法内声明 HashMap

    java - 无法创建实现 Runnable 接口(interface)的类的对象

    java - 调用 executorService.invokeAll(callables) 时如何按顺序获取 Future 列表?

    c - 如何获取内核空间中特定元素的大小

    c - 如何判断逻辑地址是否在物理内存中?

    c++ - CreateFile 打开在另一个终端 session 中创建的 MS-DOS 设备

    c - 如何知道 pthread 已停止?

    linux-kernel - 动态更改 eBPF 映射大小

    c - Linux内核中是否有函数/宏来获取smp机器上的当前抢占状态?