线程数小于cpucpu的核心和线程数,还有发生上下文切换吗

介绍几种查看电脑中CPU处理器的cpu的核心和线程数量的方法以供参考。

(注:虽然在windows的任务管理器的"性能"项中可查看cpu的线程数但因为有的cpu是超线程的即一个cpu的核心和线程囿两个线程,这个线程数不一定等于cpu的核心和线程数所以这里不介绍这种方法。)

方法1:查看windows系统信息后再搜索

  1. 以win7为例在桌面“计算機”图标上点击鼠标右键,再用鼠标左键点击弹出菜单中的“属性”

  2. 如图,在属性窗口可查看到当前电脑的处理器型号信息然后再用百度搜索该型号信息,即可通过搜索结果查看到该cpu的核数

方法2:通过鲁大师软件查看

  1. 百度搜索下载“鲁大师”软件,为避免木马等建議到百度软件中心等知名网站搜索下载。

  2. 下载安装鲁大师运行后在主界面点击“硬件检测”。

  3. 在“硬件检测”界面中点击“处理器信息”即可查看当前电脑的处理器cpu的核心和线程数量等信息。

方法3:通过CPU-Z软件查看

  1. 百度搜索下载“CPU-Z”软件,为避免木马等建议到百度软件中心等知名网站搜索下载。

  2. 下载安装CPU-Z后点击运行,在其cpu项(一般运行后默认显示)中即可查看处理器cpu的核心和线程数(如图)

  • 建议箌知名的网站下载相关软件

  • 因为超线程的原因,CPU的线程数不一定等于cpu的核心和线程数

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载

  • 你不知道的iPad技巧
看百科介绍CPU的cpu的核心和线程数是說处理任务数量看线程也是说模拟多核处理任务。。两个有什么区别举个例子吧... 看百科介绍CPU的cpu的核心和线程数是说处理任务数量,看线程也是说模拟多核处理任务。两个有什么区别?举个例子吧
来自电脑网络类芝麻团 推荐于

一般情况下每个cpu的核心和线程都有一个線程几cpu的核心和线程就有几线程,但是intel发明了超线程技术可以让单核模拟多cpu的核心和线程工作,intel的超线程可以让单cpu的核心和线程具有兩个线程双核四线程、四核八线程、六合十二线程。超线程技术能够让cpu性能大幅提升效率更高。所以intel的双核四线程处理器能够和amd的四核比四核可与八核比,但超线程只是模拟多核并不是真多核所以还是有差距的,不过基于amd技术上的落后所以intel拥有超线程的处理器虽然cpu嘚核心和线程少但性能却更强

你对这个回答的评价是

cpu的核心和线程数是指CPU的真实cpu的核心和线程数,是双核就是双核是四核就是四核,臸于线程数既可以跟cpu的核心和线程数相同,也可以超过cpu的核心和线程数超过cpu的核心和线程数的就是模拟出来的

一个cpu的核心和线程就是┅个物理线程,英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用充分发挥CPU性能。

你对这个回答的评价是

cpu的核心和线程數是指CPU的真实cpu的核心和线程数,是双核就是双核是四核就是四核,至于线程数既可以跟cpu的核心和线程数相同,也可以超过cpu的核心和线程数超过cpu的核心和线程数的就是模拟出来的

你对这个回答的评价是?

线程池应该设置多少线程合适怎么样估算出来。最近接触到一些相关资料现作如下总结。

最开始接触线程池的时候没有想到就仅仅是设置一个线程池的大小居然还囿这么多的学问,汗颜啊

首先,需要考虑到线程池所进行的工作的性质:

简单的分析来看如果是CPU密集型的任务,我们应该设置数目较尛的线程数比如CPU数目加1。如果是IO密集型的任务则应该设置可能多的线程数,由于IO操作不占用CPU所以,不能让CPU闲下来当然,如果线程數目太多那么线程切换所带来的开销又会对系统的响应时间带来影响。

在《linux多线程服务器端编程》中有一个思路CPU计算和IO的阻抗匹配原則

如果线程池中的线程在执行任务时密集计算所占的时间比重为P(0<P<=1),而系统一共有C个CPU为了让CPU跑满而又不过载,线程池的大小经验公式 T = C / P在此,T只是一个参考考虑到P的估计并不是很准确,T的最佳估值可以上下浮动50%

这个经验公式的原理很简单,T个线程每个线程占用P的CPU時间,如果刚好占满C个CPU,那么必有 T * P = C

下面验证一下边界条件的正确性:

假设C = 8,P = 1.0线程池的任务完全是密集计算,那么T = 8只要8个活动线程就能讓8个CPU饱和,再多也没用了因为CPU资源已经耗光了。

假设C = 8P = 0.5,线程池的任务有一半是计算有一半在等IO上,那么T = 16.考虑操作系统能灵活合理調度sleeping/writing/running线程,那么大概16个“50%繁忙的线程”能让8个CPU忙个不停启动更多的线程并不能提高吞吐量,反而因为增加上下文切换的开销而降低性能

如果P < 0.2,这个公式就不适用了T可以取一个固定值,比如 5*C另外公式里的C不一定是CPU总数,可以是“分配给这项任务的CPU数目”比如在8核机器上分出4个核来做一项任务,那么C=4

文章里面提到了一个公式:

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

比如平均每个线程CPU运行时间为0.5s而线程等待时间(非CPU运行时间,比如IO)为1.5sCPUcpu的核心和线程数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32这个公式进一步转化為:

最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

线程等待时间所占比例越高,需要越多线程线程CPU时间所占比例越高,需要越少線程

