如何理解 CPU密集型 和 I/O密集型?

追逐仰望星空 發佈 2022-12-29T06:07:57.921799+00:00

說在前面,CPU密集型與I/O密集型是在計算機上執行任務的兩種策略,在並發執行任務場景下,我們需要選擇使用多線程或多進程;如果是IO密集型任務,使用多線程,如果是CPU密集型任務,使用多進程。

說在前面,CPU密集型與I/O密集型是在計算機上執行任務的兩種策略,在並發執行任務場景下,我們需要選擇使用多線程或多進程;

如果是IO密集型任務,使用多線程,如果是CPU密集型任務,使用多進程。

前者指內存磁碟I/O使用率高,CPU使用率低;相反,後者指CPU使用率高,內存磁碟I/O使用率低。

CPU密集型

CPU密集型,也叫計算密集型,一般是指伺服器的硬碟、內存硬體性能相對CPU好很多,或者使用率低很多。系統運行CPU讀寫I/O(硬碟/內存)時可以在很短的時間內完成,幾乎沒有阻塞(等待I/O的實時間)時間,而CPU一直有大量運算要處理,因此CPU負載長期過高。

CPU密集幾乎無I/O阻塞,CPU一直會全速運行。如果是單核情況下,開多線程是沒有意義的,說白了就是一個CPU來回切著運行而已,徒增線程切換的資源消耗,卵用沒有。可見,CPU密集任務只有在多核CPU上、開多線程才可能提速。

CPU使用率較高時(如我們訓練算法模型、搞訓練集),通常線程數只需要設置為CPU核心數的線程個數就可以了。單CPU對應單線程效率最高。

一般其計算公式可遵循:CPU密集型核心線程數 = CPU核數。


I/O密集型

 I/O密集型相反,一般是指伺服器CPU的性能相對硬碟、內存硬體好很多,或者使用率低很多。系統運行多是CPU在等I/O (硬碟/內存) 的讀寫操作,此類情景下CPU負載並不高。

 I/O密集型的程序一般在達到性能極限時,CPU占用率仍然較低。這可能是因為任務本身需要大量I/O操作,而程序的邏輯做得並不好,沒有充分利用CPU能力,導致線程空餘時間很多。通常我們會開CPU核心數數倍的線程,在線程進行 I/O 操作 CPU 空閒時,啟用其他線程繼續使用 CPU,以提高 CPU 的使用率,充分利用CPU資源。

一般其計算公式可遵循:I/O密集型核心線程數 = CPU核數 / (1-阻塞係數)。

阻塞係數在在0到1範圍內。一般為0.8~0.9之間,也可以取0.8或者0.9。對於雙核CPU來說,它比較理想的線程數就是20,當然這都不是絕對的,需要根據實際情況以及實際業務來調整。

小結

  • I/O密集型:當線程等待時間所占比例越高,需要越多線程,啟用其他線程繼續使用CPU,以此提高CPU的利用率;
  • CPU密集型:當線程CPU時間所占比例越高,需要越少的線程。任務越多,花在進程、線程切換的時間就越多,通常線程數和CPU核數一致即可,這一類型在開發中主要出現在一些計算業務頻繁的邏輯中。

I/O密集型任務的特點是CPU消耗很少,任務的大部分時間都在等待I/O操作完成(磁碟I/O遠低於內存、CPU速度)。涉及到網絡、磁碟I/O的任務多是I/O密集型任務。I/O密集型任務,線程數越多,CPU效率越高,但也有相對限度。

原文連結:https://blog.csdn.net/qq_39390545/article/details/123903590

關鍵字: