動態裝載,别称动态加载(英語:Dynamic Loading)是一種程序運行機制,能讓計算機程序在運行時(而不是編譯時)裝載(或者其他二進制對象)到內存中,然後檢索庫中函數變量的地址,并執行這些函數或訪問這些變量,且能在不需要時將庫從內存中卸載。動態裝載、靜態鏈接(static linking)與動態鏈接(dynamic linking)(注意區分動態裝載與動態鏈接的微妙差別)是複用其他軟件代碼的三種機制,不同於靜態鏈接和動態鏈接,這種機制允許計算機程序在沒有某些庫的情況下啟動,然後在運行的過程中發現可用的庫從而獲得額外的功能。

歷史沿革 编辑

動態裝載早在1960年代的IBM/360操作系統中就已經廣泛使用,尤其是在輸入/輸出子模塊,以及COBOLPL/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 )不是系统类加载器,同时该加载器又无法被卸载,而你又想要卸载掉。 此时,开发者就不得不了解机制细节,否则就无法确认类是否真的被卸载。这样的操作十分麻烦。

參考資料 编辑

  1. ^ Autoconf, Automake, and Libtool: Dynamic Loading. [2019-12-19]. (原始内容存档于2020-02-24). 
  2. ^ Hot deployment and dynamic reloading. (原始内容存档于2019-12-19). 
  3. ^ dlfcn.h. The IEEE and The Open Group. [2013-12-15]. (原始内容存档于2019-10-08) (英语). 
  4. ^ David A. Wheeler. Program Library HOWTO. The Linux Documentation Project. 2003-04-11 [2013-12-15]. (原始内容存档于2020-11-12) (英语).