请问各位专家,虚拟机是什么意思,怎么用?
当前主流虚拟机
目前比较流行的虚拟机软件有VMware ACE和Virtual PC,两者都可以在Windows系统上虚拟多台计算机,用于安装Linux、OS/2、FreeBSD等其他操作系统。2003年2月微软收购Connectix后,很快发布了微软虚拟PC 2004。但出于各种考虑,新发布的Virtual PC 2004不再明确支持Linux、FreeBSD、NetWare、Solaris等操作系统,仅保留OS/2。如果要虚拟化Linux电脑,只能手动设置。相比较而言,VMware在多操作系统支持和执行效率上明显优于Virtual PC 2004。一台电脑变成两台,学习使用Linux不再是烦恼。
虚拟化分类
虚拟化浪潮
微软虚拟化
IBM虚拟化
惠普虚拟化
软件虚拟化
SUN虚拟化
英特尔虚拟化
AMD虚拟化
java虚拟机
VMware 4.5有很多版本,如工作站和GSX服务器,其中Windows版本的工作站应用最为广泛。本文在此基础上进行各种实践练习。
虚拟机的概念比较宽泛。通常人们接触到虚拟机的概念,包括像VMware这样的硬件仿真软件,以及像JVM这样介于硬件和编译器之间的软件。这里指的是后者。
虚拟机是一种抽象的计算机,它像实际的计算机一样,有一个指令集,并使用不同的存储区域。它负责执行指令和管理数据、内存和寄存器。这个虚拟机为任何平台上的编译器提供了一个独特的接口。编译器只需要面对虚拟机,生成虚拟机能理解的代码,然后解释器把虚拟机代码转换成特定系统的机器码来执行。
Sun xVM VirtualBox发布了新版本:2.1.0。
2.1.0并没有像之前的2.0.X那样主要是修复bug和完善原有功能,这个版本增加了很多新功能。强烈建议VBox的用户更新!
在官网的ChangeLog上,我们可以看到该版本的主要更新信息:
*支持Max OS X客户端的硬件虚拟化技术(VT-x和AMD-V );
*支持在32位操作系统上模拟64位客户端!(实验性质,详见用户手册);
*支持英特尔Nehalem虚拟化增强技术(EPT和VPID,详情参见用户手册);
*通过OpenGL支持3D加速!(参见用户手册第4.8章);
更新很多,但光是以上四条就有足够的理由让用户升级了!
VirtualBox最终通过OpenGL实验支持了3D加速,率先支持在32位操作系统上模拟64位客户端(需要64位CPU支持)。这意味着对虚拟机平台的限制更少。可以在你的x86平台上模拟AMD64!
至于“OpenGL 3D加速”,我了解到这个功能目前只有Windows系统才有,只能实现OpenGL加速,没有Direct3D加速。这意味着您已经可以在Windows虚拟机中运行一些OpenGL 3D应用程序,而Direct3D还需要等待一段时间。
你还在等什么?这是一个大大改进的版本。下载并快速试用:
为什么个人使用虚拟机
1.演示环境,可以方便的安装各种例子;
2.保证主机的快速运行,减少不必要的垃圾安装程序、偶尔使用的程序或虚拟机上运行的测试用程序;
3.避免每次重装银行等常用工具,不常用,保密性要求好,单独在一个环境下运行;
4.想测试一下不熟悉的应用,安装在虚拟机里彻底删除;
5.体验不同版本的操作系统,比如Linux和Mac。
有些使用虚拟机的实例
例1:由于计算机网络在我们日常生活中的影响越来越大,很多学校都将网络相关课程列为必修或选修课程。网络课程是一门理论和实践并重的课程。如果单纯地教授网络相关知识,不给学生提供实验环境,就很难引起学生对网络的兴趣,导致学习困难,甚至使学生对网络课程产生抵触情绪。因此,很多学校在注重理论教学的同时,也积极开展相关的网络实验课程。
为了解决这些问题,最简单的解决方法之一就是使用虚拟机软件搭建一个小型的网络环境,让学生在这个模拟的网络环境中学习网络的通信原理,进而具备开发网络应用的能力。
终端虚拟化因其大大降低的维护成本而受到追捧,如减少占用空间、降低购买软硬件设备的成本、节约能源、降低维护成本等。比实际的终端设备更有性价比优势。但这些并不是教育行业和制造商对虚拟化技术情有独钟的唯一原因。另一方面,我们很少提到,就是虚拟化技术可以大大提高系统的安全性。
[编辑本段]VMware虚拟机安装流程
VMware Workstation虚拟机是运行在Windows或Linux计算机上的应用程序,可以模拟基于x86的标准PC环境。这个环境和真实的电脑一样,有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口、USB控制器、SCSI控制器等设备。提供该应用程序的窗口是虚拟机的显示器。
在使用中,这个虚拟机和真正的物理主机没有太大区别。它需要分区、格式化、安装操作系统、安装应用程序和软件。简而言之,一切都和真正的电脑一样。
下面是一个示例,介绍使用VMware Workstation创建虚拟机的方法和步骤。
1.运行VMware Workstation 6,点击“文件→新建→虚拟机”进入创建虚拟机向导,或者直接按“Crtl+N”进入创建虚拟机向导。
2.在弹出的欢迎页面中单击“下一步”按钮。
3.在“虚拟机配置”选项区域选择“自定义”单选按钮。
4.在“选择虚拟机硬件兼容性”页面上,选择虚拟机的硬件格式。您可以在硬件兼容性下拉列表框中选择VMware Workstation 6、VMware Workstation 5或VMware Workstation 4。通常选择Workstation 6的格式,因为新的虚拟机硬件格式支持更多的功能。选择后点击“下一步”按钮。
5.在选择来宾操作系统对话框中,选择要创建的虚拟机类型和要运行的操作系统。在这里,选择Windows 2000 Professional操作系统,然后单击下一步。
6.在命名虚拟机对话框中,命名新创建的虚拟机并选择其保存路径。
7.在处理器选项区域选择虚拟机中的CPU数量。如果选择两个,主机需要两个CPU或超线程CPU。
8.在虚拟机的内存页面中,设置虚拟机使用的内存。通常对于Windows 98以下的系统,64MB可以设置;对于Windows 2000/XP,至少96MB可以设置;对于Windows 2003,最低为128 MB;;对于Windows Vista虚拟机,最小值为512MB。
9.在“网络类型”页面中选择虚拟机网卡的网络类型。
选择第一个选项,使用桥接网卡(VMnet0虚拟网卡),这意味着当前虚拟机与主机(运行VMware Workstation软件的计算机)处于同一网络中。
选择第二个选项,使用NAT网卡(VMnet8虚拟网卡),这意味着虚拟机通过主机单向访问主机和主机外部的网络,主机外部网络中的计算机无法访问虚拟机。
选择第三个选项,只使用本地网络(VMnet1虚拟网卡),这意味着虚拟机只能访问主机和所有使用VMnet1虚拟网卡的虚拟机。网络中除主机以外的计算机不能访问虚拟机,也不能被虚拟机访问。
选择第四项,无网络连接,表示虚拟机与主机无网络连接。
10.在选择I/O适配器类型页面中,选择虚拟机的SCSI卡型号,通常为默认值。
11.在选择磁盘页面上,选择创建新的虚拟磁盘。
12.在选择磁盘类型页面中,选择创建的虚拟硬盘的接口方法,通常为默认值。
13.在“指定磁盘容量”页面中设置虚拟磁盘大小。一般情况下,选择默认值即可。
14.在指定磁盘文件页面的磁盘文件选项区域设置虚拟磁盘文件的名称,通常选择默认值,然后单击完成。
安装操作系统
在虚拟机中安装操作系统和在真实的计算机中安装没有什么区别,但是在虚拟机中安装操作系统时,可以直接使用保存在主机上的安装光盘镜像(或软盘镜像)作为虚拟机的光驱(或软盘驱动器)。
您可以打开上面创建的Windows 2000虚拟机配置文件,在虚拟机设置页面的硬件选项卡中选择CD-ROM项目,在连接选项区域中选择使用ISO映像单选按钮,然后浏览并选择Windows 2000安装CD映像文件(ISO格式)。如果使用安装光盘,请选择使用物理驱动器,并选择安装光盘所在的光驱。
选择光驱后,点击工具栏上的播放按钮,打开虚拟机的电源,在虚拟机工作窗口中用鼠标点击,进入虚拟机。
说明如果要从虚拟机窗口切换回主机,需要按Ctrl+Alt热键。
安装VMware工具
在虚拟机中安装操作系统后,您需要安装VMware Tools。VMware Tools相当于VMware虚拟机的主板芯片组驱动、显卡驱动、鼠标驱动。安装VMware Tools后,虚拟机的性能可以大大提高,虚拟机的分辨率可以设置为任意大小。您也可以使用鼠标直接从虚拟机窗口切换到主机。
1.从虚拟机菜单中选择安装VMware Tools。
2.按照提示进行安装,最后重启虚拟机。
[编辑本段]Java虚拟机
首先,什么是Java虚拟机
Java虚拟机(JVM)是Java虚拟机的简称。它是一台虚构的计算机,通过在实际计算机上模拟各种计算机功能来实现。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等。,并且也有相应的指令系统。
1.为什么要用Java虚拟机?
Java语言的一个非常重要的特点是它与平台无关。使用Java虚拟机是实现这一功能的关键。如果一个通用的高级语言要在不同的平台上运行,至少需要编译成不同的目标代码。引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与特定平台相关的信息,使得Java语言编译器只需要生成运行在Java虚拟机上的目标代码(字节码),就可以在各种平台上运行,无需修改。Java虚拟机在执行字节码时,将字节码解释为特定平台上的机器指令执行。
2.谁需要了解Java虚拟机?
Java虚拟机是Java语言底层实现的基础,任何对Java语言感兴趣的人都应该对Java虚拟机有一个大致的了解。这有助于理解Java语言的一些属性并使用它。对于希望在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者,以及希望用硬件芯片实现Java虚拟机的人员,必须对Java虚拟机的规范有深入的了解。另外,如果你想扩展Java语言,或者把其他语言编译成Java语言的字节码,也需要对Java虚拟机有深入的了解。
3.Java虚拟机支持的数据类型。
Java虚拟机支持的Java语言的基本数据类型如下:
Byte://1字节的有符号整数的补码
short://2/双字节有符号整数的补码
int://4/4字节有符号整数的补码
long://8/8字节有符号整数的补码
Float://4字节IEEE754单精度浮点数
Double://8字节IEEE754双精度浮点数
Char://2字节无符号Unicode字符
几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型的字节码(指令)已经指出了操作数的数据类型。比如iadd、ladd、fadd、dadd指令都是两个数相加,操作数类型是int、long、float、double。虚拟机不会为布尔类型设置单独的指令。布尔数据由整数指令处理,包括整数返回。布尔数组用字节数组处理。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的老电脑在运行Java数值计算程序时可能会非常慢。
虚拟机支持的其他数据类型包括:
Object//对Javaobject (object)的4字节引用
ReturnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令。
注意:Java数组被视为对象。
虚拟机的规范对对象的内部结构没有特殊要求。在Sun公司的实现中,对对象的引用是一个句柄,它包含一对指针:一个指针指向对象的方法表,另一个指向对象的数据。Java虚拟机的字节码表示的程序应该符合类型规则。Java虚拟机的实现应该拒绝执行违反类型规定的字节码程序。由于字节码定义的限制,Java虚拟机似乎只能在32位地址空间的机器上运行。但是您可以创建一个Java虚拟机,自动将字节码转换成64位格式。从Java虚拟机支持的数据类型可以看出,Java严格规定了数据类型的内部格式,使得在各种Java虚拟机的实现中对数据的解释是一致的,从而保证了Java的平台独立性和兼容性。
可移植性。
二、Java虚拟机架构
Java虚拟机由五部分组成:一组指令集、一组寄存器、一个堆栈、一个垃圾收集堆和一个方法区。这五个部分是Java虚拟机的逻辑组成部分,不依赖于任何实现技术或组织,但它们的功能必须以某种方式在真机上实现。
1.Java指令集
Java虚拟机支持大约248个字节码。每个字节码执行一个基本的CPU操作,比如向寄存器中添加一个整数,子例程转移等。Java指令集相当于Java程序的汇编语言。
Java指令集中的指令包含一个单字节运算符来指定要执行的操作,以及零个或多个操作数来提供操作所需的参数或数据。许多指令没有操作数,只包含一个单字节运算符。
虚拟机内部循环的执行过程如下:
做{
取一个操作符字节;
根据操作符的值执行操作;
}while(程序未完成)
由于指令系统的简单性,虚拟机执行的过程非常简单,有利于提高执行效率。指令中操作数的数量和大小由运算符决定。如果操作数大于一个字节,则它的存储顺序是高位字节优先。例如,16位参数在存储时占用两个字节,其值为:
第一个字节*256+第二个字节字节码指令流通常是字节对齐的。指令tabltch和lookup是例外,在这两个指令中需要强制的4字节边界对齐。
2.注册
Java虚拟机的寄存器用来保存机器的运行状态,类似于微处理器中的一些特殊寄存器。
Java虚拟机有四种寄存器:
Pc:Java程序计数器。
Optop:指向操作数堆栈顶部的指针。
Frame:指向当前执行方法的执行环境的指针。
Vars:指向当前正在执行的方法的局部变量区域中的第一个变量的指针。
java虚拟机
Java虚拟机是堆叠的。它不定义或使用寄存器来传递或接受参数。其目的是保证指令集的简单性和实现的效率(特别是对于寄存器数量较少的处理器)。
所有寄存器都是32位的。
3.堆
Java虚拟机的堆栈有三个区域:局部变量区、运行环境区和操作数区。
(1)局部变量区域
每个Java方法都使用一组固定大小的局部变量。它们根据vars寄存器的字偏移量进行寻址。局部变量都是32位的。长整数和双精度浮点数占用两个局部变量的空间,但根据第一个局部变量的索引寻址。(例如,如果一个索引为n的局部变量是一个双精度浮点数,它实际上占用了索引n和n+1所代表的存储空间。虚拟机规范不要求局部变量中的64位值是64位对齐的。虚拟机提供将局部变量中的值加载到操作数堆栈中的指令,并且还提供将操作数堆栈中的值写入局部变量中的指令。
(2)操作环境区域
运行时环境中包含的信息用于动态链接、正常方法返回和异常传播。
动态连接
运行时环境包括指向当前类和当前方法的解释器符号表的指针,以支持方法代码的动态链接。方法的类文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接将符号方法调用翻译成实际的方法调用,加载必要的类来解释未定义的符号,并将变量访问翻译成这些变量运行时存储结构对应的偏移地址。动态链接方法和变量使得方法中使用的其他类的变化不会影响这个程序的代码。
正常方法返回
如果当前方法正常结束,当执行正确类型的返回指令时,被调用的方法将获得返回值。执行环境用于在调用者正常返回时恢复调用者的寄存器,并将调用者的程序计数器增加一个适当的值以跳过已执行的方法调用指令,然后在调用者的执行环境中继续执行。
异常和错误传播
Exception在Java中称为Error或exception,是Throwable类的子类。程序中的原因有:①动态链接错误,比如找不到需要的类文件。②运行时错误,如引用空指针。
程序使用throw语句。
当异常发生时,Java虚拟机采取以下措施:
检查与当前方法关联的catch子句表。每个catch子句都包含其有效的指令范围、可以处理的异常类型以及处理异常的代码块的地址。
与异常匹配的catch子句应满足以下条件:导致异常的指令在其指令范围内,并且发生的异常类型是其可以处理的异常类型的子类型。如果找到匹配的catch子句,系统移动到指定的异常处理块执行;如果没有找到异常处理块,则重复查找匹配catch子句的过程,直到检查完当前方法的所有嵌套catch子句。
由于虚拟机从第一个匹配的catch子句开始继续执行,catch子句表中的顺序非常重要。因为Java代码是结构化的,所以一个方法的所有异常处理程序总是可以按顺序排列在一个表中,对于任何可能的程序计数器值,都可以按线性顺序找到合适的异常处理块来处理程序计数器值下发生的异常。
如果找不到匹配的catch子句,则当前方法会得到一个“异常未被截获”的结果,并将其返回给当前方法的调用方,就好像异常刚刚发生在其调用方一样。如果在调用者中仍然没有找到相应的异常处理块,那么这个错误传播将继续。如果错误传播到顶层,系统将调用默认的异常处理块。
(3)操作数堆栈区的机器指令只从操作数堆栈中取出操作数,进行运算,并将结果返回堆栈。之所以选择堆栈结构,是因为它可以在只有少量寄存器或非通用寄存器的机器上(如Intel486)有效地模拟虚拟机的行为。操作数堆栈是32位。它用于向方法传递参数和从方法接收结果,还用于支持操作的参数和保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数堆栈顶部的两个字。这两个字是由前面的指令推到堆栈上的。这两个整数将弹出堆栈,相加,并将结果推回操作数堆栈。
每种原始数据类型都有特殊的指令来对它们执行必要的操作。每个操作数在堆栈中都需要一个存储位置,除了long和double类型,它们需要两个位置。操作数只能由适合其类型的运算符进行运算。例如,压入两个int类型的数字并将它们视为long类型的数字是非法的。在Sun的虚拟机实现中,这种限制是由字节码验证器强制执行的。然而,有一些操作(操作符dupe和swap)用于对运行时数据区进行操作,而不管其类型如何。
4.垃圾收集堆
Java的堆是一个运行时数据区,类的实例(对象)从这里分配空间。Java语言有收集无用单元的能力:它没有给程序员显式释放对象的能力。Java没有规定具体的垃圾收集算法,可以根据系统的要求使用各种算法。
5.方法区域
方法区域类似于传统语言中的编译代码或Unix进程中的主体段。它保存方法代码(编译的java代码)和符号表。在当前的Java实现中,方法代码不包含在垃圾收集堆中,但计划在未来的版本中实现。每个类文件都包含Java类或Java接口的编译代码。可以说,类文件就是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中也对类文件的格式进行了详细说明。具体可参考Sun的Java虚拟机规范。