CN105378673B - 零复制高速缓存 - Google Patents

零复制高速缓存 Download PDF

Info

Publication number
CN105378673B
CN105378673B CN201480004102.9A CN201480004102A CN105378673B CN 105378673 B CN105378673 B CN 105378673B CN 201480004102 A CN201480004102 A CN 201480004102A CN 105378673 B CN105378673 B CN 105378673B
Authority
CN
China
Prior art keywords
buffer area
computational entity
immutable buffer
immutable
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201480004102.9A
Other languages
English (en)
Other versions
CN105378673A (zh
Inventor
J·于
A·E·古德塞尔
F·S·特瑞克
C·W·布鲁密
A·H·莫罕穆德
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN105378673A publication Critical patent/CN105378673A/zh
Application granted granted Critical
Publication of CN105378673B publication Critical patent/CN105378673B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/12Replacement control
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes

Abstract

对不可变缓冲区进行高速缓存使得在不可变缓冲区的寿命期间阻止其数据和地址被改变。第一计算实体维持不可变缓冲区的高速缓存并且具有对不可变缓冲区的强引用。只要任何实体具有对不可变缓冲区的强引用,该不可变缓冲区就被保证在该强引用的历时中持续存在。第二计算实体与第一计算实体通信以获得对不可变缓冲器的强引用并且之后从不可变缓冲器读取数据。在读取来自高速缓存的数据之时,第二计算实体将强引用降级成对不可变缓冲区的弱引用。对不可变缓冲区的弱引用不保证不可变缓冲区在该弱引用的历时中将继续存在。

Description

零复制高速缓存
背景
计算机操作系统性能通常由操作系统在给定时间间隔期间可维持的最大输入/输出(I/O)操作速率(也称为“I/O性能”)来表征。结果,操作系统采用各种公知机制来提升I/O性能。
传统上,操作系统是使用向系统程序员提供对如何操纵存储器的非常精细的控制的非受管语言(如汇编语言、C、C++)来编写的。未经检查的指针的使用可被用来最小化操作系统开销并允许增加的吞吐量或降低的等待时间。使用这些未经检查的指针的不利方面在于它们难以创建和推理,导致不可靠的软件和安全弱点。
用受管编程语言编写软件提供了充足的正确性益处和开发时间效率。这些受管语言防止程序员创建许多种类的软件缺陷,这造成改进的软件质量和缩短的开发时间。操作系统正确性是用于递送可靠且安全的计算体验的关键因素。因此,使用受管语言来创建操作系统是非常有说服力的主张,因为操作系统可靠性可以改进且开发成本可被降低。
为了达到这些益处,受管编程语言在由程序员编写的源代码与物理计算机系统的原始机器资源之间插入抽象层。这一抽象层一般用于约束程序员被允许写什么,并且通过这样做消除了全部的各类潜在缺陷。不幸的是,这一抽象层引入可能损害所创建的软件的性能的开销。结果,普遍假定是受管语言用正确性缺陷来换取性能缺陷。因而,用受管语言编写的软件通常被认为先天地慢于用非受管语言编写的软件。
影响受管代码操作系统的具体问题是对在数据穿过系统时在各层之间复制数据的固有需求。这是由以下事实引起的:系统的不同组件存在于不同隔离上下文中并且没有清晰的机制来摆脱这些隔离上下文。
发明内容
根据本文描述的至少一个实施例,描述了不可变缓冲区的高速缓存。不可变缓冲区在不可变缓冲区的寿命期间保护其中填充的数据免受改变。不可变缓冲区的物理地址在不可变缓冲区的寿命期间同样被保护免受改变。第一计算实体维持不可变缓冲区的高速缓存并且具有对不可变缓冲区的强引用。只要任何实体具有对不可变缓冲区的强引用,对具有该强引用的每一实体而言,该不可变缓冲区就被保证在至少该强引用的历时中持续存在。第二计算实体与第一计算实体通信以获得对不可变缓冲区的强引用并且之后从不可变缓冲区读取数据。在读取来自高速缓存的数据之时或之后,第二计算实体将对不可变缓冲区的强引用降级成对不可变缓冲区的弱引用。对不可变缓冲区的弱引用不保证不可变缓冲区在改弱引用的历时中将继续存在。
这允许第一和第二计算实体具有不可变缓冲区的高速缓存,而不要求两个实体之间的通信,除了用于允许第二计算实体获得对强引用的初始访问的第一通信。
本概述并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
附图简述
为了描述能够获得上述和其它优点和特征的方式,各实施例的更具体的描述将通过参考各附图来呈现。可以理解,这些附图只描绘了示例实施例,并且因此不被认为是对其范围的限制,将通过使用附图并利用附加特征和细节来描述和解释各实施例,在附图中:
图1抽象地示出可在其中采用本文描述的一些实施例的计算系统;
图2示出用于提供不可变缓冲区的方法的流程图;
图3A示出填充缓冲区的过程在其中发生的环境;
图3B示出在其中使经填充的缓冲区不可变的环境;
图4示出用于使用不可变缓冲区的方法的流程图;
图5示出其中不同计算实体具有不可变缓冲区的不同视图的环境;
图6示出用于将不可变数据从一个计算实体传递到下一计算实体的方法的流程图;
图7示出其中数据流从流源提供给流缓冲区并随后从流缓冲区提供给流消费者的流传输环境;
图8示出其中第二计算实体通过第一计算实体的高速缓存来获取高速缓存的环境;
图9示出第二计算实体从第一计算实体支持的高速缓存进行第一次读取的方法的流程图;
图10示出第二计算实体从第一计算实体支持的高速缓存进行后续读取的方法的流程图;
图11示出第一计算实体(或后备高速缓存)执行逐出的方法的流程图;
图12示出示例受管代码系统;以及
图13描绘正常受管字节阵列,它具有指向它的两个不同的跨度并允许应用将该阵列的各部分看作不同的类型。
详细描述
根据本文描述的各实施例,描述了促进受管操作系统中的零复制输入/输出(I/O)语义的机制。这样的机制中的一些可被用在非受管代码操作系统中以及受管代码操作系统中。各机制不是互斥的,因为一个、一些、或甚至全部机制可被组合以进一步促进零复制I/O语义。
“零复制”指的是被设计成使数据能通过被写入存储器来进入系统并在不必复制该数据的情况下传播通过许多抽象层的体系结构。零复制体系结构不保证没有数据复制发生。相反,它仅仅使机制就位以确保大多数I/O操作可以在无需复制的情况下完成。在本说明书和权利要求书中,“存储器”被定义为任何随机存取存储器,它通常是易失性存储器,但也可包括非易失性部分或可能可完全是非易失性的。在本说明书和权利要求书中,“存储器”被定义为计算系统的主存储介质,包括可由计算系统的微处理器访问且可由硬件设备(如图形控制器或网络接口控制器)经由DMA(直接存储器访问)机制访问的可单独寻址的位置。
首先,将描述使用共享数据的不可变缓冲区的不可变可共享零复制批量数据机制。这样的机制允许在无需复制的情况下在计算系统中转移数据的大型缓冲区。该机制将被进一步扩展到数据流在计算系统内的共享使用,具有完全控制以允许高效的资源利用,这些全都在维持完整的零复制语义的同时进行。尽管受管代码系统的当前类型安全性允许更直接地实现这些机制,但这些机制也可在非受管代码系统中使用。
其次,将描述用于零复制高速缓存的机制。这样的零复制高速缓存可被用于非受管代码系统和受管代码系统两者中。零复制高速缓存使得可能创建表征进入高速缓存的数据以及从高速缓存返回的数据的零复制语义的通用高速缓存体系结构。
第三,将描述进一步增强受管代码系统的性能的若干机制,而不管这些系统是否采用不可变缓冲区或共享数据。这样的受管代码机制包括统一存储器访问和类型安全类型铸造。统一存储器访问使受管代码能够使用一致且可组合的方法均匀地访问受管存储器和非受管存储器(用于I/O缓冲区)两者。类型安全类型铸造使受管代码能够执行指针铸造以允许给定存储器区域被看作不同类型,同时维持完整的类型安全性。
将参考图1来描述计算系统的一些介绍性讨论。随后将按以上参考图2-13提供的次序来描述以上列出的机制。
计算系统现在越来越多地采取多种多样的形式。例如,计算系统可以是手持式设备、电器、膝上型计算机、台式计算机、大型机、分布式计算系统或甚至常规上不被认为是计算系统的设备。在本说明书以及权利要求书中,术语“计算系统”被广义地定义为包括任何设备或系统(或其组合),该设备或系统包含至少一个物理有形的处理器以及其上能含有可由处理器执行的计算机可执行指令的物理有形的存储器。存储器可以采取任何形式,并可以取决于计算系统的性质和形式。计算系统可以分布在网络环境中,并可包括多个组分计算系统。
如图1所示,在其最基本的配置中,计算系统100包括至少一个处理单元102和计算机可读介质104。计算机可读介质104可在概念上被认为包括物理系统存储器,它可以是易失性的、非易失性的、或这两者的某种组合。计算机可读介质104还在概念上包括非易失性大容量存储。如果计算系统是分布式的,则处理、存储器和/或存储能力也可以是分布式的。
如本文所使用的,术语“可执行模块”或“可执行组件”可以指可在计算系统上执行的软件对象、例程或方法。此处所描述的不同组件、模块、引擎,以及服务可以实现为在计算系统上执行的对象或进程(例如,作为分开的线程)。在其中实施类型安全性并且其中各进程被分配了它们自己的不同存储器对象的受管环境中执行的情况下,这样的可执行模块可以是受管代码。在可执行模块用本机代码(如C或C++)编写的情况下,这样的可执行模块还可以是非受管代码。
在随后的描述中,参考由一个或多个计算系统执行的动作描述了各实施例。如果这样的动作是以软件实现的,则执行动作的相关联计算系统的一个或多个处理器响应于已经执行了计算机可执行指令来引导计算系统的操作。例如,这样的计算机可执行指令可被实现在形成计算机程序产品的一个或多个计算机可读介质上。这样的操作的示例涉及对数据的操纵。计算机可执行指令(以及被操纵的数据)可被存储在计算系统100的存储器104中。计算系统100还可包含允许计算系统100例如通过网络110与其他处理器通信的通信信道108。
这里描述的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器等计算机硬件,如以下更详细讨论的。这里描述的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种显著不同的计算机可读介质:计算机存储介质和传输介质。
计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他有形存储介质。
“网络”被定义为使得电子数据能够在计算机系统和/或模块和/或其它电子设备之间传输的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应当包括在计算机可读介质的范围内。
此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码资料可从传输介质自动传输到计算机存储介质(或反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口控制器(例如,“NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质。因而,应当理解,计算机存储介质可被包括在还利用(或甚至主要利用)传输介质的计算机系统组件中。
计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。更具体而言,上述特征和动作是作为实现权利要求的示例形式而公开的。
本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备二者中。
不可变可共享零复制批量数据
用于支持零复制的主要挑战是传统系统中的I/O接口,它们被定义成系统中的不同层之间的复制操作。读应用程序接口(API)接受应用缓冲区作为输入并用来自某一数据源的数据来填充它。类似地,写API取得应用缓冲区并将其内容写入某一数据目标。读/写API的语义向应用授予针对缓冲区对准、分配空间和保持的完全自由。这一简单模型具有若干固有限制:该模型不能表达非连续缓冲区或不能减少数据复制操作的数量。
许多操作系统支持存储器映射文件作为一种机制来与各应用共享文件系统缓冲区高速缓存中的各页并避免与读/写接口相关联的复制操作。特殊API已被添加到网络接口以使用文件存储器映射从文件系统缓冲区高速缓存直接发送数据来加速网络话务。
存储器映射的文件抽象缺少对隐藏缓冲区的底层对准和稀疏布局的支持,并且需要各应用直接处理并管理虚拟映射和逻辑数据视图。例如,访问偏移10处的文件的应用需要在映射基虚拟地址上应用指针算术来导出正确地址。在文件被映射时扩展该文件需要应用管理在其地址空间中可能不一定连续的附加视图,且跨视图访问需要被该应用处理。
避免在存储器映射文件之间复制数据具有其他缺陷。确保存储器映射文件和读/写操作之间的语义一致性需要I/O、存储器以及文件系统之间的复杂协调。存储器映射I/O施加同步完成的开销,因为映射到文件区的虚拟地址上的页错误未命中使线程停止,直至该页在物理存储器中可用为止。
写时复制(copy-on-write)虚拟存储器技术也被用来隐藏复制操作的成本。这些写时复制技术基于以下假定来混合应用和缓冲区高速缓存页:应用极少就地修改输入缓冲区。这向文件系统给出了在无需复制的情况下对相同的物理页进行高速缓存的机会。对于一些工作负载,这一优化可以避免以相当的复杂度为代价的复制操作,尤其是在应用和存储栈处于不同保护域中时。在某些条件下在应用缓冲区被正确地对准时,其他技术(如虚拟存储器页重新映射)对网络接收路径是有用的。
图2示出用于提供不可变缓冲区的方法200的流程图。图3A示出其中填充缓冲区的过程发生的环境300A。图3B示出在其中使经填充的缓冲区不可变的环境300B。因此,现在将频繁参考图3A和3B来描述图2的方法200。环境300A和300B可以发生在图1的计算系统100内,但这并非是必需的。环境300A和300B可以是分布式的或者位于单个计算系统上。
获取计算实体首先访问要被用来填充缓冲区的源数据(动作210)。源数据可以是任何数据,但在一个实施例中,源数据包括需要大量计算资源来生成的大量批量数据。在本说明书和权利要求书中,“计算实体”是能处理计算系统中的数据的任何组件、模块、方法、功能、进程、处理器、或它们的组合。这样的计算实体可以是分布式的或者驻留在单个计算机上。
获取计算实体可以生成源数据中的全部或一些(动作211)。作为替换或补充,获取计算实体可以从数据源获取源数据的全部或一些(动作212)。例如,参考图3A,获取计算实体320从数据源310获取(如箭头301所表示的)源数据311。数据源可以例如是网络,或诸如盘等非易失性存储设备。
获取计算实体还获取缓冲区(动作220)。这一缓冲区获取(220)被示为与源数据的获取(动作210)并行,因为本文描述的原理的最宽泛方面不需要任何动作首先发生。然而,在一些系统中,一个动作可以在另一个之前被获取和/或这些动作可以至少部分地同时发生。参考图3A,获取计算实体320获取缓冲区330达以下程度:获取计算实体随后可以用数据填充缓冲区330。
不管获取计算实体生成源数据还是从数据源接收源数据还是这两者,获取计算实体用数据填充缓冲区(动作230)。参考图3A,例如,获取计算实体320将数据311填充到缓冲区330中(如箭头302所表示的)。
缓冲区随后被分类成不可变的(动作240)。图3B示出与图3A的环境300A类似的环境300B,除了数据311被示为被保护在缓冲区330内之外,它被示为具有斜纹边界331,抽象地表示缓冲区330现在是不可变的。该分类保护填充在不可变缓冲区(例如,图3B中的缓冲区330)中的数据(例如,数据311)在该不可变缓冲区的寿命期间免于改变,并且还保护不可变缓冲区在该不可变缓冲区的寿命期间免于改变其物理地址。因为这一不可变特性,对不可变数据的访问可被给予任意数量的计算实体,而没有冲突风险,因为这些计算实体中的每一者只可观察该数据。
在本机语言(如C或C++)环境中,这一不可变性可通过写入处理器的存储器管理单元(MMU)以限制处理器对存储器的某些范围的写入来实现。这可能是相当昂贵的,且对存储器访问的限制不是非常粒度化的,通常在相对大的页级上实现。此外,这可能是昂贵的操作,且不能避免以下情况:以比页级更小的粒度来执行复制以向不同级隐藏数据。
在受管环境(包括受管运行时的环境)中,软件被用来将存储器声明为不可变的并且实施该不可变性。此外,存储器缓冲区的寿命可以通过使用计数来维护,该计数在指向存储器的新指针被给予实体时递增,且在指向存储器的指针不再被实体使用时递减。在使用计数返回零时,缓冲区是不可达的,且可被存储器管理器收回。在一个实施例中,内核向不同实体授予访问存储器的权限且维持使用计数,而受管运行时提供不可变存储器的视图、实施不可变性、以及提供对数据的约束。更多相关的受管环境在下文参考图12描述。
图4示出用于使用不可变缓冲区的方法的流程图。首先,视图组件供应不可变缓冲区的灵活视图(动作401)并随后在适当时向不可变缓冲区的不同消费者提供视图(动作402)。计算实体随后可只通过其相应视图来访问不可变缓冲区(动作403)。例如,参考图5的环境500,第一计算实体501通过第一视图511访问(如箭头521所表示的)不可变缓冲区330,且第二计算实体502通过第二视图512访问(如箭头522所表示的)不可变缓冲区330。省略号513示出了对于超过仅这两个计算实体501和502,这可继续。视图511和512可以是不同视图,但也可以是相同视图。无论如何,视图组件520能够提供底层的不可变缓冲区330的不同视图。在本说明书中,术语“第一”和“第二”仅被用来将一个项与另一项区分开,且不暗示任何次序、优先级、位置、或重要性。
在一些实施例中,消费来自不可变缓冲区的数据的计算实体在保护边界或进程边界的不同侧上。例如,图5示出了通过它们的相应视图511和512来消费数据的计算实体501和502实际上被边界530分开。例如,计算实体501和502可以是不同进程,在这种情况下,边界530表示进程之间的边界。边界530还可以是保护边界,在这种情况下,一个计算实体不可在无需复制的情况下直接向另一计算实体提供数据。例如,计算实体501可以是操作系统内的内核组件,而计算实体502可以是诸如应用组件等用户模式组件。
通常,数据不会跨进程和保护边界共享,除非数据被复制。这样的复制可花费大量计算资源,尤其是在复制的数据量非常大的情况下,或者在数据的不同部分要跨这些边界频繁共享的情况下。本文描述的原理提供用于在无需复制的情况下跨进程和保护边界来共享数据的方便且灵活的机制。这因而改进了操作系统的性能。
视图提供者520所提供的视图可以是细粒度的。例如,假定要从不可变缓冲区读取的不可变数据是网络数据。协议栈的各层可能各自对网络数据的不同部分感兴趣。网络层组件(如因特网协议组件)可能对网络层头部感兴趣,而应用层组件可能仅对原始净荷感兴趣。在这两层之间是对网络数据的不同部分感兴趣的不同组件。
本文描述的原理可被有效地应用来处理这一网络数据,而无需复制网络数据。例如,协议栈的最低层可能够查看整个网络分组。该最低层可处理该分组的最外面的头部,并向协议栈的下一较高层组件返回视图定义。视图定义对网络分组的整个范围(除了最外分组之外)进行定义。这一第二组件向视图提供者520提供视图定义,视图提供者520将这一视图提供给第二组件。因而,最低组件看到整个分组,而下一组件看到不带有最外面的头部的相同分组。这可以在根本不复制数据的情况下完成。相反,数据留在不可变缓冲区内。这可被重复,直至向最高应用层提供了只对分组的净荷进行定义的视图定义。
图6示出用于将不可变数据从一个计算实体传递到下一计算实体的方法600的流程图。第一计算实体访问视图定义(动作601)并将该视图定义提供给视图提供者(动作602)。视图提供者随后将该视图提供给第一计算实体(动作603)。在第一计算实体执行其逻辑(动作604)后,它随后可将另一视图定义提供给下一计算实体(动作605),该下一计算实体要处理来自不可变缓冲区的数据。下一计算实体随后可重复这一方法600,并且因此该过程可继续通过该系统的多个层。
尽管以上描述了按零复制的方式来消费缓冲区/流,但以上描述的原理也可适用于由数据生产者生产缓冲区和流。在数据生产者的情况下,还存在供应用发送(分开地分配的)其自己的缓冲区或请求数据生产者将可写视图(跨度(Span))提供到其自己的内部缓冲区的灵活性。这可能不仅消除了复制,还通过消除对发送半充满缓冲区的需求而改进了缓冲区利用。
零复制数据流
通过操作系统的批量数据移动通常使用流体系结构来建模。流表示数据源与数据消费者之间的逻辑管道,允许源所产生的数据被递送到其目的地。流通常实现缓冲,以容纳生产者与消费者之间的吞吐量不协调性。
例如,图7示出了其中数据流711被从流源710提供到(如箭头701所表示的)流缓冲区720中并随后从缓冲区720提供到(如箭头702所表示的)流消费者730的流环境700。环境700还包括执行流控制的流管理器740。流管理器740使得各个流部分从缓冲区720以流消费者720满意的速率被馈送到(如箭头702所表示的)流消费者730。此外,流管理器730在流之前执行适当的读(如箭头701所表示的)以确保流缓冲区720内的流部分的量不会过少以至于流消费者730处于用完流部分的风险中,并且不会过多以至于占据流缓冲区720的不必要的存储器量。流管理器740还管理流缓冲区720内的流各部分的寿命,使得流部分占据的存储器一旦该流部分被消费就可被回收。
流通常在逻辑上跨多个进程和/或保护边界。例如,在应用从文件读取数据时,该数据通常从在受保护模式设备驱动程序的控制下的物理盘读取。该数据随后穿过文件系统层,并随后最终对应用代码可用。通常,层跨越可涉及数据复制,这影响性能和功耗。
然而,上述零复制不可变缓冲区的原理可被用来制定流缓冲区(如,流缓冲区720),其中跨进程或保护边界复制各个流部分的需求被消除。
具体而言,假定为流中的多个流部分中的每一个建立一个不可变缓冲区(如参考图2到6描述的)。此外,假定图2的方法和图3A和3B的过程被执行以创建包含单个流部分的相关联的不可变缓冲区,每次接收到一个流部分。
这样的不可变缓冲区允许任何数据(包括各个流部分)穿过系统的不同层和组件,从而允许每一个具有它们自己的对该数据的特定视图,而无需复制该数据,如参考图5和6中的一般数据描述的。在这种情况下,流缓冲区720将简单地是不可变缓冲区的集合,每一不可变缓冲区具有作为数据包含在其中的对应的流部分。在消费每一流部分时,对应的不可变缓冲区的存储器被允许回收。因而,使用本文描述的原理,零复制数据流传输是可能的。
零复制高速缓存
高速缓存是任何操作系统的I/O子系统的重要方面。通过充分利用以下事实降低了等待时间且提高了有效吞吐量:数据访问模式往往被群集且同一数据通常被检索多次。传统高速缓存是通过在操作系统的不同层处具有被独立地管理的各专用存储器池来完成的,每一专用存储器池具有正交保持和替换策略。访问来自高速缓存的数据通常涉及将数据从高速缓存缓冲区复制到应用缓冲区。
以上参考图2到6描述的原理允许在进程之间以及跨保护边界共享不可变缓冲区,函数调用不能被放置通过保护边界,而是必须使用昂贵得多的进程间通信或跨保护边界通信来用于跨边界通信。
这些原理可被用于实现高速缓存。在数据从直接存储器访问(DMA)操作流出时,数据被引入系统中作为不可变缓冲区(如图3A、3B和5的不可变缓冲区330)。不可变缓冲区可以围绕系统来传递新数据,并且可同时被快照到高速缓存中以供稍后重用。在对数据的稍后请求发生时,同一不可变缓冲区可从高速缓存检索并被重用——全部无需复制或甚至实际访问底层数据。这造成显著的效率增益。
例如,可能在受管代码系统中出现的一个重要的效率增益来自于受管代码系统中的垃圾收集成本的减轻。复制数据要求堆存储器的分配,这增加了垃圾收集器所要求的工作量。这一增加的垃圾收集工作对于IO缓冲区而言尤其麻烦,因为它们通常比正常堆对象大得多。通过将IO缓冲区表征为不可变高速缓存,因而显著降低了受管代码系统中要求的垃圾收集。
根据本文描述的原理,在计算实体持有基于不可变缓冲区中的底层数据的高速缓存时,计算实体具有对不可变缓冲区中的底层数据的“强”引用,并且可以使用该强引用来访问不可变缓冲区的数据。使用术语“强”来修饰引用仅被用来将引用与将在下文被称为“软”和“弱”的引用区分开。同样,使用术语“弱”和“软”来修饰引用仅被用来将引用彼此区分开以及与强引用区分开。
只要任何实体具有对高速缓存内的不可变缓冲区的强引用,对具有该强引用的每一实体而言,该不可变缓冲区及其数据就被保证在至少该强引用的持续时间期间继续存在。对不可变缓冲区的“软”引用不能被用来在不首先将软引用转换成强引用的情况下访问来自不可变缓冲区的数据。一旦数据访问完成,强引用可被转换成软引用。
软引用可被用作存储器管理提示的一种形式。如果只存在任何计算实体对给定不可变缓冲区的软引用且系统的存储器正在减少,则该系统可以选择回收支持该不可变缓冲区的存储器。如果这种情况发生,则将软引用转换成强引用的下一尝试将失败。缓冲区的内容丢失且计算实体将必须根据数据源重新生成另一不可变缓冲区的内容。
这一软引用是使用尽可能多的系统存储器作为高速缓存的有价值的方式,而无需调节系统中的高速缓存的大小的高准确度。例如,高速缓存可以选择持有其大部分数据作为软引用而非强引用。另一进程的存储器使用尖锋随后可足够大以将系统驱动到低存储器状态。该系统随后可快速反应并从那些软引用释放存储器,而无需作出与将多少存储器给予哪一进程有关的任何选择。
计算实体还可持有对给定不可变缓冲区的“弱”引用。与软引用一样,弱引用必须被转换成“强”引用以允许对不可变缓冲区内的数据的访问。强引用也可被转换成弱引用。弱引用提供用于这些缓冲区的存储器管理的第二种形式。它被用来保持对不可变缓冲区的潜在访问,而不使得持有该弱引用的计算实体承担该缓冲区所使用的存储器。如果只存在任何进程对给定不可变缓冲区的弱引用,则底层缓冲区可被立即释放。
对不可变缓冲区的弱引用可被用来减轻从具有对不可变缓冲区的强引用的另一进程检索对不可变缓冲区的强引用所需的进程间通信以及跨保护边界通信的成本。即,弱引用的高速缓存可被创建在一个计算实体(例如,一个进程)中以减轻从另一计算实体(例如,另一进程)检索这些缓冲区的成本,即使它们已经被该另一计算实体高速缓存。
图9示出第二计算实体第一次从第一计算实体支持的高速缓存进行读取的方法900的流程图。图10示出第二计算实体从第一计算实体支持的高速缓存进行后续读取的方法1000的流程图。方法900和1000一起允许第二计算实体基于第一计算实体所持有的高速缓存来构建本地高速缓存。方法900和1000可以在图8的环境800的上下文中执行,并且因而将频繁参考图8来描述。
首先参考图8的环境800,第一计算实体810具有由不可变缓冲区801所支持的数据的高速缓存811。第二计算实体820也要获取来自不可变缓冲区的数据。第二计算实体820还要维护从不可变缓冲区801导出的数据的高速缓存812。然而,在以下意义上高速缓存812是弱高速缓存:在停止存在之前,它可能不等待来自第二计算实体的释放命令。因而,第二计算实体820不具有对其高速缓存812何时被释放的控制。
边界830(处理器间或保护边界)位于第一计算实体810与第二计算实体820之间。在一个示例实现中,假定第一计算实体是文件系统,且第二计算实体是提供和/或处理文件系统所提供的文件的web服务器。
在第一计算实体获取高速缓存(例如,在文件系统的情况下是文件高速缓存)时,第一计算实体得到对数据的更快和更多的本地访问(因此是术语“高速缓存”),而且还获取对支持该高速缓存的不可变缓冲区的强引用。强引用提供以下保证:不可变缓冲区(及其数据)将至少与第一计算实体继续持有强引用一样长地继续存在(并且可能更长,如果其他实体也持有对该不可变缓冲区的强引用的话)。在这一状态下,进入图9的描述,它示出了第二计算实体(例如,第二计算实体820)从第一计算实体(例如,第一计算实体810)所支持的高速缓存(例如,高速缓存811)进行初始读取的方法900。
第二计算实体与第一计算实体通信以获得对不可变数据的强引用(动作901)。这是进程间或跨保护边界通信,并且因而是昂贵的通信。然而,它可能是所需的唯一跨边界通信,只要支持高速缓存的不可变缓冲区继续存在。例如,假定web服务器接收到对高速缓存内包含的文件的第一请求。这一初始请求可以使得web服务器执行这一初始通信并从文件系统获得对不可变缓冲区的强引用。使用这一强引用,第二计算实体可以读取来自不可变缓冲区的数据(动作902)。在读取来自高速缓存的数据之时或之后,第二计算实体将对不可变缓冲区的强引用降级成对不可变缓冲区的弱引用(动作903)。
图10示出供第二计算实体从由第一计算实体支持的高速缓存进行后续读取(如果第二计算实体的高速缓存不具有该数据的话)的方法1000的流程图。在接收到对从高速缓存进行读取的请求而对该高速缓存的弱引用仍然存在时(动作1001),第二计算实体确定不可变缓冲区是否仍然存在(判定框1002)。如果不可变缓冲区仍然存在(判定框1002中的“是”),则第二计算实体将其弱引用转换成对不可变缓冲区的强引用(动作1011)、读取缓冲区(动作1012)(并且将该数据本地地高速缓存在本地高速缓存812中),并且此后将强引用转换回弱引用(动作1013)。这在不执行与第一计算实体的进程间通信或跨保护边界通信的情况下完成。相反,第二计算实体简单地获取不可变缓冲区的视图,并从不可变缓冲区进行读取。
如果不可变缓冲区没有存在(判定框1002中的“否”)。执行与第一计算实体的进程间通信或跨保护边界通信,以由此使得第一计算实体重新获取数据并重建新的不可变缓冲区(动作1021)。随后,返回方法900,第二计算实体随后可得到对新不可变缓冲区的强引用(动作901)并从该缓冲区进行读取(动作902)。
在高速缓存系统中,经常发生的情形是高速缓存的服务器(即第一计算实体)替换该高速缓存中的项(例如,键X的值从A变为B)。在本文描述的这一弱/强高速缓存系统中,一旦键X的值A被高速缓存为弱,则客户端(即第二计算实体)决不会与服务器通信,并且因而也不会看见X的值已经改变。由于系统中某处的一些用户,客户端自己的X副本具有值A,维持对该值的强引用。在一些实施例中,这通过使对给定值的所有弱引用无效来解决。这一无效过程对底层不可变缓冲区进行标记,从而弱到强的转换不再可能。这迫使任何弱高速缓存重新获取X的值,而这将使得弱高速缓存检测到新的值B。
第二计算实体可被看作具有从第一计算实体的强高速缓存(在第一计算实体的控制下保持就位的高速缓存)导出的弱高速缓存(在第二计算实体使用弱高速缓存完成之前可能必须被重建的高速缓存)。在另一强高速缓存之上构建这一第二“弱”高速缓存造成了后备高速缓存上的替换(或逐出)策略的一些问题。逐出指的是其中较少使用的数据(即,“冷”数据)被从高速缓存移除(或逐出)来为较频繁地使用的数据(即,“热”数据)腾出空间。逐出基于与某些数据项被访问的频率有关的统计信息。弱高速缓存812和强高速缓存811具有与高速缓存各部分的访问频率有关的不同统计信息,因为它们看到对数据的不同请求。
具体而言,在退回到后备高速缓存811之前,弱高速缓存812将被用来首先服务第二计算实体820的请求。这一弱高速缓存因而将吸收对热数据的除初始引用之外的所有引用,从而隐藏它们对后备高速缓存811的有用性。因而,在后备高速缓存811接收到对新项的请求时,在不对这一点进行寻址的情况下,后备高速缓存可根据弱高速缓存812的统计信息使得“热”数据替换仍然被弱高速缓存812保留的项。这一替换可以移除对底层缓冲区的最后一个持久存储的强/弱引用,从而释放与弱高速缓存中的弱引用相对应的缓冲区。针对该弱高速缓存的对该项的下一请求随后将失败。
根据本文描述的各实施例,这一问题是通过将热数据(如弱高速缓存812看到的)的有用性传递给后备高速缓存811来解决的。在第二计算实体将对数据的弱引用转换成对该数据的强引用时,该系统可提供这一机制作为副作用。该系统对每底层缓冲区这一点发生的次数进行计数并且将这一计数暴露作为缓冲区本身的元数据属性。后备高速缓存随后可查询这一值并确定在任何两个时间点之间发生的引用的数量。这一信息可被后备高速缓存的替换算法用来保持该项存活在这两个高速缓存中。
图11示出第一计算实体(或后备高速缓存)执行逐出的方法1100的流程图。首先,后备高速缓存使用其自己的统计信息以标识逐出候选(动作1101)。第一后备高速缓存随后与弱高速缓存的第二统计信息协商所标识的那些候选(动作1102)。在与第二统计信息协商之后,随后提交与所标识的候选有关的逐出决定(动作1103),使得如果第二统计信息指示对所标识的候选的更频繁访问,则所标识的候选可被暂时保持在高速缓存内。
这一逐出策略允许任意复杂的弱高速缓存架构。由于强高速缓存所使用的逐出策略的本质,该逐出策略对给定缓冲区的弱到强转换进行计数,因而该转换的源是不相关的。因而可能使得任何数目的弱高速缓存保持对同一底层缓冲区的许多独立弱引用,而对强高速缓存的逐出策略具有相同等价的效果。此外,甚至对于具有基于强高速缓存的多层嵌套弱高速缓存的架构而言,这一效果也是相同的。高速缓存系统可因而用于丰富的系统设计。例如,可以在日志结构化存储之上的文件系统上结构化web服务器。强高速缓存将位于日志结构化存储中的底部。文件系统将具有第一层弱高速缓存。web服务器将具有第二层弱高速缓存。同样的数据项(例如文件的一部分)可以被保持在所有三个高速缓存中。
这前三个概念(即,不可变可共享零复制批量数据、零复制数据流、以及零复制高速缓存)可被应用于非受管代码系统中以及受管代码系统中。然而,因为受管系统所提供的视图可比非受管系统更快地创建且被做成更细的粒度,所以这些原理可与受管系统一起最高效地使用。
图12示出示例受管代码系统1200。受管系统1200包括受管存储器1201。受管系统1200具有多个受管代码组件1230,每一组件具有对实体专用存储器的排他访问。例如,运行的受管代码组件1230被示为包括七个组件1231到1237,但省略号1238标识这一数量的很大灵活性。例如,组件1231到1237可以是进程。
七个运行的组件1231到1237中的每一个具有对应的实体专用存储器1211到1217。受管组件可不访问另一实体专用存储器的实体专用存储器。因而,这是实体专用存储器之间的隔离保护,使得只有对应的受管组件可以访问该实体专用存储器。例如,组件1231访问实体专用存储器部分1211,但不访问实体专用存储器部分1212到1217;组件1232访问实体专用存储器部分1212,但不访问实体专用存储器部分1211或实体专用存储器部分1213到1217,以此类推。
受管代码存储器1210还包括共享存储器1219。这一共享存储器1219是图3A、3B和5的不可变缓冲区330的示例。换言之,以上描述的原理根本不依赖于受管代码系统。然而,本文描述的最终两个概念被限于受管环境。图12的几个进一步元素将参考这最终两个概念(即,统一存储器访问和类型安全类型铸造)的描述来进行描述。
统一存储器访问
受管语言环境中的存储器是可能非常动态的事物。对象被分配出堆且由垃圾收集器管理。参考图12,受管系统1200包括垃圾收集器1221。基于试探法,垃圾收集器通过将对象压缩在一起以回收先前使用的空间来定期执行堆的维护。将对象压缩在一起暗示对象的存储器地址基本上是不稳定的,遭受垃圾收集器的改变。垃圾收集器依赖于特定代码生成模式和来自操作系统的支持,以能够以对应用级代码透明的方式来移动对象。
操作系统的I/O子系统负责通过系统存储器混洗大量数据。在读取时,数据通常从外部设备获取并通过由设备本身管理的具有与处理器的最小交互的DMA操作来被置于存储器中。类似地,在写出数据时,DMA存储器操作可自动读取存储器的内容。
DMA操作不能与在操作期间被重新分配的存储器的内容竞争。这样做将需要处理器与设备之间的细粒度协调,这将极大地影响性能和功率效率。作为这一约束的结果,存在两个宽泛选项来支持受管操作系统中的DMA。
特殊锁定(pinning)操作被针对存储器区域使用以指令垃圾收集器不重新分配指定对象。这允许DMA操作在它们执行时看到受影响的存储器的一致快照。
DMA操作发生在不遭受垃圾收集的特殊存储器区域中。
第一种方法可能明显妨碍垃圾收集器的效率,因为处理锁定的存储器区域使压缩过程复杂化并降低其效率。第二种方法避免了该问题,但可能容易导致过量存储器复制,因为需要特殊化的逻辑来在正常存储器区域和特殊DMA友好存储器区域之间转移数据。
统一存储器访问体系结构给出了系统化的方式来引用存储器,而不管它是正常的受管存储器还是特殊的DMA友好的存储器区域。这使得程序员以完全安全的方式直接操纵DMA友好的存储器区域中的数据成为可能,从而避免对锁定对象的需求以及在正常存储器和DMA友好的存储器之间的进行复制这两者。
在受管语言环境中,批量数据通常被保持在阵列中。受管语言环境(例如,受管系统1200)直接理解阵列,从而允许访问各单独的阵列元素并确保程序员不能超过阵列的边界。在由语言环境管理的情况下,阵列被约束成位于受管堆中。
在图12的受管系统1200中,不可变缓冲区1219位于受管堆外部,并且因此在正常情况下将不能从受管程序直接访问。从I/O存储器进行读和写通常将使用具有显式读和写操作(包括受管堆中的正常存储器与I/O存储器之间的隐式复制)的典型I/O包来完成。
受管系统包括提供从受管代码组件直接访问不可变缓冲区1219的机制的抽象(本文称为“跨度”)。参考图12,受管存储器部分1211包括各种对象,包括抽象地表示的跨度抽象1240。跨度可被安全地创建以按与阵列工作的方式非常类似的方式来提供对I/O缓冲区的任何区域的直接访问。此外,跨度可被构造以引用受管存储器。构建在跨度之上的软件抽象因此对跨度的底层存储器的位置是不可知的。这提供了最终组成情况,从而允许抽象按自然的方式来设计以操作受管存储器(例如,存储器部分1211到1218)或不可变缓冲区1219。
跨度可通过与该跨度的底层存储进行交互来创建。例如,不可变缓冲区1219可以提供方法调用以返回跨度,其中该跨度引用由该跨度直接控制的不可变缓冲区。类似地,阵列提供返回指向它们或它们的各部分的跨度的方法。一旦跨度被物化,它就可被传递且在很大程度上与阵列在正常受管语言中使用得那样相类似地使用。
跨度的特定细节涉及底层存储的寿命管理。受管编程环境的主要益处之一在于垃圾收集器负责检测对象何时不再被引用并且它们的存储可被回收。这是例如在阵列不再有用的情况下发生的。
在跨度底层的存储器处于正常垃圾收集堆外部时,该存储器的寿命应当被仔细管理,使得所创建的引用该存储器的跨度不比存储器缓冲区本身更长寿。这可以按多种方式来安排,如通过使用底层存储器上的引用计数器或界定跨度本身的寿命。
在一个实施例中,跨度对象保持指向它表示的存储器区域的特殊地注释的指针。垃圾收集器理解这些特殊指针并特殊地对待它们。在垃圾收集操作期间,如果垃圾收集器遇到特殊指针,它考虑该指针所保持的地址。如果垃圾收集器检测到该指针指向受管堆的外部,则垃圾收集器从当时开始完全忽略该指针。如果相反,该指针被发现指向受管堆内的点,则垃圾收集器将该指针当作对受管对象的引用并且因此自动调整指针的值,以防万一底层对象被重新分配。
跨度可被创建以表示其他跨度的子区域。这使得跨度成为在无需作出复制的情况下以安全且便宜的方式从较大存储器区域切割大块的非常方便的方式。所得的跨度看起来像任何其他跨度,即使它被混合成另一跨度的存储器的子集。
类型安全类型铸造
受管编程语言的主要角色是实施类型安全性,这防止程序取得存储器中的任意地址并将它作为对象来操纵。例如,图12的受管系统1200包括确保类型安全性的类型系统1222。所有对象被显式地获取且每一对象的地址被垃圾收集器(例如,垃圾收集器1221)稳固地控制。在这样的系统中,不在垃圾收集器直接控制之下的存储器不能被应用代码直接使用。相反,存储器在能被使用之前需要被从特殊存储器复制回到由垃圾收集器控制的存储器,这是低效的。
在数据通过DMA操作流入和流出系统时,由DMA设备操纵的数据通常具有某种固有形状。例如,在通过DMA写出数据时,垃圾收集堆中的一些数据结构通常保持需要被写出的数据。“串行化”步骤随后被用来将这些结构中的数据转录到DMA操作所需的形状中。这一串行化步骤是冗长的、易错的、以及低效的。串行化和解除串行化通常是受管编程语言的重要部分。
通过利用跨度抽象,通用模型使程序员能够使用面向对象的语义与DMA存储器区域直接交互。特殊类型铸造支持使得程序员将DMA存储器区域当作对象成为可能,并且因此以自然的方式直接读和写存储器,从而最大化效率、提高正确性、并简化程序员的任务。模型扩展出仅DMA存储器之外,并且还支持经扩展的类型铸造语义以用于正常垃圾收集存储器。
为了维护类型安全性,允许任意类型之间的类型铸造是不可能或不合乎需要的。相反,存在约束这一扩展的类型铸造中能涉及的所允许的类型的集合的特定规则。然而,该规则相当宽泛,且结果对DMA操作中通常涉及的数据种类完美地起作用。
在受管编程语言中,每当存储器被分配时,它被分配给定类型。该类型确定存储器块的不同部分的重要性以及可对该存储器块执行的操作。该类型不能针对该存储器块改变,直至该存储器变得不活动并通过垃圾收集过程回收。语言环境始终负责分配、类型化、以及回收存储器块。
类型铸造是将一些存储器当作与受管环境所知的类型不同的类型的能力。类型铸造在本机编程语言中是常见的,但受管语言通常不提供类型铸造。相反,受管环境提供使得将一个类型的值复制到另一类型成为可能的类型转换机制。例如,将整数值转换成浮点值是可能的。然而,这总是通过复制来完成的——原始存储器位置保持不变。
根据本文描述的原理,类型铸造被引入作为受管语言中的通用工具。约束被应用以确保类型安全性得到保留,如稍后解释的。
在受管操作系统中,用于I/O操作的存储器必须是锁定对象或专用于I/O的存储器区域。如上所述,将对象锁定在存储器中以防止它们移动是昂贵的且导致垃圾收集环境中的许多问题。本文描述的原理假借不可变缓冲区(如图3A、3B和5的不可变缓冲区330)来使用专用I/O存储器。
I/O存储器在受管存储器子系统的范围之外。受管环境不控制这一存储器的类型,并且因此从受管程序直接访问这一种类的存储器是不可能的。相反,通常将使用特殊连接(即,胶合)代码以允许这一存储器被使用显式调用来读或写。访问这些I/O缓冲区内的任何种类的结构化数据涉及极其低效的代码,或涉及将去往和来自I/O存储器的数据复制到正常受管存储器,这也是低效的。
考虑从网络设备获取的不可变缓冲区。在这一缓冲区中,存在保持联网协议信息的TCP头部。存在基本上两种方式来在受管编程语言中使用TCP头部中的数据。下表示出了这两种方式以及每一方式中涉及的步骤。
典型受管环境类型铸造
确定缓冲区中TCP头部的偏移。确定缓冲区中TCP头部的偏移。
对于TCP头部中的每一字段
通过类似ReadInt32或ReadInt16的API来读取该字段。
将该字段存储在本地临时存储中。将不可变缓冲区的适当部分铸造成TCP头部对象。
在读取了所有字段时,在受管堆中创建TCP头部对象。这再次涉及显式地复制TCP头部中的每一字段,这一次是从本地存储复制到堆存储。访问TCP头部对象以执行必要的任何动作。
访问TCP头部对象以执行必要的任何动作。
使用类型铸造比使用传统方法获得可使用的TCP头部对象快得多。该新方法模仿本机操作环境中发生的事物,其中指针数学是可能的且在这一类型的场景中被频繁利用。指针数学在受管编程语言中不是可用的,但类型安全类型铸造给出了相同的功能。
传统方法的各种变型(它们导致更多或更少开销)是可能的。例如,所讨论的存储器缓冲区对程序员直接可用且因此可比通过使用读/写方法更高效地访问是可能的。然而,在这种情况下,程序员仍然负责将字节序列转换成更高级对象,这是冗长的、易错的且执行很差。
使类型铸造成为可能并确保类型安全性被保留的是类型铸造只对被设计成允许它的类型才是可能的。为了参与类型铸造,各类型:1)是值类型(与引用类型相对),2)只包括支持类型铸造的其他类型,3)不包括引用,4)被定义为使用特定存储器布局,以及5)在其各字段中的任一者中容忍任何位模式。
这些约束意味着为了被用于类型铸造,类型不能包含对其他对象的引用。结果是,这些约束完美地描述了被定义为表示数据格式(如TCP头部)的类型以及其他这样的数据结构的广大集合的特性。
如上所述,类型安全类型铸造可被用来读或写位于受管存储器环境的范围之外的I/O缓冲区,且也可被用来将受管存储器看作不同类型。具体而言,这一技术对将字节阵列改为看作一个或多个更丰富类型的实例是有用的。
图13描绘正常受管字节阵列,它具有指向它的两个不同的跨度并允许应用将该阵列的各部分看作不同的类型。可以此方式创建任何数量的跨度,每一跨度具有不同的类型。各跨度可自由重叠,可能引用同一存储器区域作为不同的类型。
声明任何位模式必须在其各字段中的任一者中是可容忍的规则对模型的可靠性而言是重要的。在使用类型铸造时,以其他方式看起来正常的对象的实例被引入该环境,而无需执行类型构造器。通常,构造器执行输入自变量的确认并用于最终约束组成对象的所允许的值的集合。但使用类型铸造,通过将现有存储器跨度看作不同的类型来无中生有地创建对象是可能的。
将数据复制到受管堆中的不同对象的传统方法提供了在数据被推送到受管对象的构造器时确认该数据的机会。这意味着在现实世界系统中,受管对象的无效版本从不存在于系统内,构造器确保只有有效的版本可被创建。与此相反,使用类型铸造,任何位模式可以出现。如果存在语义上无效的值,则它们可被检测到,因为对象构造不会发生。
对正确性问题的解决方案是在软件中引入附加抽象层。具体而言,如果再次以读取TCP头部作为示例,可以想象开发人员已经定义了两个不同类型:RawTcpHeader(原始TCP头部)和ValidTcpHeader(有效TCP头部)。
输入缓冲区中的数据将被类型铸造成RawTcpHeader。给定该对象,AcquireValidTcpHeader(获取有效TCP头部)方法可被调用。这一方法将确认RawTcpHeader中的各字段并且返回ValidTcpHeader的新实例,该新实例担当RawTcpHeader的平凡包装器并将告知持有者它持有了保证有效的头部。这全部在无需复制的情况下完成,仅创建了通过对象(它是ValidTcpHeader值类型)。
本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变都被权利要求书的范围所涵盖。

