不可变可共享零复制数据和流传输的制作方法_4

文档序号:9332660阅读:来源:国知局
有存在(判定框1002中的"否")。执行与第一计算实体的 进程间通信或跨保护边界通信,以由此使得第一计算实体重新获取数据并重建新的不可变 缓冲区(动作1021)。随后,返回方法900,第二计算实体随后可得到对新不可变缓冲区的 强引用(动作901)并从该缓冲区进行读取(动作902)。
[0088] 因而,第二计算实体可被看做具有从第一计算实体的强高速缓存(在第一计算实 体的控制下保持就位的高速缓存)导出的弱高速缓存(在第二计算实体使用弱高速缓存完 成之前可能必须被重建的高速缓存)。在另一强高速缓存之上构建这一第二"弱"高速缓存 造成了后备高速缓存上的替换(或逐出)策略的一些问题。逐出指的是其中较少使用的数 据(即,"冷"数据)被从高速缓存移除(或逐出)来为较频繁地使用的数据(即,"热"数 据)腾出空间。逐出基于与某些数据项被访问的频率有关的统计信息。弱高速缓存812和 强高速缓存811具有与高速缓存各部分的访问频率有关的不同统计信息,因为它们看到对 数据的不同请求。
[0089] 具体而言,在退回到后备高速缓存811之前,弱高速缓存812将被用来首先服务第 二计算实体820的请求。这一弱高速缓存因而将吸收对热数据的除初始引用之外的所有引 用,从而隐藏它们对后备高速缓存811的有用性。因而,在后备高速缓存811接收到对新 项的请求时,在不对这一点进行寻址的情况下,后备高速缓存可根据弱高速缓存812的统 计信息使得"热"数据替换仍然被弱高速缓存812保留的项。这一替换可以移除对底层缓 冲区的最后一个持久存储的强/弱引用,从而释放与弱高速缓存中的弱引用相对应的缓冲 区。针对该弱高速缓存的对该项的下一请求随后将失败。
[0090] 根据本文描述的各实施例,这一问题是通过将热数据(如弱高速缓存812看到的) 的有用性传递给后备高速缓存811来解决的。在第二计算实体将对数据的弱引用转换成对 该数据的强引用时,该系统可提供这一机制作为副作用。该系统对每底层缓冲区这一点发 生的次数进行计数并且将这一计数暴露作为缓冲区本身的元数据属性。后备高速缓存随后 可查询这一值并确定在任何两个时间点之间发生的引用的数量。这一信息可被后备高速缓 存的替换算法用来保持该项存活在这两个高速缓存中。
[0091] 图11示出第一计算实体(或后备高速缓存)执行逐出的方法1100的流程图。首 先,后备高速缓存使用其自己的统计信息以标识逐出候选(动作1101)。第一后备高速缓存 随后与弱高速缓存的第二统计信息协商所标识的那些候选(动作1102)。在与第二统计信 息协商之后,随后提交与所标识的候选有关的逐出决定(动作1103),使得如果第二统计信 息指示对所标识的候选的更频繁访问,则所标识的候选可被暂时保持在高速缓存内。
[0092] 这前三个概念(即,不可变可共享零复制批量数据、零复制数据流、以及零复制高 速缓存)可被应用于非受管代码系统中以及受管代码系统中。然而,因为受管系统所提供 的视图可比非受管系统更快地创建且被做成更细的粒度,所以这些原理可与受管系统一起 最高效地使用。
[0093] 图12示出示例受管代码系统1200。受管系统1200包括受管存储器1201。受管 系统1200具有多个受管代码组件1230,每一组件具有对实体专用存储器的排他访问。例 如,运行的受管代码组件1230被示为包括七个组件1231到1237,但省略号1238标识这一 数量的很大灵活性。例如,组件1231到1237可以是进程。
[0094] 七个运行的组件1231到1237中的每一个具有对应的实体专用存储器1211到 1217。受管组件可不访问另一实体专用存储器的实体专用存储器。因而,这是实体专用存储 器之间的隔离保护,使得只有对应的受管组件可以访问该实体专用存储器。例如,组件1231 访问实体专用存储器部分1211,但不访问实体专用存储器部分1212到1217 ;组件1232访 问实体专用存储器部分1212,但不访问实体专用存储器部分1211或实体专用存储器部分 1213到1217,以此类推。
[0095] 受管代码存储器1210还包括共享存储器1219。这一共享存储器1219是图3A、3B 和5的不可变缓冲区330的示例。换言之,以上描述的原理根本不依赖于受管代码系统。然 而,本文描述的最终两个概念被限于受管环境。图12的几个进一步元素将参考这最终两个 概念(即,统一存储器访问和类型安全类型铸造)的描述来进行描述。
[0096] 统一存储器访问
[0097] 受管语言环境中的存储器是可能非常动态的事物。对象被分配出堆且由垃圾收集 器管理。参考图12,受管系统1200包括垃圾收集器1221。基于试探法,垃圾收集器通过将 对象压缩在一起以回收先前使用的空间来定期执行堆的维护。将对象压缩在一起暗示对象 的存储器地址基本上是不稳定的,遭受垃圾收集器的改变。垃圾收集器依赖于特定代码生 成模式和来自操作系统的支持,以能够以对应用级代码透明的方式来移动对象。
[0098] 操作系统的I/O子系统负责通过系统存储器混洗大量数据。在读取时,数据通常 从外部设备获取并通过由设备本身管理的具有与处理器的最小交互的DMA操作来被置于 存储器中。类似地,在写出数据时,DM存储器操作可自动读取存储器的内容。
[0099] DM操作不能与在操作期间被重新分配的存储器的内容竞争。这样做将需要处理 器与设备之间的细粒度协调,这将极大地影响性能和功率效率。作为这一约束的结果,存在 两个宽泛选项来支持受管操作系统中的DMA。
[0100] 特殊锁定(pinning)操作被针对存储器区域使用以指令垃圾收集器不重新分配 指定对象。这允许DM操作在它们执行时看到受影响的存储器的一致快照。
[0101] DM操作发生在不遭受垃圾收集的特殊存储器区域中。
[0102] 第一种方法可能明显妨碍垃圾收集器的效率,因为处理锁定的存储器区域使压缩 过程复杂化并降低其效率。第二种方法避免了该问题,但可能容易导致过量存储器复制,因 为需要特殊化的逻辑来在正常存储器区域和特殊DM友好存储器区域之间转移数据。
[0103] 统一存储器访问体系结构给出了系统化的方式来引用存储器,而不管它是正常的 受管存储器还是特殊的DM友好的存储器区域。这使得程序员以完全安全的方式直接操纵 DM友好的存储器区域中的数据成为可能,从而避免对锁定对象的需求以及在正常存储器 和DM友好的存储器之间的进行复制这两者。
[0104] 在受管语言环境中,批量数据通常被保持在阵列中。受管语言环境(例如,受管系 统1200)直接理解阵列,从而允许访问各单独的阵列元素并确保程序员不能超过阵列的边 界。在由语言环境管理的情况下,阵列被约束成位于受管堆中。
[0105] 在图12的受管系统1200中,不可变缓冲区1219位于受管堆外部,并且因此在正 常情况下将不能从受管程序直接访问。从I/O存储器进行读和写通常将使用具有显式读和 写操作(包括受管堆中的正常存储器与I/O存储器之间的隐式复制)的典型I/O包来完成。
[0106] 受管系统包括提供从受管代码组件直接访问不可变缓冲区1219的机制的抽象 (本文称为"跨度")。参考图12,受管存储器部分1211包括各种对象,包括抽象地表示的 跨度抽象1240。跨度可被安全地创建以按与阵列工作的方式非常类似的方式来提供对I/O 缓冲区的任何区域的直接访问。此外,跨度可被构造以引用受管存储器。构建在跨度之上 的软件抽象因此对跨度的底层存储器的位置是不可知的。这提供了最终组成情况,从而允 许抽象按自然的方式来设计以操作受管存储器(例如,存储器部分1211到1218)或不可变 缓冲区1219。
[0107] 跨度可通过与该跨度的底层存储进行交互来创建。例如,不可变缓冲区1219可以 提供方法调用以返回跨度,其中该跨度引用由该跨度直接控制的不可变缓冲区。类似地,阵 列提供返回指向它们或它们的各部分的跨度的方法。一旦跨度被物化,它就可被传递且在 很大程度上与阵列在正常受管语言中使用得那样相类似地使用。
[0108] 跨度的特定细节涉及底层存储的寿命管理。受管编程环境的主要益处之一在于垃 圾收集器负责检测对象何时不再被引用并且它们的存储可被回收。这是例如在阵列不再有 用的情况下发生的。
[0109] 在跨度底层的存储器处于正常垃圾收集堆外部时,该存储器的寿命应当被仔细管 理,使得所创建的引用该存储器的跨度不比存储器缓冲区本身更长寿。这可以按多种方式 来安排,如通过使用底层存储器上的引用计数器或界定跨度本身的寿命。
[0110] 在一个实施例中,跨度对象保持指向它表示的存储器区域的特殊地注释的指针。 垃圾收集器理解这些特殊指针并特殊地对待它们。在垃圾收集操作期间,如果垃圾收集器 遇到特殊指针,它考虑该指针所保持的地址。如果垃圾收集器检测到该指针指向受管堆的 外部,则垃圾收集器从当时开始完全忽略该指针。如果相反,该指针被发现指向受管堆内的 点,则垃圾收集器将该指针当作对受管对象的引用并且因此自动调整指针的值,以防万一 底层对象被重新分配。
[0111] 跨度可被创建以表示其他跨度的子区域。这使得跨度成为在无需作出复制的情况 下以安全且便宜的方式从较大存储器区域切割大块的非常方便的方式。所得的跨度看起来 像任何其他跨度,即使它被混合成另一跨度的存储器的子集。
[0112] 类铟安全类铟铸浩
[0113] 受管编程语言的主要角色是实施类型安全性,这防止程序取得存储器中的任意地 址并将它作为对象来操纵。例如,图12的受管系统1200包括确保类型安全性的类型系统 1222。所有对象被显式地获取且每一对象的地址被垃圾收集器(例如,垃圾收集器1221) 稳固地控制。在这样的系统中,不在垃圾收集器直接控制之下的存储器不能被应用代码直 接使用。相反,存储器在能被使用之前需要被从特殊存储器复制回到由垃圾收集器控制的 存储器,这是低效的。
[0114] 在数据通过DM操作流入和流出系统时,由DM设备操纵的数据通常具有某种固 有形状。例如,在通过DM写出数据时,垃圾收集堆中的一些数据结构通常保持需要被写出 的数据。"串行化"步骤随后被用来将这些结构中的数据转录到DM操作所需的形状中。这 一串行化步骤是冗长的、易错的、以及低效的。串行化和解除串行化通常是受管编程语言的 重要部分。
[0115] 通过利用跨度抽象,通用模型使程序员能够使用面向对象
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1