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

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

核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;

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

二 cpu线程数和Java多线程

首先明白几个概念:

(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采用分片机制执行线程,给每个线程划分很小的时间颗粒去执行,但是真正的项目中,线程要做很多的的操作,读写磁盘、数据逻辑处理、出于业务需求必要的休眠等等操作。

c 如何确定程序线程数?

个人理解:一般情况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了,过多的程序线程数不但不会提高性能,反而还会因为线程间的频繁切换而受影响,具体需要根据线程处理的业务考略,不断调整线程数个数,确定当前系统最优的线程数。

线程数是一种逻辑的概念,简单地说,就是模拟出的CPU核心数。比如,可以通过一个CPU核心数模拟出2线程的CPU,也就是说,这个单核心的CPU被模拟成了一个类似双核心CPU的功能。我们从任务管理器的性能标签页中看到的是两个CPU。 比如Intel 赛扬G460是单核心,双线程的CPU,Intel 酷睿i3 3220是双核心 四线程,Intel 酷睿i7 4770K是四核心 八线程 ,Intel 酷睿i5 4570是四核心 四线程等等。

对于一个CPU,线程数总是大于或等于核心数的。一个核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线程,也就是说它可以同时运行两个线程。 CPU的线程数概念仅仅只针对Intel的CPU才有用,因为它是通过Intel超线程技术来实现的,最早应用在Pentium4上。如果没有超线程技术,一个CPU核心对应一个线程。所以,对于AMD的CPU来说,只有核心数的概念,没有线程数的概念。

CPU之所以要增加线程数,是源于多任务处理的需要。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。

物理cpu:实际server中插槽上的cpu的个数,物理cpu的数量,可以数不重复的physical id 有几个

逻辑cpu:Linux用户对 /proc/cpuinfo 这个文件肯定不陌生. 它是用来存储cpu硬件信息的,信息内容分别列出了processor 0 – n 的规格。这里需要注意,如果你认为n就是真实的cpu数的话, 就大错特错了,一般情况,我们认为一颗cpu可以有多核,加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的cpu core出来,逻辑CPU数量=物理cpu数量 x cpu cores 这个规格值 x 2(如果支持并开启ht),备注一下:Linux下top查看的CPU也是逻辑CPU个数

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数

# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)

cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l

#查看线程数                                                                                                                                                                                                     grep 'processor'        /proc/cpuinfo | sort -u | wc -l      注意,此处查看的线程数是总得线程数,可以理解为逻辑cpu的数量

CPU核数跟多线程的关系

一直以来有这样的疑惑,单核CPU适合多线程吗?是不是几个核的CPU开几个线程是最合适的?

今天就这一问题查了一些资料,现整理如下:

要说多线程就离不开进程,进程和线程的区别在这里就不详细说了,只将关键的几点:

a)进程之间是相互独立的,不共享内存和数据,线程之间的内存和数据是公用的,每个线程只有自己的一组CPU指令、寄存器和堆栈,对于线程来说只有CPU里的东西是自己独享的,程序中的其他东西都是跟同一个进程里的其他线程共享的。

b)操作系统创建进程时要分配好多外部资源,所以开销大。(这个跟操作系统有关,有人做过实验,window创建进程的开销大,linux创建进程的开销就很小。)

再来说一下CPU,在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。而现在多核CPU的情况下,同一时间点可以执行多个任务,具体到这个任务在CPU哪个核上运行,这个就跟操作系统和CPU本身的设计相关了。

我们假设一个极端的情况:在一台单核计算机上只运行2个程序,一个是我们的程序A,另一个是操作系统的程序B,每个程序是一个进程。单核CPU的时候,A和B在CPU上交替运行,具体的分配方式由操作系统来判断,我这里猜测应该跟A和B的线程数有关,因为线程是CPU级别的,如果A有5个线程,B也有5个线程,那么CPU分配给A和B的时间应该是1:1的;如果A增加到15个线程,CPU分配给A和B的时间应该是3:1的比例。所以此时如果A的线程数多,那么获得的CPU执行次数就多,处理的速度也就快了。以上假设的前提是:①A和B的优先级相同,②A和B都是只消耗CPU资源的程序。

