Java 线程和操作系统的线程有啥区别?

02Java线程模型 线程有哪几种实现方式?Java线程与操作系统线程之间又有什么关系呢? 阅读详情

不想看解释的小伙伴可直接翻到文末寻找答案。

1. 用户空间和内核空间

关于内核态和用户态我们在 了解操作系统的那些事儿,从这篇文章开始 这篇文章中已经详细介绍过,这里不再过多赘述。

至于什么是系统空间和用户空间也非常好理解:在操作系统中,内存通常会被分成用户空间(User space)与内核空间(Kernel space)这两个部分。当进程/线程运行在用户空间时就处于用户态,运行在内核空间时就处于内核态:

  • 运行在内核态的程序可以访问用户空间和内核空间,或者说它可以访问计算机的任何资源,不受限制,为所欲为,例如协调 CPU 资源,分配内存资源,提供稳定的环境供应用程序运行等
  • 而应用程序基本都是运行在用户态的,或者说用户态就是提供应用程序运行的空间。运行在用户态的程序只能访问用户空间

那为什么要区分用户态和内核态呢?

其实早期操作系统是不区分用户态和内核态的,也就是说应用程序可以访问任意内存空间,如果程序不稳定常常会让系统崩溃,比如清除了操作系统的内存数据。为此大佬们设计出了一套规则:对于那些比较危险的操作需要切到内核态才能运行,比如 CPU、内存、设备等资源管理器程序就应该在内核态运行,否则安全性没有保证。

举个例子,对于文件系统和数据来说,文件系统数据和管理就必须放在内核态,但是用户的数据和管理可以放在用户态。

用户态的程序不能随意操作内核地址空间,这样有效地防止了操作系统程序受到应用程序的侵害。

那如果处于用户态的程序想要访问内核空间的话怎么办呢?就需要进行系统调用从用户态切换到内核态。

2. 操作系统线程

① 在用户空间中实现线程

在早期的操作系统中,所有的线程都是在用户空间下实现的,操作系统只能看到线程所属的进程,而不能看到线程。

从我们开发者的角度来理解用户级线程就是说:在这种模型下,我们需要自己定义线程的数据结构、创建、销毁、调度和维护等,这些线程运行在操作系统的某个进程内,然后操作系统直接对进程进行调度。

这种方式的好处一目了然,首先第一点,就是即使操作系统原生不支持线程,我们也可以通过库函数来支持线程;第二点,线程的调度只发生在用户态,避免了操作系统从内核态到用户态的转换开销。

当然缺点也很明显:由于操作系统看不见线程,不知道线程的存在,而 CPU 的时间片切换是以进程为维度的,所以如果进程中某个线程进行了耗时比较长的操作,那么由于用户空间中没有时钟中断机制,就会导致此进程中的其它线程因为得不到 CPU 资源而长时间的持续等待;另外,如果某个线程进行系统调用时比如缺页中断而导致了线程阻塞,此时操作系统也会阻塞住整个进程,即使这个进程中其它线程还在工作。

② 在内核空间中实现线程

所谓内核级线程就是运行在内核空间的线程, 直接由内核负责,只能由内核来完成线程的调度。

几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris 等,都支持内核线程。

每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核就叫做多线程内核(Multi-Threads Kernel)。

从我们开发者的角度来理解内核级线程就是说:我们可以直接使用操作系统中已经内置好的线程,线程的创建、销毁、调度和维护等,都是直接由操作系统的内核来实现,我们只需要使用系统调用就好了,不需要像用户级线程那样自己设计线程调度等。

上图画的是 1:1 的线程模型,所谓线程模型,也就是用户线程和内核线程之间的关联方式,线程模型当然不止 1:1 这一种,下面我们来详细解释以下这三种多线程模型:

下文翻译自 https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html

