iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Java线程和操作系统的线程有什么区别
  • 643
分享到

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

2023-06-15 14:06:40 643人浏览 安东尼
摘要

这篇文章主要介绍了Java线程和操作系统的线程有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 用户空间和内核空间关于内核态和用户态我们在 了解操作系统的那些事儿

这篇文章主要介绍了Java线程操作系统的线程有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1. 用户空间和内核空间

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

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

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

  • 而应用程序基本都是运行在用户态的,或者说用户态就是提供应用程序运行的空间。运行在用户态的程序只能访问用户空间

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

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

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

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

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

2. 操作系统线程

① 在用户空间中实现线程

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

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

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

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

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

② 在内核空间中实现线程

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

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

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

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

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

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

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

1)多对一线程模型:

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

  • 在多对一模型中,多个用户级线程映射到某一个内核线程上

  • 线程管理由用户空间中的线程库处理,这非常有效

  • 但是,如果进行了阻塞系统调用,那么即使其他用户线程能够继续,整个进程也会阻塞

  • 由于单个内核线程只能在单个 CPU 上运行,因此多对一模型不允许在多个 CPU 之间拆分单个进程

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

2)一对一线程模型:

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

  • 一对一模型克服了多对一模型的问题

  • 一对一模型创建一个单独的内核线程来处理每个用户线程

  • 但是,管理一对一模型的开销更大,涉及更多开销和减慢系统速度

  • 此模型的大多数实现都限制了可以创建的线程数

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

3)多对多线程模型:

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

  • 多对多模型将任意数量的用户线程复用到相同或更少数量的内核线程上,结合了一对一和多对一模型的最佳特性

  • 用户对创建的线程数没有限制

  • 阻止内核系统调用不会阻止整个进程

  • 进程可以分布在多个处理器上

  • 可以为各个进程分配可变数量的内核线程,具体取决于存在的 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 采用的是一对一的线程模型。

感谢你能够认真阅读完这篇文章,希望小编分享的“Java线程和操作系统的线程有什么区别”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网操作系统频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java线程和操作系统的线程有什么区别

本文链接: https://www.lsjlt.com/news/280534.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java线程和操作系统的线程有什么区别
    这篇文章主要介绍了Java线程和操作系统的线程有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 用户空间和内核空间关于内核态和用户态我们在 了解操作系统的那些事儿...
    99+
    2023-06-15
  • Java中用户线程和守护线程有什么区别
    这篇文章给大家分享的是有关Java中用户线程和守护线程有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在 Java  语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知,所以本文...
    99+
    2023-06-15
  • go协程和线程有什么区别
    Go协程和线程是两种并发执行的机制,它们有以下几个主要区别:1. 调度器:Go协程由Go语言的运行时调度器(Goroutine Sc...
    99+
    2023-10-20
    go
  • android进程和线程有什么区别
    Android进程和线程是两个概念,它们有以下区别:1. 定义:进程是程序的执行实例,是操作系统对程序的一种抽象;线程是进程中的一个...
    99+
    2023-09-23
    android
  • Java之进程和线程的区别是什么
    这篇文章主要介绍“Java之进程和线程的区别是什么”,在日常操作中,相信很多人在Java之进程和线程的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java之进程和线程的区别是什么”的疑惑有所帮助!...
    99+
    2023-07-05
  • java中守护线程与非守护线程的区别有什么
    这篇文章将为大家详细讲解有关java中守护线程与非守护线程的区别有什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:pub...
    99+
    2023-05-31
    java 守护线程 非守护线程
  • Java守护线程和用户线程的区别
    目录守护线程定义创建守护线程将线程池设置为守护线程守护线程 VS 用户线程用户线程守护线程守护线程注意事项总结前言: 在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况...
    99+
    2022-11-13
  • java中线程和进程有哪些区别
    这篇文章将为大家详细讲解有关java中线程和进程有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入...
    99+
    2023-06-14
  • Java中守护线程和用户线程的区别有哪些
    这篇文章主要介绍Java中守护线程和用户线程的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MV...
    99+
    2023-06-14
  • java进程、线程、纤程的区别是什么
    本篇内容主要讲解“java进程、线程、纤程的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java进程、线程、纤程的区别是什么”吧!在Java 中,这些短小的代码段一般会被放入一个cl...
    99+
    2023-06-16
  • php多线程与并发线程有什么区别
    PHP是一种脚本语言,通常用于开发Web应用程序。在PHP中,多线程和并发线程之间存在一些区别: 多线程:多线程是指在一个进程中...
    99+
    2023-10-27
    php
  • 协程和线程的区别和联系
    本篇内容介绍了“协程和线程的区别和联系”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进程进程是什么进程是操作系统对一个正在运行的程序的一种抽...
    99+
    2023-06-15
  • 线程和进程的区别是什么
    线程和进程的区别:1、线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小;2、进程相对独立,需要通过显式机制进行通信,切换开销较大;而线程的管理更为灵活,进程的管理相对复杂。线程和进程是操作系统中...
    99+
    2023-08-10
  • golang线程池和协程池有什么区别
    Golang中没有线程池的概念,而是通过协程(goroutine)来实现并发。协程是一种轻量级的线程,由Go语言的运行时环境(run...
    99+
    2023-10-26
    golang
  • 什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
    文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable ...
    99+
    2023-08-19
    java JavaEE 多线程 进程
  • java线程sleep和wait的区别有哪些
    Java中的线程sleep和wait方法有以下区别:1. 调用wait方法的线程会放弃自己的锁,并进入等待状态,直到其他线程调用相同...
    99+
    2023-09-25
    java
  • unity协程和线程的区别是什么
    Unity协程和线程的区别主要体现在以下几个方面:1. 执行环境:- Unity协程运行于主线程中,与Unity的更新循环同步,可以...
    99+
    2023-09-29
    unity
  • Go中什么是协程,协程和线程的区别和联系
    在Go中,协程(Goroutine)是一种轻量级的线程,由Go运行时环境管理。协程是一种用户态的线程,不需要操作系统的线程支持。在G...
    99+
    2023-09-23
    Go
  • Python主线程与子线程的区别是什么
    Python主线程与子线程的区别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python子线程在创建自身的线程状态对象后,会通过_PyGILState_NoteTh...
    99+
    2023-06-17
  • java中进程和线程有什么关系
    java中进程和线程有什么关系?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作