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密集型適合腳本語言開發的多線程。

發佈了45 篇原創文章 · 獲贊 27 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章