摘要:對(duì)多線程程序,單核與多核如何工作相關(guān)的探討我們程序員在編碼的時(shí)候,涉及到技術(shù)方案時(shí),往往會(huì)忽略掉代碼對(duì)性能方面的影響,或者沒(méi)有足夠的敏感度來(lái)幫助自己判斷自己的技術(shù)方案對(duì)系統(tǒng)性能造成的影響。
對(duì)多線程程序,單核cpu與多核cpu如何工作相關(guān)的探討
我們程序員在編碼的時(shí)候,涉及到技術(shù)方案時(shí),往往會(huì)忽略掉代碼對(duì)性能方面的影響,或者沒(méi)有足夠的敏感度來(lái)幫助自己判斷自己的技術(shù)方案對(duì)系統(tǒng)性能造成的影響。改進(jìn)的方式之一是,我們需要對(duì)底層系統(tǒng)的原理更了解一點(diǎn),這樣心里才能有桿秤,知道選擇什么樣的技術(shù)去實(shí)現(xiàn)代碼,可能帶來(lái)什么樣的問(wèn)題。
這篇文章,通過(guò)收集一些論壇討論問(wèn)題,來(lái)幫助大家了解cpu對(duì)多線程的程序如何處理,性能會(huì)有什么影響和取舍,雖然內(nèi)容有些基礎(chǔ),但往往我們最容易忽略的就是這些基礎(chǔ)。
1. 多線程在單核和多核CPU上的執(zhí)行效率問(wèn)題的討論
a1: 多線程在單cpu中其實(shí)也是順序執(zhí)行的,不過(guò)系統(tǒng)可以幫你切換那個(gè)執(zhí)行而已,其實(shí)并沒(méi)有快(反而慢)
多個(gè)cpu的話就可以在兩個(gè)cpu中同時(shí)執(zhí)行了..............
a2: 單核CPU上運(yùn)行的多線程程序, 同一時(shí)間只能一個(gè)線程在跑, 系統(tǒng)幫你切換線程而已, 系統(tǒng)給每個(gè)線程分配時(shí)間片來(lái)執(zhí)行, 每個(gè)時(shí)間片大概10ms左右, 看起來(lái)像是同時(shí)跑, 但實(shí)際上是每個(gè)線程跑一點(diǎn)點(diǎn)就換到其它線程繼續(xù)跑
效率不會(huì)有提高的
切換線程反倒會(huì)增加開(kāi)銷(xiāo)
a3: #3樓說(shuō)的是對(duì)的。所以一般沒(méi)有必要的話,尤其在單核CPU的時(shí)候,不推薦使用多線程。
單核CPU時(shí)使用多線程,通常是有線程要處于等待狀態(tài)。
而對(duì)于普通的進(jìn)度條更新類(lèi)的,能夠簡(jiǎn)單控制的(比如:在循環(huán)里面手動(dòng)處理消息)就簡(jiǎn)單控制,一般不使用線程,這樣可以提高程序的性能。并且避免掉不必要的線程同步問(wèn)題。
a4: 你試一下雙核三線程,保準(zhǔn)效率反而比雙線程低!
算法同樣時(shí),CPU占用率達(dá)到100%的最小線程數(shù)效率最高,如果是cpu占率率高的運(yùn)算單核單線程,雙核雙線程,四核四線程是最適合的。
但為什么有時(shí)候線程數(shù)超過(guò)CPU內(nèi)核數(shù)會(huì)更快呢?原因是這種程序的單個(gè)線程運(yùn)算量不足以占滿CPU一個(gè)內(nèi)核(比如存在大量IO操作,IO比較慢,是程序瓶頸)。
a5: 多線程的用處在于,做某個(gè)耗時(shí)的操作時(shí),需要等待返回結(jié)果,這時(shí)用多線程可以提高程序并發(fā)程度。如果一個(gè)不需要任何等待并且順序執(zhí)行能夠完成的任務(wù),用多線程簡(jiǎn)直是浪費(fèi)。
討論來(lái)源地址
2. 淺談多核CPU、多線程與并行計(jì)算
a1: CPU發(fā)展趨勢(shì)
核心數(shù)目依舊會(huì)越來(lái)越多,依據(jù)摩爾定律,由于單個(gè)核心性能提升有著嚴(yán)重的瓶頸問(wèn)題,普通的桌面PC有望在2017年末2018年初達(dá)到24核心(或者16 核32線程),我們?nèi)绾蝸?lái)面對(duì)這突如其來(lái)的核心數(shù)目的增加?編程也要與時(shí)俱進(jìn)。筆者斗膽預(yù)測(cè),CPU各個(gè)核心之間的片內(nèi)總線將會(huì)采用4路組相連),因?yàn)槿噙B太過(guò)復(fù)雜,單總線又不夠給力。而且應(yīng)該是非對(duì)稱(chēng)多核處理器,可能其中會(huì)混雜幾個(gè)DSP處理器或流處理器。
a2: 線程越多越好嗎?什么時(shí)候才有必要用多線程?
線程必然不是越多越好,線程切換也是要開(kāi)銷(xiāo)的,當(dāng)你增加一個(gè)線程的時(shí)候,增加的額外開(kāi)銷(xiāo)要小于該線程能夠消除的阻塞時(shí)間,這才叫物有所值。
Linux自從2.6內(nèi)核開(kāi)始,就會(huì)把不同的線程交給不同的核心去處理。Windows也從NT.4.0開(kāi)始支持這一特性。
什么時(shí)候該使用多線程呢?這要分四種情況討論:
a.多核CPU——計(jì)算密集型任務(wù)。此時(shí)要盡量使用多線程,可以提高任務(wù)執(zhí)行效率,例如加密解密,數(shù)據(jù)壓縮解壓縮(視頻、音頻、普通數(shù)據(jù)),否則只能使一個(gè)核心滿載,而其他核心閑置。
b.單核CPU——計(jì)算密集型任務(wù)。此時(shí)的任務(wù)已經(jīng)把CPU資源100%消耗了,就沒(méi)必要也不可能使用多線程來(lái)提高計(jì)算效率了;相反,如果要做人機(jī)交互,最好還是要用多線程,避免用戶沒(méi)法對(duì)計(jì)算機(jī)進(jìn)行操作。
c.單核CPU——IO密集型任務(wù),使用多線程還是為了人機(jī)交互方便,
d.多核CPU——IO密集型任務(wù),這就更不用說(shuō)了,跟單核時(shí)候原因一樣。
程序員需要掌握的技巧/技術(shù)
(1)減少串行化的代碼用以提高效率。這是廢話。
(2)單一的共享數(shù)據(jù)分布化:把一個(gè)數(shù)據(jù)復(fù)制很多份,讓不同線程可以同時(shí)訪問(wèn)。
(3)負(fù)載均衡,分為靜態(tài)的和動(dòng)態(tài)的兩種。具體的參見(jiàn)有關(guān)文獻(xiàn)。
討論來(lái)源地址
3. 請(qǐng)問(wèn):CPU的多核和應(yīng)用程序的多線程的關(guān)系是怎么樣的?
a1: 多核兒就是系統(tǒng)同時(shí)可以運(yùn)行多個(gè)線程,比如雙核可以同時(shí)執(zhí)行兩個(gè)線程。單核兒只能一次執(zhí)行一個(gè)線程。
a2: 試了一個(gè)ping 從192.168.0.1 到192.169.0.255的程序
用多線程做的,發(fā)現(xiàn)在單核的機(jī)器上和多核的機(jī)器運(yùn)行性能有兩倍左右的差異。
a3: 多核對(duì)于用戶,應(yīng)該說(shuō)對(duì)于程序員來(lái)說(shuō),是透明的,根本不用管它,當(dāng)你是單核的編程就可以了,除非使用OpenMP進(jìn)行編程,就用很多條條框框了,另外你上面的測(cè)試是不準(zhǔn)確的,網(wǎng)絡(luò)(主要是遠(yuǎn)程主機(jī))會(huì)因?yàn)椴煌瑫r(shí)候而有不同的響應(yīng)速度,你應(yīng)該在干凈的本機(jī)同環(huán)境下進(jìn)行測(cè)試.但是,對(duì)于多線程多核優(yōu)于單核還是可以確定的. 總之,我們不用擔(dān)心程序在單核或多核上會(huì)出現(xiàn)并發(fā)問(wèn)題.
a4: 多核指的是CPU有多個(gè)核心,多線程是程序有多個(gè)線程在同時(shí)執(zhí)行。
多核也要用多線程才能發(fā)揮優(yōu)勢(shì)。
同樣,多線程要在多核上才能真正有優(yōu)勢(shì)。
這點(diǎn)來(lái)說(shuō),對(duì)程序員不是透明的。程序員可以控制程序/線程在哪個(gè)CPU(核)上運(yùn)行。用戶也可以控制程序在哪幾個(gè)核上運(yùn)行。所以多核,多線程對(duì)用戶和程序員都不是透明的。程序員必須了解這方面的知識(shí)。才能讓程序最大限度的發(fā)揮機(jī)器的性能。
討論來(lái)源地址
原文引用
編輯by:
二月的獅子
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/76723.html
摘要:對(duì)多線程程序,單核與多核如何工作相關(guān)的探討我們程序員在編碼的時(shí)候,涉及到技術(shù)方案時(shí),往往會(huì)忽略掉代碼對(duì)性能方面的影響,或者沒(méi)有足夠的敏感度來(lái)幫助自己判斷自己的技術(shù)方案對(duì)系統(tǒng)性能造成的影響。 對(duì)多線程程序,單核cpu與多核cpu如何工作相關(guān)的探討 我們程序員在編碼的時(shí)候,涉及到技術(shù)方案時(shí),往往會(huì)忽略掉代碼對(duì)性能方面的影響,或者沒(méi)有足夠的敏感度來(lái)幫助自己判斷自己的技術(shù)方案對(duì)系統(tǒng)性能造成的影...
摘要:實(shí)際工作并不是非此即彼,往往都是進(jìn)程線程結(jié)合的方式。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于數(shù)目時(shí),不同的線程運(yùn)行于不同的上改善程序結(jié)構(gòu)。關(guān)于操作系統(tǒng)內(nèi)部如何創(chuàng)建銷(xiāo)毀進(jìn)程線程,即為什么這些操作進(jìn)程消耗會(huì)比線程大,還沒(méi)有搞明白。 一、淺層理解 進(jìn)程是資源分配的最小單位,線程是CPU分配的最小單位——簡(jiǎn)單明了的說(shuō)明了進(jìn)程與線程的區(qū)別特點(diǎn),然而在實(shí)際工作中并沒(méi)有什么卵用。 二、多個(gè)維度下,進(jìn)程與線程的優(yōu)...
摘要:編者按本文作者為,文章從程序架構(gòu)與系統(tǒng)的發(fā)展歷程出發(fā),逐步論證了為什么響應(yīng)式編程并非一時(shí)之勢(shì),而是能帶來(lái)更快處理速度,更高硬件利用率的未來(lái)選擇。這就是摩爾定律所說(shuō)的應(yīng)用程序。響應(yīng)式方法并非一時(shí)之勢(shì)它是編寫(xiě)軟件的未來(lái)趨勢(shì)。 【編者按】本文作者為 David Buschman,文章從程序架構(gòu)與系統(tǒng)的發(fā)展歷程出發(fā),逐步論證了為什么響應(yīng)式編程并非一時(shí)之勢(shì),而是能帶來(lái)更快處理速度,更高硬件利用率...
摘要:因?yàn)楣芾砣藛T是了解手下的人員以及自己負(fù)責(zé)的事情的。處理器優(yōu)化和指令重排上面提到在在和主存之間增加緩存,在多線程場(chǎng)景下會(huì)存在緩存一致性問(wèn)題。有沒(méi)有發(fā)現(xiàn),緩存一致性問(wèn)題其實(shí)就是可見(jiàn)性問(wèn)題。 網(wǎng)上有很多關(guān)于Java內(nèi)存模型的文章,在《深入理解Java虛擬機(jī)》和《Java并發(fā)編程的藝術(shù)》等書(shū)中也都有關(guān)于這個(gè)知識(shí)點(diǎn)的介紹。但是,很多人讀完之后還是搞不清楚,甚至有的人說(shuō)自己更懵了。本文,就來(lái)整體的...
摘要:因?yàn)楣芾砣藛T是了解手下的人員以及自己負(fù)責(zé)的事情的。處理器優(yōu)化和指令重排上面提到在在和主存之間增加緩存,在多線程場(chǎng)景下會(huì)存在緩存一致性問(wèn)題。有沒(méi)有發(fā)現(xiàn),緩存一致性問(wèn)題其實(shí)就是可見(jiàn)性問(wèn)題。 網(wǎng)上有很多關(guān)于Java內(nèi)存模型的文章,在《深入理解Java虛擬機(jī)》和《Java并發(fā)編程的藝術(shù)》等書(shū)中也都有關(guān)于這個(gè)知識(shí)點(diǎn)的介紹。但是,很多人讀完之后還是搞不清楚,甚至有的人說(shuō)自己更懵了。本文,就來(lái)整體的...
閱讀 1251·2021-11-15 18:00
閱讀 1845·2021-10-08 10:15
閱讀 871·2021-09-04 16:48
閱讀 2465·2021-09-04 16:48
閱讀 1363·2019-08-29 18:40
閱讀 1025·2019-08-29 13:08
閱讀 3064·2019-08-26 14:06
閱讀 1184·2019-08-26 13:35