.NET中的線程與異步(筆記)

翻出了以前記錄的筆記,基本涵蓋了.NET中線程和異步的相關概念。能夠提供一個學習的方向。算法

線程類型

工做者線程
IO線程編程

線程池

全局隊列(QueueUserWorkItem、Timer老是放入全局)
本地隊列windows

工做者線程調度流程

若是本地隊列有任務,則調度本地隊列
若是本地隊列沒有任務則去其它工做者線程中調度
若是全部工做者線程本地隊列都沒有任務則去全局隊列取任務調度
若是全局隊列也沒有任務則睡眠等待
若是睡眠了太長時間則本身醒來銷燬本身安全

從全局隊列取到本地隊列採用 FIFO 算法
從本地隊列取出時,採用 LIFO 算法
子任務、嵌套任務會被分配在線程的局部隊列中服務器

線程的開銷

上下文切換

數據

AsyncLocal
ThreadLocal
ExecutionContext
SynchronizationContext(抽象的內容,基於ExecutionContext)多線程

參考資料

https://blogs.msdn.microsoft.com/pfxteam/2012/06/15/executioncontext-vs-synchronizationcontext/併發

http://stackoverflow.com/questions/9562836/whats-the-meaning-of-usetaskfriendlysynchronizationcontext異步

https://msdn.microsoft.com/en-us/magazine/gg598924.aspx異步編程

Timer

全部的Timer只有一個線程,調度具體任務時使用線程池
避免重複執行,使用Change方法學習

僞共享

由於不一樣的內核訪問一個內核的cache發生的問題 [StructLayout(LayoutKind.Explicit)] [FieldOffset(64)]

異步模型

APM(異步編程模型)

BeginXXX、EndXXX

HTTP(RFC 2616) 客戶端應用程序到一個服務器的併發鏈接數不該超過2個。
FCL強制了這個規則,除非從新指定"ServicePointManager.DefaultConnectionLimit"

FileStream

指定 FileOptions.Asynchronous 儘可能使用 BeginRead,不然儘可能使用Read
章節:27.8.8

異步編程模型

image

線程同步

類庫和線程安全

FCL法則
靜態方法保證線程安全
實例方法不保證

基元用戶模式和內核模式

用戶模式

在硬件中發生
線程將一直在cpu上運行,稱做「活鎖」

內核模式

在操做系統中發生
windows會堵塞線程使它再也不浪費cpu時間
線程將一直堵塞,稱做「死鎖」

windows操做系統檢測不到一個線程在一個基元用戶模式中構造上堵塞了。因此線程池不會建立一個新的線程來替換這種臨時堵塞。

活鎖浪費cpu時間和內存,死鎖只浪費內存 同時使用稱做:混合模式構造

用戶模式構造

易失構造

它包含一個簡單的數據類型的變量上執行原子性的讀或寫操做

互鎖構造

它包含一個簡單的數據類型的變量上執行原子性的讀和寫操做

相關FCL類型
1.Interlocked
2.SpinWait
3.SpinLock

內核模式構造

相關FCL類型
WaitHandle
EventWaitHandle
AutoResetEvent
ManualResetEvent
Semaphore
Mutex

混合模式構造

相關FCL類型
ManualResetEventSlim
SemaphoreSlim
CountdownEvent(與SemaphoreSlim相反) Monitor
Barrier(多線程協調)

lock Monitor

Task優點

  1. 任務使用的內存比線程少的多,建立和銷燬所需的時間也少的多(複用線程)
  2. 線程池根據可用CPU數量自動伸縮任務規模
  3. 每一個任務完成一個階段後,運行的任務線程回到線程池,以便在那裏接受新任務
  4. 線程池是站在整個進程的高度觀察任務,因此,它能更好的調度這些任務,減小進程中的線程數,並減小上下文切換
相關文章
相關標籤/搜索