是否可以在运行时使用可执行内存堆和分布式系统进行修补程序?

时间:2015-12-15 10:31:47

标签: runtime execution jit hotfix

我一直在寻找JIT的一些教程,并在运行时分配大量可执行内存。这主要是一个概念性的问题,所以如果我出错了,请纠正我。

如果我理解正确,JIT利用运行时解释器/编译器输出本机或可执行代码,如果是本机二进制,则将其放在内存中的可执行代码堆中,这是特定于操作系统的(例如VirtualAlloc( )对于Windows,mmap()用于Linux)。

此外,像Erlang这样的语言可以有一个分布式系统,每个部分彼此分开,这意味着如果一个失败,其他语言可以模块化的方式解释这种情况,这意味着模块也可以切换如果管理得当,可以随意进出,而不会影响整体执行。

使用运行时编译器或某种代码传递机制,在运行时任意加载代码以替换可以更新的代码模块是不可行的?

实施例

假设我有一个{T}或T运行的sort(T, T)函数。现在,假设我在运行时加载了merge_sort(T,T)函数。如果我实现了一种分类帐或注册系统,以便第一个sort(T,T)的用户可以重新分配自己使用新的merge_sort(T,T)函数并检测所有用户何时调整自己,那么我应该能够解除分配并从内存中删除sort(T,T)

这基本上听起来很像JIT,但对我而言,吸引人的部分是你可以在运行时为模块任意更换代码的方面。这样,当一个系统没有满载时,每个模块都在使用,模块可以自动切换到新代码,如果需要,等等。从理论上说,这不是一种实现补丁的方法,如果程序可以在各个模块中静默地交换代码,那么使用程序的用户永远不必“重新启动”程序?我想大得多的分布式系统可以利用这个,但那些较小的系统呢?

1 个答案:

答案 0 :(得分:1)

  

此外,某些语言(如Erlang)可以使用分布式系统   这样每个部分彼此分开,意味着如果一个   失败,其他人可以模块化的方式解释这种情况,   这意味着模块也可以随意切入和切换   在不影响整体执行的情况下正确管理。

您正在描述如何创建容错系统,这与在运行时替换代码完全不同(在Dynamic Software Update或DSU处已知)。实际上,在Erlang中,您可以让一个进程监视其他进程,如果一个进程失败,它会将工作迁移到另一个进程,以保持系统按预期运行。请注意,DSU不用于实现容错。它们具有不同的用途。

  

假设我有一个在T或T上运行的排序(T,T)函数。现在,假设   我有一个merge_sort(T,T)函数,我已在运行时加载。如果我   实现一种分类帐或注册系统,使用户   第一个排序(T,T)可以重新分配自己使用新的merge_sort(T,T)   功能和检测所有用户自己调整后,我应该   然后能够从内存中释放并删除sort(T,T)。

这称为DSU,用于执行以下任何任务,而无需关闭系统:

  • 修复一段代码中的一个或多个错误。
  • 修补安全漏洞。
  • 使用更高效的代码。
  • 部署新功能。

因此,任何应用或系统都可以使用DSU,以便它可以执行这些任务而无需重新启动。

如上所述,除了促进容错之外,Erlang还允许您执行DSU。有关详细信息,请参阅此Erlang write paper

有很多方法可以实现DSU。因为您对JIT编译器感兴趣并假设通过" JIT编译器"你的意思是组件不仅编译IL代码,而且还分配可执行内存和补丁函数调用二进制代码地址,我将讨论如何在JIT环境中实现DSU。 JIT编译器必须支持以下两个功能:

  • 在运行时获取或创建新二进制代码的能力。如果您有IL代码,则无需分配可执行内存,因为必须进行编译。
  • 能够用新的代码替换一段IL代码(可能已被JIT)或二进制代码。

显然,使用这两个功能,您可以在单个功能上执行DSU。交换整个模块或库需要交换该模块导出的所有函数和全局变量。