CPU-bound(計算密集型) 和I/O bound(I/O密集型)
I/O密集型 (CPU-bound)
I/O bound 指的是系統的CPU效能相對硬碟/記憶體的效能要好很多,此時,系統運作,大部分的狀況是 CPU 在等 I/O (硬碟/記憶體) 的讀/寫,此時 CPU Loading 不高。
CPU bound 指的是系統的 硬碟/記憶體 效能 相對 CPU 的效能 要好很多,此時,系統運作,大部分的狀況是 CPU Loading 100%,CPU 要讀/寫 I/O (硬碟/記憶體),I/O在很短的時間就可以完成,而 CPU 還有許多運算要處理,CPU Loading 很高。
計算密集型 (CPU-bound)
在多重程式系統中,大部份時間用來做計算、邏輯判斷等CPU動作的程式稱之CPU bound。例如一個計算圓周率至小數點一千位以下的程式,在執行的過程當中
絕大部份時間用在三角函式和開根號的計算,便是屬於CPU bound的程式。
It is because the performance characteristic of most protocol codec implementations is CPU-bound, which is the same with I/O processor threads.
根據以上分析,可以認為通常情況下,大部分程式針對某個特定的效能metric而言
都可分為CPU bound 和 I/O bound兩類。
CPU bound的程式一般而言CPU佔用率相當高。這可能是因為任務本身不太需要訪問I/O裝置,也可能是因為程式是多執行緒實現因此遮蔽掉了等待I/O的時間。
而I/O bound的程式一般在達到效能極限時,CPU佔用率仍然較低。這可能是因為任務本身需要大量I/O操作,而pipeline做得不是很好,沒有充分利用處理器能力
轉自http://blog.chinaunix.net/space.php?uid=13714918&do=blog&id=2875404
程序 vs. 執行緒
我們介紹了多程序和多執行緒,這是實現多工最常用的兩種方式。現在,我們來討論一下這兩種方式的優缺點。
首先,要實現多工,通常我們會設計Master-Worker模式,Master負責分配任務,Worker負責執行任務,因此,多工環境下,通常是一個Master,多個Worker。
如果用多程序實現Master-Worker,主程序就是Master,其他程序就是Worker。
如果用多執行緒實現Master-Worker,主執行緒就是Master,其他執行緒就是Worker。
多程序模式最大的優點就是穩定性高,因為一個子程序崩潰了,不會影響主程序和其他子程序。(當然主程序掛了所有程序就全掛了,但是Master程序只負責分配任務,掛掉的概率低)著名的Apache最早就是採用多程序模式。
多程序模式的缺點是建立程序的代價大,在Unix/Linux系統下,用fork
呼叫還行,在Windows下建立程序開銷巨大。另外,作業系統能同時執行的程序數也是有限的,在記憶體和CPU的限制下,如果有幾千個程序同時執行,作業系統連排程都會成問題。
多執行緒模式通常比多程序快一點,但是也快不到哪去,而且,多執行緒模式致命的缺點就是任何一個執行緒掛掉都可能直接造成整個程序崩潰,因為所有執行緒共享程序的記憶體。在Windows上,如果一個執行緒執行的程式碼出了問題,你經常可以看到這樣的提示:“該程式執行了非法操作,即將關閉”,其實往往是某個執行緒出了問題,但是作業系統會強制結束整個程序。
在Windows下,多執行緒的效率比多程序要高,所以微軟的IIS伺服器預設採用多執行緒模式。由於多執行緒存在穩定性的問題,IIS的穩定性就不如Apache。為了緩解這個問題,IIS和Apache現在又有多程序+多執行緒的混合模式,真是把問題越搞越複雜。
計算密集型 vs. IO密集型
是否採用多工的第二個考慮是任務的型別。我們可以把任務分為計算密集型和IO密集型。
計算密集型任務的特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視訊進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數。
計算密集型任務由於主要消耗CPU資源,因此,程式碼執行效率至關重要。Python這樣的指令碼語言執行效率很低,完全不適合計算密集型任務。對於計算密集型任務,最好用C語言編寫。
第二種任務的型別是IO密集型,涉及到網路、磁碟IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和記憶體的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。
IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用執行速度極快的C語言替換用Python這樣執行速度極低的指令碼語言,完全無法提升執行效率。對於IO密集型任務,最合適的語言就是開發效率最高(程式碼量最少)的語言,指令碼語言是首選,C語言最差。
總之,計算密集型程式適合C語言多執行緒,I/O密集型適合指令碼語言開發的多執行緒。