併發技術1:CSP併發理論

尹成發表於2018-11-16

非同步async
並行:多個任務併發執行

同步sync
序列:多個任務依次執行

阻塞block
某個併發任務由於拿不到資源沒法幹活,從而無所事事地乾等

程式併發-執行緒併發-協程併發

非同步回撥async callback
A執行緒喚起B執行緒,令其幹活
同時給B一個回撥函式
命令B在幹完活以後,執行這個回撥函式
這個回撥函式會與A執行緒發生互動
A不必阻塞等待B執行的結果,AB兩個執行緒可以併發執行
利弊

  • 效率高
  • 回撥地獄CallbackHell,邏輯線不清晰

共享記憶體

  • 多個併發執行緒通過共享記憶體的方式互動資料
  • 執行緒安全問題:AB間共享的資料地址可能被C併發修改

同步鎖/資源鎖
為了解決共享記憶體所導致的執行緒安全問題,共享的記憶體地址在特定時間段被特定執行緒鎖定
加鎖期間,其它執行緒無法訪問,帶來低效率問題

死鎖
A鎖住B的資源
B鎖住A要的資源
AB同時阻塞
案例:小兩口的冷戰

  • 女:鎖住女人的尊嚴,得到男人的尊嚴後才釋放
  • 男:鎖住男人的尊嚴,得到女人的尊嚴後才釋放

執行緒池

  • 背景:執行緒的開銷大

  • 記憶體:儲存上下文資料

  • CPU:執行緒排程

    為了避免無度建立執行緒(記憶體溢位OutOfMemory),在一個池中建立一堆執行緒,迴圈利用這些執行緒,用完了以後重置並丟回池中.

  • 利弊

     利:避免了無度建立執行緒,降低了OOM的風險
     弊:用不用都佔去了一大塊記憶體開銷
    

執行緒併發的弊端
開執行緒佔記憶體
啥也不幹就拿走1M棧空間
1024條執行緒就佔用1G記憶體
執行緒切換佔CPU
記憶體共享不安全
加了鎖效率又低下
回撥地獄導致開發難度高

堆疊

  • 變數和物件的名稱
  • 引用堆地址

  • 雜亂無章地堆放各種資料
  • 沒有棧對其進行引用時,就由nil進行引用
  • 被nil引用的堆地中的內容隨時可能被垃圾回收器回收

垃圾回收

  • 一塊堆記憶體如果沒有被棧引用,就會被0號棧(空nil)所引用
  • 一切被nil引用的對記憶體,會隨時被垃圾回收器(GarbageCollector=GC)回收

CSP模型

  • CommunicatingSequentialProcess
  • 可通訊的序列化程式
  • 併發的程式間通過管道進行通訊

共享記憶體 VS 管道

  • 記憶體共享:通過記憶體共享通訊
  • 管道:通過通訊共享記憶體

管道

  • 最早由CSP模型提出
  • 以點對點管道代替記憶體共享實現併發程式間的資料互動
  • 相比記憶體共享資料互動的相率要高很多

協程

  • coroutine
  • coorperte
  • 協作
  • IO時讓出CPU
  • routine
  • 事務
  • 微執行緒/纖程

學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928

[清華團隊帶你實戰區塊鏈開發]

(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980
在這裡插入圖片描述

相關文章