用户线程 vs 内核线程
1. 介绍
线程是通过进程代码的执行流,具有自己的程序计数器、系统寄存器和存储其执行历史的堆栈。在内核线程中,内核负责管理线程。与内核线程不同,用户线程更容易管理、更快,并且受任何操作系统的支持。
本文中,我们将探讨用户线程和内核线程的差异、优点和局限性。
2. 用户线程
用户线程是用户在用户库的帮助下创建的线程。用户线程对创建它们的进程及其运行时环境可见:
用户线程由创建者进程单独执行和管理,留在其地址空间中,不需要内核的帮助。然而,由于用户空间中的所有线程只有一个线程描述符,如果其中一个线程创建了页面错误,整个过程就会被阻止。
2.1. 优点和局限性
用户线程有几个优点:
- 相比于内核线程,用户线程可以更快创建,并且控制也更简单
- 可以在任何操作系统上运行
- 线程切换不需要内核模式权限
它们也有一些局限:
- 操作系统内核和线程不能很好的通信
- 无论进程包含一个线程还是多个线程,它在调度过程中都会接收一个时间片
- 每个线程都必须决定何时将控制权交给另一个线程
非阻塞系统调用是必要的。否则,即使进程仍然有可运行的线程,它也会在内核中停止。
3. 内核线程
操作系统直接处理内核线程,内核管理它们。内核控制每个进程及其线程的上下文信息。即使一个内核线程执行阻塞操作,也不会对其他线程产生影响。
3.1. 优点和局限性
内核线程有一些优点:
- 它们允许在不同的 CPU 上调度同一进程的多个实例
- 内核程序可以进行多线程处理
- 当一个线程停止时,内核可以为同一进程调度另一个线程
内核线程有如下不足之处:
- 与用户线程相比,它们运行缓慢且效率低下,因为内核必须调度和管理进程和线程
因为每个线程都需要一个完整的线程控制块来跟踪其他线程,所以会有大量的开销
内核的复杂性增加
将控制权从进程中的一个线程转移到同一进程中的另一个线程需要将模式切换到内核模式
4. 对比
用户线程必须映射到内核线程,因为内核对在 CPU 上执行的线程进行计划,并且必须知道它所调度的线程。
进程的所有用户线程都由分配给该进程的内核线程执行。每当所选进程的内核线程在处理器上运行时,它都会被调度到 CPU 上。
如果要执行进程中的任何其他用户线程,则必须将它们逐一映射到指定给生成进程的内核线程上。我们必须将用户线程映射到生成进程上,因为它管理所有线程。
简而言之,以下是用户线程和内核线程之间的区别:
用户线程 | 内核线程 |
---|---|
用户线程可以更快地创建。 | 内核线程创建较慢 |
用户线程的实现由线程库处理 | 内核线程的创建由操作系统提供支持 |
每个操作系统都支持用户线程 | 操作系统的内核线程是唯一的 |
具有多线程的应用不能使用多个处理 | 内核例程可以有许多线程。 |
5. 小结
本文中,我们讨论了用户线程和内核线程。用户线程是用户创建和控制的线程。操作系统生成并控制内核线程。我们需要按顺序将用户线程映射到指定的内核线程。这样,我们才能执行它们。