acm-header
登录

ACM通信

实践

I / O虚拟化


I / O虚拟化

信贷:Andreas Kberle

回到顶部

这个词虚拟是严重超载的,从运行在云中的虚拟机到运行在虚拟世界中的虚拟化身。即使在较窄的计算机I/O上下文中,虚拟化也有着悠久而多样的历史,其典型例子是有意将逻辑设备与它们的物理实例化分离开来。

例如,在计算机存储中,一个逻辑单元号(LUN)表示一个逻辑磁盘,它可以由本地物理驱动器上的分区到由网络存储阵列导出的多盘RAID卷等任何东西支持。在计算机网络中,虚拟专用网络(VPN)表示逻辑上隔离的专用网络,在这种网络中,使用加密方法提供隔离,以保护实际上可能穿越公共因特网的数据。在计算机体系结构中,IOMMU (I/O内存管理单元)将I/O虚拟内存地址转换为相应的物理内存地址,使设备直接访问内存既安全又高效。虚拟化的其他例子包括虚拟LAN (VLAN)、NPIV (N_Port ID虚拟化)、Intel定向I/O虚拟化技术(VT-d)和多根I/O虚拟化(MR-IOV)。

通常的主题是将逻辑与物理分离,在抽象与具体之间引入某种程度的间接。这种间接方式已被证明是非常强大和多才多艺的。现代虚拟化平台以多种方式利用了间接和抽象。

虚拟机(VM)是一种软件抽象,它表现为一个完整的硬件计算机,包括虚拟化的cpu、RAM和I/O设备。虚拟化软件层,称为虚拟机监控程序,提供了将操作系统及其应用程序与物理硬件解耦的间接级别。这个词客人通常用来区分VM中运行的软件层;客户操作系统管理应用程序和虚拟硬件,而管理程序管理虚拟机和物理硬件宿主硬件。

尽管IBM在几十年前就发明了大型机虚拟机并将其商业化,但直到20世纪90年代末,当VMware率先在x86平台上实现高效虚拟化时,虚拟机才实现了向商用硬件的飞跃。从那时起,虚拟化在工业界和学术界都经历了兴趣的复兴。如今,vm在许多计算环境中很常见,在企业数据中心和云计算基础设施中几乎无处不在。

由于虚拟化是一个广泛的主题,而I/O设备的范围又大又多样,因此本文主要关注基于vm的系统中的一些代表性I/O系统问题,主要是在单个物理主机的上下文中。在强调了主要的好处和挑战之后,我们将探讨各种实现方法和技术,这些方法和技术用于实现灵活、高性能的I/O虚拟化。

回到顶部

好处

虚拟化系统的许多好处都依赖于VM的逻辑I/O设备与其物理实现的解耦。示例包括在相同硬件上复用多个vm的能力,以及动态迁移和增强的安全性等高级虚拟化特性。

在最基本的层面上,解耦实现了I/O设备的时间和空间复用,允许由更少的物理设备实现多个逻辑设备。虚拟化的应用程序(如服务器整合或在同一台机器上运行异构操作系统环境)依赖于此特性。随着不可阻挡的趋势创造出越来越强大的硬件,很多硬件仍然没有得到充分利用也就不足为奇了。将逻辑I/O设备多路复用到物理设备上的能力允许管理员和自动化系统以更高的利用率驱动I/O设备,并实现更好的硬件效率。虚拟化在过去十年中的迅速普及,很大程度上归功于这种基本分区和服务器整合带来的显著成本节约。

解耦提供了逻辑设备和物理设备之间的灵活映射,促进了无缝移植。通过支持逻辑I/O设备到具有不同但语义兼容的接口的物理设备的映射,虚拟化使得vm可以移植,甚至跨异构系统。相同的VM映像可以在具有不同I/O设备和配置的计算机上运行,I/O虚拟化层提供必要的转换。

解耦还支持流行的VM特性,如暂停和恢复VM的能力,以及在物理机器之间移动正在运行的VM的能力(称为热迁移)。在这两种应用中,活动逻辑设备都必须与物理设备解耦,并在保存或移动虚拟机后恢复时进行再耦合。

