操作系统 - 多线程
什么是线程?
线程是通过进程代码的执行流,它有自己的程序计数器来跟踪接下来要执行的指令、保存当前工作变量的系统寄存器以及包含执行历史记录的堆栈。 p>
线程与其对等线程共享很少的信息,例如代码段、数据段和打开的文件。 当一个线程改变一个代码段内存项时,所有其他线程都会看到。
线程也称为轻量级进程。 线程提供了一种通过并行性提高应用程序性能的方法。 线程代表了一种通过减少开销来提高操作系统性能的软件方法,线程等效于经典进程。
每个线程只属于一个进程,并且没有线程可以存在于进程之外。 每个线程代表一个单独的控制流。 线程已成功用于实现网络服务器和 Web 服务器。 它们还为在共享内存多处理器上并行执行应用程序提供了合适的基础。 下图展示了单线程和多线程进程的工作原理。
进程和线程的区别
S.N. | 进程 | 线程 |
---|---|---|
1 | 进程是重量级的或资源密集型的。 | 线程是轻量级的,比进程占用更少的资源。 |
2 | 进程切换需要与操作系统交互。 | 线程切换不需要与操作系统交互。 |
3 | 在多个处理环境中,每个进程执行相同的代码但拥有自己的内存和文件资源。 | 所有线程可以共享同一组打开的文件、子进程。 |
4 | 如果一个进程被阻塞,那么在第一个进程被解除阻塞之前没有其他进程可以执行。 | 当一个线程被阻塞并等待时,同一任务中的第二个线程可以运行。 |
5 | 不使用线程的多个进程使用更多资源。 | 多线程进程使用更少的资源。 |
6 | 在多个进程中,每个进程独立于其他进程运行。 | 一个线程可以读取、写入或更改另一个线程的数据。 |
线程的优点
- 线程最大限度地减少了上下文切换时间。
- 线程的使用提供了进程内的并发性。
- 高效沟通。
- 创建和上下文切换线程更经济。
- 线程允许以更大的规模和效率利用多处理器架构。
线程类型
线程通过以下两种方式实现 −
用户级线程 − 用户管理的线程。
内核级线程 − 操作系统管理的线程作用于内核,一个操作系统核心。
用户级线程
在这种情况下,线程管理内核不知道线程的存在。 线程库包含用于创建和销毁线程、在线程之间传递消息和数据、调度线程执行以及保存和恢复线程上下文的代码。 应用程序以单线程启动。
优势
- 线程切换不需要内核模式权限。
- 用户级线程可以在任何操作系统上运行。
- 调度可以是用户级线程中特定于应用程序的。
- 用户级线程可以快速创建和管理。
缺点
- 在典型的操作系统中,大多数系统调用都是阻塞的。
- 多线程应用程序无法利用多处理。
内核级线程
在这种情况下,线程管理由内核完成。 应用区没有线程管理代码。 内核线程由操作系统直接支持。 任何应用程序都可以编程为多线程。 单个进程中支持应用程序中的所有线程。
内核为整个进程和进程中的各个线程维护上下文信息。 内核的调度是在线程的基础上完成的。 内核在内核空间中执行线程创建、调度和管理。 内核线程的创建和管理速度通常比用户线程慢。
优势
- 内核可以同时在多个进程上调度来自同一进程的多个线程。
- 如果进程中的一个线程被阻塞,内核可以调度同一进程的另一个线程。
- 内核例程本身可以是多线程的。
缺点
- 创建和管理内核线程的速度通常比用户线程慢。
- 在同一进程中将控制从一个线程转移到另一个线程需要对内核进行模式切换。
多线程模型
某些操作系统提供组合的用户级线程和内核级线程设施。 Solaris 是这种组合方法的一个很好的例子。 在组合系统中,同一应用程序中的多个线程可以在多个处理器上并行运行,并且阻塞系统调用不需要阻塞整个进程。 多线程模型分为三种
- 多对多关系。
- 多对一关系。
- 一对一的关系。
多对多模型
多对多模型将任意数量的用户线程多路复用到数量相等或更少的内核线程上。
下图显示了多对多线程模型,其中 6 个用户级线程与 6 个内核级线程复用。 在此模型中,开发人员可以根据需要创建尽可能多的用户线程,并且相应的内核线程可以在多处理器机器上并行运行。 该模型提供了最佳的并发精度,当一个线程执行阻塞系统调用时,内核可以调度另一个线程执行。
多对一模型
多对一模型将多个用户级线程映射到一个内核级线程。 线程管理由线程库在用户空间完成。 当线程进行阻塞系统调用时,整个进程都会被阻塞。 一次只有一个线程可以访问内核,因此多个线程无法在多处理器上并行运行。
如果用户级线程库在操作系统中以系统不支持的方式实现,则内核线程使用多对一关系模式。
一对一模型
用户级线程与内核级线程是一对一的关系。 此模型提供比多对一模型更多的并发性。 当一个线程进行阻塞系统调用时,它还允许另一个线程运行。 它支持多线程在微处理器上并行执行。
这种模型的缺点是创建用户线程需要对应的内核线程。 OS/2、windows NT 和 windows 2000 使用一对一的关系模型。
用户级 & 内核级线程的区别
S.N. | 用户级线程 | 内核级线程 |
---|---|---|
1 | 用户级线程的创建和管理速度更快。 | 内核级线程的创建和管理速度较慢。 |
2 | 由用户级别的线程库实现。 | 操作系统支持创建内核线程。 |
3 | 用户级线程是通用的,可以在任何操作系统上运行。 | 内核级线程特定于操作系统。 |
4 | 多线程应用程序无法利用多处理。 | 内核例程本身可以是多线程的。 |