日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈线程池(上):线程池的作用及CLR线程池

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈线程池(上):线程池的作用及CLR线程池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程池是一個重要的概念。不過我發現,關于這個話題的討論似乎還缺少了點什么。作為資料的補充,以及今后文章所需要的引用,我在這里再完整而又簡單地談一下有關線程池,還有.NET中各種線程池的基礎。更詳細的內容就不多作展開了,有機會我們再詳細討論這方面的細節。這次,還是一個“概述”性質的,希望可以說明白這方面問題的一些概念。

線程池的作用

其實“線程池”就是用來存放“線程”的對象池。

在程序中,如果某個創建某種對象所需要的代價太高,同時這個對象又可以反復使用,那么我們往往就會準備一個容器,用來保存一批這樣的對象。于是乎,我們想要用這種對象時,就不需要每次去創建一個,而直接從容器中取出一個現成的對象就可以了。由于節省了創建對象的開銷,程序性能自然就上升了。這個容器就是“池”。很容易理解的是,因為有了對象池,因此在用完對象之后必須有一個“歸還”的動作,這樣便可以把對象放回池中,下次需要的時候就可以再次拿出來使用了。

例如,我們在使用ADO.NET連接SQL Server時,.NET框架就會自動幫我們維護一個連接池,這就是因為重新創建一個連接的代價相對比較高昂,“復用”就顯得比較劃算了。不過有些朋友可能會說,我們明明是每次都創建一個SqlConnection對象,哪里有“復用”啊?這是因為.NET框架中把“連接池”做透明了,對于程序員完全隱藏了這個概念。每次我們雖然創建的是新的SqlConnection對象,但是這個對象內部占用的“數據庫連接”還是會復用的。為什么總是強調用完SqlConnection對象后要及時“關閉”(Dispose或Close)呢?其實這里并沒有斷開數據庫連接,只是把這個連接放回了連接池。等到下次創建新的SqlConnection對象時,這個連接又可以拿出來用了。

既然我們每次都是從池中獲取對象,那么這些對象是由誰來創建,又是什么時候創建的呢?這個就要根據不同情況由各對象池來自行實現了。例如,可以在創建對象池的時候指定池內對象數量,并且一下子全部創建好,當然您也可以在得到請求時,如果發現池中已經沒有剩余對象時創建。您也可以“事前”先準備一部分,“事中”根據需要再繼續補充。還可以做得“智能”一些,例如,根據實際情況添加或刪除一些對象,甚至對需求“走勢”進行“預測”,在空閑時便創建更多的對象以備“不時之需”。各中變化難以言盡。

當然,它們的原理和目的是類似的。相信上面這段文字也已經講清了“線程池”的作用:因為創建一個線程的代價較高,因此我們使用線程池設法復用線程。就是這么簡單。

CLR線程池

在.NET中,CLR線程和操作系統線程對應,您可以簡單地認為.NET中的Thread對象便封裝了一個操作系統線程,并附帶一些托管環境下所需要的數據(如GC Handle)1。而CLR線程池便是存放這些CLR線程的對象池。

我們在編寫程序的時候,可以使用ThreadPool類的兩個靜態方法:QueueUserWorkItem和UnsafeUserQueueWorkItem向CLR線程池中添加任務(一個WorkCallback委托對象),這兩個方法的區別,在于前者會收集調用方的ExecutionContext,也就是保留了的當前線程的執行信息(如認證或語言文化等),使任務最終會在“創建”時刻的環境中執行2——后者就不會。因此,如果比較兩個方法的絕對性能,Unsafe方法會略勝一籌。但是平時還是建議使用QueueUserWorkItem方法,因為保留執行上下文會避免很多麻煩事情,且這點性能損耗其實算不上什么。

CLR線程池在.NET框架中的作用很大,除了讓程序員使用之外,其他一些功能也會依賴CLR線程池。如ThreadPool.RegisterWaitForSingleObject方法,或是System.Threading.Timer組件——還有更重要可能也是更隱藏的:ASP.NET在得到一個請求后,也會將這個請求處理的任務交由CLR線程池去執行——請注意,它們最多只是添加任務而已,并不表示任務會立即執行。所有添加到CLR線程池的任務都會在合適的時候得以執行——可能馬上,也可能要稍等片刻,甚至更久。