该虚拟化层还可能更改到物理设备的映射,即使VM本身不移动。例如,通过在复制存储内容时更改映射,虚拟机的虚拟磁盘可以在网络存储单元之间透明迁移,甚至在虚拟机仍然处于活动使用状态时也是如此。相同的功能可用于提高可用性或在不同I/O通道之间平衡负载。例如,在计算机和存储之间有多条路径的存储系统中,虚拟化层可以重新绑定映射以屏蔽故障或避免可能因路径争用而发生的延迟。

I/O虚拟化为逻辑I/O设备的许多创新和有益增强提供了立足点。在研究论文和商业虚拟化系统中,对进出VM的I/O流进行干预的能力得到了广泛的利用。

I/O虚拟化启用的一个有用功能是设备聚合,可以将多个物理设备组合成一个功能更强的逻辑设备,并将其导出到VM。示例包括将多个磁盘存储设备组合成一个更大的磁盘,以及网络通道绑定(其中多个网络接口可以组合成一个更快的网络接口)。

通过插入和转换虚拟I/O请求,可以将新特性添加到现有系统中,透明地用新功能增强未修改的软件。例如,可以将磁盘写转换为对多个磁盘的复制写,以便系统能够容忍磁盘设备故障。类似地,通过记录和跟踪对虚拟磁盘所做的更改,虚拟化层可以提供时间旅行特性,从而可以将VM的文件系统向后移动到较早的时间点。该功能是许多桌面虚拟化系统中快照和撤销特性的关键组成部分。

许多I/O虚拟化增强旨在提高系统安全性。一个简单的例子是在来往于磁盘的I/O上运行加密函数,以实现透明的磁盘加密。插入网络流量允许虚拟化层实现高级网络安全,例如防火墙和使用深度包检测的入侵检测系统。

回到顶部

挑战

虽然虚拟化提供了许多好处,但它也带来了重大挑战。一个是实现良好的I/O性能,尽管与灵活的间接和插入相关的潜在开销。在多个vm间复用物理设备会引入调度和优先级等复杂的资源管理问题,从而进一步影响性能。另一个挑战是为虚拟设备和接口定义适当的语义,特别是在面对复杂的物理I/O设备或系统级优化时。

在许多系统中,非平凡的性能损失与间接相关。对于虚拟化I/O也是如此,因为I/O操作必须在概念上遍历两个独立的I/O堆栈:一个在管理虚拟硬件的客户机中;另一个在管理物理硬件的管理程序中。较长的I/O路径会影响延迟和吞吐量,并增加额外的CPU负载。

事实上,在一些早期的虚拟化系统上,I/ o密集型工作负载遭受了超过两倍的虚拟化损失。从那时起,进一步的研究、优化和硬件加速将这种惩罚降低为噪音,以满足令人印象深刻的高要求的生产工作负载。与直觉有些不同的是,在相同的物理硬件上,虚拟化系统甚至优于原生系统,通过在扩展配置中运行几个较小的VM实例来克服原生扩展限制。

图1描述了虚拟化系统中I/O请求的流程。当VM中运行的应用程序发出I/O请求时(通常是通过进行系统调用),它最初由客户机操作系统中的I/O堆栈处理,客户机操作系统也运行在VM中。客户机中的设备驱动程序向虚拟I/O设备发出请求,然后由管理程序拦截该设备。管理程序将来自多个VM的请求调度到底层物理I/O设备上,通常通过管理程序管理的另一个设备驱动程序或直接访问物理硬件的特权VM。

当物理设备处理完一个I/O请求后,必须重新遍历两个I/O栈,但顺序相反。实际设备发布一个物理完成中断,由管理程序处理。管理程序确定哪个VM与完成关联,并通过为来宾操作系统管理的虚拟设备发布一个虚拟中断来通知它。为了减少开销,一些管理程序在软件中执行虚拟中断合并,类似于物理卡中的硬件批处理优化,后者延迟中断交付,目的是为多个传入事件只发布一个中断。

通过操纵I/O请求(例如检查网络数据包以执行安全检查或透明地加密磁盘写入),插入可能会产生额外的开销。在某些情况下,插入成本可以忽略不计,特别是与对传统旋转媒体的I/O等高延迟操作相比。在其他情况下,即使在内存中创建一个额外的I/O数据副本也可能非常昂贵——例如,对于具有极高包速率的快速网络。为了提高性能,一些管理程序并行处理此处理的部分,将工作转移到其他处理器核心。当然,当cpu存在竞争时,可用于运行的vm的内核就会减少。

