2. Java线程模型

news2024/11/22 21:22:26

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/20648.html

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

相关文章

bat脚本启动Java服务

bat脚本启动Java服务1.终端cmd窗口运行jar2. bat脚本启动jar包3.后台启动bat脚本4. 运行bat只启动一次jar服务及停止脚本5.注意事项6.所用资源1.终端cmd窗口运行jar Java项目一般会被打包成jar后启动,在windows系统中可以通过终端窗口cmd启动jar包,即在…

5G无线技术基础自学系列 | 移动通信网络的架构

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 第五代(5thGeneraton, 5G) …

计算机中的第一个伟大发明(IR/IAR)

计算机工具的普及极大的推动了科技领域的发展以及提高人们生活的便捷性,那么在其中有哪些举足轻重的发明呢?本节我们来了解一下计算机中第一个伟大的发明:指令寄存器和指令地址寄存器 回顾在步进器加持下的两数两加 前面提到两个数相加的执行…

PyCharm运行PyQT6 (四) 百篇文章学PyQT

本文章是百篇文章学PyQT的第四篇,本文讲述如何使用PyCharm成功运行PyQT6,PyCharm在配置过程中会遇到很多问题,博主在本篇文章中将遇到和踩过的坑总结出来,可以供大家参考,希望大家安装顺利。包括 安装、遇到问题的解决…

Intel芯片、AMD显卡有多强?M1系列呢?

我们知道英特尔是半导体行业和计算创新领域的全球领先厂商 ,创始于1968年。如今,英特尔正转型为一家以数据为中心的公司 。英特尔与合作伙伴一起,推动人工智能、5G、智能边缘等转折性技术的创新和应用突破 ,驱动智能互联世界。…

【由浅入深 - Java笔记】玩转List:List过滤和筛选

文章目录List过滤:Comparator、Comparable 和 Stream1. 使用list的Stream进行筛选2. 增强for循环遍历元素,进行筛选3. 使用list.foreach遍历4. 使用iterator遍历5. 视频笔记List过滤:Comparator、Comparable 和 Stream 花时间精力去凿许多浅井…

5G无线技术基础自学系列 | 移动通信网络的演进

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 随着移动用户数量的不断增加&#xff0…

mac系统安装搭载Windows系统虚拟机方法教程

我们都知道macOS系统虽然相对windows系统而言更稳定,但macOS系统中可使用的软件数量较windows系统而言要少很多。对于macOS系统应用少的问题,我们可以使用虚拟机来解决。那么,苹果虚拟机好用吗?整体而言是可以的。苹果虚拟机怎么装…

0-搭建nodejs环境

1) 安装 nvm nvm 即 (node version manager),好处是方便切换 node.js 版本 安装注意事项 要卸载掉现有的 nodejs提示选择 nvm 和 nodejs 目录时,一定要避免目录中出现空格选用【以管理员身份运行】cmd 程序来执行 nvm 命令首次运行前设置好国内镜像地…

小马哥的CSS驿站

目录 第一章 CSS概述 1.1语法 1.2注释 1.3CSS的创建 第二章 CSS选择器 1.id选择器 2.class选择器 3.标签选择器 4.子代选择器 5.后代选择器 6.相邻兄弟选择器 7.后续兄弟选择器 8.交集选择器 9.并集选择器 第三章 CSS样式 1.文本与文字样式 (1&…

G2O学习 - 曲线拟合实例

学习使用G2O进行曲线拟合使用 1. 拟合目的,如何建立拟合的图模型 大概就是曲线拟合,求曲线 y ax^2 bx c 中 abc 的值。 但是我一直不明白如何获得下面图的。 我觉得应该是这样的 首先把abc视为一个变量,这个变量应该是一个矩阵【这里还…

Python和Pycharm安装教程

一、Python安装 1.进入官网下载Python 官网地址:Download Python | Python.org 官网下载可能会有些慢,请耐心等待 我这里把3.11的安装包和后面的Pycharm安装包都放到网盘里面了 链接:https://pan.baidu.com/s/1spxNUbH4trWBox1SJeBjkQ?pwdh…

Linux CentOS 系统安装

VMware 下载地址 Ctrl F 搜索【下载试用版】VMware 下载地址 Ctrl F 搜索【DOWNLOAD NOW】VMware-workstation-full-16.2.4-20089737.exe 文件下载地址CentOS 下载地址 Ubuntu 下载地址 阿里巴巴开源镜像站-OPSX镜像站 1、下载安装VMware虚拟机 2、下载Linux系统镜像&…

TCP/UDP/Socket 通俗讲解

1.封包和拆包 封包,就是发送数据前把自己本地需要发送的数据包装一下,即把要发送的原始数据附加上接受者可以辨识到自己身份等一些额外信息。有点像寄一封信,信封上填写的寄件人和收件人以及地址。 拆包,是接收到对方封包后发送来…

强化学习领域值得关注的国际顶级会议

导读: 强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达…

目标检测论文解读复现之十三:改进YOLOv5s的遥感图像目标检测

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

LeetCode 0799. 香槟塔

【LetMeFly】799.香槟塔 力扣题目链接:https://leetcode.cn/problems/champagne-tower/ 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香…

几何算法——介绍

几何算法——介绍介绍1 关于几何引擎介绍2 关于模型的表达2.1 CSG (Constructive Solid Geometry )表示2.2 Brep (Boundary Representation)表示3 关于翼边结构和半边结构3.1 翼边结构3.2 半边结构4 关于边界表示法4.1 ACIS中的Brep表示很早之前就想写一些几何算法相关的文章&a…

一汽大众迈腾车前悬架系统设计

目 录 摘要 I Abstract II 第一章 绪论 1 1.1选题背景及意义 1 1.2国内外的研究现状 1 1.3本文的主要研究内容 3 第二章 悬架的结构分析与整体参数设计 4 2.1悬架系统的简介与分类 4 2.1.1悬架系统的简介 4 2.1.2悬架系统的分类 5 2.2独立悬架的特点 5 2.3整体参数的设计 6 2.3…

VM Tools安装过程

系列文章目录 VM Tools安装过程 VM Tools安装过程系列文章目录一、VM Tools安装步骤二、安装后无法使用问题解决办法之一一、VM Tools安装步骤 此时系统会弹出装载虚拟CD驱动器 点击打开文件 打开文件后可将 文件夹里的文件全部复制到自己的某个文件夹中,比如桌面 注…