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

转载自https://blog.csdn.net/yangmx_5/article/details/68065299

这篇文章要讨论的是Java编程中的多线程和操作系统中的多线程的区别问题。

线程状态。首先两者的线程状态是一样的。(创建、就绪、执行、阻塞、终止),其实这五个状态也是进程的状态。

那么Java中的多线程 和 OS中的多线程的区别在哪里?


我们先来看下OS中的线程实现

OS中线程的实现有三种,一种是用户级线程ULT(UserLevelThreads),一种是内核支持线程KST(KernelSupportedThreads),还有一种是前两种的组合方式

所以我们大可以将OS实现线程的方式分为两类,一类是用户级,一类是内核级。这两类的不同在于用户级线程是在用户空间实现的,而内核级线程是在OS内核空间实现的。设置用户级线程的系统,调度是以进程为单位的。而设置了内核级进程的而是以线程为单位进行调度的。

OS内核常驻在内存中,所以将内存空间分为内核空间和用户空间。 线程在内核中实现有以下几个好处:

  1. 内核可以在多处理器系统中调度同一进程中的多个线程并行执行。
  2. 如果某一个进程中的线程阻塞了,可以跨进程调度其他线程进行执行
  3. 线程的切换速度快,开销小。并且内核本身支持多线程技术可以提高系统的执行速度和效率。
但是也有个缺点,当用户将线程交付下来时要将线程由用户态切换为核心态再进行调度等操作,因此也会造成模式切换的开销较大。

线程在用户空间实现的主要优点:

  1. 首先线程的切换不需要转换到内核空间,所以节省了模式切换的开销
  2. 用户级线程的实现和OS平台无关,对于线程管理的代码是属于用户程序的一部分。用户级线程甚至可以在不支持线程机制的OS上实现。
用户级线程的缺点:
  1. 一个进程被分配一个CPU,同一时刻只能有一个线程运行。
  2. 若进程中的正在运行的线程阻塞,则当前进程的其他线程全被阻塞。

组合方式: 组合方式综合前两种的优点,分为三种模型:多对一、一对一、多对多 简单理解下就是 不同数量的用户级线程 搭配

不同数量的内核级线程。此处不再做过多的介绍。

以上便是操作系统中线程的实现。


Java中的多线程实现

看到用户级的线程实现,是不是都要以为用户级的线程就是我们现在Java的多线程支持,然而并不是


Java多线程是在JVM中实现的,而JVM相对于OS是一个进程。我们用Java编写的多线程程序对于OS来说是不可见的。OS只关心JVM交付给它的任务。至于我们写的多线程具体是怎么实现的,就要看JVM怎么将我们的程序交给OS运行了。

补充一下: 
https://www.zhihu.com/question/23096638 
这里面解释的很详细


猜你喜欢

转载自blog.csdn.net/faker_wang/article/details/80714772