協程、執行緒與程式

發表於2018-06-29

協程、執行緒、程式等概念是我們作為開發人員經常會聽到的一些詞。本文就這些概念做了一些淺陋的研究,希望能夠拋磚引玉。 在講解執行緒,協程之前首先需要了解一些基礎的計算機概念

核心:在現代作業系統中,往往將一些基本的、公共的、執行頻率高的模組以及關鍵資料結構獨立開來,使其常駐記憶體,這一部分被稱為核心。核心是基於硬體的第一層軟體封裝,它控制著計算機的硬體資源,負責管理程式、記憶體、檔案網格系統、裝置驅動程式等,為上層的應用提供安全的硬體訪問。上層應用程式通過核心提供的介面訪問硬體資源,這些介面被稱為系統呼叫。

特權級:一種保護資料安全、阻止惡意行為的機制。作業系統提供不同的許可權來訪問對應級別的資源。從系統的安全性和穩定性考慮,使用者的應用程式不能直接訪問硬體資源,一些危險的指令只有作業系統可以執行,此外特權級也可以防止一些應用程式濫用其他程式的資源。0級特權可以訪問計算機硬體資源,3級特權一般是給應用程式使用的,可以呼叫基本的cpu指令。

核心態和使用者態:當一個程式執行系統呼叫執行核心程式碼的時候,程式就處於核心態。程式執行使用者自己的程式碼的時候,稱為使用者態。核心態執行在0級特權,使用者態執行在3級特權

程式、程式、執行緒、協程:

  1. 程式:一組資料和指令的集合。
  2. 程式:執行中的程式例項,是一個動態的概念。每個程式有自己獨立的地址空間。
  3. 執行緒:屬於程式,是cpu的基本排程單位,執行緒用於處理併發邏輯,擁有獨立的棧。
  4. 協程:輕量的使用者態執行緒。
  5. 排程:一個方法,決定接下來哪個上下文可以獲取cpu時間

舉例描述,我們桌面上的應用A是程式,它是由指令和資料構成的集合,當我們開啟應用A時,就可以在任務列表裡面看到一個應用A的程式,每次開啟都會有一個唯一的程式Id標識該程式。如果我們開啟另外一個應用B,就會產生一個應用B的程式,試想一下,如果程式之間的記憶體空間是可以共享的,那麼B執行時可能就會發現記憶體中多了很多A的變數(B表示一臉懵逼),應用程式之間的資料就會遭到汙染,嚴重的話應用的一些使用者登入資訊甚至可能被惡意程式獲取,所以每個程式都會有獨立的記憶體空間,程式之間的資料是不可以直接訪問的。最初作業系統中能夠擁有資源和獨立執行的基本單位是程式,由於程式建立、撤銷以及切換的開銷太大,所以出現了執行緒。執行緒是cpu的基本排程單位,它基本不佔用系統資源(只佔有極少數的保證執行必不可少的資源),因此執行緒的切換等操作都比程式快很多,無論是核心的執行緒還是應用程式的執行緒,它們的建立、切換和撤銷等操作都是由核心實現,線上程切換的過程中,程式為了管理需要從使用者態切換到核心態,還是會消耗資源,協程就是為了解決這個問題而出現的。協程是通過語言級別的排程演算法實現的,程式自己控制著現成的切換,程式不需要進入核心態,協程就是輕量的使用者態執行緒

程式與執行緒的區別:

  1. 地址空間和其他資源:程式之間互相獨立,同一程式的各執行緒之間共享
  2. 通訊:程式之間通過管道、訊息佇列、旗語、共用記憶體以及套子節等方法通訊(IPC),執行緒之間可以直接讀取資料(如全域性變數)通訊

執行緒有三種狀態:等待態(阻塞態)、就緒態、執行態。基本操作如下:

  1. 派生:執行緒在程式中派生出來,可以有執行緒或者程式派生
  2. 阻塞:如果一個執行緒需要等待某個事情發生才能執行,則被阻塞,執行緒處於等待態
  3. 啟用:如果阻塞執行緒的事件發生,則被啟用,執行緒處於就緒態
  4. 排程:選擇一個就緒態執行緒進入執行狀態,該執行緒進入執行態。
  5. 結束:如果一個執行緒結束,它的暫存器上下文以及堆疊內容等將被釋放

相關文章