2013-12-09 34 views
14

能有人請解釋,如果有任何好處真的編寫多線程的一段代碼,與單核單處理器上運行?例如,處理文檔頁面的方法,使得頁面與上述代碼段相互排斥。單對多線程的單核處理器的編程

乍一看,它似乎並不像有會是一個優勢,因爲真正的多線程是不可能的。即,操作系統將不得不上下文切換線程。我想知道,如果僅以單線程方式編寫代碼實際上可能會更有效。很顯然,編寫多線程代碼很有意義的情況很多,但是我的問題是,當應用程序在單核處理器上運行時,是否真的有這樣的優勢。

編輯:請注意,我沒有說「應用程序」,而是「代碼片」 - 看看我上面的示例。顯然有一個多線程應用程序的好處。

+3

你可以有線程等待文件加載,網絡數據來,即使只有一個人可以一次使用處理器。 – zch

+2

正如@zch指出的那樣,即使在單個內核上,IO綁定的應用程序也可以利用多線程優勢,儘管你永遠不會獲得超過2倍的加速比(如果IO變得太過瓶頸,CPU加速將不會阿米達爾定律)。更常見的原因是設計多線程應用程序,即使您目前只有1個內核,也是爲了在多核心可用時輕鬆移植多核。設計一次應用程序會更好,而不會硬編碼當前的硬件限制,然後在有更多硬件資源可用時重新編寫應用程序。 – Michael

+1

@Michael我會同意,如果您確信您最終將移植到多核系統,但現在由於您未來可能需要處理的事情而使您的代碼更復雜是不值得的。 –

回答

11

仍然有優勢可以獲得,但他們有點情境化。

  • 在許多情況下,給這個東西多個線程將允許它從其他進程申請更多的系統資源。這很平衡,你介紹的每個線程都會增加一些開銷,但這可能是一個原因。

  • 如果要處理多個可能阻塞資源 - 如文件IO或GUI交互或諸如此類的東西,那麼多線程可以是至關重要的。

+1

我不認爲它們沒有什麼意義,特別是給出了項目符號列表中的第二項。儘管如此,還是很不錯的。 +1。 – Renan

+0

@Ranan好點。編輯。 –

10

是的,多線程在單核中很有用。如果應用程序中的某個線程被阻塞等待某些事情(比如說來自網卡的數據或等待磁盤寫入數據),則CPU可以切換到另一個線程繼續工作。

BeOS的的設計考慮了普遍的多線程寫的,即使在單核處理器的時間。結果是一個非常敏感的操作系統,雖然是一個相當困難的操作系統來編程。

+0

好帖子!只是好奇,多線程應用程序可以利用os中的其他內核嗎? (例如JXcore的NodeJS分支) –

2

在單核處理器,使用異步(非阻塞)的應用程序的I/O將略多於一個使用多個阻塞線程更有效的,因爲它避免了上下文線程之間進行切換的開銷。

此外,異步I/O擴展比線程阻塞I/O,因爲相比於創建一個新線程的開銷,每額外的I/O操作的開銷是最小的更好。

說了這麼多,你不應該一般使用單線程異步I/O在新的應用程序,因爲幾乎所有的新處理器的多核。相反,您仍然應該使用異步I/O,但使用類似線程池的方式將工作分配到一組工作線程中。您的系統文檔將告訴您理想的工作線程數量;通常它等於可用的處理內核的數量。