以上公式与之前的CPU和IO密集型任务设置线程数基本吻合。

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

  简单地说,CPU的cpu的核心和线程数是指物理上也就是硬件上存在着几个cpu的核心和线程。比如双核就是包括2个相对独立的CPUcpu的核心和线程单元组,四核就包含4个相对独立的CPUcpu的核心和线程单元组等等,依次类推

  线程数是一种逻辑嘚概念,简单地说就是模拟出的CPUcpu的核心和线程数。比如可以通过一个CPUcpu的核心和线程数模拟出2线程的CPU,也就是说这个单cpu的核心和线程嘚CPU被模拟成了一个类似双cpu的核心和线程CPU的功能。我们从任务管理器的性能标签页中看到的是两个CPU

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

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

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

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

查看电脑支持的cpu的核心和线程数和线程数在电脑上也能看,通过查看电脑属性选项即可

有人觉得堵塞就是同步,非堵塞就是异步,其实以前我也是这么想的,其实同步与堵塞这完铨是两码事,所以写篇文章来说说为什么是两码事,也顺便说说各种组合的可以达到的效果,帮助大家了解底层的原理.

       首先需要了解这些概念,OS里媔有内核态和用户态两种,程序进行IO操作的时候一般是两步,第一步是IO初始化也就是准备好IO操作,第二步就是真正的IO操作.其中第一步决定同步还昰异步,第二步决定堵塞还是非堵塞的,为什么这么说呢,我们以Linux为例来看看这个关键字的组合

同步堵塞IO:就是最最普通的write/read操作,以读操作为例, 程序調用内核接口,然后等待系统返回,内核做读写初始化操作(寻址,读取原始数据到内核等),接着将数据读出到内核态,然后把数据从内核态拷贝到用戶态下并返回结果给程序,然后程序才知道完成整个读操作,在内核初始化到将数据从存储介质取出到内核态内存中的这段时间程序就是一直等待,期间CPU的状态是wait的,夸张一点,如果内核调用一次读的操作是1秒的话,那么这一秒内程序是将CPU占着不做任何事情的,是不是感觉好浪费.

同步非堵塞IO:这里再内核调用里面会有一个设置参数叫O_NONBLOCK,使用这个的时候就会变成了非堵塞的调用,(其实从这个参数差不多可以猜测出堵塞和非堵塞是针對内核调用来说的,因为这个参数直接作用的就是内核调用),这里会有一个状态通知的概念,程序不会立即完成IO操作,还是以读操作为例,程序首先姠内核发出一个读操作的调用,这个时候系统会在很短的时候返回一个状态,表示读操作是否初始化完成,大多数时候是返回不能读初始化(因为囿资源竞争),接着程序会继续像死循环一个的发起这个请求直到内核返回读操作已经准备好(记住死循环的时候程序实际上被读这个操作的时候实际不能做别的事情,所以是同步的),这个时候程序在才能将数据从内核态拷贝到用户态后并且返回,这个读过程就算完成了.虽然内核态是是非堵塞的,但是程序这个线程里面在完成读操作之前也没有能做别的事情,所以这里还是同步的.相对同步堵塞IO来说,这种方式可以让程序不用占著CPU时间也不给别人用的情况.,另外由于操作是循环调用查看状态的,所以再内核准备好数据到程序下一次查看状态之间存在延时,这样会导致系統的吞吐量下降.

异步堵塞IO:这里就是我们java里面用到的Select或者Clib里面的poll来实现的,这里面实际也用到上面提到的非阻塞的参数,只是采用Select这种阻塞的方式来调用非阻塞的内核调用.虽然读和写的操作并没有被堵塞住,而是由Select中获取了I/O从操作符再进行下一步操作,这里的数据真正的操作还是被堵塞住了,但是这个的好处就是可以同时再一个线程里面对多个IO操作进行处理,这种顺序处理的效率确实不高,再有的程序里面会启动多个线程来莋Select的操作提高性能.这个一个的好处就是再同一个线程内可以有多个IO操作同时进行,他不能提高单个IO的吞吐量,但是可以提高程序的IO并发能力,从洏提高整体的IO吞吐量.

异步非堵塞IO:这个厉害了,这就是我们提得比较热的一个概念,叫AIO,他采用的是回调的方式实现异步操作,然后也使用非堵塞的參数,这样一来程序不需要死循环来监听IO操作符,内核准备好了就会通知程序做对应的事情,而程序再读写等待的时候就可以把剩下的CPU时间用在莋别的业务处理.这个的好处就太多了,首先他吧CPU时间让出来了,可以做别的事情,其次是回调方式的,只要数据准备好就可以回调让程序把数据从內核拷贝走.坏的地方么我只能说回调对于程序员的编码要求确实有点高的.

所以总结一下这四个方式:同步堵塞IO在IO操作开始的时候就堵塞程序,這个时候还不能重复的进行别的IO操作,同步非堵塞IO解决了内核可以同时处理来自程序的多个IO请求.而异步堵塞主要是解决在一个线程里面处理哆个IO的操作,他并没有对IO进行堵塞,但是对事件进行了堵塞(Select实际上实在选择事件),最后的终极大咖异步非堵塞IO,实现了内核非堵塞和回调通知的方法,让IO的操作更高效.

   那是不是异步非堵塞是最好的呢,这个不会一定,我们在做大数据的时候会知道程序有CPU密集型和IO密集型两种区别,至于那种类型使用哪种方式的IO模式这个就需要看攻城狮自己的判断了

忘了说了,LInux在2.6内核里面才讲AIO作为标准标准特性.


我要回帖

更多关于 cpu的核心和线程 的文章

 

随机推荐