Go併發實戰筆記整理

Go併發

併發編程概念

關鍵詞

  • 串行程序 : 串行程序特指只能被順序執行的指令列表
  • 併發程序 : 能夠被併發執行兩個及以上的串行程序的綜合體
  • 並行程序 : 被設計成能夠在並行硬件上執行的併發程序
  • 分佈式系統 等於 並行系統 等於 併發系統

進程

進程 : 一個程序的執行稱爲一個進程。進程是操做系統進行資源分配的一個 基本單位

進程的衍生

由父進程使用系統函數fork,fork出一個子進程。子進程得到父進程的數據段,堆和棧的副本。
擴展Linux寫時拷貝技術html

進程的標識 進程的ID( PID) 當前進程的父進程ID( PPID)

進程的狀態操做系統之進程的幾種狀態編程

進程空間:用戶空間 內核空間多線程

系統調用 : 爲了使用戶進程可以使用操做系統更底層的功能,內核會暴露出一些接口供他們使用,這些接口是用戶進程使用內核功能的 惟一手段。系統調用時向內核空間發出一個明確的請求

內核態用戶態
用戶態 : CPU只能對用戶空間進行訪問
內核態 : 控制計算機的硬件資源併發

實現 : 當用戶進程發出一個系統調用時,內核會把CPU從用戶態切換到內核態,然後會讓CPU執行對應的內核函數編程語言

進程間的上下文切換 : 憑藉CPU的威力快速地在多個進程之間進行切換

進程間通訊 IPC

  • 管道 : 一種半雙工(單向)的通訊方式,只能用於父進程與子進程以及同祖先的子進程之間的通訊
  • 信號 : 用來通知接收進程某個事件已經發生
  • 套接字 : 可用於不一樣機器之間的進程間通訊 擴展RPC遠程過程調用
  • 共享內存 : 最快的IPC方式,多個進程共享一樣的資源。爲了作到這一點,須要內核提供同步機制
競態 : 多個進程對一個資源進行訪問
原子操做 : 執行過程當中 不能被中斷的操做(全部的系統調用都屬於原子操做)
臨界區 : 只能被 串行化訪問或執行的某個資源或某段代碼稱爲臨界區
互斥 : 保證 只有一個進程或線程在臨界區以內的作法

線程

線程 : 線程能夠視爲線程的控制流,一個進程至少會包括一個線程
線程標識 : 由操做系統內核分配和維護

線程控制的系統調用分佈式

  1. 建立線程 pthread_create
  2. 終止線程 pthread_cancel
  3. 鏈接已終止的線程 pthread_join
  4. 分離線程 pthread_detach

線程實現模型函數

  1. 用戶級線程模型
  2. 內核級線程模型
  3. 混合型線程模型

內核調度實體 (Kernel Scheduling Entity)

用戶級線程模型

線程是由用戶的線程庫全權管理,全部的調度和管理都是用戶級程序的自主行爲。(現代操做系統都不適用這種模型來實現線程)性能

內核級線程模型

由內核複製管理,屬於內核的一部分。會給內核的調度器形成很是大的負擔。
缺點 : 資源消耗較大,調度速度較慢等。但與用戶級線程模型相比有較大優點。(不少現代操做系統都是由之內核級線程模型實現線程)spa

混合型線程模型

混合型線程模型的線程庫會經過操做系統內核建立多個內核級線程,而後,經過內核級線程對應用程序進行調度。大多數此類線程庫均可以將這些應用程序動態地與內核級程序關聯。由於混合型線程模型實現的複製性,它每每不會是操做系統內核的開發者所採用。可是,這種模型能夠很好地在編程語言層面上實現並充分發揮其應有的做用操作系統

擴展 : 線程的3種實現方式

線程的同步

關鍵點是解決共享數據的一致性
  • 互斥量
  • 條件變量
  • 原子操做

不當的互斥量致使的死鎖問題
例如 : 兩個互斥量的臨界區重疊

clipboard.png

解決方案

  • 試鎖定-回退
  • 固定順序鎖定

(A爲先鎖定X再鎖定Y,B爲先鎖定Y再鎖定X。改爲A先鎖定Y再鎖定X)

條件變量 : 條件變量是對應的共享數據的狀態改變時,通知其餘 所以而被阻塞的線程。條件變量 老是和互斥量組合使用

多線程仍是多進程?

多線程做爲更加現代的併發編程方式在系統資源的利用和程序性能的提升方面都更加有優點。可是,在某些狀況下。好比對 信號的處理同時運行多套不一樣的程序以及包括 多個須要超大內存支持的任務等,傳統的多進程編程方式可能會更加適合。

臨界區的設計建議

  1. 控制臨界區的純度
  2. 控制臨界區的粒度
  3. 減小臨界區代碼的執行耗時
  4. 避免長時間持有互斥量
  5. 優先是有原子操做而不是互斥量
相關文章
相關標籤/搜索