2007/02/28

Erlang 的运行时更新

Erlang 作为电信级开发语言,在设计之初就有了在运行时自动更新程序,也就是不停机打patch的能力。 首先这种功能对于电信级别的程序来说,是非常必要的,如果不能做到这个5个9基本上就是空谈了。

然而对于传统的使用C/C++或者Java开发的程序而言,全面支持这种能力是非常复杂的,这种复杂性主要是有由于C/C++ 语言的自身特性所决定的。由C语言开发的程序的运行态,在地址空间中一般都具有4个以上的sections:
  1. text/代码段 就是程序本身
  2. data/数据段 用来保存全局变量,静态变量,以及未初始化的变量;
  3. stack/程序堆栈 用来保存当前线程的临时变量 对于C/C++ 来说它保存了程序的运行状态;
  4. heap/堆 用来保存程序运行中分配的临时变量;

text 在连接程序完成之后就确定的,对于同一份源程序产生的都是完全一样的。
data 在程序的连接完成之后,它在内存中的位置也已经确定,但是内容可能会随运行态改变。
stack 和 heap 则是完全动态的,而一个运行程序的stack数量和他所具有的thread数量相对应。基本上可以认为这两个段不能够采用认可以预定义——简单替换的方式进行更新,它们的内容对于非运行系统而言是不可知的。

因此为一个处在正在运行中的应用打补丁,需要:
  1. 不改变text代码段中的函数的入口地址。因为在stack中会保存这些函数的入口地址,如果改变了它们的地址,必将导致程序跑飞。
  2. 不能改变text代码段中所有已有函数的参数或者调用方式。
  3. 不能在中间增加数据段中全局变量。因为这将改变已有的全局变量的地址,使代码引用错误的变量。
  4. 不能简单替换数据段中的变量内容,即不能随意修改源程序中非const全局变量的内容。
然而对于C/C++程序而言,如果需要不停机打patch,这是最基本的要求。而在实际工作中,很难要求所有的fix都满足上面的要求! 其实也能做,但是代价太高了~~~。

Erlang 只有代码段,没有数据段,所有数据都动态,实现这样的功能确实要简单很多。而且 Erlang 又是已虚拟机的方式运行,替换代码段的难度又有所降低。

对于 Erlang 而言,运行时程序更新,这样的功能就算是水到渠成吧!
发表评论