如果相同的情况用一个双核的计算机来处理又会是什么结果呢?假设这个双核的计算机和操作系统比较傻,把A进程分配到核1上,B进程分配到核2上,那不管A有几个线程,都是用核1来处理,那么时间肯定是一样的。不过现实中应该不会有这么傻的CPU和操作系统吧。

所以赶紧还是会根据线程来进行处理,当A的线程比B多时,会占用核2来处理A的线程。

刚才说的是只消耗CPU资源的程序,但这样的程序在实际应用中基本上是没有的,总会有跟资源打交道的。比如读个文件,查个数据库,访问一个网络连接等等。这个时候多线程才真正体现出优势,在一个进程中,线程a去读文件,线程b去查数据库,线程c去访问网络,a先用一下CPU,然后去读文件,此时CPU空闲,b就用一下,然后去查数据库,……,相对于读文件、查数据库、访问网络来说CPU计算的时间几乎可以忽略不计,所以多线程实际上是计算机多种资源的并行运用,跟CPU有几个核心是没什么关系的。

对于一个CPU,线程数总是大于或等于核心数的。一个核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线程,也就是说它可以同时运行两个线程。

CPU的线程数概念仅仅只针对Intel的CPU才有用,因为它是通过Intel超线程技术来实现的,最早应用在Pentium4上。如果没有超线程技术,一个CPU核心对应一个线程。所以,对于AMD的CPU来说,只有核心数的概念,没有线程数的概念。

CPU之所以要增加线程数,是源于多任务处理的需要。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。

在Windows中,在cmd命令中输入“wmic”,然后在出现的新窗口中输入“cpu get *”即可查看物理CPU数、CPU核心数、线程数。其中,

Name:表示物理CPU数

NumberOfCores:表示CPU核心数

NumberOfLogicalProcessors:表示CPU线程数

单核多CPU与多核单CPU

一台计算机的处理器部分的架构

单核多CPU,那么每一个CPU都需要有较为独立的电路支持,有自己的Cache,而他们之间通过板上的总线进行通信。(一致性问题)

假如在这样的架构上,我们要跑一个多线程的程序(常见典型情况),不考虑超线程,那么每一个线程就要跑在一个独立的CPU上,线程间的所有协作都要走总线,而共享的数据更是有可能要在好几个Cache里同时存在。这样的话,总线开销相比较而言是很大的,怎么办?那么多Cache,即使我们不心疼存储能力的浪费,一致性怎么保证?

多核单CPU,那么我们只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。在这样的架构上,如果我们跑一个多线程的程序,那么线程间通信将比上一种情形更快。

多个CPU常见于分布式系统,用于普通消费级市场的不多,多用于cluster,云计算平台什么的。多CPU架构最大的瓶颈就是I/O,尤其是各个CPU之间的通讯,低成本的都用100M以太网做,稍微好一点的用1000M以太网,再好的就用光纤等等,但无论如何速度和通量都比不上主板的主线。所以多CPU适用于大计算量,对速度(时间)不(太)敏感的任务,比如一些工程建模,或者像SATI找外星人这种极端的,跑上几千年都不着急的。而且多CPU架构更简单清晰,可以用消费级产品简单做数量堆叠,成本上有优势。而多核单CPU则适合对通讯I/O速度要求较快的应用,(相同核数量下)成本上也高一些,好像只有在超级计算机里会用到以万为单位的核心数,普通消费级产品也就是到16核封顶了,因为成本控制的原因。

在Windows中,在cmd命令中输入“wmic”,然后在出现的新窗口中分别输入“cpu get Name”,“cpu get NumberOfCores”,“cpu get NumberOfLogicalProcessors”即可查看物理CPU数、CPU核心数、线程数。

如下图所示:

Name:表示物理CPU数

NumberOfCores:表示CPU核心数

NumberOfLogicalProcessors:表示CPU线程数

注释:VM虚拟机中的CPU选择的核心数实际是代表线程数。

输入“cpu get *”也可

2.在cmd命令中输入“systeminfo”,以下信息表示物理CPU有两个

