simulation、emulation、模拟、仿真。这四个名词很容易混淆,刚弄明白,赶紧记下来。
首先,不谈模拟和仿真,先对simulation和emulation进行区分,这是因为这里两个英文单词的界线比两个中文名词的界线要清晰得多。
wiki中关于emulation的解释中提到:
An emulator duplicates (provides an emulation of) the functions of one system using a different system, so that the second system behaves like (and appears to be) the first system. This focus on exact reproduction of external behavior. is in contrast to some other forms of computer simulation, which can concern an abstract model of the system being simulated |
wiki中关于simulation的解释中提到:
A simulator may imitate only a few of the operations and functions of the unit it simulates. Contrast with: emulate |
1965年的Communications of ACM中有一篇论文叫"Emulation of Large Systems",是一个叫Tucker的IBM工程师写的,他们用IBM360来emulate之前的IBM70xx系列机型,里面提到:
A new technique called emulation are discussed ... An emulator is a package that includes both special hardware and a complementary set of software. The package runs in the manner of an interpretive routine simulator program but is about 5 or even 10 times as fast as a purely software simulator |
从上面的资料可以看到,simulation和emulation的区别还是比较明显的。根据我的理解,simulation和emulation都是在制造一个“假象”,但是emulation比simulation要“假”得更完全。
simulation是模拟出原系统的一个抽象模型,而不需要真的去做真实系统要做的事情。因此它其实不具备真实系统的功能,只是当某一功能执行时,通常不必输出功能执行的结果,只是在simulator中记录下由此引发的状态变化。因此它通常用于设计初期的模型验证。
emulation则更进一步,要真正地去做所有真实系统能做的事情,只不过做的“过程”不同,它一般用于处理兼容性问题和在资源有限的条件下完成系统原型的实现。
如果把真实系统比作一个人的话,simulator就是这个人的一幅肖像画,而emulator则是这个人的一个克隆人
举个例子,我们要实现一个p2p文件分发系统。
最开始的时候我们可以实现一个simulator:它用一个函数来模拟节点间的通信,这个函数的输入是网络性能(带宽,跳数...),输出是通信时延————注意,并没有真正的数据在传输和拷贝,甚至都没有真正的节点,我们只是模拟了通信时延这个“特征(feature)”。
接下来,我们把这个分发系统实现了,编译成一个exe文件,但这时我们发现我们没有足够多的计算机来组成一个真实的、具有足够规模的网络来进一步测试(通常p2p网络的节点数成百上千),这时,我们可以写一个emulator:它可以区分同一个计算机上的不同进程,因此我们可以在一台计算机上开100个进程,这样可以用100台计算机模拟出10000台计算机的网络————注意,此时数据真的是通过Socket在传输,只不过有的数据走的是loopback口,并没有真的进网卡。
有一种流行的说法是,simulation是用软件实现,emulation要涉及到硬件实现的部分。这个区分很简单明了,在很多情况下也是适用的(包括上面举的p2p分发系统的例子)。但是这种说法只是对于大多数情况的一种归纳性解释,因此在某些情况下就无法区分二者了。比如,这种解释无法区分Operating System Emulator和Operating System Simulator————这个时候二者都不涉及硬件,这是因为真实系统(Operating System)本身就不涉及硬件。
再说说“模拟”与“仿真”。首先,即使在正式场合下(如论文标题),{模拟,仿真}和{simulation,emulation}这两个集合并不是一一映射的。你可以看到"模拟-simulation"的组合,也可以看到"仿真-simulation"的组合。显然,这个不一致现象是由于同时存在两种一一映射造成的。这个问题不是说理能解决的,还得随着使用次数越来越大,看大多数人的习惯。个人感觉,simulation翻译成“模拟”,而emulation翻译成“仿真”的情况多一些。
最后,提一下“虚拟”这个概念。这个概念最近火的不行,英文名叫virtualization。我还没有仔细调查它和前两个概念的细微差别,但是可以肯定的是,virtualization和emulation比较相似,和simulation不是一回事。其他的,以后查到再补进来吧。