一个JAVA线程就是一个OS线程,线程调度依赖于操作系统,JVM层面不干预。JAVA语言层面讲,只是规范,并不要求具体如何实现。具体的实现模型有几种,比如1:1,N:1, 1:N。在LINUX下,你可以用JNI来调用taskset,实现把线程分配到某一个CPU上。
一个JAVA线程就是一个OS线程,线程调度依赖于操作系统,JVM层面不干预。JAVA语言层面讲,只是规范,并不要求具体如何实现。具体的实现模型有几种,比如1:1,N:1, 1:N。在LINUX下,你可以用JNI来调用taskset,实现把线程分配到某一个CPU上。
Java语言的线程,从规范的角度来说是不强制要求任何具体的实现方式的。采用1:1、N:1、M:N模型都可以。
具体到我们平时常用的JVM实现,Oracle/Sun的HotSpot VM,它是用1:1模型来实现Java线程的,也就是说一个Java线程是直接通过一个OS线程来实现的,中间并没有额外的间接结构。而且HotSpot VM自己也不干涉线程的调度,全权交给底下的OS去处理。所以如果OS想把某个线程调度到某个CPU/核上,它就自己弄了。
这个意义上说Java程序跑在HotSpot VM上开多个Java线程,就跟一个C/C++程序开了多线程来跑没有任何两样。那么怎么控制这些线程分布到不同的CPU核上去呢?
在Linux上的话,可以用taskset来把线程绑在某个指定的核上。
JVM的实现有很多种,并不是所有JVM都像HotSpot VM这样总是用1:1模型的。在JVM里面也存在内存屏障(jvm的内存屏障),因为不是实体的机器,是逻辑的概念;所有实现JVM规范的虚拟机,必须实现四个屏障,Load和stored的四种组合;volatile也是这个作用可见性,和静止指令重排,那在最终的CPU是如何实现JVM规定的这些规范的呢?通过Hotspot(热点),通过汇编语言,lock、add来对CPU寄存器前面加零,也就是总线和缓存锁的概念。
延伸阅读:
什么是多线程
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。可以通过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。
文章标题:Java多线程如何实现在多CPU上分布,发布者:小编,转载请注明出处:https://worktile.com/kb/p/36327