Claims (8)

1.一种用于高速缓存来自不可变缓冲区的数据的系统,包括:
不可变缓冲区,所述不可变缓冲区保护填充在所述不可变缓冲区中的数据在所述不可变缓冲区的寿命期间免于改变,并且还保护所述不可变缓冲区在所述不可变缓冲区的寿命期间免于改变其物理地址;
第一计算实体,所述第一计算实体维持所述不可变缓冲区的高速缓存并且具有对所述不可变缓冲区的强引用,其中只要任何实体具有对所述不可变缓冲区的强引用,所述不可变缓冲区就被保证在至少具有强引用的每一实体的所述强引用的历时中持续存在;以及
第二计算实体,所述第二计算实体与所述第一计算实体通信以获得对所述不可变缓冲区的强引用,并且之后从所述不可变缓冲区读取数据,其中在从所述高速缓存读取数据之时或之后,所述第二计算实体使对所述不可变缓冲区的强引用降级成对所述不可变缓冲区的弱引用,其中对所述不可变缓冲区的弱引用不保证所述不可变缓冲区将在所述弱引用的历时中持续存在,
在对所述高速缓存的弱引用仍然存在的同时接收到要从所述不可变缓冲区进行读取的请求之时,所述第二计算实体确定所述不可变缓冲区是否仍然存在,
如果所述不可变缓冲区仍然存在,则所述第二计算实体将对所述不可变缓冲区的弱引用转换成对所述不可变缓冲区的强引用,并且在不执行与所述第一计算实体的进程间或跨保护边界通信的情况下从所述不可变缓冲区读取数据;以及
如果所述不可变缓冲区不存在,则所述第二计算实体执行与所述第一计算实体的进程间或跨保护边界通信,藉此使得所述第一计算实体重新获取数据并重新创建新的不可变缓冲区,并且允许所述第二计算实体获得对所述新的不可变缓冲区的强引用并且从所述新的不可变缓冲区进行读取。
2.如权利要求1所述的系统,其特征在于,函数调用不能被置于所述第一计算实体和所述第二计算实体之间,而是进程间通信或跨保护边界通信被用于供所述第一计算实体和所述第二计算实体进行通信。
3.如权利要求1所述的系统,其特征在于,进一步包括:
视图提供者,被配置成向所述第一计算实体和所述第二计算实体给出对所述不可变缓冲区的不同视图。
4.如权利要求1所述的系统,其特征在于,所述第一计算实体将关于对不可变缓冲区的访问频率的第一统计信息维持在高速缓存中,并且其中所述第二计算实体将关于对不可变缓冲区的访问频率的第二统计信息维持在所述高速缓存中,所述第一和第二统计信息是不同的。
5.如权利要求4所述的系统,其特征在于,所述第一计算实体被配置成执行以下操作以便执行逐出:
使用所述第一统计信息来标识所述高速缓存中的不可变缓冲区之间供逐出的候选的动作;
与所述第二统计信息协商关于至少被标识的候选的动作;以及
在与所述第二统计信息协商之后相对于每一被标识的逐出候选作出关于被标识的候选的逐出决定的动作,以使得如果所述第二统计信息指示对被标识的候选的更频繁访问,则被标识的候选能暂时被保持在所述高速缓存中。
6.如权利要求1所述的系统,其特征在于,所述系统是受管代码系统。
7.如权利要求1所述的系统,其特征在于,所述系统是非受管系统。
8.一种用于高速缓存来自不可变缓冲区的数据的方法,所述方法包括:
第一计算实体访问对不可变缓冲区的第一强引用的动作,其中所述不可变缓冲区保护填充在所述不可变缓冲区中的数据在所述不可变缓冲区的寿命期间免于改变,并且所述不可变缓冲区还被保护在所述不可变缓冲区的寿命期间免于改变其物理地址,其中只要任何实体具有对所述不可变缓冲区的强引用,所述不可变缓冲区就被保证在至少具有所述强引用的每一实体的所述强引用的历时中持续存在;
所述第一计算实体使用来自所述不可变缓冲区的数据来制定高速缓存的动作;
所述第一计算实体向第二计算实体提供第二强引用的动作;以及
当所述第一计算实体通过所述高速缓存完成时,所述第一计算实体释放所述第一强引用的动作,
在对所述高速缓存的弱引用仍然存在的同时接收到要从所述不可变缓冲区进行读取的请求之时,所述第二计算实体确定所述不可变缓冲区是否仍然存在,
如果所述不可变缓冲区仍然存在,则所述第二计算实体将对所述不可变缓冲区的弱引用转换成对所述不可变缓冲区的强引用,并且在不执行与所述第一计算实体的进程间或跨保护边界通信的情况下从所述不可变缓冲区读取数据;以及
如果所述不可变缓冲区不存在,则所述第二计算实体执行与所述第一计算实体的进程间或跨保护边界通信,藉此使得所述第一计算实体重新获取数据并重新创建新的不可变缓冲区,并且允许所述第二计算实体获得对所述新的不可变缓冲区的强引用并且从所述新的不可变缓冲区进行读取。
CN201480004102.9A 2013-01-04 2014-01-03 零复制高速缓存 Active CN105378673B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/734,785 2013-01-04
US13/734,785 US9323693B2 (en) 2013-01-04 2013-01-04 Zero-copy caching
PCT/US2014/010134 WO2014107553A2 (en) 2013-01-04 2014-01-03 Zero-copy caching

