對於多線程程序,單核cpu與多核cpu是怎麼工作的

此文中的大部分資料來自於網絡上,我只是覺得把有道理的整理一下,方便以後查閱。

1.多線程在單核和多核CPU上的執行效率問題的討論
a1: 多線程在單cpu中其實也是順序執行的,不過系統可以幫你切換那個執行而已,其實並沒有快(反而慢)
多個cpu的話就可以在兩個cpu中同時執行了..............

a2: 單核CPU上運行的多線程程序, 同一時間只能一個線程在跑, 系統幫你切換線程而已, 系統給每個線程分配時間片來執行, 每個時間片大概10ms左右, 看起來像是同時跑, 但實際上是每個線程跑一點點就換到其它線程繼續跑

效率不會有提高的
切換線程反倒會增加開銷

a3: #3樓說的是對的。所以一般沒有必要的話,尤其在單核CPU的時候,不推薦使用多線程。
單核CPU時使用多線程,通常是有線程要處於等待狀態。
而對於普通的進度條更新類的,能夠簡單控制的(比如:在循環裏面手動處理消息)就簡單控制,一般不使用線程,這樣可以提高程序的性能。並且避免掉不必要的線程同步問題。

a4: 你試一下雙核三線程,保準效率反而比雙線程低!

算法同樣時,CPU佔用率達到100%的最小線程數效率最高,如果是cpu佔率率高的運算單核單線程,雙核雙線程,四核四線程是最適合的。

但爲什麼有時候線程數超過CPU內核數會更快呢?原因是這種程序的單個線程運算量不足以佔滿CPU一個內核(比如存在大量IO操作,IO比較慢,是程序瓶頸)。

a5: 多線程的用處在於,做某個耗時的操作時,需要等待返回結果,這時用多線程可以提高程序併發程度。如果一個不需要任何等待並且順序執行能夠完成的任務,用多線程簡直是浪費。

http://bbs.csdn.net/topics/320003381


2.淺談多核CPU、多線程與並行計算

a1: CPU發展趨勢

核心數目依舊會越來越多,依據摩爾定律,由於單個核心性能提升有着嚴重的瓶頸問題,普通的桌面PC有望在2017年末2018年初達到24核心(或者16核32線程),我們如何來面對這突如其來的核心數目的增加?編程也要與時俱進。筆者斗膽預測,CPU各個核心之間的片內總線將會採用4路組相連:),因爲全相連太過複雜,單總線又不夠給力。而且應該是非對稱多核處理器,可能其中會混雜幾個DSP處理器或流處理器。

a2: 線程越多越好嗎?什麼時候纔有必要用多線程?

線程必然不是越多越好,線程切換也是要開銷的,當你增加一個線程的時候,增加的額外開銷要小於該線程能夠消除的阻塞時間,這才叫物有所值。

Linux自從2.6內核開始,就會把不同的線程交給不同的核心去處理。Windows也從NT.4.0開始支持這一特性。

什麼時候該使用多線程呢?這要分四種情況討論:

a.多核CPU——計算密集型任務。此時要儘量使用多線程,可以提高任務執行效率,例如加密解密,數據壓縮解壓縮(視頻、音頻、普通數據),否則只能使一個核心滿載,而其他核心閒置。

b.單核CPU——計算密集型任務。此時的任務已經把CPU資源100%消耗了,就沒必要也不可能使用多線程來提高計算效率了;相反,如果要做人機交互,最好還是要用多線程,避免用戶沒法對計算機進行操作。

c.單核CPU——IO密集型任務,使用多線程還是爲了人機交互方便,

d.多核CPU——IO密集型任務,這就更不用說了,跟單核時候原因一樣。

4.程序員需要掌握的技巧/技術

(1)減少串行化的代碼用以提高效率。這是廢話。

(2)單一的共享數據分佈化:把一個數據複製很多份,讓不同線程可以同時訪問。

(3)負載均衡,分爲靜態的和動態的兩種。具體的參見有關文獻。

http://www.linuxidc.com/Linux/2015-02/113734.htm


3.請問:CPU的多核和應用程序的多線程的關係是怎麼樣的?
a1: 多核兒就是系統同時可以運行多個線程,比如雙核可以同時執行兩個線程。單核兒只能一次執行一個線程。

a2: 試了一個ping 從192.168.0.1 到192.169.0.255的程序
用多線程做的,發現在單核的機器上和多核的機器運行性能有兩倍左右的差異。

a3: 多核對於用戶,應該說對於程序員來說,是透明的,根本不用管它,當你是單核的編程就可以了,除非使用OpenMP進行編程,就用很多條條框框了,另外你上面的測試是不準確的,網絡(主要是遠程主機)會因爲不同時候而有不同的響應速度,你應該在乾淨的本機同環境下進行測試.但是,對於多線程多核優於單核還是可以確定的. 總之,我們不用擔心程序在單核或多核上會出現併發問題.

a4: 多核指的是CPU有多個核心,多線程是程序有多個線程在同時執行。
多核也要用多線程才能發揮優勢。
同樣,多線程要在多核上才能真正有優勢。
這點來說,對程序員不是透明的。程序員可以控制程序/線程在哪個CPU(核)上運行。用戶也可以控制程序在哪幾個核上運行。所以多核,多線程對用戶和程序員都不是透明的。程序員必須瞭解這方面的知識。才能讓程序最大限度的發揮機器的性能。

http://bbs.csdn.net/topics/120075600


4.pthread
php手冊中關於pthread有關函數: http://php.net/manual/en/book.pthreads.php
pthread擴展:http://pecl.php.net/package/pthreads

http://www.baidu.com/s?wd=php%20pthread
http://www.sogou.com/web?query=php%20pthread
http://www.sogou.com/web?query=php%20pthread

延伸閱讀:
http://www.baidu.com/s?wd=多線程程序%20單核cpu%20多核cpu
http://www.sogou.com/web?query=多線程程序%20單核cpu%20多核cpu
http://www.sogou.com/web?query=多線程程序%20單核cpu%20多核cpu
[轉]淺談多核CPU、多線程與並行計算: http://www.cnblogs.com/lihaozy/archive/2013/03/13/2957520.html
PHP使用Pthread實現的多線程操作實例: http://www.jb51.net/article/74849.htm
php三種實現多線程類似的方法: http://www.jb51.net/article/74165.htm

參考文獻:

https://www.cnblogs.com/caihuafeng/p/5438753.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章