Marshalling (電腦科學)

marshalling可譯作集結、結集、編碼、編組、編集、安整、數據打包、列集等,是電腦科學中把一個對象的主記憶體表示變換為適合儲存或傳送的數據格式的過程。典型用於數據必須在一個程式的兩個部分之間移動,或者必須從一個程式移動到另一個程式。Marshalling類似於序列化,可用於一個對象與一個遠端對象通訊。逆過程被稱作unmarshalling

用途

Marshalling被用於實現不同的遠端程序呼叫(RPC)機制,這必須用到行程間的數據傳輸。stub必須把程式主記憶體空間的本地格式的數據轉換為網絡數據表示英語Network Data Representation格式(NDR,常稱為數據的線上格式),這種轉換被稱為marshaling數據。當客戶端或伺服器接受數據,必須從NDR格式把數據轉換為程式的本地格式,這稱為unmarshaling數據。[1]

Microsoft的組件對象模型(COM)中,當跨COM的套間(apartment)傳遞介面指標時,介面指標必須被marshalled。[2][3].NET Framework下,在非受管(unmanaged)類型與CLR類型間,例如P/Invoke過程,必須做marshalling。[4]例如,C#程式呼叫C語言寫的DLL,其中函數參數使用字串,就需要做marshalling。

使用Mozilla應用程式框架XPCOM的指令碼或應用程式,廣泛使用marshalling。

例子

Microsoft Windows系列作業系統,Direct3D裝置驅動程式是內核態驅動程式。DirectX執行時處理用戶態API。用戶態執行系統呼叫來執行內核態操作,需要CPU切換為內核態,這將耗費微秒級的時間來完成。[5]在此期間,CPU不能執行任何操作。為最佳化效能,必須極小化CPU這種模式切換。 Linux OpenGL驅動程式分為兩部分:內核驅動與用戶空間驅動。用戶空間驅動把所有OpenGL命令翻譯為機械碼提交給GPU。為減少系統呼叫,用戶空間驅動實現marshalling。當GPU的命令緩衝區(command buffer)裝滿了繪圖數據,API簡單地把請求繪製的呼叫存放在一個臨時緩衝區;當命令緩衝區接近為空,執行內核模式切換一次性增加被儲存的命令。

與序列化的比較

序列化一個對象意味着把它的狀態轉化為位元組流,使這個位元組流能反向轉化為該對象的一個副本。

術語「marshal」被Python標準庫認為與「序列化」同義。[6] 但與Java相關的RFC 2713不認為二者是同義:

"marshal"一個對象意味着記錄下它的狀態與codebase(s)[note 1]在這種方式,以便當這個marshal對象在被"unmarshalled"時,可以獲得最初代碼的一個副本,可能會自動裝入這個對象的類別定義。可以marshal任何能被序列化或遠端(即實現java.rmi.Remote介面)。Marshalling類似序列化,除了marshalling也記錄codebases。Marshalling不同於序列化是marshalling特別處理遠端對象。

——Schema for Representing Java(tm) Objects in an LDAP Directory (RFC 2713)[7]

參見

註釋

  • ^note 1 此處使用的「Codebase」在Java相關的涵義下,指可裝入對象代碼的URL的列表。不是一般意義上存放原始碼的codebase英語codebase

參考文獻

  1. ^ MSDN:"Aliasing and Marshaling Attributes". [2018-12-05]. (原始內容存檔於2019-03-28). 
  2. ^ Apartments and COM Threading Models. [2018-01-20]. (原始內容存檔於2015-09-23). 
  3. ^ CoInitializeEx function (COM). Windows Desktop App Development. [2013-02-22]. (原始內容存檔於2017-07-12). 
  4. ^ Interop Marshaling Overview. [2018-01-20]. (原始內容存檔於2016-11-29). 
  5. ^ Code Quality: The Open Source Perspective. [2018-01-20]. (原始內容存檔於2020-12-19). 
  6. ^ marshal — Internal Python object serialization. Python Software Foundation. [4 November 2016]. (原始內容存檔於2012-10-14). 
  7. ^ Schema for Representing Java(tm) Objects in an LDAP Directory. IETF. October 1999 [4 November 2016]. (原始內容存檔於2020-01-20).