虚拟化系统中的资源管理带来了额外的挑战。尽管每个VM看起来都有自己专用的虚拟硬件,但实际上管理程序必须在多个重要性不同的VM之间复用有限的物理硬件,将它们的虚拟资源映射到可用的物理资源上。在最基本的层面上,对物理设备的竞争将导致某些虚拟机的调度延迟。hypervisor至少要防止虚拟机垄断资源,拒绝向其他虚拟机提供服务。

更一般地说,管理程序应该提供某种性能隔离或服务质量控制措施,以反映不同VM工作负载的相对重要性或绝对需求。当物理资源跨多个用户或组织共享时,表达资源管理策略的能力尤其重要,这在多租户云计算环境中很常见。一些管理程序支持相对权重控制,其中VM的分配与它的权重直接成正比。有些还提供绝对预留和限制设置,它们绑定VM的最小和最大分配,而不考虑系统负载。


I/O虚拟化为逻辑I/O设备的许多创新和有益增强提供了立足点。


对于不同主机上的虚拟机可以并发访问的I/O设备,例如网络存储阵列,资源管理需要分布式算法来公平、高效地调度请求。虚拟化平台最近才开始提供复杂的解决方案,能够为VM I/O带宽和延迟提供端到端服务质量。

调度还可能以更微妙的方式影响VM性能。例如,CPU资源的争用会导致TCP网络性能的问题。TCP连接依赖于精确的往返时间(RTT)估计,以便执行流控制和适当调整窗口大小。然而,当一个包挂起时,虚拟机可能会被调度几十毫秒甚至几百毫秒。因此,CPU时间多路复用可能扭曲VM的RTT值,导致其拥塞窗口增长过慢,从而显著降低吞吐量。为了解决这个问题,一些研究人员建议将更多的TCP功能下放给管理程序。另一种选择是为虚拟机提供支持可选TCP卸载引擎(TOE)功能的虚拟网络接口控制器(NIC)硬件,就像在一些物理网卡中发现的那样。

向虚拟网卡添加TCP卸载功能的想法突出了为虚拟硬件选择适当语义的困难。对于接口更复杂的设备,如现代显卡,更是如此。在一个极端情况下,虚拟硬件可以具有与物理设备相同的接口。这种方法具有与已经支持(或将支持)物理设备的所有软件兼容的显著优势。不幸的是,这种透明性通常是以模拟相当复杂的虚拟设备接口为代价的,而这种虚拟设备接口的设计并没有有效地支持虚拟化。在另一个极端,虚拟硬件可以有一个全新的特定于管理程序的接口,明确地设计为简单和高效。

一个相关的挑战是确保虚拟化忠实地保留软件对物理设备的期望语义。例如,一些虚拟化系统通过利用VM和物理存储之间的hypervisor级别的缓冲区缓存来提高I/O性能。虽然缓存读取不会带来任何问题,但缓存写入会违反客户文件系统、数据库和其他软件所依赖的持久性语义。在原生的、未虚拟化的系统中,I/O完成表示已经提交了写操作。管理程序必须使用透写缓存来保留此属性,尽管有些管理程序提供了显式选项,通过放松此约束来权衡安全性和性能。

直接内存访问(DMA)说明了额外的安全和性能问题。它允许I/O设备直接读写主机RAM,而不涉及CPU,这对于实现高性能I/O速率至关重要。不幸的是,赋予设备使用DMA到达任意物理内存位置的能力是有风险的,特别是因为大多数操作系统bug都是由行为不当的设备驱动程序导致的。正如下一节所讨论的,虚拟化系统可以通过使用各种方法来确保vm之间的严格隔离,例如在来宾和管理程序级别利用硬件IOMMU功能。

回到顶部

方法

实现I/O虚拟化的经典方法是将软件结构化为两部分:一个被仿真的虚拟设备(导出到VM)和一个后端实现(虚拟设备模拟代码使用后端实现提供设备的语义)。现代管理程序支持具有分割实现的I/O虚拟化体系结构,如图2,其中虚拟机可以在不同的虚拟设备接口模拟前端以及设备的多个不同后端实现之间进行选择。例如,虚拟机可以配置IDE、SCSI或使用文件、本地磁盘或存储区域网络(SAN)实现的半虚拟化磁盘设备。在这里,我们将描述在现代虚拟化系统中实现这些功能的方式,并讨论一些可用的优化选项。


