Java线程模型

一、相关知识

用户级线程(ULT):实现在用户空间的线程称为用户级线程。用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由用户空间的库函数完成,不需要内核的参与,也不需要进行用户态和内核态的切换,因此这种线程的系统资源消耗非常低,且非常的高效。用户级线程调度器在用户空间的线程库实现,内核并不知道用户线程的存在,因此只有一个处理器内核会被分配给该进程 ,也就不能发挥多核 CPU 的优势,无法做到真正意义上的并发,且如果一个进程内部有一个线程发生了阻塞,会导致这个进程(包括它的所有线程)都阻塞

内核级线程(KLT):内核线程建立和销毁都是由操作系统负责、通过系统调用完成的。在内核的支持下运行,无论是用户进程的线程,或者是系统进程的线程,他们的创建、撤销、切换都是依靠内核实现的,但是调度开销要比用户线程更大。此外线程表是存放在操作系统固定的表格空间或者堆栈空间里,所以内核级线程的数量是有限的。

二、Linux的线程模型

Linux线程又称为“轻量级进程”,因为在Linux中并没有专门的数据结构用于描述线程,只有task_struct这一种描述进程的结构体。在内核看来只有进程而没有线程,线程调度时也是当做进程来调度的。

  • 一个Linux进程拥有自己独立的地址空间,而一个轻量级进程没有自己独立的地址空间,它只有一个最小的执行上下文和调度程序所需的统计信息,它只带有进程执行相关的信息,与父进程共享进程地址空间。因此LWP之间可以通过共享内存直接进行数据交换,无需复杂的IPC机制,通信效率更高。
  • 轻量级进程简称LWP,是一种由内核支持的用户线程,每一个轻量级进程都与一个特定的内核线程关联。它是基于内核线程的高级抽象,系统只有先支持内核线程才能有 LWP。每一个进程有一个或多个 LWP,每个LWP 由一个内核线程支持,在这种实现的操作系统中 LWP 就是用户线程。

三、常见的线程模型

线程模型:线程模型是指操作系统或编程语言中管理线程执行方式的架构或策略。在同时支持用户级线程和内核级线程的操作系统中,可以采用两者结合的方式,将n个用户级线程映射到m个内核级线程上。

  1. 一对一:一个用户级线程对应一个内核级线程,即创建一个用户级线程就需要创建一个对应的内核级线程。当进程中的一个线程阻塞时,其他线程仍然可以继续执行,并发能力强。然而一个用户进程会占用多个内核级线程,线程调度需要由操作系统内核完成,涉及用户态和内核态的切换,开销较大

  1. 多对一:多个用户及线程对应一个内核级线程,每个用户进程只对应一个内核级线程。用户级线程的切换在用户态完成即可,不需要切换到内核态,线程管理的开销小。然而当一个用户线程被阻塞时,整个进程中的所有线程都会被阻塞,无法利用多CPU的并发优势

  1. 多对多:n个用户级线程对应m个内核级线程,结合了用户级线程和内核级线程的优点,克服了一对一模型中用户进程占用太多内核级线程,且所有线程切换都需要在内核态进行的开销,又克服了多对一模型中无法支持并发的缺点。

四、Java线程模型

Java程序在JVM上运行,JVM可以运行在不同的操作系统之上,不同的操作系统创建线程的方式是不同的,JVM通过对不同操作系统的原生线程进行抽象,屏蔽了底层不同操作系统的实现方式。而JVM线程和操作系统线程的映射关系即Java的线程模型,其约定了用户线程和操作系统线程的规范和协议。不同的JVM实现中使用了不同的线程模型。

  • 目前主流的JVM采用的都是一对一的线程模型,即一个JAVA线程会映射到一个内核级线程,每个线程都是独立的调度单元,直接利用操作系统内核提供的调度功能。

  • Java早期版本采用过多对一的线程模型,Java 线程在 Solaris 系统上的初始实现是多对一的

  • Go语言采用的GMP线程模型就是基于多对多的方式来实现的,这也是为什么能够利用goroutine实现更高并发的原因。值得一提的是,Java的Loom项目也在进行这方面的探索。


参阅:

