程式執行緒協程關係
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計算密集型應用
歡迎掃碼新增,一起交流哦!
- 也可以點選公眾號選單或者回復微信獲取