向CLR線程池添加任務時,任務會被臨時放到一個隊列中,并在合適的時候執行。那么怎么樣才算是“合適的時候”?簡單的概括說來,便是線程池內有空閑的線程,或線程池所管理的線程數量還沒有達到上限的時候。如果有空閑的線程,線程池就會立即讓它領取一個任務執行。如果是第二種情況,線程池便會創建新的Thread對象。由于讓操作系統管理太多線程反而會造成性能下降,因此CLR線程池會有一個上限。不同的托管環境會設置不同的上限。如在.NET 2.0 SP1之后,普通的Windows應用程序(如控制臺或WinForm/WPF),會將其設置為“處理器數 * 250”。也就是說,如果您的機器為2個2核CPU,那么CLR線程池的容量默認上限便是1000,也就是說,它最多可以管理1000個線程同時運行——很多情況下這已經是一個很可怕的數字了,如果您覺得這還不夠,那么就應該考慮一下您的實現方式是否可以改進了。

對于ASP.NET應用程序來說,CLR線程池容量代表了應用程序最多可以同時執行的請求數量。對于托管在IIS上的ASP.NET執行環境來說,這個值由全局配置決定。這個配置在machine.config文件中system.web/processModel節點中,為maxWorkerThreads屬性,它決定了為單個處理器分配的線程數。如果這個值為40,且機器上擁有4個處理器(2 * 2CPU),那么這臺機器目前的配置表示在同一時刻,ASP.NET可以同時處理160個請求。某些參考資料建議您將其修改為每處理器80-100個線程,這時您只要修改相應的屬性值就可以了。

既然有最大值,也就相應有了最小值,它代表了CLR線程池“總是會保留”的最少線程數量。由于線程會占用資源,如在默認情況下,每個線程將獲得1MB大小的棧空間3。所以如果在系統中保留太多空閑線程對資源也是一種浪費。因此,CLR線程池在使用大量線程處理完大量任務之后,也會逐步地釋放線程,直至到達最小值。CLR線程池的最小線程數量確保了在任務數量較少的情況下,新來的任務可以立即執行,從而省去了創建新線程的時間。在普通應用程序中這個值為“處理器數 * 1”,而在ASP.NET應用程序中這個值配置在machine.config文件中system.web/processModel節點的minWorkerThreads屬性中4

在某些時候可能會遇到這樣的情況:在一個瞬間忽然來大量任務,每個任務的執行時間說長不長說短不短,不過足以導致線程池快速分配數百個線程。如果這個峰值之后就一片平靜,那么勢必造成大量空閑的線程,這種開銷對性能的損耗也非常明顯。因此,CLR線程池限制了線程的創建速度不超過每秒2個。這樣,即使在某個瞬時獲得了大量的任務,CLR線程池也可以使用相對較少的線程來完成所有工作5

但是,還有一種情況也值得考慮。例如,對于一個比較繁忙的Web應用程序來說,一打開便會涌入大量的連接。由于線程的創建速度有限,因此可以執行的請求數量也只能慢慢增加。對于這種您預料到會產生大量線程,而且忙碌狀況會持續一段時間的情況,限制線程的創建速度反而會帶來損傷效率。這時,您就可以手動設置CLR線程池的最小線程數量。如果此時CLR線程池中擁有的線程數量較少,那么系統就會立即創建一定數量的線程來達到這個最小值。設置和獲取CLR線程池最小線程數量的接口為:

public static class ThreadPool {public static void GetMinThreads(out int workerThreads, out int completionPortThreads);public static bool SetMinThreads(int workerThreads, int completionPortThreads); }

這兩個接口的作用和使用方式應該足夠明顯了(不理解的話可以查閱MSDN),其中workerThreads參數便是CLR線程池的最小線程數,而completionPortThreads涉及到我們下次要討論IO線程池,在此就不多作展開了。除了設置和讀取CLR最小線程數的方法之外,ThreadPool還包含這些接口:

public static class ThreadPool {public static void GetMaxThreads(out int workerThreads, out int completionPortThreads);public static bool SetMaxThreads(int workerThreads, int completionPortThreads);public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads); }

值得注意的是,無論是設置還是獲取到的這些數值,都與處理器數量沒有任何關系了。也就是說,在一臺2 * 2CPU的機器上運行一個普通的.NET應用程序時:

  • 調用GetMaxThreads方法將獲得1000,表示CLR線程池最大容量為1000(250 * 4),而不是250。
  • 調用SetMinThreads并傳入100,表示CLR線程池所擁有的最小線程數量為100,而不是400(100 * 4)。

對于CLR線程池的簡單描述就暫時先到這里了。如果您還有什么疑問請提出,我會加以補充。

相關文章

  • 淺談線程池(上):線程池的作用及CLR線程池
  • 淺談線程池(中):獨立線程池的作用及IO線程池
  • 淺談線程池(下):相關試驗及注意事項

