02Java线程模型

news2024/12/26 7:54:08

1. 操作系统线程

无论使用何种编程语言编写多线程程序,最终都是通过调用操作系统的线程来执行任务。线程是CPU调度的最小执行单元。
线程有多种实现方式,常见的有:内核线程、用户线程、混合线程。
不同线程模型的主要区别在于线程的调度方不同,是操作系统还是虚拟机。

1.1 内核线程

由操作系统来负责多线程调度的多线程实现方式,叫做内核线程。
我们知道,**进程的地址空间分为内核空间和用户空间。**程序在内核空间执行时,CPU处于内核态,程序在用户空间执行时,CPU处于用户态。因此内核线程也叫做内核空间线程,或者内核态线程。
对于应用程序来说,其运行在用户空间,无法直接操作(创建、使用、销毁等)内核线程。因此,**操作系统暴露可以操作内核线程的系统调用,给应用程序使用。**因为系统调用比较底层,所以,大部分编程语言都对其进行封装,提供易用的线程接口,比如Linux中的pthread、C++中的std::thread等等。对于Java这种跨平台的语言来说,为了提供统一的线程操作接口,也会将操作系统提供的系统调用,封装为自己的线程类库。
内核线程模型,也叫做1:1模型。前面的1表示用户空间的一个线程,也就是在应用程序开发者眼中的一个线程,比如通过Java Thread创建的一个线程对象。后面的1表示内核空间的一个线程,也就是真正的线程。1:1模型指的就是:用户空间中的一个用户线程对应内核空间中的一个内核线程。

综上,应用程序运行在用户空间,通过系统调用才能实现对内核线程的操作。而系统调用会导致用户态和内核态的上下文切换,比较耗时。这是内核线程的一个弊端。

1.2 用户线程

为了解决内核线程存在的弊端(内核态和用户态的上下文切换),计算机科学家发明了用户线程。
类比内核线程,用户线程指的是线程的调度由虚拟机完成,而虚拟机本质上就是一个运行在用户空间的应用程序。
实现调度算法来调度线程的程序,叫做调度程序。用户线程的调度程序的实现思路,和内核线程的调度程序的实现思路基本一致。
实际上,用户线程只是一个外壳。从本质上来看,虚拟机执行三个线程,相当于轮询执行三段代码。所以应用程序操作用户线程(创建、使用、销毁等),都是在用户空间完成的,完全不需要操作系统内核的参与,这样就避免了系统调用带来的用户态和内核态的上下文切换。
不过,用户线程需要有专门的结构来记录上下文信息。除此之外,虚拟机也需要为每个用户线程维护独立的函数调用栈。
用户线程也叫做M:1线程模型。其中M表示M个用户线程,1表示1个内核线程。当虚拟机在运行时,操作系统会为其创建进程,而且是单线程的进程,这里的单线程指的是内核线程,即一个内核线程对应多个用户线程。

操作系统线程调度算法调度的是内核线程,为内核线程之间公平地分配时间片。不管虚拟机中创建多少个用户线程,它们都只能共享一个内核线程的CPU时间片。因此用户线程无法利用多核优势
除此之外,用户线程在使用上还有另外的限制。在用户线程中,我们无法使用阻塞模式的系统调用,比如read()、write()等阻塞IO系统调用。在内核线程中,当我们调用read()、write()等阻塞IO系统调用时,操作系统会让当前线程让出时间片,切换为其他线程执行。对于用户线程来说,当一个用户线程中的代码调用了阻塞IO系统调用时,对应的内核线程,就会被操作系统调度让出时间片,直到IO读写完成才会放入就绪队列。也就是说,只要一个用户线程阻塞了,其他用户线程也无法工作了。
解决这个问题的办法是,在用户线程中不要使用阻塞模式的系统调用,我们可以使用非阻塞的系统调用,内核线程在执行这类非阻塞的系统调用时,不需要让出时间片,可以继续执行后续的代码。
当然,相对于阻塞模式的系统调用,非阻塞模式的系统调用使用起来很不方便。比如调用非阻塞的write()系统调用,应用程序需要轮询查看是否写入完成。为了解决这个问题,一般支持用户线程的编程语言,会使用非阻塞函数模拟实现阻塞函数。在用法上,让程序员感知好像是在使用阻塞函数,实际上,底层使用的是非阻塞的系统调用来实现的。

