为什么跑四个cpu 核数 线程数的程序 cpu 内存饱满

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
即使没多大出息,也不可以没了追求
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(13836)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_082074',
blogTitle:'单线程和多线程的优缺点',
blogAbstract:'\r\n多线程处理的优点同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。多线程处理可以同时运行多个过程。例如,文字处理器应用程序在您处理文档的同时,可以检查拼写(作为单独的任务)。由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能: 多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。 当前没有进行处理的任务可以将处理器时间让给其他任务。 占用大量处理时间的任务可以定期将处理器时间让给其他任务。 可以随时停止任务。 可以分别设置各个任务的优先级以优化性能。 是否需要创建多线程应用程序取决于多个因素。在以下情况下,最适合采用多线程处理: ',
blogTag:'多线程,应用程序,单线程,任务,线程',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'即使没多大出息,也不可以没了追求',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}如何提高多线程程序的cpu利用率 - DoubleLi - 博客园
正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情。在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行。然后,事情确实你发现创建多线程根本没有让程序快多少,也没有提高多少cpu利用率,甚至可能让cpu利用率下降。唯一能够确定的是多线程能够避免界面假死。为什么会是这样的了。本文将举一些例子和讲述一些原因。&&首先,我来讲一下多处理的一些知识。如下图所示,&&多处理器系统也只有一个待运行的线程队列,内存中也只有一个操作系统拷贝,而且也只有一个内存系统,但是会有多个cpu同时运行不同的线程。一个cpu运行一个线程,那么上图中的系统最多能在同一时间运行2个线程。其实,多处理系统需要掌握的知识不是这些,而是缓存一致性。&&现在来解释下什么是缓存一致性。由于,还是只有一个内存系统。所有cpu都要和这个内存系统通信,但是只有一条总线,那么这无疑会造成总线紧张,限制整体的速度了。那么,你多个cpu也没多少意义了。解决这个问题的办法还是利用cpu的缓存机制,学过组成原理的同学都知道,cpu的缓存命中率还是很高的,有90%以上吧。那么,我继续利用缓存机制还是可以降低总线的频繁使用的。但是,每个cpu都有自己的缓存。如果有2个cpu的缓存存储的是同一内存数据的内容,其中一个cpu的缓存更新了,另外一个cpu的缓存也必须更新,这就是所谓的缓存一致性。编程多线程程序的一个很重要的一点就是避免因为缓存一致性引起的缓存更新风暴。&&现在我举一个缓存更新风暴的例子。如图所示的类定义,&&锁lockHttp和lockSsl中间只有8个字节,而绝大部分系统上一个缓存行是128个字节,那么这2个锁很可能就处在同一个缓存行上面。那么,最坏的情况会发生什么事情了。假设处理器P1在运行一个处理http请求的线程T1,处理器P2在运行一个处理ssl请求的线程T2,那么当T1获得锁lockHttp的时候,锁的内容就会改变,为了保持缓存一致性,就会更新P2的缓存。那么,T2要获得锁lockssl的时候,发现缓存已经失效了,就必须从内存中重新加载缓存之类。总之,这会将缓存命中率降低到90%以下,引起性能的严重降低。而且发生这种事情的原因是因为我们不了解硬件的体系结构。&&多cpu不能成倍提高速度的原因是任务的某些部分是必须串行处理的。比如,矩阵乘法可以分为三个部分,初始化矩阵,相乘,返回结果。这三部分第二部分可以用多线程来处理,第一部分和第三部分则是不可以的。而且第二部分必须在第一部分完成之后,第三部分必须在第一部分完成之后。那么,无论你添加多少个处理器,最快的时间都至少是第一部分和第二部分的时间之和。这个事实好像叫做Amdahl法则。&&如果使用多线程,那么就必须考虑线程同步,而线程同步又是导致速度降低的关键。所以下面就讲述一些方法来加快多线程程序的吞吐速度。&&方法一,把一个任务分解为多个可以子任务。&&因为总有些子任务是可以并发的,多个子任务并发执行了很可能就能够避免cpu需要io操作的完成了,而且能够提高系统的吞吐量。&&方法二,缓存多线程的共享数据。&&当你已经在使用多线程了,很多时候必须使用共享数据。如果,数据是只读的,那么可以在第一次获取后保存起来,以后就可以重复使用了。但是,第一次的获取还是无法避免的需要线程同步操作的。&&方法三,如果线程数目有限,就不要共享数据。&&做法是为每一个线程实例化一个单独的数据,其实就是为每一个线程分配一块数据使用。这样没有线程同步操作了,速度可以尽可能的提示。&&方法四,如果没办法确定线程数目到底有多少,那么使用部分共享吧。&&部分共享其实就是使用多个资源池代替一个资源池,资源池的数目得更加经验来确定。如下图所示,
&&最后在提一个叫做Thundering Herd的问题,该问题维基百科有定义。大意是,当多个线程在等待一个资源的时候,如果事件等待到了,操作系统是唤醒所有等待的线程让它们自己去竞争资源了还是选择一个线程把资源给它。当然唤醒所有的线程肯定开销要大,而且所有没有抢到资源的线程还得重新进入等待状态,这无疑造成很多没必要的操作,浪费了没必要的线程上下文切换。总之,会不会存在Thundering Herd还是跟不同的操作系统有关的。万一存在Thundering Herd了,多线程可能就没那么好办了。&&到现在我们知道了为什么多cpu并不能成倍提高程序的速度了。首先因为有些任务无法并行,其次即使是并行cpu之间还是有很多牵制的。本书的内容主要来自提高c++性能的编程技术一书。14:15:28 修改
本来打算换个便宜的Xeon&E5&&才600左右的E5&2620&没想到被I5&2550K超4.5G干掉了,不用换了,最便宜的X79都要800元评论评论评论
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
原因:同架构下,主频差的太多了,。。。I5&4核4线&&主频4.5G=4*4.5G=18G,而且是足称的“单核单线18G”,E5&6核12线&主频1.2G=12*1.2G=14.4G,而且是需要使用超线程才勉强到“单核单线14.4G”不输才有鬼。。。但这只是从绝对速度成绩来看,如果换个角度,每G的单位效能比,结果是E5比I5强些,特别是长时间多线程渲染任务。I5&2550K的每G渲染效能:6.89pts/18G=0.383pts/GE5&2620的每G渲染效能:6.09pts/14.4G=0.422pts/G说明E5单位效能比I5高,(频率边际效率递减规律:随着每Mhz的升高,性能提升的幅度逐渐降低,直到架构的设计极限)如果再看看耗电量就更清楚了。所以如果是工作用机经常跑多线程渲染(如渲染用图形服务器),E5比I5要出色稳定高效的多。购置成本和使用成本就更不用说了。
14:42:51 修改
&发表于&14:15&原因:同架构下,主频差的太多了,。。。I5&4核4线&&主频4.5G=4*4.5G=18G,而且是足称的“单核单线18G”,E5&6核12线&主频1.2G=12*1.2G=14.4G,而且是需要使用超线程才勉强到“单核单线14.4G”不输才有鬼。。。I5&2550K的每G渲染效能:6.89...
&任何渲染软件都是I5比较高哦~
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
&发表于&14:17&&任何渲染软件都是I5比较高哦~
&不可否认绝对速度值是I5高,但是运行效率是E5高。
&发表于&14:17&&任何渲染软件都是I5比较高哦~
&你把I5的主频下降到3.6G试试吧,3.6G*4=14.4G,理论上,渲染速度和E5用1.2G区别不大,但是E5的负载和耗电量要低很多。(因为I5的线程数目只有E5的1/3,所要要达到相同的渲染速度,必须要用3倍的主频)
&发表于&14:23&&你把I5的主频下降到3.6G试试吧,3.6G*4=14.4G,理论上,渲染速度和E5用1.2G区别不大,但是E5的负载和耗电量要低很多。(因为I5的线程数目只有E5的1/3,所要要达到相同的渲染速度,必须要用3倍的主频)
&实在看不明白,不过K就&是要超频的,就像E5和I7带超线性一样,不超白不超~&&900多买的2550K一直1.3V&4.7G用
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
.cn/images/upload/upc/tx/itbbs//_.gif
&发表于&14:15&原因:同架构下,主频差的太多了,。。。I5&4核4线&&主频4.5G=4*4.5G=18G,而且是足称的“单核单线18G”,E5&6核12线&主频1.2G=12*1.2G=14.4G,而且是需要...
我四核CPU用到想吐!明年就是换6930K!以后不会在光顾四核了
您需要登录后才可以发帖
其他登录方式:

我要回帖

更多关于 cpu线程 的文章

 

随机推荐