《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎
windows為什么要支持線程
線程開銷
CPU發展趨勢
CLR線程和Windows線程
使用專用線程執行異步的計算限制操作
線程調度和優先級

windows為什么要支持線程

早期的操作系統只有一個執行線程,但同時包含了操作系統代碼和應用程序代碼,一旦應用程序出現bug,整個主機必須重啟,數據都會丟失。
微軟后來發布了新的內核——Windows NT。決定在一個進程中運行應用程序的實例。進程實際是應用程序實例需要使用的資源的集合。保護了數據的安全性。但是如果發生死循環呢?如果機器只有一個CPU,他會執行死循環,雖然數據不會被破壞,系統依然會停止響應。微軟的解決方案就是線程。它的職責是對CPU進行了虛擬化。每個進程都有專用的線程(相當于一個CPU)。

線程開銷

和一切虛擬化機制一樣,線程有空間(內存耗用)和時間(運行時的執行性能)上的開銷:

  • 線程內核對象(thread kernel object)
    為每個線程分配的數據結構之一。包括描述線程的一組屬性,線程上下文(CPU寄存器集合)。x86,x64,ARM CPU架構,上下文分別占約700,1240,350字節。
  • 線程環境塊(thread environment block, TEB)
    TEB是用戶模式中分配和初始化的內存塊,占用一個內存頁(三種架構都是4kB)。
  • 用戶模式棧(user-model stack)
    存儲傳給方法的局部變量和實參。Windows默認分配1MB內存(保留地址空間,需要時換到物理內存。
  • 內核模式棧(kernel-model stack)
    用于向OS內核模式函數傳遞實參。Win32:12KB;Win 64:24KB。
  • DLL線程連接(attach)和線程分離(detach)通知
    Windows的一個策略是,任何進程在創建和終止線程時,都會調用進程加載的所有非托管DLL的DLLMain方法。

上下文切換開銷
Windows大約每30ms執行一次上下文切換。這個動作不會帶來任何內存或性能上的收益。事實上,上下文切換可能帶來其它的性能損失,比如缺頁中斷,cache寫入。
執行GC時,CLR必須掛起所有線程,遍歷它們的棧查找根以便對堆中的對象進行標記(GC算法第一步),再次遍歷它們的棧(更新它們的根),再恢復所有線程。所以減少線程的數量會顯著提升GC的性能。
線程越多,調試體驗越差(遇到斷點時掛起所有線程)。


CPU發展趨勢

除了提高CPU的速度外,還有多核——為了使用線程。
目前的三種多CPU技術:

  • 多個CPU;
  • 超線程CPU——芯片中包含兩組架構狀態,比如CPU寄存器,但只要一組執行資源;
  • 多核CPU。

CLR線程和Windows線程

目前,CLR線程完全等價于Windows線程。


使用專用線程執行異步的計算限制操作

應盡量使用線程池來執行異步的計算操作。但是如果滿足以下任何條件,就可顯式創建自己的線程。

  • 線程需要非Normal的優先級運行。
  • 需要線程是一個前臺線程,防止應用程序在線程結束前終止。
  • 直接為長時間運行的任務創建專用線程。因為,線程池為了判斷是否需要創建一個額外的線程,所采用的邏輯比較復雜。
  • 需要控制線程(啟動,并可能調用Abort方法)。

線程調度和優先級

Windows是搶占式多線程操作系統,所有你不能保證自己的線程一直運行,也阻止不了其它線程的運行。
Microsoft知道開發人員 在為線程分配優先級時很難做到完全合理,因此公開了優先級系統的一個抽象層。

  • 進程優先級類(抽象概念):決定應用程序與其它應用相比的響應能力。
    6個進程優先級類:Idle,Below NormalNormal(默認),Above NormalHigh(絕對必要時使用),和Realtime(盡量避免使用)。
  • 優先級:線程優先級
    Windows支持7個相對線程優先級:IdleLowestBelow NormalNormalAbove NormalHighestTime-Critical

每個線程的優先級取決于兩個標準:1)它的進程優先級類;2)在其進程優先級類中,線程的優先級。他倆合并構成一個線程的“基礎優先級”。每個線程都有一個“動態優先級”,線程調度器根據 這個優先級決定執行哪個線程。最初,基礎優先級和動態優先級相同。系統可以提升基礎優先級在0到15之間的線程優先級(即,概念上非Realtime優先級類)。

事實上,Windows永遠不會調度進程,它只調度線程。

C#可以通過設置Thread的Property屬性,來設置相對線程優先級。ThreadPriority枚舉:Lowest,BelowNormal,Normal,AboveNormal或者Highest。和Windows為自己保留了優先級0和Realtime范圍一樣,CLR為自己保留了Idle和Time-Critical優先級。



來自為知筆記(Wiz)



轉載于:https://www.cnblogs.com/qianzi067/p/5808344.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254597.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《高效程序員的45個習慣》-之二

請您在閱讀本文之前,先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題,用3期來列出這45個習慣,每次不貪多,貪精,大家如果有空,一定要細細品味這15個習慣。 注意:每一個好的習…

