Hi~朋友,关注置顶防止错过消息
摘要
- 线程的概念
- 线程和进程的比较
- 线程的上下文切换
- 线程的实现方式
线程的概念
线程是计算机操作系统的最小调度资源,同一个进程内多个线程可以共享代码段、数据段、打开的文件等资源,但是每个线程都有一套独立的寄存器和栈,这样可以保证线程的控制流是独立的。
线程和进程的比较
线程的优缺点
优点:
- 一个进程中可以有多个线程
- 各个线程之间可以并发运行
- 各个线程之间可以共享地址空间和文件资源
缺点:
- 当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃
线程和进程的区别
- 进程时资源(包括内存、打开的文件等)分配的单位,线程时CPU调度的单位
- 进程拥有一个完整的资源平台,线程只独享必不可少的资源,比如寄存器和栈
- 线程和进程一样同样具有就绪、阻塞、运行三种基本状态
- 线程能减少并发执行时间和空间开销
为什么线程可以减少开销?
- 线程创建时间比进程快,线程在创建的过程中不涉及内存、文件等的申请和打开,因为一个进程的所有线程共享一块内存和文件资源
- 线程的终止时间比进程快,因为线程释放的资源要比进程少
- 线程的切换比进程快,因为同一个进程多个线程共享内存,因此不需要进行页表的切换,但是对于进程,需要页表切换,页表的切换开销相对较大
- 统一进程的所有线程共享内存和文件资源,因此在线程之间传递数据时,不需要经过内核,数据交互效率变高
线程的上下文切换
线程在切换时,只需要切换线程私有数据、寄存器等不共享的数据。
线程的实现方式
线程实现方式
- 用户线程:在用户空间实现的线程,不是由内核管理的线程,是由用户态的线程库来完成线程的管理
- 内核线程:在内核中实现的线程,是由内核管理的线程
- 轻量级进程:在内核中支持用户线程
用户线程和内核线程的对应关系
- 多对一:多个用户线程对应同一个内核线程
- 一对一:一个用户线程对应一个内核线程
- 多对多:多个用线程对应到多个内核线程
用户线程
用户线程基于用户的线程库来管理实现,线程控制块(TCB)也在用户的库中实现,操作系统是无法知道TCB的存在的。
用户线程的调度和管理,操作系统无法直接参与,都是需要用户自己实现。
用户线程的优缺点
优点:
- 每个进程都需要有私有的TCB列表,用来跟踪记录各个线程的状态信息(PC、栈指针、寄存器),TCB由用户自己实现,可用于不支持线程技术的操作系统
- 用户线程的切换也是用户自己实现,无需用户态和内核态的切换,所以速度较快
缺点:
- 由于操作系统不参与线程的调度,如果一个线程因发起系统调用阻塞,那么该进程包含的所有线程都无法执行
- 线程在开始运行后,除非主动让出CPU,否则其他线程无法执行,因为用户态的线程无法打断当前运行中的线程,这种打断特权只有操作系统具备,但用户线程不受操作系统管理
- 在多线程执行时,每个线程得到的时间片较少,执行较慢,因为时间片的划分是以进程为单位
内核线程
内核线程是由操作系统管理,线程的TCB也是存放在操作系统中。
内核线程的优缺点
优点:
- 在一个进程中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行
- 分配给线程,多线程的进程获得更多的CPU执行时间
缺点:
- 在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息,如PCB和TCB
- 线程的创建、终止和切换都是通过系统调用的方式进行,系统开销较大
轻量级进程
轻量级进程(LWP)是由内核支持的用户线程,一个进程可以有一个多个LWP,每个LWP跟内核线程一一对应。
在轻量级进程之上也是可以使用用户线程的,LWP与用户线程额对应关系有以下三种:
- 1:1,一个LWP对应一个用户线程
- N:1,一个LWP对应多个用户线程
- M:N,多个LWP对应多个用户线程
1:1模式
优点:实现并行,当一个LWP阻塞时,不会影响其他LWP
缺点:每一个用户线程,就会产生一个内核线程,创建线程的开销过大
N:1模式
优点:用户线程多开影响较小,上下文切换发生在用户空间,切换的效率高
缺点:一个用户线程如果阻塞,整个进程都会阻塞,如果是在多核CPU中,无法充分利用CPU
M:N模式
将1:1和N:1的模式进行混搭,首先用户线程对应到多个LWP,LWP再一一对应到内核线程。
优点:结合了前两种模式的优点,并且大部分的线程上下文切换发生在用户空间,且多个线程又可以充分利用CPU的资源。