Multithreading Models (JDK 1.1 for Solaris Developer's Guide) (oracle.com)

Java 线程模型 - jqc - 博客园 (cnblogs.com)

干货 | 进程、线程、协程 10 张图讲明白了! - 知乎 (zhihu.com)

Java并发系列之一:JVM线程模型-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA之间数据传输的讨论:解析数据传输与同步技术

在现代电子工程领域,数据传输和同步技术是确保信息准确、高效传递的关键。FPGA间的高速数据传输是实现复杂系统功能的关键技术之一。本文将基于移知公开课《FPGA之间数据传输的讨论》的内容,探讨FPGA间数据传输的技术细节和面临的挑战,帮助读…

使用VS2022生成安装包

首先需要本地已经能够正常运行的软件包,包含可执行文件及必要的运行库等,如下所示RemoteCli.exe为最终的可执行文件 打开VS2022 ,选择 扩展–>管理扩展–>联机,搜索Microsoft Visual Studio Installer Projects,…

Lua调用c#

1. 类 --lua中使用C#的类非常简单 --固定套路 --CS.命名空间.类名 --Unity的类 比如 GameObject Transform等等 —— CS.UnityEngine.类名 --CS.UnityEngine.GameObject--通过C#中的类 实例化一个对象 lua中没有new 所以我们直接 类名括号就是实例化对象 --默认调用的 相当于就…

智能分析/视频汇聚EasyCVR安防视频融合管理云平台技术优势分析

安防行业的发展历程主要围绕视频监控技术的不断改革升级,从最初的模拟监控到数字监控,再到高清化、网络化监控,直至现在的智能化监控,每一次变革都推动了行业的快速发展。特别是近年来,随着AI、大数据、物联网等技术的…

LVS负载均衡(twenty-six day)

一、LVS (一)什么是LVS linux virtural server的简称,也就是linxu虚拟机服务器,这是一个由章文岩博士发起的开源项目,官网是http://www.linuxvirtualserver.org,现在lvs已经是linux内核标准的-部分,使用lv…

学术周交流与学习节选

文章目录 1、粒度多模态运动分析1.1 免特征重建的终身行人重识别1.2 无样本保留的终身行人重识别1.3 粒度多模态运动之类增量学习1.4 粒度多模态之人体姿态估计扩散模型 2、深度伪造的被动取证与主动防御2.1 研究现状及主要方法2.2 基于梯度的伪影特征表示2.3 基于伪造自适应学…

SQL注入实例(sqli-labs/less-18)

0、初始页面 先使用brup爆破密码,账号admin,密码admin 1、确定闭合字符 判断注入点在post请求参数的User-agent处 闭合字符为单引号 2、爆库名 3、爆表名 4、爆列名 5、查询最终目标 在index.php中有这么一句 $insert"INSERT INTO security.uage…

haproxy算法与具体实现

一、负载均衡 1.什么是负载均衡 负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从…

『大模型笔记』人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)

人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF) 文章目录 一. 人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)1. 概念解释2. RLHF的组成部分2.1. 强化学习(Reinforcement Learning, RL)2.2. 状态空间(state space)2.3. 动作空…

深入InnoDB核心:揭秘B+树在数据库索引中的高效应用

目录 一、索引页与数据行的紧密关联 (一)数据页的双向链表结构 (二)记录行的单向链表结构 二、未创建索引情况 (一)无索引下的单页查找过程 以主键为搜索条件 以非主键列为搜索条件 (二…

ffmpeg 内存模型

最近在学习ffmpeg,阅读了一些packet和frame关于内存操作的api。在此长话短说,只说核心点。 ffmpeg模型 AVFrame 表示编码前的原始数据帧,AVPacket 表示编码后的压缩数据包。 问题: (1)从av_read_frame读…

算法打卡 Day20(二叉树)-找树左下角的值 + 路径总和 + 从中序与后序遍历序列构造二叉树

文章目录 Leetcode 513-找树左下角的值题目描述解题思路 Leetcode 112-路径总和题目描述解题思路相关题目Leetcode 113-路径总和 ii Leetcode 106-从中序与后序遍历序列构造二叉树题目描述解题思路类似题目Leetcode 105-从前序与中序遍历序列构造二叉树 Leetcode 513-找树左下角…

HSL模型和HSB模型,和懒人配色的Color Hunt

色彩不仅仅是视觉上的享受,它在数据可视化中也扮演着关键角色。通过合理运用色彩模型,我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL(Hue, Saturation, Lightness)和HSB(Hue, Saturation, Brightness&#x…

Java中的抽象类与接口

1. 抽象类 1.1 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的, 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 比如&…

freeRTOS学习之ARM架构

分析了arm架构以及RISC指令集的部分内容,同时复习了计算机组成原理中函数的汇编指令流程,也就是CPU的工作流程,大有裨益!

【python】使用FastAPI开发文件下载和上传服务的详细分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

如何使用Zoom API创建一个会议?

一、注册一个免费的Zoom账号(zoom.us) 二、在Zoom 应用市场(App Marketplace)创建一个server to server 的app,授予创建会议的权限。 三、创建一个Zoom API的服务端程序(node.js) 1、git clone https://github.com/zoom/server-to-server-o…

英语口语成人英语生活英语口语表达四六级英语培训柯桥小语种学习

全红婵向外国人展示金牌夺冠后,全红婵向外国友人展示金牌。视频中,一位外国男子对全红婵说:“How are you?”全红婵回应:“Good!Good!全红婵比出“拿捏”手势对方说全红婵是奥运冠军&#xff0c…

SpringCloud与SpringBoot之间的关系解析

Spring Cloud和Spring Boot是两个独立的项目,分别用于构建微服务架构和快速构建Java应用程序。它们之间有着密切的关系,可以相互配合使用。 Spring Boot简介 Spring Boot是一个用于快速构建Java应用程序的框架。它简化了Spring应用程序的开发过程&#x…

IDEA使用LiveTemplate快速生成方法注释

文章目录 1 场景2 要点2.1 新增LiveTemplate模版2.2 模版内容填写 3 练习手段 1 场景 方法的注释,一般包含作者、创建时间、功能描述、输入参数、返回值,如果每个方法的注释都手写,非常耗时,且容易随着后期变更代码导致差异&#…