龙空技术网

Java线程模型

minhthyu 70

前言:

此时各位老铁们对“java线程函数”可能比较看重,你们都想要分析一些“java线程函数”的相关资讯。那么小编同时在网上网罗了一些对于“java线程函数””的相关资讯,希望同学们能喜欢,兄弟们一起来了解一下吧!

定义

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

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

线程主要分为两种

内核线程,简称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.此模型是大部分协程实现的基础。

标签: #java线程函数 #java线程模型