跳至內容

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).