软件升级:
加载
调用一个 未加载的文件或者显示的code:load_file/1 函数调用的时候都会 触发erlang代码服务器动态加载代码
热更新
当内存中的程序需要更新的时候, erlang VM 会维持两个版本, 一个是老版本 old , 一个是新版本 new. 热更新时,驻留在旧代码中的执行会继续执行旧的代码而其他情况下执行新的代码。
具体是:当函数调用为非限定调用的时候就使用旧代码, 而在使用M:F(A) 完全限定调用的时候, 就使用新的代码。
这个时候就会出现几个问题,
1. 如果一直调用local 代码是不是就一直不更新了?
2. 如果代码连续修改了两次,现在内存中就会有三个版本v(1) v(2) v(3), 那么如果最初的版本v(1)还在执行会被怎么处理?
用下面的代码来测试一下(代码来自elrang 编程指南)
-module(mod_test).
-export([main/0, loop/0, cal/1, do/1]).
main() ->
register(foo, spawn(mod_test, loop,[])).
loop() ->
receive
{Sender, X} ->
Sender ! {self(),cal(X)}
end,
loop().
do(X) ->
foo ! {self(),X},
receive
{_, Y} ->
Y
end.
cal(X) ->
X + 1.
1> c(mod_test).
{ok,mod_test}
2> mod_test:main() .
true
3> mod_test:do(1).
2
之后修改cal(X) -> X + 2.重新在原来的终端上编译
<
本文介绍了Erlang中的软件升级,特别是热更新机制。在Erlang虚拟机(VM)中,热更新可以同时维持旧版和新版代码,非限定调用使用旧代码,完全限定调用则使用新代码。当代码连续修改导致内存中有多个版本时,系统会杀死执行旧版本的进程。通过实验展示了如何进行热更新,并提到了code模块的相关函数如code:load_file/1和code:purge/1等。

6702

被折叠的 条评论
为什么被折叠?



