細長問題:
當具有多個阻塞線程然後CPU核心,在哪裏是通過降低上下文最大化CPU效率線量和線程塊時間之間的平衡切換開銷?線程數量和線程塊時間之間的平衡在哪裏?
我有很多種IO設備,我需要在Windows 7上使用x64多核處理器進行控制:PCI設備,網絡設備,將東西保存到硬盤驅動器,大量數據被複制, ......最常見的政策是:「在它上面放一個線索!」。幾十個線程後,這開始覺得不好主意。
我的內核都沒有被100%使用,還有幾個內核仍在閒置,但是在10到100毫秒範圍內出現延遲,這些延遲無法通過IO阻塞或CPU密集型使用來解釋。其他流程似乎也不需要資源。我懷疑上下文切換開銷。
有一堆可能的解決方案,我有:
- 捆綁同一個IO設備減少線程:這主要無二的硬盤驅動器,但也許對於網絡也是如此。如果我在一個線程中爲硬盤節省了20MB,而在另一個線程中節省了20MB,那麼把它全部發布到相同的情況下會不會更好?如果有多個硬盤驅動器,這將如何工作?
- 通過捆綁相似的IO設備來減少線程並提高優先級:數十個優先級提高的線程可能會讓我的用戶界面線程斷斷續續。但是我可以將所有這些功能集中在一個或幾個線程中,並增加它的優先級。
任何情況下,研究解決類似的問題,我們非常感激。
「阻塞線程通常是做I/O的錯誤方式」爲什麼?使用線程是實現我知道的非阻塞I/O的最簡單方法。異步I/O總是有點棘手的管理。 – 2011-05-31 08:21:37
@ james-kanze:但是ASIO的表現要好得多。 – 2011-05-31 08:26:33
@James:因爲執行ASIO的原因通常與性能有關,並且使用線程會給你帶來非常糟糕的性能。 (我們甚至不會涉及到所有常見的線程錯誤,這些錯誤可能會讓您「陷入一些棘手的問題」:) – jalf 2011-05-31 08:32:08