1)多对一线程模型:

  • 在多对一模型中,多个用户级线程映射到某一个内核线程上
  • 线程管理由用户空间中的线程库处理,这非常有效
  • 但是,如果进行了阻塞系统调用,那么即使其他用户线程能够继续,整个进程也会阻塞
  • 由于单个内核线程只能在单个 CPU 上运行,因此多对一模型不允许在多个 CPU 之间拆分单个进程

从并发性角度来总结下,虽然多对一模型允许开发人员创建任意多的用户线程,但是由于内核只能一次调度一个线程,所以并未增加并发性。现在已经几乎没有操作系统来使用这个模型了,因为它无法利用多个处理核。

2)一对一线程模型:

  • 一对一模型克服了多对一模型的问题
  • 一对一模型创建一个单独的内核线程来处理每个用户线程
  • 但是,管理一对一模型的开销更大,涉及更多开销和减慢系统速度
  • 此模型的大多数实现都限制了可以创建的线程数

从并发性角度来总结下,虽然一对一模型提供了更大的并发性,但是开发人员应注意不要在应用程序内创建太多线程(有时系统可能会限制创建线程的数量),因为管理一对一模型的开销更大。Windows (从 Win95 开始) 和 Linux 都实现了线程的一对一模型。

3)多对多线程模型:

  • 多对多模型将任意数量的用户线程复用到相同或更少数量的内核线程上,结合了一对一和多对一模型的最佳特性
  • 用户对创建的线程数没有限制
  • 阻止内核系统调用不会阻止整个进程
  • 进程可以分布在多个处理器上
  • 可以为各个进程分配可变数量的内核线程,具体取决于存在的 CPU 数量和其他因素

3. Java 线程

在进入 Java 线程主题之前,有必要讲解一下线程库 Thread library 的概念。

在上面的模型介绍中,我们提到了通过线程库来创建、管理线程,那么什么是线程库呢?

线程库就是为开发人员提供创建和管理线程的一套 API。

当然,线程库不仅可以在用户空间中实现,还可以在内核空间中实现。前者涉及仅在用户空间内实现的 API 函数,没有内核支持。后者涉及系统调用,也就是说调用库中的一个 API 函数将会导致对内核的系统调用,并且需要具有线程库支持的内核。

下面简单介绍下三个主要的线程库:

1)POSIX Pthreads:可以作为用户或内核库提供,作为 POSIX 标准的扩展

2)Win32 线程:用于 Window 操作系统的内核级线程库

3)Java 线程:Java 线程 API 通常采用宿主系统的线程库来实现,也就是说在 Win 系统上,Java 线程 API 通常采用 Win API 来实现,在 UNIX 类系统上,采用 Pthread 来实现。

下面我们来详细讲解 Java 线程:

事实上,在 JDK 1.2 之前,Java 线程是基于称为 "绿色线程"(Green Threads)的用户级线程实现的,也就是说程序员大佬们为 JVM 开发了自己的一套线程库或者说线程管理机制。

而在 JDK 1.2 及以后,JVM 选择了更加稳定且方便使用的操作系统原生的内核级线程,通过系统调用,将线程的调度交给了操作系统内核。而对于不同的操作系统来说,它们本身的设计思路基本上是完全不一样的,因此它们各自对于线程的设计也存在种种差异,所以 JVM 中明确声明了:虚拟机中的线程状态,不反应任何操作系统中的线程状态。

也就是说,在 JDK 1.2 及之后的版本中,Java 的线程很大程度上依赖于操作系统采用什么样的线程模型,这点在不同的平台上没有办法达成一致,JVM 规范中也并未限定 Java 线程需要使用哪种线程模型来实现,可能是一对一,也可能是多对多或多对一。

总结来说,回答下文题,现今 Java 中线程的本质,其实就是操作系统中的线程,其线程库和线程模型很大程度上依赖于操作系统(宿主系统)的具体实现,比如在 Windows 中 Java 就是基于 Wind32 线程库来管理线程,且 Windows 采用的是一对一的线程模型。

光耦合MOSFET(Optocoupled MOSFET,简称OCMOS) 光耦合MOSFET(Optocoupled MOSFET,简称OCMOS)是一种将光电耦合器和MOSFET结合在一起的器件,用于实现电气隔离和信号传输。选择合适的光耦合MOSFET时,还需要考虑具体应用的需求和环境条件,以确保最佳性能和可靠性。- 最大输出电流和电压:确保所选型号能够满足电路的最大电流和电压需求。- 最大输出电流和电压:确保所选型号能够满足电路的最大电流和电压需求。- 隔离电压:根据应用环境的电气隔离要求选择合适的隔离电压。- 隔离电压:根据应用环境的电气隔离要求选择合适的隔离电压。 阅读详情

相关推荐

手把手教你解决Kernel panic报错:init找不到的5种排查方法(附NFS挂载实战)

本文深入解析了Linux系统启动时出现“Kernel panic - not syncing: No working init found”报错的根本原因,并提供了五种系统性的排查方法。文章结合NFS挂载根文件系统的实战场景,详细阐述了从动态链接库依赖、内核引导参数、NFS权限配置、文件系统完整性到内核配置干扰的完整排查路径,帮助开发者快速定位并解决这一常见的系统启动故障。

weixin_29159995的博客 194

java线程与操作系统线程的区别

用户空间和内核空间 关于内核态和用户态可以参考这篇文章:了解操作系统的那些事儿,从这篇文章开始,这里不再过多赘述。 至于什么是系统空间和用户空间也非常好理解:在操作系统中,内存通常会被分成用户空间(User space)与内核空间(Kernel space)这两个部分。当进程/线程运行在用户空间时就处于用户态,运行在内核空间时就处于内核态: 运行在内核态的程序可以访问用户空间和内核空间,或者说它可以访问计算机的任何资源,不受限制,为所欲为,例如协调 CPU 资源,分配内存资源,提供稳定的环境供应用程序运.

lyzchengxuyuan的博客 993

将运算放大器(运放)用作比较器

我们研究了一些经典的运算放大器电路。这些电路中运用了负反馈,因此通常就可以使运算放大器工作在线性区域内。 但是,也可以将运算放大器用作比较器,从而使其以非线性方式工作。由于其输入受到硬驱动,因此其输出电压会对电源轨产生猛烈的冲击。如下文所示,这可能并不总是一种好的设计方法。 变为非线性 在线性应用中,可以对运算放大器做如下理想假设:无限增益和带宽、零输出阻抗、无限输入阻抗,以及输入之间为零伏。也可以将运算放大器以非线性方式使用,但有一些地方要特别注意和处理。 一种常见的配置是仅使用开环运算放大器(无反馈),

ltqdxl的博客 3万+

java中的线程与操作系统的线程有什么区别

答: 在多核操作系统中,jvm也会允许在一个进程内同时并发执行多个线程。java中的线程和操作系统中的线程分别存在于虚拟机和操作系统中,他们虽然不同,但却是一一对应,息息相关的。 先总述一下,尽量概括到要点,接下来仔细阐述,阐述的详略程度视情况而定,别太简略就行。但是一定一定要条理,哪怕你讲的点都对,但是如果东一榔头西一棒槌,只会让人觉得你思路不清晰,或者知识不系统。 阐述: 我以线程创建与结束,来阐述一下他们的关系吧 首先,日常开发中都是会使用线程池来获取或者创建线程的,而线程在创建时,其实是先创建一

路辉的博客 3425

libopus 实现pcm 编码到opus

opus 是一种音频格式,常用于语音通话、视频会议中。最近做了个pcm 到opus 的编码,踩了不少坑,特此记录一下。

sinat_27720649的博客 9472

使用Simulink设计并实现一个可调谐的二阶IIR陷波滤波器,实时去除音频中的工频噪声

