Java线程模型

定义

线程是操作系统的最小调度单位,包含于进程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程可以并行执行不同的任务。

与进程的不同

  1. 进程是操作系统资源分配的最小单位,线程是操作系统执行的最小单位;
  2. 进程包含线程,一个进程可以包含多个线程,同一个进程中的不同线程共享同一资源(此处会引发另一个问题,线程不可见问题);
  3. 进程是指一段程序的执行过程,线程指的是进程中一个单一顺序的控制流(任务);

线程分类

线程主要分为两种

  • 内核线程,简称KLT(Kernel Level Thread)
  • 用户线程,简称ULT(User Level Thread)

内核线程

系统内核管理线程,内核保存线程的状态和上下文,线程阻塞不会引起进程阻塞。在多处理器上,多线程在多处理器上并行运行。线程的创建、调度和管理等生命周期是由内核直接管理完成,效率比ULT要低,比进程要高。

内核线程
  1. 内核空间会维护[进程表]和[线程表]。
  2. 进程表中维护并管理进程[运行的程序代码]集合。
  3. 线程维护并管理各个进程中的线程集合。
  4. 线程阻塞,其所在的进程不会阻塞。
  5. 内核线程和轻量级进程(Light Weight Process,LWP,是使用内核线程的一种高级接口)是一对一模型,这个文章后面会有介绍。

优缺点

  • 优点:可以将复杂的线程生命周期的管理任务交给操作系统,编程和实现简单;线程维护在操作系统内核,线程阻塞不会阻塞进程;如果机器是多核处理器,内核线程可以充分利用多核处理器进行并行运行线程。
  • 缺点:当线程进行调度、创建等,会涉及到用户态和内核态之间的转化以及线程上下文的切换,资源消耗大、效率较低。

用户线程

用户程序实现,不依赖操作系统内核,应用提供创建、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度高、效率高。内核对ULT无感知,线程阻塞则进程(包含它的所有线程)阻塞。

用户线程
  1. 内核空间会维护[进程表]
  2. 进程表中记录进程[运行的程序代码]集合。
  3. 线程阻塞,其所在的进程也会阻塞。
  4. 操作系统内核无法感知用户线程,对于线程的创建、调度、撤销等无感知。

优缺点

  • 优点:由于操作系统内核无法感知用户线程,对于线程的创建、调度、撤销等无感知。所以当线程进行调度、创建等,不会涉及到用户态和内核态之间的转化以及线程上下文的切换,资源消耗小、效率较高。
  • 缺点:需要维护复杂的线程生命周期,编程和实现复杂;线程维护在进程中,内核无感知,线程阻塞会阻塞整个进程(包含整个进程的其他线程);用户线程不能充分利用多核处理器进行并行运行线程,只能在单个核中运行。

线程模型

线程模型主要分为三种

  • 一对一模型
  • 多对一模型
  • 多对多模型

一对一模型

一对一模型 简易


一对一模型 简易
  1. 用户空间的一个线程(应用程序的线程概念)对应内核的一个线程,1:1。
  2. 用户空间的线程通过LWP(属于用户空间)对内核线程进行创建、销毁等操作。
  3. 由于每个线程的创建、调度、销毁都需要内核的支持,每次线程的创建、切换都会设计用户状态/内核状态的切换,性能开销比较大,并且单个进程能够创建的LWP的数量是有限。
  4. 能够充分里用多核的优势。

一对一模型

一对一模型
  1. 用户进程可以创建多个(有限个)LWP对内核线程进行管理(包含创建、销毁等生命周期的方法),本质上还是操作系统进行的管理。
  2. KLT是实际的计算运行的线程,在内核空间,由操作系统内核进行管理维护(创建、调度、销毁等)。
  3. 严格意义上,LWP是属于操作系统层面的

一对一模型 详细

一对一模型 详细
  1. JVM进程中通过new Thread(Runnable/Callable)创建Java层面的线程。
  2. Java线程通过库调度器调用LWP的接口创建、销毁内核线程等。
  3. 内核线程是由操作系统内核进行管理维护。

注:About LWP

  1. 其实LWP(轻量级进程)是操作系统提供的操作内核线程的入口(接口),属于中间层。
  2. 在Linux操作系统中,往往都是通过fork函数创建一个子进程来代表内核中的线程,在fork完一个子进程后,还需要将父进程中大部分的上下文信息复制到子进程中,消耗大量cpu时间用来初始化内存空间,产生大量冗余数据。为了避免上述情况,轻量级进程(Light Weight Process, LWP)便出现了,其使用clone系统调用创建子进程,过程中只将部分父进程数据进行复制,没有被复制的资源可以通过指针进行数据共享,这样一来LWP的运行单元更小、运行速度更快。
  3. LWP与内核线程一一映射,每个LWP都由一个内核线程支持
  4. LWP可以被普通进程创建,有父子进程的关系。

多对一模型

多对一模型 简易

多对一模型 简易
  1. 一个内核线程可以对应多个用户线程,即跟用户线程相匹配。
  2. 用户线程的创建、调度、销毁不需要内核的支持,所以也就不涉及上下文切换的资源损耗,效率通常较高。
  3. 但是内核无法感知到用户线程(只能感知到用户空间的进程),所以当一个进程中的一个线程阻塞,将会导致整个进程都阻塞。
  4. 由于内核感知的是应用进程,所以进程中的多线程只能是运行在单个运算核上,无法充分利用计算性能并行计算,当然如果机器是单核就另当别论了;

多对一模型

多对一模型
  1. 此时内核直接管理进程,所有的资源类操作都是通过进程进行代为转发与内核进行通信,所谓的一直对外?

多对多模型

多对多模型 简易

多对多模型 简易
  1. 这个模型其实就是一个混合的线程模型。
  2. LWP和内核是1:1对应关系(LWP需要内核的支持才能工作,fork等函数)。
  3. 用户线程和LWP是n:1(n>0)对应关系。
  4. 由于用户进程和LWP(可以理解为内核线程)是n:m的关系,所以即解决了1:1模型中性能开销及线程数量的问题,也解决了N:1模型中阻塞问题,同时也能充分利用CPU的多核优势。

多对多模型

(
多对多模型

1.此模型是大部分协程实现的基础。

你可能感兴趣的:(Java线程模型)