实现I/O虚拟化的经典方法是将软件结构化为两部分:导出到VM的模拟虚拟设备和由虚拟设备模拟代码使用的后端实现,以提供设备的信息。


作为一个具体的例子,考虑一个遗留的PC I/O设备,例如IDE磁盘。虚拟机中的操作系统将调用设备驱动程序来启动磁盘读或写请求。设备驱动程序将包含OUT指令,用于为操作编写操作类型、设备号、磁盘扇区号、长度和缓冲区内存位置。驱动程序假定设备将使用DMA在内存和磁盘设备之间传输内容,然后在完成时引发中断。为了使仿真设备正确工作,仿真软件必须捕获并解释OUT指令,以确定正确的操作及其参数;通过存储或获取请求的存储块,使用该体系结构的DMA功能的模拟来读写内存,从而执行操作的模拟;最后在VM上发出适当的中断信号,通知驱动程序请求完成。

虽然设备模拟代码特定于被模拟的特定设备(例如,IDE磁盘),但正在执行的操作的语义是通用的,并且经常构造,以便同一设备模拟可以访问多个不同的后端实现。例如,对于虚拟磁盘,后端实现可以简单到不经过转换就将请求转发到本地物理IDE控制器,也可以复杂到将虚拟磁盘存储为主机操作系统文件系统中的文件,就像在许多桌面虚拟化产品中那样。在后一种情况下,后端必须为包含虚拟磁盘内容的文件生成主机操作系统文件系统读写操作,以便执行模拟的虚拟磁盘扇区读写操作。

后端实现的可插入结构使为虚拟设备生成新功能变得容易。磁盘存储后端可以通过访问包含其ISO(国际标准化组织)映像的文件,为虚拟机实现模拟CD-ROM设备。类似地,现代虚拟化系统中的快照和撤销功能可以通过记录日志而不是覆盖虚拟磁盘文件来实现,从而使虚拟化层能够控制虚拟机可以看到哪个版本的磁盘。

伴随着灵活性和创新特性而来的是潜在的性能损失,它们可能差别很大。为服务器机器进行优化的后端可以有效地将模拟的读和写传输到本地磁盘的一部分,这可能具有非常低的虚拟化开销。相比之下,对于桌面虚拟化后端,数据存储在主机操作系统使用的网络文件系统上的加密文件中,损失可能相对较大。不仅每个读和写请求都要遍历主机操作系统和网络文件系统的文件系统和网络代码,而且每个扇区还会产生额外的加密和解密开销。

当前关于I/O虚拟化的许多研究都集中在解决某些问题的新插入功能或减少与虚拟化相关的开销的优化上。在服务器虚拟化和整合中,优化一直是一个特别重要的目标,因为在服务器虚拟化和整合中,开销直接影响到每个服务器支持的vm数量等指标。除了后端优化之外,减少I/ o虚拟化开销还需要减少虚拟设备模拟成本。最近的一些优化尝试使用软件或修改I/O设备硬件来实现这一点。

降低模拟成本的软件技术之一是减少管理程序执行I/O操作所需执行的陷阱和模拟操作的数量。例如,传统PC IDE接口使用8位OUT指令与磁盘控制器通信。通信扇区号、缓冲区地址和长度需要多个这样的指令,导致向管理程序重复捕获以运行设备模拟代码。为替代磁盘设备(如SCSI磁盘)使用驱动程序可以以更少的陷阱实现相同的功能,大大减少了模拟开销。

甚至可以通过优化VM软件和设备仿真之间的通信来实现进一步的减少。在Windows和Linux等现代操作系统环境中,可以安装设备驱动程序,直接将请求的参数通信到管理程序的设备模拟代码,从而减少开销。这种使用针对虚拟化层优化的虚拟硬件而不是匹配任何特定真实设备的方法称为半虚拟化.实际上,大多数现代虚拟化平台都支持模拟遗留设备以获得兼容性,并提供可选的准虚拟设备以获得更高的性能。

例如,半虚拟化磁盘接口可以让设备模拟代码通过驱动程序和模拟程序之间共享的内存段接受命令,从而允许命令通信几乎零开销。模拟代码只是将命令传递给优化后的后端实现。示例包括Xen的虚拟块设备前端驱动程序和VM-ware的PVSCSI来宾磁盘驱动程序。

