<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 電腦硬件知識(shí) > CPU知識(shí) > 如何提高多線程程序的

        如何提高多線程程序的

        時(shí)間: 捷鋒774 分享

        如何提高多線程程序的

          正如大家所知道的那樣,多核多cpu越來越普遍了,而且編寫多線程程序也是件很簡單的事情。那么,如何提高多線程的CPU的一些使用率,下面是學(xué)習(xí)啦小編帶來的關(guān)于如何提高多線程程序的cpu利用率的內(nèi)容,歡迎閱讀!

          如何提高多線程程序的:

          首先,我來講一下多處理的一些知識(shí)。如下圖所示,

          多處理器系統(tǒng)也只有一個(gè)待運(yùn)行的線程隊(duì)列,內(nèi)存中也只有一個(gè)操作系統(tǒng)拷貝,而且也只有一個(gè)內(nèi)存系統(tǒng),但是會(huì)有多個(gè)cpu同時(shí)運(yùn)行不同的線程。一個(gè)cpu運(yùn)行一個(gè)線程,那么上圖中的系統(tǒng)最多能在同一時(shí)間運(yùn)行2個(gè)線程。其實(shí),多處理系統(tǒng)需要掌握的知識(shí)不是這些,而是緩存一致性。

          現(xiàn)在來解釋下什么是緩存一致性。由于,還是只有一個(gè)內(nèi)存系統(tǒng)。所有cpu都要和這個(gè)內(nèi)存系統(tǒng)通信,但是只有一條總線,那么這無疑會(huì)造成總線緊張,限制整體的速度了。那么,你多個(gè)cpu也沒多少意義了。解決這個(gè)問題的辦法還是利用cpu的緩存機(jī)制,學(xué)過組成原理的同學(xué)都知道,cpu的緩存命中率還是很高的,有90%以上吧。那么,我繼續(xù)利用緩存機(jī)制還是可以降低總線的頻繁使用的。但是,每個(gè)cpu都有自己的緩存。如果有2個(gè)cpu的緩存存儲(chǔ)的是同一內(nèi)存數(shù)據(jù)的內(nèi)容,其中一個(gè)cpu的緩存更新了,另外一個(gè)cpu的緩存也必須更新,這就是所謂的緩存一致性。編程多線程程序的一個(gè)很重要的一點(diǎn)就是避免因?yàn)榫彺嬉恢滦砸鸬木彺娓嘛L(fēng)暴。

          現(xiàn)在我舉一個(gè)緩存更新風(fēng)暴的例子。

          如圖所示的類定義,

          鎖lockHttp和lockSsl中間只有8個(gè)字節(jié),而絕大部分系統(tǒng)上一個(gè)緩存行是128個(gè)字節(jié),那么這2個(gè)鎖很可能就處在同一個(gè)緩存行上面。那么,最壞的情況會(huì)發(fā)生什么事情了。假設(shè)處理器P1在運(yùn)行一個(gè)處理http請(qǐng)求的線程T1,處理器P2在運(yùn)行一個(gè)處理ssl請(qǐng)求的線程T2,那么當(dāng)T1獲得鎖lockHttp的時(shí)候,鎖的內(nèi)容就會(huì)改變,為了保持緩存一致性,就會(huì)更新P2的緩存。那么,T2要獲得鎖lockssl的時(shí)候,發(fā)現(xiàn)緩存已經(jīng)失效了,就必須從內(nèi)存中重新加載緩存之類??傊?,這會(huì)將緩存命中率降低到90%以下,引起性能的嚴(yán)重降低。而且發(fā)生這種事情的原因是因?yàn)槲覀儾涣私庥布捏w系結(jié)構(gòu)。

          多cpu不能成倍提高速度的原因是任務(wù)的某些部分是必須串行處理的。比如,矩陣乘法可以分為三個(gè)部分,初始化矩陣,相乘,返回結(jié)果。這三部分第二部分可以用多線程來處理,第一部分和第三部分則是不可以的。而且第二部分必須在第一部分完成之后,第三部分必須在第一部分完成之后。那么,無論你添加多少個(gè)處理器,最快的時(shí)間都至少是第一部分和第二部分的時(shí)間之和。這個(gè)事實(shí)好像叫做Amdahl法則。

          如果使用多線程,那么就必須考慮線程同步,而線程同步又是導(dǎo)致速度降低的關(guān)鍵。所以下面就講述一些方法來加快多線程程序的吞吐速度。

          方法一,把一個(gè)任務(wù)分解為多個(gè)可以子任務(wù)。

          因?yàn)榭傆行┳尤蝿?wù)是可以并發(fā)的,多個(gè)子任務(wù)并發(fā)執(zhí)行了很可能就能夠避免cpu需要io操作的完成了,而且能夠提高系統(tǒng)的吞吐量。

          方法二,緩存多線程的共享數(shù)據(jù)。

          當(dāng)你已經(jīng)在使用多線程了,很多時(shí)候必須使用共享數(shù)據(jù)。如果,數(shù)據(jù)是只讀的,那么可以在第一次獲取后保存起來,以后就可以重復(fù)使用了。但是,第一次的獲取還是無法避免的需要線程同步操作的。

          方法三,如果線程數(shù)目有限,就不要共享數(shù)據(jù)。

          做法是為每一個(gè)線程實(shí)例化一個(gè)單獨(dú)的數(shù)據(jù),其實(shí)就是為每一個(gè)線程分配一塊數(shù)據(jù)使用。這樣沒有線程同步操作了,速度可以盡可能的提示。

          方法四,如果沒辦法確定線程數(shù)目到底有多少,那么使用部分共享吧。

          部分共享其實(shí)就是使用多個(gè)資源池代替一個(gè)資源池,資源池的數(shù)目得更加經(jīng)驗(yàn)來確定。如下圖所示,

          最后在提一個(gè)叫做Thundering Herd的問題,該問題維基百科有定義。大意是,當(dāng)多個(gè)線程在等待一個(gè)資源的時(shí)候,如果事件等待到了,操作系統(tǒng)是喚醒所有等待的線程讓它們自己去競爭資源了還是選擇一個(gè)線程把資源給它。當(dāng)然喚醒所有的線程肯定開銷要大,而且所有沒有搶到資源的線程還得重新進(jìn)入等待狀態(tài),這無疑造成很多沒必要的操作,浪費(fèi)了沒必要的線程上下文切換??傊?,會(huì)不會(huì)存在Thundering Herd還是跟不同的操作系統(tǒng)有關(guān)的。萬一存在Thundering Herd了,多線程可能就沒那么好辦了。

          到現(xiàn)在我們知道了為什么多cpu并不能成倍提高程序的速度了。首先因?yàn)橛行┤蝿?wù)無法并行,其次即使是并行cpu之間還是有很多牽制的。

        看了如何提高多線程程序的文章內(nèi)容的人還看:

        1.java多線程內(nèi)存模型

        2.Linux下如何實(shí)現(xiàn)shell多線程編程

        3.CPU超線程技術(shù)是什么

        4.Java學(xué)習(xí)方法有哪些

        5.CPU專業(yè)名詞詳解

        6.哪些IBM可以適用于linux

        7.i3、i5、i7處理器詳細(xì)介紹

        8.CMOS開機(jī)密碼怎么清除

        608771 主站蜘蛛池模板: 国产精品成人中文字幕| 国产精品久久毛片| 亚洲精品综合网二三区| 国产成人自拍小视频在线| 亚洲高清激情一区二区三区| 97久久久亚洲综合久久| 亚洲AV日韩精品久久久久| 日本高清日本在线免费| 国产精品一区二区三粉嫩| 亚洲综合日韩av在线| 天天干天天射天天操| 久久夜色精品国产亚av| 国产精品久久久久久影视| 成人午夜电影福利免费| 青青草无码免费一二三区| 97视频精品全国在线观看| 中国CHINA体内裑精亚洲日本| a级毛片毛片看久久| 国产精品无码专区| 一区二区三区四区在线不卡高清| 亚洲天堂免费一二三四区| 99久久精品费精品国产一区二| 欧美丰满熟妇bbbbbb| 一区二区三区激情免费视频| 女同另类激情在线三区| 亚洲av成人一区二区三区| 91精品国产91热久久久久福利 | 中国成人黄色自拍视频| 久久99国产一区二区三区| 被灌满精子的少妇视频| 在线无码午夜福利高潮视频| 精品亚洲无人区一区二区| 国产美女69视频免费观看| 丰满人妻一区二区三区高清精品 | 国产传媒剧情久久久av| 国产福利深夜在线播放| 少妇脱了内裤在客厅被| 日韩丝袜欧美人妻制服| 午夜福利不卡片在线播放免费| 亚洲精品日韩精品久久| 亚洲精品福利一区二区三区蜜桃|