一 cpu个数、核数、线程数的关系java
cpu个数:是指物理上,也及硬件上的核心数;算法
核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;多线程
线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数性能
二 cpu线程数和Java多线程spa
首先明白几个概念:操作系统
(1) 单个cpu线程在同一时刻只能执行单一Java程序,也就是一个线程线程
(2) 单个线程同时只能在单个cpu线程中执行队列
(3) 线程是操做系统最小的调度单位,进程是资源(好比:内存)分配的最小单位进程
(4)Java中的全部线程在JVM进程中,CPU调度的是进程中的线程内存
(5)Java多线程并非因为cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数,操做系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。
a 那么java多进程,每一个进程又多线程,cpu是如何调度的呢?
我的理解:操做系统并非单纯均匀的分配cpu执行不一样的进程,由于线程是调度的最小单位,因此会根据不一样进程中的线程个数进行时间分片,均匀的执行每一个线程,也就是说A进程中有10个线程,而B进程中有2个进程,那么cpu分给进程的执行时间理论上应该是5:1才合理。
b cpu线程数和java线程数有直接关系吗?
我的理解:没有直接关系,正如上面所说,cpu采用分片机制执行线程,给每一个线程划分很小的时间颗粒去执行,可是真正的项目中,一个程序要作不少的的操做,读写磁盘、数据逻辑处理、出于业务需求必要的休眠等等操做,当程序在进行I/O操做的时候,线程是阻塞的,线程由运行状态切换到等待状态,此时cpu会作上下文切换,以便处理其余的程序;当I/O操做完成后,cpu 会收到一个来自硬盘的中断信号,并进入中断处理例程,手头正在执行的线程所以被打断,回到 ready 队列。而先前因 I/O 而waiting 的线程随着 I/O 的完成也再次回到 就绪 队列,这时 cpu 可能会选择它来执行。
c 如何肯定程序线程数?
我的理解:若是全部的任务都是计算密集型的,则建立的多线程数 = 处理器核心数就能够了
若是io操做比较耗时,则根据具体状况调整线程数,此时 多线程数 = n*处理器核心数
通常状况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了,过多的程序线程数不但不会提升性能,反而还会由于线程间的频繁切换而受影响,具体须要根据线程处理的业务考略,不断调整线程数个数,肯定当前系统最优的线程数。 ---------------------