对于仅由单个VM使用的I/O设备,其中后端实现主要通过VM向设备传递驱动命令,因此很容易直接通过设备,将其专门分配给VM。考虑一个高性能网卡的例子,它只被一台计算机上运行的一个虚拟机使用。配置CPU虚拟化相对容易,因此与设备通信的x86指令可以直接连接到设备,并产生零I/O虚拟化开销。这直通模式可以消除设备模拟和后端实现的开销。

尽管直通模式可以消除I/O虚拟化开销,但它引入了一些限制和实现挑战,从而减缓了其部署速度。除了每个直通设备只能被单个VM使用这一明显的限制外,直通还形成了硬件和VM之间的耦合。因此,虚拟化的许多可移植性好处都失去了,还有一些关键好处,如动态迁移和依赖于I/O介入能力的特性。

直通模式的最大挑战之一影响使用DMA的设备。最根本的问题是VM中的驱动程序将使用来宾的内存地址概念来编写设备DMA,这与VM的内存所在的实际内存地址不同。这不仅是不正确的,而且是一个很大的安全和安全问题,因为设备可能会读写可能属于管理程序或其他VM的内存。为了实现这一点,在将内存地址编程到设备之前,虚拟机的驱动程序必须转换内存地址以使用正确的实际内存。这将驱动程序暴露于管理程序内存虚拟化的详细信息中,并且仍然存在安全问题,因为驱动程序中的bug可能导致不正确的转换。

为了消除直通的限制和挑战,设备构建者已经修改了他们的硬件,以了解虚拟化层。为了处理专用直通设备的限制,这种支持虚拟化的硬件导出多个接口,每个接口可以附加到不同的VM。因此,每个VM都可以直接访问设备的直通副本。例如,支持虚拟化的NIC可能具有许多个性,这些个性的外观和行为就像许多独立的网卡直接映射到不同的vm。

需要额外的硬件支持来解决直接涉及VM内存的DMA操作的挑战。内存管理单元用于将DMA操作的内存地址映射到虚拟机内存中的正确位置。这个映射硬件(iommui)是为连接到设备上的每个虚拟机编写的,其中包含虚拟机在内存中的位置的映射。每个DMA请求都通过IOMMU运行,IOMMU将请求路由到实际机器内存中的正确位置或从该位置发出请求,如果请求无效则生成错误。IOMMU允许VM中的驱动程序使用其内存地址的虚拟化概念来编程设备DMA,同时仍然允许管理程序决定VM内存在物理机器内存中的实际位置。IOMMU还提供了一定的安全级别,确保即使客户机中的驱动程序软件有bug,也不能生成对VM外部位置的DMA访问。

尽管IOMMUs可以安全有效地允许支持虚拟化的I/O设备直接访问虚拟机的内存,但这对依赖动态页面重映射的现代管理程序中一些更复杂的内存虚拟化操作有影响。考虑一些特性,如内存超量使用,在这些特性中,管理程序可以通过诸如将VM内存按需分页到二级存储等技术回收RAM;内存压缩;或者透明内存共享,通过在多个虚拟机之间以只读方式共享相同的页面,可以消除重复数据。这些特性要求对VM内存的某些访问发生故障并在允许进行之前调用hypervisor操作。DMA设备需要尊重这一点,因此设备需要支持类似于DMA操作上的页面错误的东西,其中在允许DMA完成之前调用管理程序。容忍DMA操作上的任意延迟的能力可能会对实现I/O设备虚拟化所需的更改产生更大的影响。

虽然生产管理程序使用硬件IOMMUs和其他硬件强制的内存映射技术来确保vm之间的隔离,但它们还没有将IOMMUs包含到提供给vm的虚拟硬件中。虚拟IOMMU (vIOMMU)将允许客户操作系统防御它自己的有bug的设备驱动程序,就像在本地系统中一样。

最近,研究人员开发了新的IOMMU仿真技术,以有效地向来宾提供vIOMMUs。更重要的是,同样的方法促进了更灵活的设备传递形式,允许VM与直接分配的I/O设备交互,而不需要管理程序的干预。由于客户机向vIOMMU公开了当前涉及DMA操作的内存区域,因此hypervisor能够安全地修改其他内存区域的映射。通过只对vIOMMU操作进行干预,可以实现接近本机的I/O性能,同时保留管理程序管理、重新映射和过度使用内存的能力。

