美文网首页
Java线程模型

Java线程模型

作者: 小王_min | 来源:发表于2021-03-09 10:19 被阅读0次

    定义

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

    与进程的不同

    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线程模型

          本文链接:https://www.haomeiwen.com/subject/ldmvqltx.html