fbpx
维基百科

動態裝載

動態裝載,别称动态加载(英語: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) (英语). 

動態裝載, 此條目可参照英語維基百科相應條目来扩充, 2018年5月27日, 若您熟悉来源语言和主题, 请协助参考外语维基百科扩充条目, 请勿直接提交机械翻译, 也不要翻译不可靠, 低品质内容, 依版权协议, 译文需在编辑摘要注明来源, 或于讨论页顶部标记, href, template, translated, page, html, title, template, translated, page, translated, page, 标签, 别称动态加载, 英語, dynamic, loading, 是一種. 此條目可参照英語維基百科相應條目来扩充 2018年5月27日 若您熟悉来源语言和主题 请协助参考外语维基百科扩充条目 请勿直接提交机械翻译 也不要翻译不可靠 低品质内容 依版权协议 译文需在编辑摘要注明来源 或于讨论页顶部标记 a href Template Translated page html title Template Translated page Translated page a 标签 動態裝載 别称动态加载 英語 Dynamic Loading 是一種程序運行機制 能讓計算機程序在運行時 而不是編譯時 裝載庫 或者其他二進制對象 到內存中 然後檢索庫中函數和變量的地址 并執行這些函數或訪問這些變量 且能在不需要時將庫從內存中卸載 動態裝載 靜態鏈接 static linking 與動態鏈接 dynamic linking 注意區分動態裝載與動態鏈接的微妙差別 是複用其他軟件代碼的三種機制 不同於靜態鏈接和動態鏈接 這種機制允許計算機程序在沒有某些庫的情況下啟動 然後在運行的過程中發現可用的庫從而獲得額外的功能 目录 1 歷史沿革 2 应用 2 1 热部署 3 编程语言 3 1 C C 3 2 Java 4 參考資料歷史沿革 编辑動態裝載早在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 LoadLibraryLoadLibraryEx解析庫 dlsym GetProcAddress卸載庫 dlclose FreeLibraryJava 编辑对于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 英语 取自 https zh wikipedia org w index php title 動態裝載 amp oldid 74532497, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。