用户级线程和内核级线程有什么区别?


33

在阅读了一些资料之后,我仍然对用户级和内核级线程感到困惑。

特别是:

线程可以同时存在于用户级别和内核级别

用户级别和内核级别之间有什么区别?


1
这真的是Comp Sci(理论)还是编程?
Mehrdad 2012年

6
@Mehrdad,操作系统是计算机科学的一部分。
卡夫

Answers:


28

多任务操作系统内核的作用之一是调度:确定何时执行哪个执行线程。因此,这样的内核具有线程进程的概念。线程是正在执行的顺序代码,具有自己的堆栈,有时还有其他数据。在操作系统上下文中,人们通常使用进程来表示具有自己的内存空间的线程,并使用线程来表示与其他线程共享其内存空间的线程。一个进程可以具有一个或多个线程。

某些操作系统(例如,较旧的unix系统)仅提供进程:内核管理的每个线程都有自己的内存空间。其他操作系统(例如,大多数现代的UNIX系统)允许进程包含多个执行线程:它们提供了内核级的线程概念。

进程也可以管理自己的线程。在协作多线程中,每个线程的代码都包含切换到另一个线程的指令。在抢占式多线程中,进程从内核请求周期性的异步通知,并通过切换到其他线程来对这些通知做出反应。这样,在用户级别的库中,无需内核合作即可实现多线程。

系统可以同时提供内核级和用户级线程。这就是所谓的混合线程

用户级和内核级线程各有其优点和缺点。用户级线程之间的切换通常更快,因为不需要重置内存保护即可切换到内核内调度程序,而无需再次切换回该进程。对于使用大量非常短命的线程的大规模并发系统(例如某些高级语言(尤其是Erlang)及其绿色线程),这尤其重要。用户级线程需要较少的内核支持,这可以使内核更简单。内核级线程允许一个线程运行,而同一进程中的另一个线程在系统调用中被阻塞; 具有用户级线程的进程必须注意不要阻塞系统调用,因为它们会阻塞进程的所有线程。内核级线程可以在多处理器计算机上同时运行,而纯粹的用户级线程则无法实现。


最后一行说:“内核级线程可以在多处理器计算机上同时运行,而纯粹的用户级线程则无法实现”。但是,给定的链接说,ULT可以同时运行stackoverflow.com/questions/14791801/…。我有什么问题吗?
加里克

你能检查我的上述评论吗?
加里克

1
@Garrick多个用户级线程可以同时在不同的内核上运行,前提是它们在不同的内核级线程中运行。如果仅将ULT作为工具,则只能使用一个处理器。如果KLT可用,则可以将内核线程分布在多个处理器上,并在可用内核线程之间分派ULT。
吉尔斯(Gilles)'所以

4

将内核级线程视为“ 虚拟处理器 ”,而将用户级线程视为简单线程(现在就这样称呼它们)。现在,要执行的线程已经分配给处理器了吗?因此,每个线程都分配给一个虚拟处理器,以便可以执行它。

这是事实

  • 创建一个新的虚拟处理器有点昂贵。(内核必须在线程控制块中创建一个条目,分配堆栈等。)

  • 与创建新的虚拟处理器相比,创建线程非常简单。应用程序开发人员可以使用编程语言提供的线程库创建线程,并在用户空间中进行管理。并且不同的语言实现了多线程以不同的方式。

楷模

  • 如果将线程映射到单个虚拟处理器,则必须注意不要在任何一个线程中进行阻塞的系统调用,因为其他线程不能再同时运行。

  • 如果可以创建更多的虚拟处理器,则可以克服此限制。现在,线程可以并发运行(如果存在多个真实处理器,则可以并行运行)。一个线程不会影响映射到其他虚拟处理器上的其他线程。

  • 在后一种模型中,可以将一个或多个线程映射到虚拟处理器上。

  • 以上模型分别命名为“多对一”,“一对一”和“多对多”。

Referenes:Galvin等人的操作系统概念。主题:线程->多线程模型

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.