CLR via C# 讀書筆記 1-2 創建線程的成本
在clr中創建線程的代價還是比較高的 ,他需要兩個部分
內存:
- 線程核心對象, 存放描述線程的一些內容和上下文 . (內存消耗:700B-2500B)
- 線程環境,存放例如異常處理鏈之類. (內存消耗 1Page 4k-8k)
- 用戶模式堆棧, 存放 參數 變量等 ,這也就是平時我們說的堆棧和堆的區別中的堆棧 (內存消耗:1MB)
- 核心模式堆棧, (內存消耗12KB-24KB)
基本上看來好像就消耗了1MB多一些的內存....不過如果你知道你的機器上一般都運行著數百個線程....可能就覺得這個數字太大了
CPU調度和上下文切換.
CPU在不同線程中切換的時候,需要卸載掉前一個線程的上下文,并加載后一個線程的上下文.
這也是一個非常消耗資源的操作
考慮到這兩個原因,一般在非必要情況下,盡可能的不創建線程,或者優先使用線程池
PS1:每個普通的windows線程 (不是.net線程)也需要消耗1M的堆棧
PS2:widnows線程和.net線程 現在是1對1的,不過不保證在將來的實現中也是一對一的
PS3:運行在SYSTEM下的線程可能做了特殊的處理并沒有消耗那么多的內存
PS4:書中提到每次切換上下文的時間是30MS,但是我個人覺得這個數字有點問題,似乎粒度不夠細
PS5:考慮到線程創建的成本,盡可能的復用它,就像線程池一樣
PS6:線程的成本低只是相對于進程而言,其實線程還是非常消耗資源的動作
PS7:真正創建和分配內存的動作在:Thread.Start, 而不在?構造函數的時候
浙公網安備 33010602011771號