zoukankan      html  css  js  c++  java
  • CPU线程和Java线程

    一 cpu个数、核数、线程数的关系

    cpu个数:是指物理上,也及硬件上的核心数;

    核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;一个CPU核心数模拟出2线程的CPU

    线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数,及程数=cpu个数(2) * 核数(2)=4

    Windows: wmic  然后 物理CPU数 “cpu get NumberOfCores”, CPU核心数 “cpu get NumberOfLogicalProcessors” 

    Linux: 

    查看CPU个数  cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

    查看核数         cat /proc/cpuinfo| grep "cpu cores"| uniq

     Windows也可以查看任务管理器:

     二 cpu线程数和Java多线程

     (1) 线程是CPU级别的,单个线程同时只能在单个cpu线程中执行

     (2) Java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。

     (3) 线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位

     (4)Java中的所有线程在JVM进程中,CPU调度的是进程中的线程

     线程的调度是指按照特定的机制为多个线程分配CPU的使用权。有两种调度模型:分时调度模型和抢占式调度模型

    • 分时调度模型是指让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU的时间片。
    • Java虚拟机采用抢占式调度模型,是指优先让可运行池中处于就绪态的线程中优先级高的占用CPU,如果可运行池中线程的优先级相同,那么就随机选择一个线程,使其占用CPU,处于运行状态的线程会一直执行,直至它不得不放弃CPU,一个线程会因为以下原因放弃CPU:
      • (1)Java虚拟机让当前线程暂时放弃CPU,转到就绪态,使其他线程获得运行机会
      • (2)当前线程因为某些原因而处于阻塞状态
      • (3)线程运行结束

     Java线程让步:

    3. Thread.yield()方法

    就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行(根据CPU的调度),并不是单纯的让给其他线程。

     4.等待其他线程结束:join()

    当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会恢复运行(阻塞恢复到就绪)

    知乎相关问题:

    在java里创建几个线程怎么能确保他们跑在不同的CPU上?可以控制它们的分布吗?
    答复:
    作者:RednaxelaFX
    链接:https://www.zhihu.com/question/64072646/answer/216184631

    Java语言的线程,从规范的角度来说是不强制要求任何具体的实现方式的。采用1:1、N:1、M:N模型都可以。先放个传送门:RednaxelaFX:JVM中的线程模型是用户级的么?

    具体到我们平时常用的JVM实现,Oracle/Sun的HotSpot VM,它是用1:1模型来实现Java线程的也就是说一个Java线程是直接通过一个OS线程来实现的,中间并没有额外的间接结构。而且HotSpot VM自己也不干涉线程的调度,全权交给底下的OS去处理。所以如果OS想把某个线程调度到某个CPU/核上,它就自己弄了。

    这个意义上说Java程序跑在HotSpot VM上开多个Java线程,就跟一个C/C++程序开了多线程来跑没有任何两样。那么怎么控制这些线程分布到不同的CPU核上去呢?

    在Linux上的话,可以用taskset来把线程绑在某个指定的核上。在Java层面上,有大大写了个现成的库来利用taskset绑核:OpenHFT/Java-Thread-Affinity 有兴趣的话可以参考一下。

    结束前提一下:JVM的实现有很多种,并不是所有JVM都像HotSpot VM这样总是用1:1模型的。前面的传送门已经有例子了所以这里就不多说,但还是想特别提一下免得给初学者留下“Java线程就肯定是OS线程”的误解。请务必针对实现来讨论这种问题。

    参考:https://www.cnblogs.com/webglcn/p/10639065.html

              https://zhuanlan.zhihu.com/p/86855590

     在java里创建几个线程怎么能确保他们跑在不同的CPU上?可以控制它们的分布吗?

  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/14066797.html
Copyright © 2011-2022 走看看