動態裝載
此條目可參照英語維基百科相應條目來擴充。 (2018年5月27日) |
動態裝載,別稱動態加載(英語:Dynamic Loading)是一種程序運行機制,能讓計算機程序在運行時(而不是編譯時)裝載庫(或者其他二進制對象)到內存中,然後檢索庫中函數和變量的地址,並執行這些函數或訪問這些變量,且能在不需要時將庫從內存中卸載。動態裝載、靜態鏈接(static linking)與動態鏈接(dynamic linking)(注意區分動態裝載與動態鏈接的微妙差別)是複用其他軟件代碼的三種機制,不同於靜態鏈接和動態鏈接,這種機制允許計算機程序在沒有某些庫的情況下啟動,然後在運行的過程中發現可用的庫從而獲得額外的功能。
歷史沿革
[編輯]動態裝載早在1960年代的IBM/360操作系統中就已經廣泛使用,尤其是在輸入/輸出子模塊,以及COBOL和PL/I的運行時庫中。裝載的過程對於應用程序開發者是透明的,主要由操作系統或者輸入輸出子系統自動處理。這樣做的好處有:
- 修復子系統漏洞時只需要打一次補丁即可,而不需要重新鏈接
- 程序庫可以免於被胡亂修改而造成嚴重影響
IBM於1970年代開發的戰略性事務處理操作系統CICS中,不僅在普通應用程序級別上使用了動態加載,甚至在內核級別都廣泛採取這種機制,這使得用戶可以在不用重啟CICS操作系統的前提下,就可以對應用程序做任何級別的漏洞修復。
應用
[編輯]動態裝載經常用於插件。[1][Apache http服務器的例子待補充翻譯]
熱部署
[編輯]熱部署(英:Hot deployment)是,服務器不需要重啟的情況下,修改軟件或者軟件。[2]
編程語言
[編輯]C/C++
[編輯]並非所有作業系統都支持動態裝載。類UNIX作業系統通過C編程語言實作而成的dl庫提供該類功能。在微軟的視窗作業系統採用Windows應用程序接口。
類UNIX系統[3][4] | 視窗系統 | |
---|---|---|
申明 | dlfcn.h | windows.h |
定義 | libdl | kernel32.dll |
裝載庫 | dlopen | LoadLibrary LoadLibraryEx |
解析庫 | dlsym | GetProcAddress |
卸載庫 | dlclose | FreeLibrary |
Java
[編輯]
對於Java語言而言,類的動態裝載是通過類加載器(ClassLoader
)該對象進行實現的。示例如下:
Class type = ClassLoader.getSystemClassLoader().loadClass(name);
Object obj = type.newInstance();
通過反射機制的方式,我們可以加載仍舊未被載入類。並通過下面例子,進行操作加載成功的類。
Class type = Class.forName(name);
Object obj = type.newInstance();
當我們想要卸載一個類,很遺憾,至今沒有一種簡單的並且程序可控制的的方法(不存在原生方法)。打個比方,當開發者有這樣的需求時——正在使用的類加載器(ClassLoader
)不是系統類加載器,同時該加載器又無法被卸載,而你又想要卸載掉類。 此時,開發者就不得不了解機制細節,否則就無法確認類是否真的被卸載。這樣的操作十分麻煩。
參考資料
[編輯]- ^ Autoconf, Automake, and Libtool: Dynamic Loading. [2019-12-19]. (原始內容存檔於2020-02-24).
- ^ Hot deployment and dynamic reloading. (原始內容存檔於2019-12-19).
- ^ dlfcn.h. The IEEE and The Open Group. [2013-12-15]. (原始內容存檔於2019-10-08) (英語).
- ^ David A. Wheeler. Program Library HOWTO. The Linux Documentation Project. 2003-04-11 [2013-12-15]. (原始內容存檔於2020-11-12) (英語).