2016-12-16 37 views
0

想象一下,我有兩項任務,每項任務都需要2秒才能完成工作。叉與單個核心上的線程

在這種情況下,如果我爲它們中的每一個創建了兩個線程,並且我的PC是單核的,這將不會節省任何時間。我對嗎 ?

如果我使用fork創建兩個進程(機器仍然是單核)並且每個進程負責一項任務該怎麼辦?這可以節省時間嗎?

如果不是這樣,我有一個問題:

在當前現代化的機器(包括多核),如果我有幾個任務重,我應該使用哪種方法?

  • fork?
  • 線程?
  • fork + thread,意思是說創建一些進程和每個進程都包含多個線程?
+0

您不會在任何這些組合中保存任何時間。如果一項工作需要2秒,則需要2秒。一種方法可能比另一種浪費更多(浪費切換上下文多少時間,等待鎖定等)。這大部分取決於實現,並且沒有通用的答案,我想。 –

回答

0

「作業需要2秒鐘」 - 如果這2秒鐘完全佔用CPU(100%負載),那麼如果您沒有共享內核,則不會從任何線程獲取任何內容,也不會獲得任何內容fork。單核CPU非常繁忙,你無法使其更繁忙。

如果這2秒鐘包括等待時間(例如在I/O,存儲,無論什麼情況下),即使使用單個內核,也可以獲得某些東西。增益量取決於CPU工作與CPU等待率以及多處理開銷。大多數非平凡程序至少有一定數量的「CPU等待」,所以即使在單核CPU上,多線程通常也是有用的。

設置協程和上下文切換的開銷可能很大,需要測量。很明顯,你的活動任務的運行時間越短,開銷的比例(用於設置線程或進程等)越小,而多處理增益越小。傳統上,線程的開銷通常比進程少得多(畢竟,這就是爲什麼他們是被髮明的),但是「相當」可能會隨着時間的流逝而消失 - 在現代Linux系統上,進程只是稍微慢一些設置比線程(實際上,都使用相同的系統調用)。您寧願根據與數據保護(或共享)數量相關的要求而不是執行速度來確定線程或進程。

1

即使使用具有兩個線程的單個內核也可以加速執行。如果你的例程純粹是CPU綁定的,那麼兩個線程不會改進任何東西,事實上,由於上​​下文切換開銷,性能會更差。但是如果例程必須等待內存,磁盤或網絡(通常情況下),那麼即使使用單個內核,兩個線程也會提高性能。

關於fork vs線程,線程需要較少的資源,所以原則上應該是第一選擇。但是有兩點需要注意:1)也許你希望能夠終止一個並行例程,這對於進程而言比使用線程更安全,2)某些語言(特別是Python和Ruby)提供的僞線程庫不會使用真正的線程,但使用相同的線程在例程之間切換。例如,在等待網絡請求時,此模擬線程可能非常有用,但必須考慮到它不是真正的多線程。

修訂號:正如Sergio Tulentsev所評論的,Ruby和Python的確提供了真正的線程,而不僅僅是協程。

+1

不知道python,但ruby現在已經有很多年了。 –

+0

確實在Ruby中有一個Thread類。我的警告主要是關於Global Interpreter Lock如何影響Ruby和Python中的線程並行性。究其原因,我認爲,爲什麼有很多用於Python的異步事件處理,協程等的庫,有一個併發編程工具的簡要列表[在這裏](https://wiki.python.org/moin/)併發/) –

+0

我建議你修改你的答案。因爲ruby確實有獨立的線程。只是他們被GVL癱瘓了。即便如此,他們不是綠色的線程,這是完全不同的事情。 –