软件升级:
加载
调用一个 未加载的文件或者显示的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:mai