程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 淺談.NET下的多線程和並行計算(十二)CLR via C#第三版閱讀筆記(1)

淺談.NET下的多線程和並行計算(十二)CLR via C#第三版閱讀筆記(1)

編輯:關於ASP.NET

最近此書出了第三版,在閱讀此書線程部分的過程中有很多心得,補充了此前知識盲點,因此把這些 關鍵和重要的知識點匯集成日志文章並且納入到這個系列中。順便說一下,筆者喜歡這本書的原因是作者 作為微軟顧問並沒有按照MSDN的教條教大家怎麼去用而是能說出很多自己的觀點甚至很多是微軟.NET框架 不夠的地方,並給出自己的實現。

為什麼說線程是比較昂貴的?

1)從內存上來說,(對於32位架構)每一個線程包含線程內核對象(700字節)/線程環境塊(4KB)/ 內核堆棧(12KB)/用戶堆棧(1MB)。並且可以發現,這1MB的用戶堆棧內存在CLR線程創建的時候完全分 配,並不是動態增加的(Windows線程的創建只是保留1MB的內存空間)。

2) 從線程切換上來說,需要做哪些步驟來進行切換?首先是把CPU寄存器中的值保存到當前線程的內 核對象中,然後如果線程切換到不同CPU的話需要為CPU准備新的虛擬地址空間,最後把目標線程內核對象 中寄存器的值復制到CPU寄存器中。

3) 更大的性能損害來自於,線程切換之後緩存中的數據可能會不能命中,需要重新准備這些數據。

4) 此外,在垃圾回收的時候,CLR會掛起所有線程,查看線程堆棧,垃圾回收壓縮後重置堆棧指針地 址。

當然,線程總比進程的創建好一點,不過作者也說了線程多啊,一個OUTLOOK有幾十個線程,作者還納 悶怎麼打開記事本的打開對話框會多22個線程,我想這個和操作系統有關,Vista的打開文件對話框更復 雜,在其中為了不阻塞UI很多Part都以新的線程來加載內容,還好這個打開對話框用的不是 CLR線程…… 當前CLR線程對應Windows線程,作者也希望在將來CLR能實現虛擬邏輯線程的概念,以改善性能。

什麼時候手動創建線程而不是使用線程池?

1) 需要自定義線程的優先級,線程池的線程總是Normal。

2) 需要一個前台線程,線程池的線程總是後台線程。

作者建議大家對於非UI線程創建為後台線程而不是前台線程,有的時候我們可以發現有些軟件在關閉 之後,或者說關閉UI之後在進程中還存在,占用內存,這是因為我們看到關閉的是UI線程,還有其它前台 線程未關閉。

3) 需要手動中止線程,線程池不提供這個功能。

4) 線程執行時間很長,線程池用於短而多的線程任務比較合適。

線程的調度

1) 每一個線程的優先級是0到31。高優先級的線程ready之後,不管低優先級的線程在做什麼,立即 上位,沒話說。Windows會把最高優先級的不同線程調度到各個CPU上並行執行,多核多處理器誰也不閒著 。

2) Windows制定進程有6個優先等級,線程有7個,通過組合來得出實際的線程優先級0到30(0優先級 保留給Windows用於內存釋放)。CLR保留了線程優先級中的最低和最高級,供程序員可設置的只有5個等 級。

3)進程的優先級是一個虛擬的概念,只是為了幫助用於映射到1-31中的某個等級,一般來說進程的等 級默認為創建它的進程的等級。很多進程都是Windows Explorer創建的,默認也就是Nomral這個等級,說 白了我們的線程在大多情況下映射到Windows線程優先級為6-10。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved