1. 程式人生 > >多執行緒的優劣/效能/系統開銷

多執行緒的優劣/效能/系統開銷

轉自:http://hi.baidu.com/goga/blog/item/ef7e8326af7ae31f8b82a103.html
執行緒建立之前
1.系統為執行緒分配並初始化一個執行緒核心物件;
2.系統為每個執行緒保留1MB的地址空間(按需提交)用於執行緒使用者模式堆疊;
3.系統為執行緒分配12KB(左右)的地址空間用於執行緒的核心模式堆疊。
執行緒建立之後
4.Windows呼叫當前程序中的每個DLL都有的一個函式,用來通知程序中的所有DLL,作業系統建立了一個新的執行緒。
銷燬一個執行緒時
5.當前程序中的所有DLL都要接收一個關於該執行緒即將"死亡"的通知;
6.執行緒的核心物件及建立時系統分配的堆疊需要釋放。

如果某臺計算機只有一個CPU的話,則在某一時刻只有一個執行緒可以執行。
Windows必須跟蹤記錄執行緒物件,而且不停地跟蹤記錄每個執行緒物件。
Windows必須決定CPU下一個次(每隔約20毫秒)排程那一個執行緒使其執行。
上下文切換(Context switch):Windows使CPU停止執行一個執行緒的程式碼,而開始執行另一個執行緒的程式碼的現象,我們稱之為上下文切換。

上下文切換的開銷:

1.進入核心模式;
2.將CPU的暫存器儲存到當前正在執行的執行緒的核心物件中。
註明:X86架構下CPU暫存器佔了大約700位元組(Byte)的空間,X64架構下CPU暫存器大約佔了1024(Byte)的空間,IA64架構下CPU暫存器佔了大約2500Byte的空間。
3.需要一個自旋鎖(spin lock),確定下一次排程那一個執行緒,然後再釋放該自旋鎖。
如果下一次排程的執行緒屬於同一個程序,哪麼此處開銷更大,因為OS必須先切換虛擬地址空間。
4.把即將要執行的執行緒的核心物件的地址載入到CPU暫存器中。
5.退出核心模式。

以上都是純粹的開銷,導致Windows和應用程式的執行速度比在單執行緒系統上的執行速度慢。
綜上所述:應儘量限制執行緒的使用。

多執行緒的帶來的好處:
1.健壯性。
此執行緒的錯誤不會影響彼執行緒。
2.可擴充套件性。
多個CPU情況下,可充分發揮多個CPU的優勢。