《基于Simulink的音频陷波滤波器设计与实现》摘要:本文详细介绍了使用Simulink设计陷波滤波器去除音频工频噪声(如50Hz)的方法。核心内容包括:1)二阶IIR陷波滤波器的原理与传递函数;2)Simulink实现步骤(音频系统搭建、滤波器设计、频率跟踪);3)性能分析(频谱对比、时域波形、听觉测试)。通过精准消除特定频率干扰,同时保留语音信号(200Hz-4kHz),有效提升信噪比(>20dB)。文章还探讨了多陷波级联、自适应算法等高级技巧,为音频处理、语音通信等应用提供实用解决方案。

amy_mhd的博客 155

Java线程与操作系统线程有什么区别?

在Java中,线程是一个重要的概念,它在并发编程中起着至关重要的作用。理解Java线程与操作系统线程的区别对提升编程效率和优化应用程序性能是非常关键的。本文将从Java线程的发展历程、用户线程与内核线程的区别、不同的线程模型及其实际应用场景等多个方面进行详细讲解。

qq_33326733的博客 1195

Python 爬虫实战:模拟登录网易云音乐(加密接口逆向与自动化登录实现)

网易云音乐作为国内主流的音乐流媒体平台,其丰富的音乐资源和个性化推荐算法吸引了大量用户。对于开发者而言,模拟登录网易云音乐并实现自动化操作,可以用于数据分析、歌单同步、歌词抓取等场景。然而,网易云音乐采用了多重加密机制和反爬策略,直接模拟登录存在较大挑战。

yansideyucsdn的博客 2590

JVM系列——Java与线程,介绍线程原理和操作系统的关系

Java中线程的实现,线程状态流转,线程和操作系统关系,Java线程的调度 并发不一定要依赖多线程(如PHP中很常见的多进程并发)。但是在Java里面谈论并发,基本上都与线程脱不开关系。因此我们讲一下从Java线程在虚拟机中的实现。

zekser的博客 2022

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1337

手把手教你学simulink实例--基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

MHD0815的博客 299

Java回顾---线程和操作系统的线程的区别

当线程在用户空间下实现时,操作系统对线程的存在是无感知的,操作系统只能看到进程,看不到线程,所有的线程都是在用户空间上实现。 也就是说,程序员需要自己实现线程的数据结构、创建销毁和调度维护。也就相当于需要实现一个自己的线程调度内核。 Java中的线程 在JDK1.2之前,JVM中有一个自己的线程调度内核,而到了操作系统层面,就是用户空间内的线程实现, 而到了1.2之后,JVM就换成了操作系统原生的线程模型,通过系统调用, 将程序的线程交给了操作系统内核进行调度。也就是说,现在Java的线程的本质,就是操作系

伊懿的博客 476

华为OD机试 - 开源项目热度榜单(Java 2025 C卷 100分)

H = Wwatch X#watch + Wstar X#star +Wfork X#fork +Wissue X#issue +Wmr X#mr H表示热度值,Wwatch、Wstar、Wfork、Wissue、Wmr分别表示5个统计维度的权重,#watch、#star、#fork、#issue、#mr分别表示5个统计维度的统计值。

学Java,找哪吒 1756

Java 线程和操作系统的线程有什么区别

Java线程是JVM层面的抽象,早期采用用户态线程(绿色线程),现代主流实现(如HotSpot)采用1:1模型直接映射操作系统内核线程。区别在于:1.抽象层次不同(JVM管理状态/优先级,操作系统实际调度);2.部分特性不完全对应(如中断机制);3.JVM可能优化线程创建/销毁过程。最终执行仍依赖操作系统线程,但提供跨平台一致性。

weixin_46084191的博客 1202

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java线程和操作系统线程的关系

传统进程的缺点 fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。 各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。 多线程的优缺点 线程:其实可以先简单理解成cpu的一个执行流,指令序列。多支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多

wzl1217333452的博客 2971

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

操作系统之线程和进程

操作系统相关内容, 进程和线程, 并发和并行.

trong_ 的烂笔头 2567

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

操作系统线程状态和Java线程状态的区别与联系

线程状态在操作系统和Java虚拟机中的不同之处

