2012-04-11 178 views
11

我對單線程和多線程編程之間的差異存在誤解,所以我想要回答下面的問題以使一切都清楚。誤解單線程和多線程編程之間的差異

假設有9個獨立的任務,我想用一個單線程程序和一個多線程程序完成它們。基本上,它會是這樣的:

單線程:

- Execute task 1 
- Execute task 2 
- Execute task 3 
- Execute task 4 
- Execute task 5 
- Execute task 6 
- Execute task 7 
- Execute task 8 
- Execute task 9 

多線程:

線程1:

- Execute task 1 
- Execute task 2 
- Execute task 3 

線程2:

- Execute task 4 
- Execute task 5 
- Execute task 6 

Thread3:

- Execute task 7 
- Execute task 8 
- Execute task 9 

據我所知,只有ONE線程在同一時間(讓CPU)來執行,一旦量子結束後,線程調度會給另一個線程提供CPU時間。

那麼,哪個程序會早些完成?它是多線程程序(邏輯上)?或者它是單線程程序(因爲多線程有很多上下文切換需要一些時間)?爲什麼?我需要一個很好的解釋:)

+2

'哪個程序會早點完成?答案:它取決於 – 2012-04-11 17:10:12

+0

即使在單個CPU上也會異步發生許多事情:內存讀取,磁盤I/O,網絡I/O ......在「強制超時」期間,上下文切換通常會優先發生。無論如何,現在誰真的只有一個CPU? – 2012-04-11 17:10:47

+0

這個問題目前的形式是無法回答的。這些任務是相互獨立的,還是依賴於早期任務的結果?有多少個CPU /內核可用?任務處理器是綁定的還是I/O綁定的?在並行性(多CPU /內核,處理器綁定,獨立任務)的理想情況下,多線程版本可能會更快。但也許不是。 – dlev 2012-04-11 17:12:04

回答

17

這取決於。

你有多少個cpus?你的任務涉及多少I/O?

如果您只有1個CPU,並且任務沒有阻塞I/O,那麼單線程將完成等於或快於多線程,因爲切換線程會產生開銷。

如果您有1個cpu,但任務涉及大量阻塞I/O,則可能會看到使用線程加速,假設在I/O正在進行時可以完成工作。

如果您有多個cpus,那麼您應該看到單線程上的多線程實現的加速,因爲可以並行執行多個線程。除非這些任務是I/O占主導地位,在這種情況下,限制因素是您的設備速度,而不是CPU功耗。

+0

如果你有1個cpu,但是任務涉及很多阻塞I/O,將會有很大的加速,因爲所有九個任務都可能在完成IO發出信號時獲得一些CPU。 – 2012-04-11 17:51:29

+1

通過cpus你真的是指核心?大多數電腦都有一個CPU,但CPU有多個核心。 – Guffa 2012-04-11 17:54:59

+0

是[15個字符] – hvgotcodes 2012-04-11 17:55:50

6

據我所知,只有一個線程將在同一時間

這將是,如果CPU只有一個核心的情況下執行。現代CPU有多個內核,可以並行運行多個線程。

運行三個線程的程序運行速度將快三倍。即使任務是獨立的,計算機中仍有一些資源必須在線程之間共享,如內存訪問。

2

嗯,這不完全是語言不可知的。一些解釋性編程語言不支持真正的線程。也就是說,執行線程可以由程序定義,但解釋器是單線程的,所以所有的執行都在CPU的一個核心上。

對於支持真正多線程的編譯語言和語言,單個CPU可以有多個內核。實際上,大多數臺式電腦現在有2個或4個內核。因此,執行真正獨立任務的多線程程序可以根據CPU中可用內核的數量快兩到四倍。

+0

任務很少真正獨立。根據我的經驗,通常最終發生的事情是,您的代碼不再像CPU一樣使用單個線程和/或核心,而是現在可能會被I/O綁定。你投入四核的努力常常被浪費掉。這一課很難學到。 – 2014-04-15 18:30:43

+1

@ A-B-B,你是對的。確保併發計算足夠複雜以證明開銷也很重要。但是,就IO而言,假設有一個IO密集型任務。這個任務仍然會受益於多線程,因爲一個線程可以在另一個線程正在使用通信總線的同時進行計算。最後,還有專門的架構設計可以執行高效的並行IO。 – 2014-04-16 03:28:54

2

假設集: 單核心,沒有超線程; 任務受CPU限制; 每個任務需要3個量子時間;每個調度器分配被限制爲1個量子時間; FIFO調度程序非搶先; 所有線程同時觸發調度程序; 所有上下文切換需要相同的時間量;

  • 測試1::單的方法,單個線程(包含所有9個任務)
  • 試驗2:

    過程如下圈定單一過程,三個線程(包含各3個任務)

  • 試驗3:三個過程,每個單線程(包含各3個任務)
  • 測試4:三個過程,每個具有三個線程(包含每一個任務)

有了上述假設,他們都在同一時間完成。這是因爲爲CPU預留了一定量的時間,上下文切換是標準化的,沒有中斷處理,並且沒有任何內容正在等待IO。

欲瞭解更多有關這種性質的深入,請找到this book