请问虚拟机和模拟器有什么不同?

如题所述

虚拟机通常只VMware、Microsoft Virtual PC等工具,可以用他们来模拟PC,你可以在虚拟机里面装上Windows XP来研究各种病毒而不必担心会感染真正的系统,也常用来学习Linux。虚拟机的硬盘在你真正的系统上是一个或者几个文件,备份还原转移都很方便。
模拟器通常指模拟以前的游戏机的程序,用它们可以玩很多以前经典的游戏,比如红白机模拟器、PS模拟器、GBA模拟器,这样我们就可以在电脑上玩一些经典的游戏了。比如街霸啊超级玛丽啊拳皇啊合金弹头啊宠物小精灵之类的
从本质上讲,虚拟机和模拟器没有区别,他们都是用PC的CPU内存和硬盘空间来模拟出一个新的环境,只是他们模拟的环境不一样而已。在实际的使用中,因为模拟器仅仅用于玩游戏,而虚拟机可以很方便的让你在一个Windows XP中体验诸多其它的系统,所以很多人就觉得虚拟机比模拟器强大。殊不知模拟一个PS2/PSP的环境比模拟一个XP难上千倍,因为要模拟出不同架构的环境,虚拟的效率极低,目前的电脑尚达不到性能上的要求。追问

那它的具体实现过程是怎样的?

追答

  其他的不清楚
  运行过程
  上面对虚拟机的各个部分进行了比较详细的说明,下面通过一个具体的例子来分析它的运行过程。
  虚拟机通过调用某个指定类的方法main启动,传递给main一个字符串数组参数,使指定的类被装载,同时链接该类所使用的其它的类型,并且初始化它们。例如对于程序:
  public class HelloApp {
  public static void main(String[] args){
  System.out.println("Hello World!");
  for (int i = 0; i < args.length; i++ ) {
  System.out.println(args);
  }
  }
  }
  编译后在命令行模式下键入:java HelloApp run virtual machine
  将通过调用HelloApp的方法main来启动java虚拟机,传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。
  开始试图执行类HelloApp的main方法,发现该类并没有被装载,也就是说虚拟机当前不包含该类的二进制代表,于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败,则抛出一个异常。类被装载后同时在main方法被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段:检验,准备和解析。检验检查被装载的主类的符号和语义,准备则创建类或接口的静态域以及把这些域初始化为标准的默认值,解析负责检查主类对其它类或接口的符号引用,在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。

追问

别copy,我想这样实现不知行不行:用一个循环模拟运行状态的CPU,然后在循环里加入代码,获取被模拟的内存中的虚拟机的机器码,然后调用一个函数执行对应的动作,改变模拟器中的特定变量,然后执行特定硬件的代码,比如存储器,然后做接下来的动作,接着重新循环。不知这样行不行?

追答

你可以试试。

参考http://baike.baidu.com/link?url=A4gzvDOYFVY2RElsRBlJwovV19l2iBK3eN_uaSjCKAl96LGaXVlcXR-1W7Ln_876

温馨提示:答案为网友推荐,仅供参考