1.3 混合线程

用户线程的优缺点
优点:避免了使用内核线程导致的内核态和用户态之间的上下文切换。
缺点:(1)一个进程内的用户线程无法利用多核并行运行;(2)一个用户线程调用阻塞系统调用会阻塞一个进程中的所有用户线程。
为了解决用户线程的缺点,计算机科学家发明了混合线程,又叫做M:N线程模型
**M:N线程模型表示一个进程中的M个用户线程对应N个内核线程,M一般大于N。**如果M等于N,那就退化成了1:1线程模型。如果M小于N,那么多余的内核线程就浪费掉。如果应用程序创建M个用户线程,那么虚拟机就会使用操作系统提供的系统调用,创建N个内核线程来服务这M个用户线程。M个用户线程并不会绑定在一个内核线程上,因此,一个用户线程阻塞并不会导致所有的用户线程阻塞。同时,M个用户线程分散在N个内核线程上,不同的用户线程可以分散在不同的CPU上执行,也就利用到了计算机多核的优势。

2. Java线程与操作系统线程的关系

Java线程有两种实现方式,一种叫Green Thread,一种叫Native Thread。
实际上,Green Thread就是用户线程模型,也就是M:1线程模型。Green Thread实际上只存在于早期jdk版本中,在JDK1.3中便已经废弃,被Native Thread取而代之。
Native Thread实际上就是内核线程模型,也就是1:1线程模型。Java提供的线程库,只不过是对操作系统提供的操作内核线程的系统调用的二次封装。线程的调度由操作系统来完成,因此,Java线程库实现起来非常简单。
每个操作系统的内核线程实现都有细微差别,比如线程的状态定义、线程的优先级划分等等都有可能不同。Java作为跨平台编程语言,需要提供统一编程接口。为了封装各个操作系统中线程实现的差别,Java线程库定义了自己的线程状态和优先级,以及和各个操作系统中线程状态和优先级的映射关系。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu】配置ubuntu网络

配置ubuntu网络 一、三种虚拟网络介绍二、 配置ubuntu系统使用桥接模式连接外网三、通过NAT模式让ubuntu系统连接外网四、常见问题1.解决ubuntu系统没有网络图标一、三种虚拟网络介绍 VMnet0 : 桥接模式,选中桥接模式之后,可以将VMnet0桥接到对应的物理网卡之上, 默认选中自…

uniapp公共新闻模块components案例

uniapp公共新闻模块components案例 简介&#xff1a;本文使用uniapp的公共新闻模块讲解components案例。 效果展示&#xff1a; 第一步 创建公共模块 第二步 编写组件 <template><view class"newsbox"><view class"pic"><ima…

动态路由协议 OSPF 工作过程 之 状态机维度

状态机 &#xff1a; # 什么是状态机呢 &#xff1f; 状态机 &#xff1a; 就是 OSPF 路由间的邻居关系所在的不同阶段 不同的关系 就是 不同的状态机 OSPF 的状态机 &#xff1a; # 我们用 思科 的PPT 来介绍 OSPF 的状态机 # 里面所有黄颜色方框里 标定的就是 状态机…

Json格式API调试,taobao1688pinduoduo商品详情测试接口

Json常用类型 任何支持的类型都可以通过 JSON 来表示&#xff0c;例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。 对象&#xff1a;对象在 JS 中是使用花括号包裹 {} 起来的内容&#xff0c;数据结构为 {key1&#xff1a;value1, key2&#xf…

JavaScript:生成器函数

在介绍生成器函数之前先了解一下ES6的一个关键字&#xff0c;名为yield yield关键字&#xff0c;可以让代码在其出现的地方暂停执行&#xff0c;它只能在生成器函数内部使用。 生成器函数 生成器函数的语法比较简单在普通函数声明的时候在函数名前面添加一个*即可&#xff0…

openxr runtime Monado 源码解析 源码分析:Prober设备发现和管理 system device HMD target instance

monado系列文章索引汇总&#xff1a;openxr runtime Monado 源码解析 源码分析&#xff1a;源码编译 准备工作说明 hello_xr解读openxr runtime Monado 源码解析 源码分析&#xff1a;整体介绍 模块架构 模块作用 进程 线程模型 整体流程openxr runtime Monado 源码解析 源码分…