MIME Type的介紹

轉載自: http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先,我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么,瀏覽器是如何區分它們,決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神,該項目的想法來源自tale和MyBlog。 做了一些改造,增加了一些功能和一些代碼的重構,并且更換了博客主題。 關于項目,對于開發的練手項目,能夠工程化,嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification:分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正則表達式

#----正則表達式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #預期結果 ^匹配字符開…

WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟 (1)、獲取服務終結點的服務協定、綁定以及地址信息 (2)、使用該信息創建WCF客戶端 (3)、調用操作 (4)、關閉WCF客戶端對象 二、操作實例 1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨…

《高效程序員的45個習慣》-之三

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之二。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

負載均衡的那些事?

什么是負載均衡&#xff1f;1、負載&#xff1a;就是后端系統的承載能力。比如同等條件下&#xff0c;一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差&#xff1b;相同配置下&#xff0c;一個cpu利用率為80%的機器比30%的承載能力一般要差等等。2、均衡&am…

Develop內部函數,持續更新

Develop內部函數 目錄Develop內部函數dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信認證方案,用手機短信進行上網認證如何實現?

WFilter NGF的“Web認證”模塊&#xff0c;提供了一系列的上網認證解決方案。包括如下認證方式&#xff1a;本地用戶名密碼認證AD域用戶名密碼認證企業郵箱用戶名密碼認證Radius用戶名密碼認證微信WiFi認證Facebook Wifi認證除此&#xff0c;WFilter NGF還有一個“其他”的選項…

《高效程序員的45個習慣》-末篇

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之三。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

【Qt開發】V4L2 API詳解 Buffer的準備和數據讀取

前面主要介紹的是&#xff1a;V4L2 的一些設置接口&#xff0c;如亮度&#xff0c;飽和度&#xff0c;曝光時間&#xff0c;幀數&#xff0c;增益&#xff0c;白平衡等。今天看看V4L2 得到數據的幾個關鍵ioctl&#xff0c;Buffer的申請和數據的抓取。1. 初始化 Memory Mapping …

halcon File文件算子,持續更新

目錄File文件Images圖像read_imageread_sequencewrite_imagedeserialize_imageserialize_imagelist_image_fileparse_filenameMisc混合體copy_filedelete_filefile_existsget_current_dirlist_filesmake_dirread_world_fileremove_dirset_current_dirObject對象deserialize_obj…

Nginx 之一:編譯安裝nginx 1.8.1 及配置

轉http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介紹 官網地址www.nginx.org&#xff0c;nginx是由1994年畢業于俄羅斯國立莫斯科鮑曼科技大學的同學為俄羅斯rambler.ru公司開發的&#xff0c;開發工作最早從2002年開始&#xff0c;第一次公開發布時間…

PI校正環節的程序實現推導過程

PI校正環節在經典控制論中非常有用&#xff0c;特別是對負反饋控制系統&#xff0c;基本上都有PI校正環節。1.下面分別說明比例環節和積分環節的作用&#xff0c;以階躍信號為例。①比例環節單獨作用以上分析說明&#xff0c;若只有比例環節的控制系統&#xff0c;階躍響應也是…

XML文檔注釋(C#)

目錄XML文檔編譯器識別的標記添加XLM注釋的方法添加XLM注釋的例子XML文檔 C#可以根據特定的注釋自動創建XML格式的文檔說明。 這些注釋都是單行注釋&#xff0c;但都以三條斜杠開頭 編譯器識別的標記 標記說明<C>把行中的文本標記為代碼&#xff0c;例如<c>int …

vs里根據json快速創建對應類的方法

有時候,我們在調用別人接口的時候,服務端返回了一個json格式的字符串,我們要獲取json里面的數據的話一般有兩種方式: 1.通過正則 2.反序列化成一個對象 第一種方式這里不再多說,主要說一下第二種,(為什么呢&#xff0c;你看到后面 你也會喜歡上第二種) 有人肯定會說, json字符串…

德魯克的《卓有成效的管理者》

是一本很好的書&#xff0c;對我有諸多的啟發&#xff0c;這本書我在短期內連看兩遍呢。 現將一些我覺得有啟發性的句子發給大家分享。 1. 一個人的有效性&#xff0c;與他的智力、想象力或知識之間&#xff0c;幾乎沒有太大的關聯。有才能的人往往最為無效&#xff0c;因為他們…

人工智能之基于face_recognition的人臉檢測與識別

不久乘高鐵出行&#xff0c;看見高鐵火車站已經實現了“刷臉進站”&#xff0c;而且效率很高&#xff0c;很感興趣&#xff0c;今天抽時間研究一下&#xff0c;其實沒那么復雜。 我基本上是基于https://github.com/ageitgey/face_recognition上的資料和源碼做一些嘗試和試驗。 …

iOS 升級https的方案選擇

我的選擇是將UIWebView統一替換為WKWebView WKWebView AFN SDWebImage https的支持之前的博客都有涉及轉載于:https://www.cnblogs.com/Jusive/p/6867531.html