0

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

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

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

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

例子

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

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

4

1 回答 1

1

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

您正在描述如何创建一个容错系统,这与在运行时替换代码(在动态软件更新或 DSU 中已知)完全不同。事实上,在 Erlang 中,您可以让一个进程监控其他进程,如果一个进程失败,它将把工作迁移到另一个进程,以保持系统按预期运行。请注意,DSU 不用于实现容错。它们是具有不同目的的不同功能。

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

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

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

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

除了上面讨论的容错之外,Erlang 还使您能够执行DSU 。有关详细信息,请参阅此Erlang 编写论文

有许多方法可以实现 DSU。由于您对 JIT 编译器感兴趣并假设“JIT 编译器”是指不仅编译 IL 代码而且分配可执行内存并使用二进制代码地址修补函数调用的组件,我将讨论如何在 JIT 中实现 DSU环境。JIT 编译器必须支持以下两个特性:

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

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

于 2016-01-01T20:25:58.857 回答