併發技術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