?

注1:嚴格說來,Thread對象和系統線程對應關系還有些細節上的考慮。例如,Thread對象只有當真正Start了之后,CLR才會創建一個操作系統線程與它綁定。

注2:ExecutionContext是個很重要且很有用的對象,例如,WinForms或WPF的異步任務中操作界面元素拋出異常該怎么辦呢?

注3:使用Windows API或Thread類創建線程時可以指定它的棧空間大小,但是CLR線程池中的線程只能使用默認值——不過這個默認值也和托管環境有關,如普通應用程序默認為1MB,而ASP.NET為250KB,這意味著ASP.NET應用程序相對更容易產生Stack Overflow異常。

注4:可惜的是,對于processModel節點的數據,ASP.NET只會讀取machine.config中的全局配置信息,這意味著我們不能使用web.config為不同應用程序配置不同的參數。如果我們要實現應用程序級別的配置,那么必須使用ThreadPool類中提供的API進行設置,這點稍后便會提到。

注5:對于這點,您不妨來做一個算術題:線程池內一下子涌入了500個任務,每個任務阻塞或暫停5秒,每個線程占用1MB內存,假設線程池目前為空,且有著足夠的容量,此外線程創建速度也足夠快,那么在限制及不限制線程創建速度的情況下,完成這些任務需要多少時間和內存空間?

from:?http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html

總結

以上是生活随笔為你收集整理的浅谈线程池(上):线程池的作用及CLR线程池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91 在线视频 | 国产一区二区三区在线看 | 日韩草逼视频 | 中文字幕一区二区不卡 | 91尤物国产福利在线观看 | 亚洲无线看 | 中文在线а√在线8 | 国产一区自拍视频 | 激情五月婷婷网 | 右手影院亚洲欧美 | 午夜影院日本 | 激情av中文字幕 | 成人午夜视频免费 | 国产精品亚洲一区二区无码 | 天天爽夜夜爽一区二区三区 | 女人天堂网站 | 饥渴少妇色诱水电工 | 又黄又色又爽的视频 | 看国产一级片 | 久久精品视频在线观看 | 午夜极品 | 久久性精品 | 日韩免费视频 | 国产剧情一区 | 色播放| 天天玩天天操 | 黑人巨大av| 成人自拍偷拍 | 国产女人18毛片水真多 | 欧美黑人做爰爽爽爽 | 亚洲v国产v欧美v久久久久久 | 日韩电影中文字幕在线观看 | 老太太av | 欧美一级片一区二区 | www操 | 成人久久久精品国产乱码一区二区 | www.污网站 | 91精品视频免费 | 8x8x国产精品一区二区 | 日本日皮视频 | 免费黄色激情视频 | 青青国产精品视频 | 免费看污黄网站在线观看 | 色天天 | 在线观看成人动漫 | 日韩国产成人无码av毛片 | 亚洲欧洲精品成人久久奇米网 | 婷婷丁香花五月天 | 亚洲第一激情 | 国产一级特黄毛片 | 亚洲小说网 | 超碰av在线播放 | 无码人妻熟妇av又粗又大 | 色人阁视频| 极品尤物魔鬼身材啪啪仙踪林 | 国产精品传媒视频 | 强行侵犯视频在线观看 | 黄色片网站免费 | 一二三四国产精品 | 日本三级黄色录像 | 欧美一级性 | 欧美黑人精品一区二区不卡 | 国产精品成人久久电影 | 四虎影院在线观看免费 | 美女又爽又黄视频毛茸茸 | 极品在线播放 | 天堂网av中文字幕 | 午夜影院91 | 中文字幕第7页 | 日韩欧美综合一区 | 日韩一级影院 | 国产激情无码一区二区 | 国产精品一区久久久 | 91午夜影院| 91午夜免费视频 | 99干99| 奇米精品一区二区三区在线观看 | 免费成人深夜小野草 | 成年人黄国产 | 清纯粉嫩极品夜夜嗨av | 久久精品视频2 | 日本一本不卡 | 久热青草 | 久久夜色精品 | 在线观看视频www | 99精品视频在线观看免费 | 深夜在线视频 | a级在线观看网站 | 麻豆视频二区 | www.黄色. | 国产偷怕 | 久久久久久久久久久影视 | 亚洲欧美一区二区三区情侣bbw | 免费成人在线看 | 国产理论片在线观看 | 天堂精品一区 | 看片在线观看 | 国产黄色免费大片 | 手机看片在线观看 |