【操作系统-11】线程
1、线程概念
线程是程序执行中的一个基本单位,也称为轻量级进程。一个进程通常由多个线程组成,这些线程共享进程的资源(比如内存、文件描述符等)。线程是程序执行的最小单位,线程之间的切换相比于进程的切换更为高效。因此,线程可以提供更高的并发性和更好的系统资源利用率。
线程的主要特点:
- 共享资源:同一个进程中的所有线程共享进程的地址空间、全局变量、堆内存和打开的文件描述符等资源。
- 独立执行:每个线程都有自己的程序计数器(PC)、栈和局部变量,独立执行自己的代码。
- 并发性:多个线程在同一时间内并发执行,或在多个CPU核心上并行执行。
线程的优势在于它能充分利用多核处理器的优势,提高程序的并发性和响应性,尤其是在需要处理大量I/O操作或需要进行多任务并行计算的应用中。
2、用户级线程与内核级线程
在操作系统中,线程的管理可以分为用户级线程和内核级线程,它们的主要区别在于线程的创建、调度和管理是由谁来控制。
-
用户级线程(ULT):用户库管,内核看不见。
-
内核级线程(KLT):内核直接管,内核看得见。
(1)用户级线程(User-Level Thread,ULT)
管理方式
线程库(如 pthread、Windows 线程 API)在用户空间完成线程的创建、调度和切换。内核完全不知道这些线程的存在,它只看到“一个进程”。
优点
-
高效:创建、销毁、切换都在用户态完成,不需要陷入内核,速度非常快。
-
可移植性强:只要用户空间有线程库,就能跑,不依赖操作系统是否支持线程。
缺点
-
阻塞问题:如果一个线程执行了阻塞系统调用(如 I/O),整个进程都会被阻塞。因为内核只看到进程,它认为这个进程在阻塞,就不会去调度同一进程里的其他线程。
-
不能利用多核:内核只给这个进程分配一个 CPU 核心,所以同一进程内的多个用户级线程无法真正并行,只能并发。
(2)内核级线程(Kernel-Level Thread,KLT)
管理方式
线程的创建、调度、管理全部由操作系统内核完成。内核为每个线程分配独立的资源(如栈、寄存器上下文、TCB),并直接参与 CPU 调度。
优点
-
独立调度:内核可以在多个 CPU 核心上同时调度同一进程的多个线程,真正实现并行。
-
高效的阻塞处理:一个线程阻塞时,内核可以调度同一进程中的其他线程继续执行,不会阻塞整个进程。
缺点
-
开销较大:线程的创建、销毁、切换都需要操作系统支持,涉及用户态和内核态的切换,成本比 ULT 高。
-
系统调用频繁:每次线程切换都可能需要执行系统调用,影响性能。
(3)混合模式:用户级线程与内核级线程结合(Hybrid)
在某些操作系统中,线程的管理采用用户级线程和内核级线程的结合模式,称为混合线程模型。这意味着用户级线程库在用户空间管理线程的创建和调度,但内核仍然对这些线程进行调度。
优点:能够兼顾用户级线程的高效性和内核级线程的并行性。
缺点:实现复杂,且需要操作系统支持。
3、多线程模型
根据线程管理的不同方式,操作系统支持不同的多线程模型。主要的多线程模型有以下几种:
(1)多对一模型(Many-to-One)
多个用户级线程映射到一个内核级线程上。所有线程由用户空间线程库管理,内核只看到一个内核级线程。
特点
-
线程的创建、调度、切换都在用户空间进行。
-
内核只看见一个进程/内核线程,所有线程共享一个内核线程。
-
如果一个线程阻塞(如 I/O),整个进程的所有线程都会被阻塞。
优点
-
线程管理开销小,切换速度快。
-
可移植性强,不依赖内核支持。
缺点
-
不能利用多核处理器,无法真正并行。
-
一个线程阻塞会导致整个进程阻塞。
示例
早期的 Solaris 操作系统使用的线程模型。
(2)一对一模型(One-to-One)
每个用户级线程都对应一个内核级线程。操作系统内核能够直接识别和调度每个线程,每个用户级线程都会分配一个独立的内核级线程。
特点
-
每个用户级线程都有一个对应的内核线程,能够并行执行。
-
操作系统能够同时调度多个线程,充分利用多核处理器。
-
如果一个线程阻塞,操作系统仍然可以调度其他线程继续执行。
优点
-
支持多核处理器,线程并行性较强。
-
阻塞处理高效,一个线程阻塞不影响其他线程。
缺点
-
线程的创建和管理开销较大,因为每个线程都需要一个内核级线程。
-
线程数量受限于内核资源。
示例
现代 Windows 和 Linux 操作系统通常采用这种模型。
(3)一对多模型(One-to-Many)
一个用户级线程映射到多个内核级线程上。这种模型在实际操作系统中极少使用,更多是理论上的分类。
特点
-
一个用户级线程可以对应多个内核级线程。
-
理论上可以提高并行性,但管理复杂。
-
实际中很难协调,容易出现资源浪费和同步问题。
优点:能够利用内核的调度,同时避免了用户级线程的阻塞问题。
缺点:实现较复杂,且存在较高的开销。
示例:一些特定的嵌入式系统和研究性操作系统使用这种模型。
(4)多对多模型(Many-to-Many)
多个用户级线程映射到多个内核级线程上。用户级线程通过线程库管理,内核级线程由操作系统管理,二者之间是多路复用关系。
特点
-
用户级线程数量可以很多,内核级线程数量相对较少。
-
内核级线程可以并行执行,用户级线程可以灵活调度。
-
一个线程阻塞时,内核可以调度其他内核线程,不会阻塞整个进程。
优点
-
结合了多对一和一对一的优点:创建快、可并行、阻塞处理高效。
-
线程数量不受内核资源严格限制。
缺点
-
实现复杂,需要用户空间线程库和内核紧密配合。
-
调度策略设计难度大。
示例
Solaris、Windows 的线程模型、Go 的 goroutine 调度器(GMP 模型)都有类似思想。
总结
线程是执行的最小单位,多个线程共享进程的资源,可以提高并发性和响应性。
用户级线程由用户空间的线程库管理,不依赖于操作系统内核;内核级线程由操作系统内核管理,能够在多核处理器上并行执行。
多线程模型有多对一、一对一和一对多三种方式,分别在不同的操作系统和应用场景下具有不同的优缺点:
- 多对一模型:适用于没有多核处理器需求的系统,但效率较低。
- 一对一模型:每个线程有独立的内核级线程,能够充分利用多核处理器。
- 一对多模型:介于两者之间,可能在某些系统中使用。
选择合适的线程模型和线程管理方式,能够提高系统的并发性和资源利用效率,适应不同的计算需求。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)