计算机网络4小时速成:物理层,功能特性,通信系统模型,分类,调制,曼彻斯特编码,信噪比,香农定理,复用技术,同轴电缆,中继器

计算机网络4小时速成&#xff1a;物理层&#xff0c;功能特性&#xff0c;通信系统模型&#xff0c;分类&#xff0c;调制&#xff0c;曼彻斯特编码&#xff0c;信噪比&#xff0c;香农定理&#xff0c;复用技术&#xff0c;同轴电缆&#xff0c;中继器 2022找工作是学历、能力…

[附源码]计算机毕业设计JAVA基于jsp的网上点餐系统

[附源码]计算机毕业设计JAVA基于jsp的网上点餐系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM m…

Proxy 代理对象使用详解即原理总结

Proxy 代理对象使用详解即原理总结 Proxy简单介绍 ECMAscript 6新增的代理可以给目标对象定义一个关联的代理对象&#xff0c;而这个代理对象可以作为抽象的目标对象来使用&#xff0c;在对目标对象的各种操作影响目标对象之前&#xff0c;可以在代理对象中对这些操作加以控制…

【python与数据分析】Matplotlib数据可视化

目录 前言 一、数据可视化库matplotlib 1.综述 2.pyplot基础语法 &#xff08;1&#xff09;创建画布与创建子图 &#xff08;2&#xff09;添加画布内容 &#xff08;3&#xff09;保存与展示图形 &#xff08;4&#xff09;设置pyplot的动态rc参数 二、绘制折线图 …

Python面向对象总结一

还记得第一次接触Python是在刚刚进入大学的第一个学期&#xff0c;之后就没有再使用过python。虽然基本语法&#xff0c;内置函数等没有忘记&#xff0c;但最近的学习中&#xff0c;一直在用python、matlab混合编程&#xff0c;零零散散的知识点、模模糊糊的记忆&#xff0c;有…

5G无线技术基础自学系列 | 传统无线网络架构

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 在4G网络中&#xff0c; 无线侧基本完成…

Anaconda配置镜像源

目录 一、首先生成 Anaconda的 .condarc配置文件&#xff1a; 二、命令行方式配置镜像源 三、可视化界面的方式配置镜像源 一、首先生成 Anaconda的 .condarc配置文件&#xff1a; 打开 Anaconda prompt&#xff0c;敲命令&#xff1a; conda config 查看 .condarc 中的源…

MySQL 增删改查进阶 — 数据库约束

文章目录数据库约束1.约束类型1.1 not null1.2 unique 唯一约束1.3 主键约束 primary key1.4 default 默认值1.5 外键约束 foreign key数据库约束 约束就是让数据库帮助程序猿更好的检查数据是否正确。 1.约束类型 not null - 提示某列不能存储 NULL 值。 允许为空&#xff…

wav to image concat 版

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

STM32矩阵按键

矩阵按键原理 本实验使用STM32F103单片机&#xff0c;主题代码通用的。 如果每个按键占用一个GPIO引脚&#xff0c;对于使用多个按键来说就是一种资源的浪费&#xff0c;因此当我们在设计时&#xff0c;可以考虑矩阵这种方式。本实验使用4*4也就是16个按键。 矩阵按键相对于独立…

Go 语言搭建个人博客(qiucode.cn 重构篇 三)

1、读取配置文件 项目中如数据库连接、邮箱配置等这些信息一般会被写入一个文件,而通过编码在程序中读取想要的配置信息。 本项目使用yaml文件作为配置文件,配合第三方库viper来读取yaml配置文件。 go get -u github.com/spf13/viper在项目根目录新建一个yaml文件,内容如…

数学杂谈:限制条件下的均匀分布考察

数学杂谈&#xff1a;限制条件下的均匀分布考察 1. 问题描述2. 问题解答 1. 答案2. 解析3. 蒙特卡洛模拟 3. 离散情况延拓 1. 正整数的情况2. 整数的情况3. N→∞N \to \inftyN→∞的情况 4. 误区分析 1. 问题描述 假设x1,...,xnx_1, ..., x_nx1​,...,xn​均为0∼10 \sim 10…

思科防火墙解析(ASA)

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 一. 防火墙的分类&#xff0c; 二. 发展史&#xff0c; 三. 思科防火墙技术应用的…

[附源码]java毕业设计铁东社区新冠病毒疫苗接种管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…