回到顶部

结论

将逻辑设备与其物理实现分离提供了许多引人注目的优点。单个物理设备可以进行多路复用,允许它充当多个虚拟设备,从而提高硬件利用率。抽象特定硬件和物理位置的细节使无缝迁移成为可能。虚拟和物理之间的间接级别还为透明地插入I/O操作提供了方便的挂钩,支持复制、负载平衡、加密和安全检查等新功能。

I/O虚拟化的一个关键挑战是用最小的开销实现这些好处。已经设计了许多聪明的软件和硬件方法来实现高性能的间接和插入,包括半虚拟化和虚拟化感知设备。当使用设备多路复用将不同的工作负载整合到相同的物理硬件上时,资源管理问题(如调度和优先级)就变得非常重要。为虚拟设备定义干净的接口和适当的语义也是一项挑战。

I/O虚拟化在学术界和工业界仍然是一个活跃的研究和开发领域。尽管我们在这里从单个物理机器的角度关注系统问题,但I/O虚拟化的更广泛的背景包括分布式系统以及连接其虚拟组件和物理组件的结构上的大量工作。基于虚拟机的系统的日益普及和商业上的成功必然会推动对新的虚拟化优化和I/O功能的需求。

ACM队列的q戳相关文章
queue.acm.org

虚拟化的现实
西蒙·克罗斯比,大卫·布朗
http://queue.acm.org/detail.cfm?id=1189289

网络虚拟化:打破性能障碍
苏格兰人Rixner
http://queue.acm.org/detail.cfm?id=1348592

虚拟化的成本
乌尔里希Drepper
http://queue.acm.org/detail.cfm?id=1348591

回到顶部

参考文献

1.Ahmad, I., Gulati, A.和Mashtizadeh, A. vIC:虚拟机存储设备IO的中断合并。在2011 Usenix年度技术会议论文集(2011年6月)。

2.Amit, N., Ben-Yehuda, M., Tsafrir, D.和Schuster, A. IOMMU:高效的IOMMU仿真。在2011 Usenix年度技术会议论文集(2011年6月)。

3.Gamage, S.,袋鼠,A., Kompella, R.R.和Xu, D.在虚拟化云中改善TCP传输性能的机会泛滥。在第二届ACM云计算研讨会论文集(2011年10月)。

4.古拉提,艾哈迈德,I.和沃尔德斯伯格,C.帕达:存储访问的资源的比例分配。在第七届文件和存储技术会议论文集(2009年2月)。

5.苏格曼(J.),文基塔查拉姆(G.),林(b . h .)。在VMware工作站的托管虚拟机监视器上虚拟化I/O设备。在2001年Usenix年度技术会议论文集(2001年6月)。

回到顶部

作者

卡尔Waldspurger目前正在与stelth模式的初创公司合作。在过去十年的大部分时间里,他是VMware的首席工程师,负责核心资源管理和虚拟化技术,包括调度、内存管理和分布式系统。

孟德尔Rosenblum是斯坦福大学计算机科学和电子工程系的副教授。他的研究兴趣包括系统软件、分布式系统和计算机体系结构。他是VMware Inc.的联合创始人,并积极参与VMware虚拟化平台的研发。

回到顶部

数据

F1图1。应用程序发出的I/O请求首先由VM中运行的客户操作系统I/O堆栈处理,然后由管理物理硬件的管理程序I/O堆栈处理。

F2图2。现代管理程序将设备虚拟化分为前端模拟和后端实现。例如,虚拟机可以配置IDE、SCSI或半虚拟化磁盘设备,这些设备可以作为文件、本地磁盘或SAN存储区域网络实现。模拟设备和物理设备(例如SCSI前端和本地SCSI后端)可能在大小和其他属性上有所不同。

回到顶部


©2012 acm 0001-0782/12/0100 $10.00

允许为个人或课堂使用部分或全部作品制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。除ACM外,本作品的其他组件的版权必须受到尊重。允许有信用的文摘。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,都需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org传真(212)869-0481。

数字图书馆是由计算机协会出版的。版权所有©2012 ACM, Inc.


评论


匿名

不错的文章。我想知道作者对虚拟化guid的问题有什么看法?


显示1评论

登录为完全访问
»忘记密码? »创建ACM Web帐号
文章内容:
Baidu
map