不定期更新Java相关的各种内容 1149

Java多线程和操作系统多线程关系

这篇文章要讨论的是Java编程中的多线程和操作系统中的多线程的区别问题。 线程状态。首先两者的线程状态是一样的。(创建、就绪、执行、阻塞、终止),其实这五个状态也是进程的状态。 那么Java中的多线程 和 OS中的多线程的区别在哪里? 我们先来看下OS中的线程实现 OS中线程的实现有三种,一种是用户级线程ULT(UserLevelThreads),一种是内核支持线程KST(Kern...

追求极致 1万+

什么是线程(Thread)?进程和线程有什么区别?

介绍什么是线程(Thread)。 进程和线程有什么区别.

想听风雨的博客 1983

【操作系统】线程和进程的区别 详细版

总结来说,线程是进程的一部分,用于实现并发和并行操作。线程共享进程的资源,通信更方便快捷,切换开销较小。进程相对独立,需要通过显式机制进行通信,切换开销较大。线程的管理更为灵活,进程的管理相对复杂。

A_aspectJ的博客 1207

操作系统 - 进程与线程的区别[超详解]

线程就是我们所谓的"跑起来的程序",那什么是可以跑起来的程序呢?就是类似我们在桌面上创建的对应软件的快捷方式,右击软件点击打开文件所在位置我们就可以看到xxx.exe文件,这样exe的文件我们统称为可执行文件当我们不想启动软件时,这些文件就会静静的"呆在"硬盘上,在我们双击之前是不会对系统有任何影响.

积跬步以至千里 1549

Java线程的状态以及转换条件,与操作系统线程状态的区别?

JVM作为一个跨平台虚拟机,它不需要也不应该深入管理操作系统的线程调度细节,而是专注于高层次的线程状态管理。操作系统负责具体的线程调度,JVM只需要维护线程在逻辑上的状态。 JVM 的 RUNNABLE 更加关注的是业务逻辑上的“线程可以执行”,而不需要区分底层的调度细节。 操作系统则负责更细粒度的状态转换,包括将线程从 READY 切换到 RUNNING,以及可能的 I/O 或等待状态的管理。 这种设计保证了 Java 的跨平台性和简洁性,同时也让 JVM 的线程管理模型相对简单易用。

changyuan 1103

Go 语言的 Goroutine 线程和 Java 线程的区别

在并发编程领域,Go 语言的 Goroutine 和 Java 线程是两种不同的并发模型。它们在设计、实现和使用方式上都有很大的区别。本文将深入探讨 Go 语言的 Goroutine 线程和 Java 线程的区别,帮助你更好地理解这两种并发模型。Go 语言的 Goroutine 和 Java 线程在设计、实现和使用方式上都有很大的区别。Goroutine 是一种轻量级线程,由 Go 运行时环境管理,具有低资源占用、高效的调度机制和无阻塞的通信方式,适合处理高并发的 I/O 密集型任务。

2201_75798391的博客 839

深入解析操作系统线程状态与Java线程状态的本质差异

本文深入解析了操作系统与JVM线程生命周期的实现机制。操作系统的线程状态机(就绪、运行、阻塞等)通过内核数据结构(如Linux的task_struct)和调度算法实现精确控制;而JVM线程状态(NEW、RUNNABLE、BLOCKED等)则是对底层系统的抽象封装,两者存在约30%的状态映射差异。文章通过大量代码示例和图表对比,揭示了状态转换的底层原理,并提供了死锁检测、性能调优等实战技巧。最后指出,随着虚拟线程等新技术发展,理解线程状态机制对构建高并发系统愈发重要。

weixin_51786043的博客 1284

goroutine和Java线程的区别

例如: 4.性能和扩展性 Java: Go:

zzy66666c的博客 1191
上一篇: 排查问题的技巧:索引,GC,容器,网络抓包,全链路追踪等技能
下一篇: 一点点地给你分析RabbiMQ的几种消息模型
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值