Publications (2)

Publication Number Publication Date
CN105378673A CN105378673A (zh) 2016-03-02
CN105378673B true CN105378673B (zh) 2018-12-14

Family

ID=50029242

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201480004102.9A Active CN105378673B (zh) 2013-01-04 2014-01-03 零复制高速缓存

Country Status (6)

Country Link
US (1) US9323693B2 (zh)
EP (1) EP2941704B1 (zh)
CN (1) CN105378673B (zh)
BR (1) BR112015015933B1 (zh)
ES (1) ES2738282T3 (zh)
WO (1) WO2014107553A2 (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9330055B2 (en) * 2013-06-04 2016-05-03 International Business Machines Corporation Modular architecture for extreme-scale distributed processing applications
US10503405B2 (en) * 2015-02-10 2019-12-10 Red Hat Israel, Ltd. Zero copy memory reclaim using copy-on-write
US9921875B2 (en) 2015-05-27 2018-03-20 Red Hat Israel, Ltd. Zero copy memory reclaim for applications using memory offlining
US9971550B2 (en) 2015-11-12 2018-05-15 International Business Machines Corporation Zero copy support by the virtual memory manager
US10719446B2 (en) * 2017-08-31 2020-07-21 Oracle International Corporation Directly mapped buffer cache on non-volatile memory
US11151050B2 (en) 2020-01-03 2021-10-19 Samsung Electronics Co., Ltd. Efficient cache eviction and insertions for sustained steady state performance

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6643263B1 (en) * 1998-03-31 2003-11-04 Telefonaktiebolaget Lm Ericsson (Publ) Device and method for buffer protection
US8055622B1 (en) * 2004-11-30 2011-11-08 Symantec Operating Corporation Immutable data containers in tiered storage hierarchies

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7251735B2 (en) 2003-07-22 2007-07-31 Lockheed Martin Corporation Buffer overflow protection and prevention
US7428730B2 (en) 2003-12-15 2008-09-23 Intel Corporation Software development environment
US7269718B2 (en) 2004-04-29 2007-09-11 International Business Machines Corporation Method and apparatus for verifying data types to be used for instructions and casting data types if needed
US7346762B2 (en) 2006-01-06 2008-03-18 Apple Inc. Replacing instruction and corresponding instructions in a queue according to rules when shared data buffer is accessed
JP2009129127A (ja) 2007-11-22 2009-06-11 Fujitsu Ltd プログラムの不変物抽出処理プログラム,処理装置,および処理方法,ならびに該プログラムを記憶する記憶媒体
GB0911099D0 (en) 2009-06-26 2009-08-12 Codeplay Software Ltd Processing method
US20120150925A1 (en) 2010-12-10 2012-06-14 International Business Machines Corporation Proactive Method for Improved Reliability for Sustained Persistence of Immutable Files in Storage Clouds
US8863080B2 (en) 2011-11-29 2014-10-14 Red Hat, Inc. Maintaining a pointer's type
US9015831B2 (en) 2012-08-08 2015-04-21 Synopsys, Inc Method and apparatus for static taint analysis of computer program code

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6643263B1 (en) * 1998-03-31 2003-11-04 Telefonaktiebolaget Lm Ericsson (Publ) Device and method for buffer protection
US8055622B1 (en) * 2004-11-30 2011-11-08 Symantec Operating Corporation Immutable data containers in tiered storage hierarchies

Also Published As

Publication number Publication date
BR112015015933A8 (pt) 2019-10-22
CN105378673A (zh) 2016-03-02
US20140195739A1 (en) 2014-07-10
BR112015015933A2 (pt) 2017-07-11
ES2738282T3 (es) 2020-01-21
EP2941704A2 (en) 2015-11-11
WO2014107553A3 (en) 2014-08-28
BR112015015933B1 (pt) 2022-04-12
EP2941704B1 (en) 2019-05-15
US9323693B2 (en) 2016-04-26
WO2014107553A2 (en) 2014-07-10

Similar Documents

Publication Publication Date Title
CN105051695B (zh) 不可变可共享零复制数据和流传输
CN105103136B (zh) 共享和受管的存储器统一访问
Mahgoub et al. {SONIC}: Application-aware data passing for chained serverless applications
CN105378673B (zh) 零复制高速缓存
Chen et al. Computation and communication efficient graph processing with distributed immutable view
Sha et al. A new design of in-memory file system based on file virtual address framework
US9448934B2 (en) Affinity group access to global data
Zhang et al. A virtual memory foundation for scalable deterministic parallelism
Appavoo Clustered objects
CN105103126B (zh) 受管代码系统中的类型铸造
Craddock et al. The Case for Physical Memory Pools: A Vision Paper
US9298622B2 (en) Affinity group access to global data
AOUKAR et al. Evaluation and Analysis of Graph Navigation query in Edge Streaming Database
Schmidt et al. Developing a Cloud-based Virtual Machine

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant