然而对于传统的使用C/C++或者Java开发的程序而言,全面支持这种能力是非常复杂的,这种复杂性主要是有由于C/C++ 语言的自身特性所决定的。由C语言开发的程序的运行态,在地址空间中一般都具有4个以上的sections:
- text/代码段 就是程序本身
- data/数据段 用来保存全局变量,静态变量,以及未初始化的变量;
- stack/程序堆栈 用来保存当前线程的临时变量 对于C/C++ 来说它保存了程序的运行状态;
- heap/堆 用来保存程序运行中分配的临时变量;
text 在连接程序完成之后就确定的,对于同一份源程序产生的都是完全一样的。
data 在程序的连接完成之后,它在内存中的位置也已经确定,但是内容可能会随运行态改变。
stack 和 heap 则是完全动态的,而一个运行程序的stack数量和他所具有的thread数量相对应。基本上可以认为这两个段不能够采用认可以预定义——简单替换的方式进行更新,它们的内容对于非运行系统而言是不可知的。
因此为一个处在正在运行中的应用打补丁,需要:
- 不改变text代码段中的函数的入口地址。因为在stack中会保存这些函数的入口地址,如果改变了它们的地址,必将导致程序跑飞。
- 不能改变text代码段中所有已有函数的参数或者调用方式。
- 不能在中间增加数据段中全局变量。因为这将改变已有的全局变量的地址,使代码引用错误的变量。
- 不能简单替换数据段中的变量内容,即不能随意修改源程序中非const全局变量的内容。
Erlang 只有代码段,没有数据段,所有数据都动态,实现这样的功能确实要简单很多。而且 Erlang 又是已虚拟机的方式运行,替换代码段的难度又有所降低。
对于 Erlang 而言,运行时程序更新,这样的功能就算是水到渠成吧!
没有评论:
发表评论