程式執行緒協程關係

sltin發表於2021-01-04

cpu的處理

  • 計算機的核心為cpu,它是計算機的運算和控制核心
  • 積體電路中的電晶體數量也在大幅度增長,大大的提升了cpu的效能
  • 根據摩爾定律,積體電路晶片中所整合的電晶體數量每隔18個月就翻一翻
  • 過於密集的電晶體雖然提高了cpu的處理效能,但也帶來了單個晶片發熱過高和成本過高的問題
  • 但是近年來受限於材料技術的發展,晶片中電晶體的數量增長已經放緩
  • 也就是說,程式已經無法簡單的依賴硬體的提升來提高執行速度
  • 多核cpu的出現則是程式執行速度的另一個方向,硬體增長緩慢的情況下則儘量讓軟體最大化的利用cpu

併發和並行

並行

  • 指兩個或多個程式在同一個時刻執行
  • 並行執行的程式,同一個時刻內都有多個程式在cpu中執行,這要求cpu需要有多核計算能力
  • 多個程式被分配到cpu的不同的核中被同時執行

併發

  • 兩個或多個程式在同一個時間段內執行
  • 單核cpu也可以通過分時複用的方式給多個程式分配一定的執行時間片
  • 多個程式在cpu上被快速輪換的執行,從而在巨集觀上模擬出多個程式同時執行的效果
  • 由於cpu的執行效率非常高,時間片非常短,在各個程式間快速的切換,給人的巨集觀感覺就是好像同時在執行
  • 微觀上實際上同一時刻只有一個程式在執行

核心空間和使用者空間

  • 作業系統會把記憶體空間分為核心空間和使用者空間
  • 核心空間的程式碼能夠直接訪問計算機的底層資源,為使用者空間的程式碼提供計算機底層資源訪問能力
  • 使用者空間為上層應用程式的活動空間,無法直接訪問計算機底層資源,需要藉助 系統呼叫 庫函式 等方式呼叫核心空間提供的資源

程式、執行緒和協程

程式
  • 程式是一個具有獨立功能的程式 關於某個資料集合的一次動態執行過程
  • 是作業系統進行資源分配和排程的基本單位
  • 是應用程式執行的載體,
  • 動態性,結構性,獨立性,併發性,非同步性
執行緒
  • 執行緒則是程式執行過程中的一個單一的順序控制流程
  • 是cpu呼叫和分派的基本單位
  • 執行緒是比程式更小的獨立執行基本單元
  • 一個程式中可以擁有一個或者多個執行緒
  • 執行緒可以分為核心執行緒使用者執行緒
  • 核心執行緒由作業系統管理排程,是核心排程實體,可以直接操作計算機底層資源,充分利用cpu多和平行計算的優勢,執行緒切換時需要cpu切換到核心態,存在一定的開銷,可建立的執行緒數量受作業系統的限制
  • 使用者執行緒由使用者空間的程式碼建立,管理和排程,儲存在使用者空間中,無法被作業系統感知,切換時也無須切換到核心態,切換高效並且開銷小,理可建立的執行緒數量只和記憶體大小相關
協程
  • 協程是一種使用者執行緒,屬於輕量級執行緒(使用者模擬的執行緒)
  • 協程的排程完全由使用者程式碼控制,協程擁有自己的暫存器和棧上下文空間,並儲存在使用者空間。
  • 協程切換時無須切換到核心態,訪問核心空間,切換速度極快,
  • 開發人員需要在使用者空間,處理協程切換時上下文資訊的儲存和恢復,棧空間大小的管理的問題
  • 協程是基於執行緒的,內部實現上,維護了一組資料結構和n個執行緒,真正執行的還是執行緒,協程程式碼被扔進一個待執行佇列中,由執行緒取出來執行,遇到非同步io等操作則儲存當前協程狀態,去執行另外的協程,大概原理就是這樣,利用並封裝額作業系統的非同步函式,比如linux的epoll,select和windows的iocp,event等
  • 缺點是協程的本質是個單執行緒,無法直接利用多核cpu的優勢,需要通過協程和(程式或執行緒)的配合才能來利用多核cpu的能力,比如swoole,是通過協程和程式組合,所以工作worker量一般等於系統的核心數,才會最大化利用系統資源,不過我們日常所編寫的大部分程式都是io密集型應用,協程有一定的提升優勢,不適用於cpu計算密集型應用

歡迎掃碼新增,一起交流哦!

  • 也可以點選公眾號選單或者回復微信獲取

相關文章