simulation 与 emulation 的区别(转)
simulation 与 emulation 的区别
解释一:
模拟(Simulation)即选取一个物理的或抽象的系统的某些行为特征,用另一系统来表示它们的过程。模拟技术的高级阶段称为仿真模拟(Emulation)、系统仿真,即用一数据处理系统来全部或部分地模拟某一数据处理系统,以致于模仿的系统能想被模仿的系统一样接受同样的数据、执行同样的程序、获得同样的结果。
解释二:
仿真 (Emulation) 是试图模仿一个设备的内部设计;模拟 (Simulation) 是试图模仿一个设备的功能。
解释三:
Emulation:When one system performs in exactly the same way as another, though perhaps not at the same speed. A typical example would be emulation of one computer by ( a program running on) another. You migh use emulation as a replacement for a system whereas you would use a simulation if you just wanted to analyse it and make predictions about it.
Simulation: Attempting to predict aspects of the behaviour of some system by creating an approximate (mathematical) model of it. This can be done by physical modelling, by writing a special-purpose computer program or using a more general simulation package, probably still aimed at a particular kind of simulation (e.g. structural engineering, fluid flow). Typical examples are aricraft flight simulators or electronic circuit simulators. A great many simulation languages exist, e.g. {Simula}
解释四:
Simulation,是指用软件去模拟某个系统的功能,并不要求实现该系统的内部细节,只要在同样的输入下,软件的输出和所模拟系统的输出一致就可以了。比如你在 PC 机上用一个软件去 simulate 红白机的游戏 “超级玛莉”,你只要让你的软件运行出来的效果和红白机上 “超级玛莉” 游戏一样就可以,至于这个软件你是怎么实现则无关紧要。
Emulation,是指用软件去模拟出某个系统中各个部件的组成,真实地模拟出系统的运行机制。这就要求软件的作者需要非常了解所模拟系统的内部结构,能够利用各种数据结构实现出各个部件的模型。同样去 emulate 红白机的游戏 “超级玛莉”,首先就要用软件模拟出红白机中的各种硬件,如 CPU、内存、图形处理芯片、声音处理芯片以及游戏手柄等,再通过将加载游戏的 ROM 来运行该游戏。现在各种游戏模拟器,如 MAME、VirtualNes 都是采用 emulation 的手段去实现游戏的模拟,所以它们又叫做 emulator。
模拟就是指用在某个平台上用纯软件的方法去模拟另一个平台上程序的运行,模拟包含 “Simulation” 和 “Emulation”,通过上面对这两者的分析大家可以知道,“Simulation” 是一种高层次上的模拟,类似于 “黑盒”,而 “Emulation” 更注重于对底层的模拟,类似于 “白盒”。
仿真的解释就比较多了,有的说仿真是指用机器底层的微指令来解释执行另一个平台的指令,有的说仿真是软件结合硬件来模拟另一种平台程序的运行,即 “硬件仿真 + 软件模拟”。其实这两者是针对不同仿真对象和宿主平台而言的:前者具体的是讲系统仿真,是以大型机 CPU(现在也可以指 PC 机)为仿真对象的,通常在研制 CPU 的过程中,用宿主机的 CPU 去仿真其软件的运行,这样可以使硬件和软件的研发过程同步,加快整体系统的研发进度;后者一般指嵌入式仿真,做过嵌入式开发的朋友都知道,开发过程中经常要用仿真器去调试程序,我们可以在 PC 机上调试嵌入式系统中的某个程序,通过仿真器向嵌入式微控制器发送调试信号(如 JTAG),使微控制器执行某条指令,而 PC 机上会相应地显示出该条指令执行的结果,看上去似乎是 PC 在 “执行” 这条指令一样,这样来达到仿真的目的。但不管怎样,仿真总是与硬件相关的,这一点与模拟是有区别的。
现在还出现了 “虚拟机” 一词,在我看来,虚拟机更多地采用了模拟技术,而不是仿真,但是虚拟机相对于一个模拟器而言要复杂很多,像 Bochs 这样的虚拟机实质上应该是一个 emulator,而像 VirtualPC、VMWare 和 VirtualBox 这样的虚拟机,则采用了更为复杂的技术,既有 simulation,也有 emulation,甚至还有系统仿真,所以不能单纯地将它认为是一个模拟器。
解释五
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 不是一回事。其他的,以后查到再补进来吧。
解释七
维基百科上对仿真器 (emulator) 和模拟器 (simulator) 的解释如下:
仿真器(Emulator),又称仿真程序,在软件工程中指可以使计算机或者其他多媒体平台(掌上电脑,手机)能够运行其他平台上的程序,常被错误的称为模拟器。仿真器多用于电视游戏和街机,也有一些用于掌上电脑。仿真器一般需要 ROM 才能执行,ROM 的最初来源是一些原平台的 ROM 芯片,通过一些手段将原程序拷贝下来(这个过程一般称之为 “dump”)然后利用仿真器加载这些 ROM 来实现仿真过程。 ()
直观解释这两者的区别,可以比较 Palm Os 的仿真器 (emulator) 和模拟器 (simulator) 。
Palm Os 的仿真器 (emulator)
Palm Os 仿真器 (emulator) 显得更真实一些,在使用中,需要载入实际 Palm 上的 ROM 文件,而且,从外观,界面到操作上,也逼真地再现实际 Palm。可以说,仿真器 (emulator) 就是一个用软件实现的 Palm PDA.
Palm Os 的模拟器 (simulator) 的使用相对比较简单一些,也可以测试和实现 Palm 上的绝大多数功能。
解释八
Simulator 纯粹以软件来模拟源平台的功能和运行结果;Emulator 以软件和硬件来模拟源平台的内部设计、行为和运行结果。
举例来说:
有使用硬件来模拟的,都是 Emulator。比如基于单片机的模拟。(什么是叫使用硬件模拟?比如模拟源平台的 Timer/PPU/SPU, 直接使用目标平台的 Timer/PPU/SPU,那么就是硬件模拟)。
一般的,在 PC 上运行的模拟器都叫 Simulator,常见的是模拟 LCD 的显示画面;在嵌入平台上运行的模拟器都是 Emulator,因为在嵌入平台运行的话,为了提高效率,都会以对应的硬件模块来模拟源平台。
PC 上的模拟器如果模拟其内部设计、行为,比如读取 ROM 文件,精确中断、异常,OS 等都是 Emulator。
解释九
Simulator 都是软件,Emulator 有硬有软也可以软硬结合
比如 pc 上常说的 GBA、PS 游戏模拟器,严格意义上讲,应该是仿真器才对!它从二进制 rom 文件中取出一行行电视游戏机 CPU 的机器码,识别后再仿真该游戏机 cpu 的行为。即在 PC 上仿真执行其他 CPU 的机器码,称之为 binary level 仿真,因为它是直接执行机器码。
下次你再见到什么 “wm 模拟器”、“iphone 模拟器”,一定要对它有深入理解,知道它是否真的仿真到机器码的级别才能给出它真正的名字。因为我对他们不了解,所以我也不敢妄下结论。
总的来说,接触仿真器(emulator)的机会更多一些,我一时居然想不到有什么著名的开发用的真正的模拟器(simulator)
另外就是硬件仿真器,MDK 的 debug 选项下有两个选择
左上的 use simulator,指使用软件仿真。
右上的 ULINK 指使用实时仿真器,即硬件仿真器。ADS 下使用另外一种实时仿真器叫 ICE (In Circuit Emulator,ICE)。
经常看见这两个词,很容易混淆,按我的理解如下:
Simulator 是模拟目标系统的功能和行为。Simulator 和目标系统看上去是一样的。
Emulator 是模拟目标系统的底层接口。目标系统直接运行于 Emulator 之上。