验证/仿真
仿真器和模拟器经常被混淆,两者有些许相似,但是是两个不同的概念,本文为大家带来仿真器和模拟器的区别简单分析。
模拟器(simulator)是用于分析研究目标系统本身,模拟器系统本身要跟目标系统保持一致。例如飞行模拟器对于用户来讲其本身要跟真正的飞机一致;再比如gem5模拟器,其本身要跟CPU所有内部行为一致(包括内部运行原理都要一致)。好的模拟器本身也可以仿真其目标系统,但不是所有模拟器都有这个特性。
仿真器(emulator)的目的是作为目标系统的替代品,可以完全替代目标系统,完成其对外的功能,即仿真器系统只需要保证呈现给外部的行为跟目标系统一致(不需要保证内部运行原理一致)。例如想在电脑上玩小时候玩的街机游戏,就需要在电脑上安装一个街机仿真器(虽然很多人喜欢称其为“街机模拟器”)。使用仿真器的目的是模拟目标系统呈现出的运行环境,仿真器保证的是完成目标系统相同的行为,不在乎其内部实现原理,再例如EMU8086仿真器,可以在另一台非8086电脑上仿真8086微处理器的行为。即使再好的仿真器也不能作为模拟器用于研究目标系统内部运行原理。
针对gem5,其本身是一个CPU模拟器,但是因为其也能做到仿真器可以完成的工作(gem5运行于Atmoic模式), 尽管其运行速度相比真正CPU差很多,也可以认为其是一个类似于EMU8086的CPU仿真器。但是尽管gem5运行于乱序(Out Of Order, 简称O3)时,gem5可以被看做CPU模拟器,其内部模拟的CPU各个模块也不是完全一样,所以也可以任务,gem5是由仿真多个部件的仿真器构成的。总之,模拟器针对目标系统内部进行模拟,仿真器用于仿真目标系统对外的行为。
在线仿真器ICE(In Circuit Emulator)能检查运行程序的处理器的状态。实际上,ICE取代了(或仿真了)目标板上的处理器,是一种强有力的工具。程序在ICE中可以实时运行、调试。 模拟器(simulator)是完全基于主机程序的。它模拟了目标处理器的功能和指令系统,其用户界面通常和仿真器的一样或比较类似。模拟器最大的缺点是它仅能模拟处理器,而嵌入式系统经常包含一个或更多重要的外围部件。模拟器无能为力而且不能实时运行程序。它只能起辅助作用进行软件粗调试,是纯软件的工具;而仿真器是硬件工具。
模拟器是模拟出原系统的一个抽象模型,而不需要真的去做真实系统要做的事情。因此它其实不具备真实系统的功能,只是当某一功能执行时,通常不必输出功能执行的结果,只是在simulator中记录下由此引发的状态变化。因此它通常用于设计初期的模型验证。
仿真器则更进一步,要真正地去做所有真实系统能做的事情,只不过做的“过程”不同,它一般用于处理兼容性问题和在资源有限的条件下完成系统原型的实现。
如果把真实系统比作一个人的话,simulator就是这个人的一幅肖像画,而emulator则是这个人的一个克隆人。
举个例子,我们要实现一个p2p文件分发系统。
最开始的时候我们可以实现一个simulator:它用一个函数来模拟节点间的通信,这个函数的输入是网络性能(带宽,跳数),输出是通信时延————注意,并没有真正的数据在传输和拷贝,甚至都没有真正的节点,我们只是模拟了通信时延这个“特征(feature)”。
接下来,我们把这个分发系统实现了,编译成一个exe文件,但这时我们发现我们没有足够多的计算机来组成一个真实的、具有足够规模的网络来进一步测试(通常p2p网络的节点数成百上千),这时,我们可以写一个emulator:它可以区分同一个计算机上的不同进程,因此我们可以在一台计算机上开100个进程,这样可以用100台计算机模拟出10000台计算机的网络————注意,此时数据真的是通过Socket在传输,只不过有的数据走的是loopback口,并没有真的进网卡。
全部0条评论
快来发表一下你的评论吧 !