認識 Unity C# Job System

一、認識Job System

Unity C# Job System是用於寫多線程代碼的,使用多線程能夠帶來高性能,提高code generation的質量,減少移動設備的耗電量等;

二、什麼是多線程

在單線程計算機系統中,一次只能同時執行一個指令並只能產生一個結果。加載和完成程序的時間取決於需要CPU要做的任務數量;

而多線程則是爲了充分利用CPU通過多核來同時處理多個線程的能力而出現的一種編程類型,任務或命令不再是一個接着一個,而是可以同時進行。

默認情況下有一個線程會在程序開始時運行,就是主線程,主線程創建其它線程處理任務。這些新的線程之間是平行的,而且通常會在完成後向主線程同步它們的結果。

如果有一些任務是需要運行很長時間的(這個時間是指微觀上的很長時間,比如IO操作),那麼用多線程可以提升性能。然而,遊戲開發代碼通常在同一時間包含許多小的命令要執行,如果爲每一個命令都創建一個線程,那就會創建很多線程,而且每個線程執行很短的時間,而創建線程也是需要消耗的,所以,這種方式會限制CPU和操作系統的能力。

爲了減少大量線程頻繁創建銷燬的問題,我們可以使用線程池來解決這個問題;但是即使有了線程池,也可能會出現大量線程同時激活的問題,如果有多餘CPU內核數量的線程存在,就會引起各個線程之間的CPU資源的競爭,從而引起頻繁的上下文切換。上下文切換過程會首先保存一個線程的運行狀態,然後切換到其它線程,然後切回繼續執行,上下文切換是資源密集型操作,應當儘量避免。

什麼是CPU密集型、IO密集型:https://zhuanlan.zhihu.com/p/62766037

原生插件和託管插件: https://abaojin.github.io/2017/02/15/unity-plugins/

三、什麼是Job System

Job System是一種多線程編程框架,可以理解爲何C#提供的多線程模型類似。在job system中,通過創建jobs而不是線程來管理多線程代碼,一個作業系統將通過多核來管理一組工作線程,通常會在每個CPU核上有一個工作者線程(爲了避免上下文切換)。job system會將jobs放入到作業隊列中去執行,作業系統中的工作者線程會從job system中獲得job並執行它們。job system會處理作業之間的依賴並確保以一個合適的順序來執行各個作業。

什麼是Job

一個Job是一個很小的工作單元,用於完成一個具體的任務。一個作業接收參數和數據操作,jobs可以是獨立的,也可以依賴於其它作業的完成再運行。

什麼是Job Dependencies

在複雜系統中,不可能每一個作業都是獨立的。一個作業通常會爲下一個作業準備數據,如果JobA依賴於JobB,那麼Job System就會確保知道JobB完成以後纔開始執行JobA。

四、C# Job System的安全性

Race Condition(競態條件)

多線程代碼通常都會有競態條件的風險,當一個操作的輸出取決於其控制之外的另一個進程的時間時,就會出現競爭。競態條件並非一定是錯誤,可能是不確定行爲的來源。當競爭條件導致錯誤時,很難查找問題的根源,因爲它取決於時間,只能在某些情況下復現。對其進行調試可能會導致問題消失,因爲斷點和日誌記錄可能會更改單個線程的時間。因此,競態條件給多線程編程帶來了巨大的挑戰。

Safety System(安全系統)

爲了簡化多線程編程工作,Unity的C#作業系統會檢測所有潛在的競爭情況,並減少可能引起的錯誤的影響。

例如,如果C#作業系統將主線程中的代碼數據的引用發送到作業,它無法驗證主線程是否在作業寫入它的同時正在讀取數據,這種情況下就產生了競態條件。

C# 作業系統通過向每個作業發送需要對其進行操作的數據的副本(而不是引用)來消除這種競爭情況。

C# 作業系統複製數據的方式意味着作業只能訪問可複製數據類型,在託管代碼和本地代碼之間傳遞時,不需要類型的轉換。

C# 作業系統可以使用memcpy複製可複製類型,並且在託管部分和本地部分轉換數據。它在計劃作業時會通過memcpy將數據放入到本地內存,然後在執行作業時給出託管部分的數據訪問權限。

擴展-什麼是可複製類型

可複製類型

blittable類型是不需要互操作性封送處理程序特別注意的數據類型,因爲默認情況下,它在託管和非託管內存具有通用表示形式。通過將數據固定在內存中,垃圾收集器無法移動,從而可以與非託管應用程序就地共享。這意味着託管代碼和非託管代碼都將以一致的方式更改這些類型的內存位置,並且封送處理程序需要更少的精力來維護數據完整性。

可複製類型

  • System.Byte
  • System.SByte
  • System.Int16
  • System.UInt16
  • System.Int32
  • System.UInt32
  • System.Int64
  • System.UInt64
  • System.IntPtr
  • System.UIntPtr
  • System.Single
  • System.Double

不可複製類型

  • System.Boolean
  • System.Char
  • System.Object
  • System.String

 

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