• 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上?可以控制它们的分布吗?

  • 相关阅读:
    Monggodb基础
    手游运营数据指标
    JSON语法
    Java中日期转换问题
    Java线程中锁的问题
    鼠标移动监听的注意事项
    链接数据库的问题
    获取显示器的宽高
    JTable的使用问题
    JScrollPane控件中添加其他控件的问题&&JScrollPane设置滚动条&&调整滚动速度
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/14066797.html
Copyright © 2020-2023  润新知