定义
线程是操作系统的最小调度单位,包含于进程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程可以并行执行不同的任务。
与进程的不同
- 进程是操作系统资源分配的最小单位,线程是操作系统执行的最小单位;
- 进程包含线程,一个进程可以包含多个线程,同一个进程中的不同线程共享同一资源(此处会引发另一个问题,线程不可见问题);
- 进程是指一段程序的执行过程,线程指的是进程中一个单一顺序的控制流(任务);
线程分类
线程主要分为两种
- 内核线程,简称KLT(Kernel Level Thread)
- 用户线程,简称ULT(User Level Thread)
内核线程
系统内核管理线程,内核保存线程的状态和上下文,线程阻塞不会引起进程阻塞。在多处理器上,多线程在多处理器上并行运行。线程的创建、调度和管理等生命周期是由内核直接管理完成,效率比ULT要低,比进程要高。
内核线程
- 内核空间会维护[进程表]和[线程表]。
- 进程表中维护并管理进程[运行的程序代码]集合。
- 线程维护并管理各个进程中的线程集合。
- 线程阻塞,其所在的进程不会阻塞。
- 内核线程和轻量级进程(Light Weight Process,LWP,是使用内核线程的一种高级接口)是一对一模型,这个文章后面会有介绍。
优缺点
- 优点:可以将复杂的线程生命周期的管理任务交给操作系统,编程和实现简单;线程维护在操作系统内核,线程阻塞不会阻塞进程;如果机器是多核处理器,内核线程可以充分利用多核处理器进行并行运行线程。
- 缺点:当线程进行调度、创建等,会涉及到用户态和内核态之间的转化以及线程上下文的切换,资源消耗大、效率较低。
用户线程
用户程序实现,不依赖操作系统内核,应用提供创建、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度高、效率高。内核对ULT无感知,线程阻塞则进程(包含它的所有线程)阻塞。
用户线程
- 内核空间会维护[进程表]
- 进程表中记录进程[运行的程序代码]集合。
- 线程阻塞,其所在的进程也会阻塞。
- 操作系统内核无法感知用户线程,对于线程的创建、调度、撤销等无感知。
优缺点
- 优点:由于操作系统内核无法感知用户线程,对于线程的创建、调度、撤销等无感知。所以当线程进行调度、创建等,不会涉及到用户态和内核态之间的转化以及线程上下文的切换,资源消耗小、效率较高。
- 缺点:需要维护复杂的线程生命周期,编程和实现复杂;线程维护在进程中,内核无感知,线程阻塞会阻塞整个进程(包含整个进程的其他线程);用户线程不能充分利用多核处理器进行并行运行线程,只能在单个核中运行。
线程模型
线程模型主要分为三种
- 一对一模型
- 多对一模型
- 多对多模型
一对一模型
一对一模型 简易
一对一模型 简易
- 用户空间的一个线程(应用程序的线程概念)对应内核的一个线程,1:1。
- 用户空间的线程通过LWP(属于用户空间)对内核线程进行创建、销毁等操作。
- 由于每个线程的创建、调度、销毁都需要内核的支持,每次线程的创建、切换都会设计用户状态/内核状态的切换,性能开销比较大,并且单个进程能够创建的LWP的数量是有限。
- 能够充分里用多核的优势。
一对一模型
一对一模型
- 用户进程可以创建多个(有限个)LWP对内核线程进行管理(包含创建、销毁等生命周期的方法),本质上还是操作系统进行的管理。
- KLT是实际的计算运行的线程,在内核空间,由操作系统内核进行管理维护(创建、调度、销毁等)。
- 严格意义上,LWP是属于操作系统层面的
一对一模型 详细
一对一模型 详细
- JVM进程中通过new Thread(Runnable/Callable)创建Java层面的线程。
- Java线程通过库调度器调用LWP的接口创建、销毁内核线程等。
- 内核线程是由操作系统内核进行管理维护。
注:About LWP
- 其实LWP(轻量级进程)是操作系统提供的操作内核线程的入口(接口),属于中间层。
- 在Linux操作系统中,往往都是通过fork函数创建一个子进程来代表内核中的线程,在fork完一个子进程后,还需要将父进程中大部分的上下文信息复制到子进程中,消耗大量cpu时间用来初始化内存空间,产生大量冗余数据。为了避免上述情况,轻量级进程(Light Weight Process, LWP)便出现了,其使用clone系统调用创建子进程,过程中只将部分父进程数据进行复制,没有被复制的资源可以通过指针进行数据共享,这样一来LWP的运行单元更小、运行速度更快。
- LWP与内核线程一一映射,每个LWP都由一个内核线程支持
- LWP可以被普通进程创建,有父子进程的关系。
多对一模型
多对一模型 简易
多对一模型 简易
- 一个内核线程可以对应多个用户线程,即跟用户线程相匹配。
- 用户线程的创建、调度、销毁不需要内核的支持,所以也就不涉及上下文切换的资源损耗,效率通常较高。
- 但是内核无法感知到用户线程(只能感知到用户空间的进程),所以当一个进程中的一个线程阻塞,将会导致整个进程都阻塞。
- 由于内核感知的是应用进程,所以进程中的多线程只能是运行在单个运算核上,无法充分利用计算性能并行计算,当然如果机器是单核就另当别论了;
多对一模型
多对一模型
- 此时内核直接管理进程,所有的资源类操作都是通过进程进行代为转发与内核进行通信,所谓的一直对外?
多对多模型
多对多模型 简易
多对多模型 简易
- 这个模型其实就是一个混合的线程模型。
- LWP和内核是1:1对应关系(LWP需要内核的支持才能工作,fork等函数)。
- 用户线程和LWP是n:1(n>0)对应关系。
- 由于用户进程和LWP(可以理解为内核线程)是n:m的关系,所以即解决了1:1模型中性能开销及线程数量的问题,也解决了N:1模型中阻塞问题,同时也能充分利用CPU的多核优势。
多对多模型
( 多对多模型1.此模型是大部分协程实现的基础。
网友评论