首頁>技術>

引言

1 一個基本的軟體執行結構圖

上圖中,

main 函式在主執行緒中,子執行緒 1 和子執行緒 2 都用來處理任務,任務存放在任務佇列中;

每個任務需要兩個階段才能完成,先經過階段 1 處理,再經過階段 2 處理;

階段 1 需要兩個函式處理,分別是函式 A 和函式 B;

階段 2 需要一個函式處理,即函式 C.

2 函式和佇列如何部署到不同的執行緒上?

說到底,每個執行緒上執行的都是一些基本的功能函式,我們可以把實現某個功能的函式劃分到一個函式集合裡。這個例子中,子執行緒 1 上執行的是函式集合 1,子執行緒 2 上執行的是函式集合 3.

執行緒、函式集合、任務佇列的繫結關係圖

當執行緒上的函式從任務佇列取任務進行處理的時候,我們要明確以下幾點:

同一個任務佇列可以被多個執行緒排程多個執行緒可以排程同一個任務佇列不同的函式集合可以部署在同一個執行緒上同一個函式集合也可以部署在不同執行緒上

執行緒、函式集合、任務佇列的具體繫結關係,我們可以靈活地寫在配置檔案中,比如 json、yaml 等。在程序起來之後,透過載入配置檔案的方式實現資源的部署。為什麼一個執行緒上可以掛多個任務佇列呢?因為任務佇列可以有不同的型別呀,比如說系統任務,使用者業務等。

3 執行緒上的函式如何排程?

在業務執行緒實際執行的過程中,我們只會看到一個個函式,那如何控制函式的執行順序呢?最簡單的一種方案就是狀態機。執行緒每執行一個迴圈,從初始狀態開始,經過中間狀態,到最終狀態結束。任務到達每一種狀態時,就會進行相應的動作處理(即對應了一個有序的函式集合),根據任務處理的結果,選擇需要跳轉的下一個狀態,直到遇到最終狀態,當前任務處理結束。接著,從任務佇列上取下一個任務,迴圈排程。

狀態機迴圈排程任務

4 執行緒起來之後,哪些函式集合會真正執行起來?

前文講到,在部署框架中指定了每個執行緒上需要執行哪些函式集合。但是,當執行緒實際起來之後,我們卻是根據狀態機進行排程,狀態機也指定了每個狀態需要執行哪些動作(也就是函式集合),那我們到底是執行部署框架中定義的函式集合還是執行狀態機中對應的函式集合呢?答案當然是狀態機中對應的函式集合呀。

總結

這篇文章中,我嘗試總結了一種基於多執行緒並行技術下的可靈活編排的軟體架構。這個架構核心的地方有兩點:一是資源部署(即佇列、函式、執行緒的繫結關係);二是基於狀態機原理進行排程,每個狀態處理之後如何選擇下個狀態,直接關係到軟體效能。朋友們,在摩爾定律失效、軟體效能要求越來越高的需求下,你們有更好的軟體架構,能實現 CPU 多核、多執行緒資源的最大化利用及高效的排程框架嗎?期待你的留言。

18
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • JVM生成的3種檔案,你都見過嗎?