java cpu个数_cpu个数、核数、线程数、Java多线程关系的理解相关推荐

  1. 0.9.2、线程池——核心线程数、阻塞队列、最大线程数之间的关系

    文章目录 线程池内部运行过程 验证思路 确保先提交的任务优先被线程池处理 确保执行的任务占有足够久的线程池资源 可观测的阻塞队列大小 充分的信息 代码 自定义线程池 结果 结论 基本几结论 新任务提交 ...

  2. CPU 核数与线程数有什么关系?

    作为一名美食资浅爱好者,尽管小风哥我厨艺拙计,但依然阻挡不了我对烹饪的热爱. 那小风哥我通常是怎么做菜的呢? 大厨与菜谱 你没猜错,做菜之前先去下一份菜谱,照着菜谱一步步来:起锅烧油.葱姜蒜末下锅爆香 ...

  3. 线程池应该设置多少核心线程数——Java多线程系列学习笔记

    前言 本章主要讨论线程池合适的线程数量是多少,以及 CPU 核心数和线程数的关系.我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能.在 ...

  4. VC获取进程的cpu使用率、内存、线程数、句柄数等信息

    //ProcessInfoCollect.h //进程信息采集#pragma once//枚举进程 typedef BOOL(_stdcall *ENUMPROCESS)(DWORD *pProces ...

  5. 关于最佳线程数的计算的准确理解

    Venkat Subramaniam 博士在<Programming Concurrency on the JVM>中提到关于最优线程数的计算: The minimum number of ...

  6. 技术派-关于最佳线程数的计算的准确理解

    Venkat Subramaniam 博士在<Programming Concurrency on the JVM>中提到关于最优线程数的计算: The minimum number of ...

  7. mfc怎么获取进程的线程数_Python多线程获取小米应用商店App,看看我是怎么做到的

    一.[项目背景] 小米应用商店给用户发现最好的安卓应用和游戏,安全可靠,可是要下载东西要一个一个的搜索太麻烦了.而且速度并不是很快. 今天小编就教大家利用多线程爬取小米应用商店的游戏模块,快速获取我们 ...

  8. cpu核数和逻辑个数的区别_CPU核数和线程数有什么作用?核心和线程哪个重要?

    [文章导读]我们在组装电脑选购硬件的时候,大多数的人群更在乎CPU的性能,除了考虑架构.工艺.单核性能等,还需要考虑核心和线程数量,CPU从早期的单核,发展到现在的双核.多核,除了核心数量之外,还有线 ...

  9. cpu核数和逻辑个数的区别_CPU的核心数与线程数的关系和区别

    我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面就来解释一下CPU的核心数与线程 ...

最新文章

  1. 开发者必备!Github 上 1.6W 星的「黑魔法」,早知道就不会秃头了
  2. pandas读写MySQL数据库详解及实战
  3. iphone-common-codes-ccteam源代码 CCUIActivityIndicatorView.h
  4. 非洲的风能和太阳能真是企业家无与伦比的商机?
  5. git上传代码到码云(详细)
  6. Linux服务器下运行SpringBoot HelloWorldDemo(Mac篇)
  7. win7服务器远程灰色的,小编为你细说win7系统远程协助复选框是灰色的详细技巧...
  8. SendMessage函数的常用消息及其应用大全
  9. *多叉树的树形背包常见建模方法
  10. Debian安装软件是Debian GNU/Linux 5.0.4 _Lenny_ - Official amd64 DVD Binary-1 20100131-22:09
  11. temp变量this变量base变量 c# 1613715552
  12. 【2022最新Java面试宝典】—— Linux面试题(50道含答案)
  13. c语言合法的用户字符,在C语言中下列合法的字符常量是
  14. UE4 layered blend per bone 节点详解
  15. 微信浏览器跳转app解决方案
  16. 最重要的三种能力:思考力、行动力、表达力
  17. 2021-01-30
  18. COSMIC度量知识整理
  19. [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理
  20. 直观打印二叉树的图形

热门文章

  1. matlab2014 图标,Ubuntu14.04 Matlab 2014b启动器(使用matlab自带图标)
  2. Cesium空间分析-通视分析
  3. FreeSwtich的监听功能
  4. bootstrap制作导航条案例
  5. Java利用Mybatis进行数据权限控制
  6. 大连理工计算机原理综合设计,大连理工大学计算机原理实验综合实验设计报告.pdf...
  7. Hi3861开发环境搭建 ||避坑指南|| [适用于几乎所有以Hi3861为主控的开发板]
  8. Visual Studio 2019 许可证过期解决办法
  9. HTML+CSS-淘宝网页
  10. R进阶(1) --dplyr中的Select函数