2013-01-18 105 views
1

我想知道爲什麼相比於同一個線程異步操作的上下文切換速度慢。爲什麼上下文切換很慢?

爲什麼是更好地運行N個線程(以N等於核心的數量),每一個處理中號客戶assynchronously的,而不是運行M根絲線?我已經告訴其原因是上下文切換的開銷,但我怎麼也找不到慢是上下文交換機。

回答

1

只是爲了澄清我會認爲當你說「而不是運行M根絲線」你的意思是N * M個線程(如果你運行的M根絲線,每一個需要處理N個客戶端,以匹配相同數量的總客戶,這將是一個類似的情況)。

因此,在N個內核中運行的N個線程之間的差異,每個線程處理M個客戶端,以及N * M個線程運行在相同數量的內核中,這是第一種情況下不必創建新線程和如你所說,你不會有上下文切換。這是一個優點,因爲創建操作系統線程所需的工作量很大;它需要創建一個不同的進程空間,一個新的堆棧等。另外,如果你有更多的線程,OS調度程序將停止並激活正在運行的進程,這也是非常耗時的。每次調度改變分配給核心它可能還需要緩存此進程的上下文的過程中,加入了大量的緩存缺失的,因此更多的時間。另一方面,如果您擁有固定的線程數量,等於核心數量(有時甚至建議使用N-1),則可以在用戶級別的調度程序中管理「任務」或客戶端,這可能會會導致您的程序更多的計算,但避免了大量的操作系統進程和內存管理,使整體執行速度更快。一些當前的並行API,如.Net任務並行庫(TPL),OpenMP,英特爾線程構建模塊或Cilk體現了稱爲動態多線程的這種並行模式。