進程、線程和go協程

單核心和多核心:

摩爾定律:當價格不變時,集成電路上可容納的元器件的數目,約每隔18-24個月便會增加一倍,性能也將提升一倍。

早期 CPU 工藝的發展,基本上是通過提高電子元器件的密集程度實現的;但是電子元器件大小總歸有個極限,不可能無限小下去。單核心的速度總會遇到一個瓶頸,爲了解決這種性能瓶頸,多核心就應運而生。

執行體

從 CPU 的角度,執行程序主要依賴的是內置存儲:寄存器和內存(RAM),它們構成執行體的上下文。
執行體的上下文,就是一堆寄存器的值。要切換執行體,只需要保存和恢復一堆寄存器的值即可

切換執行體所產生的開銷:
時間成本:

  1. 執行體切換本身的開銷,它主要是寄存器保存和恢復的成本,可騰挪的餘地非常有限;
  2. 執行體的調度開銷,它主要是如何在大量已準備好的執行體中選出誰獲得執行權;
  3. 執行體之間的同步與互斥成本

空間成本:

  1. 執行體的執行狀態;TLS(線程局部存儲);
  2. 執行體的堆棧。

進程

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

  1. 進程是OS進行資源分配的基本單位。
  2. 進程是程序運行的實例。
  3. 進程的調度由操作系統進行調度

多進程:
1. 各進程之間的資源相互獨立,不能共享
2. 佔用資源多

線程

  1. 線程是調用CPU運算的最小單元
  2. 線程的調度由操作系統進行調度

多線程:
1. 充分利用多核心
2. 降低阻塞造成的CPU資源閒置
3. 同一個進程中的多個線程,共享進程的資源
4. 典型的線程棧大小差不多有 1M,

使用多線程的場景:
1. 多核CPU——計算密集型任務。此時要儘量使用多線程,可以提高任務執行效率,例如加密解密,數據壓縮解壓縮(視頻、音頻、普通數據),否則只能使一個核心滿載,而其他核心閒置。
2. 單核CPU——計算密集型任務。此時的任務已經把CPU資源100%消耗了,就沒必要也不可能使用多線程來提高計算效率了;相反,如果要做人機交互,最好還是要用多線程,避免用戶沒法對計算機進行操作。
3. 單核CPU——IO密集型任務,使用多線程還是爲了人機交互方便,
4. 多核CPU——IO密集型任務,這就更不用說了,跟單核時候原因一樣。

協程

  1. 輕量級線程(在用戶態實現線程)
  2. 協程的調度由用戶控制
  3. 協程棧的大小往往只有幾 K 或者幾十 K

協程就是爲了這樣兩個目的而來:
1. 迴歸到同步 IO 的編程模式;
2. 降低執行體的空間成本和時間成本。

goroutine:
1. 堆棧開始很小(只有 4K),但可按需自動增長;
2. 堅決幹掉了 “線程局部存儲(TLS)” 特性的支持,讓執行體更加精簡;
3. 提供了同步、互斥和其他常規執行體間的通訊手段,包括大家非常喜歡的 channel;
4. 提供了幾乎所有重要的系統調用(尤其是 IO 請求)的包裝。
5. goroutine是可以並行的,coroutine原理是基於一個線程的協程,是不能並行的。
6. 基於CSP(Communicating Sequential Processes)模型實現
7. MPG模型
8. 工作竊取調度

Go的CSP併發模型實現:M, P, G
time.Timer源碼閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章