erlang 软件升级

软件升级:

加载

调用一个 未加载的文件或者显示的code:load_file/1 函数调用的时候都会 触发erlang代码服务器动态加载代码

热更新

当内存中的程序需要更新的时候, erlang VM 会维持两个版本, 一个是老版本 old , 一个是新版本 new. 热更新时,驻留在旧代码中的执行会继续执行旧的代码而其他情况下执行新的代码。
具体是:当函数调用为非限定调用的时候就使用旧代码, 而在使用M:F(A) 完全限定调用的时候, 就使用新的代码。
这个时候就会出现几个问题,
1. 如果一直调用local 代码是不是就一直不更新了br> 2. 如果代码连续修改了两次,现在内存中就会有三个版本v(1) v(2) v(3), 那么如果最初的版本v(1)还在执行会被怎么处理p>

用下面的代码来测试一下(代码来自elrang 编程指南)

1> c(mod_test).
{ok,mod_test}
2> mod_test:main() .
true
3> mod_test:do(1).
2

之后修改cal(X) -> X + 2.重新在原来的终端上编译

4> c(mod_test).
{ok,mod_test}
5> mod_test:do(1).
2

我们看到并没有完成热更因为使用了非完全调用。
所以第一个问题的答案是一直不更新。

之后修改cal(X) -> X + 3. 重新编译执行,

14> mod_test:do(1).
** exception error: bad argument
in function mod_test:do/1 (mod_test.erl, line 16)

发现foo进程不存在, 所以第二个问题,内存中有三个版本时,系统 会杀死正在执行旧版本的进程。

我们还可以将loop() 函数改成为完全限定试一下。
发现会在完全限定函数调用的时候改变成新的版本

但是即便会用新的版本, 在热更新的时候也只能更新逻辑,而不是内存中的数据结构,因为我们影响的只是代码区

一些相关函数

code:purge(Module) %% 删除旧版本的文件
code:load_file(Module) %% 载入module 模块到内存
code:soft_purge(Module) %% 相似于purge函数,但是只有在没有任何进程运行那块代码的时候

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年3月11日
下一篇 2016年3月12日

相关推荐