存储器管理设备、 存储器管理方法及其程序 技术领域 本公开内容涉及一种管理计算机存储器中的数据的存储器管理设备、 存储器管理 方法及其程序。
背景技术 在写时复制 (Copy-On-Write) 机制中, 例如, 在生成子进程时, 只为可以被重写的 页面分配物理存储器区域, 而针对不可以被重写的页面, 在其父进程的物理页面上进行共 享参考。然后, 在进行写入时, 首次分配针对子进程的所有数据的物理存储器区域, 并执行 复制。
另外, 在应用程序中, 常常希望在初始状态在存储器中写入零数据。在这种情况 下, 当操作系统使用上面提到的写时复制机制时, 可以在零页面 ( 该页面中的所有数据由 零数据构成 ) 上进行共享参考, 这提高了效率。
除了写时复制机制以外, 已经存在共享相同数据的系统。 例如, 在日本专利申请公 开 No.2009-543198( 下文称为专利文献 1) 中描述的方法中, 一模块通过使用数据块的散列 ( 指纹 ) 来搜索相同的数据, 从而尝试共享。
发明内容
然而, 即使当以上面提到的方式来使用写时复制机制时, 也会出现下面的问题。 例 如, 在希望在存储器中写入零数据的情况下, 大部分应用软件在启动时独立地执行用零填 充其多个页面的进程。因此, 由于此, 写时复制机制没有有效地工作, 这导致大大增加了零 页面的问题。
另一方面, 在使用散列的系统中, 如在专利文献 1 的方法中, 计算散列值的过程是 昂贵的。 搜索相同散列数据的过程也是昂贵的, 因而, 例如难以将这种方法应用到具有低处 理能力的计算器。
鉴于上面提到的情况, 需要提供一种存储器管理设备、 存储器管理方法及其程序, 其能够抑制在存储器中累积各自具有频繁出现模式的大量页面 ( 例如零页面等 ), 而不需 要高的计算处理能力。
根据本公开内容的实施方式, 提供了一种包括确定器和设置单元的存储器管理设 备。
所述确定器确定写入数据的模式是否是频繁出现模式, 其中所述写入数据是作为 在存储器中进行写入的指令的目标的数据。
所述设置单元在所述确定器确定所述写入数据的模式是所述频繁出现模式并且 所述频繁出现模式的数据已经被保持在所述存储器中的情况下, 对具有所述频繁出现模式 的所述写入数据设置共享参考 (shared reference)。
在本公开内容的实施方式中, 在所述写入数据的模式是所述频繁出现模式的情况 中, 如果所述写入数据已经被保持在所述存储器中, 则关于具有该频繁出现模式的后续数据设置所述共享参考。 因而, 抑制在存储器中累积具有频繁出现模式的大量数据是可能的。 另外, 在本公开内容的实施方式的过程中, 没有使用散列数据, 因而不需要高的计算处理能 力。
频繁出现模式可以是以下模式 : 其中, 具有相同值的预定数量的数据是连续的。 可 替换地, 所述频繁出现模式可以是通过计算机学习而累积的模式, 或者所述频繁出现模式 可以是复制源的数据模式。
所述确定器可以根据所述写入数据的模式是否与预先定义的所述频繁出现模式 相对应, 来确定所述写入数据的模式是否是所述频繁出现模式。
根据本公开内容的实施方式, 提供了一种存储器管理设备执行的存储器管理方 法, 所述方法包括 : 确定写入数据的模式是否是频繁出现模式, 其中所述写入数据是作为在 存储器中进行写入的指令的目标的数据。
在确定所述写入数据的模式是所述频繁出现模式并且所述频繁出现模式的数据 已经被保持在所述存储器中的情况下, 关于具有所述频繁出现模式的所述写入数据设置共 享参考。
根据本公开内容的实施方式, 提供了一种使存储器管理设备执行上面提到的存储 器管理方法的程序。 如上面描述的, 根据本公开内容的实施方式, 能够抑制在存储器中累积各自具有 零页面等的频繁出现模式的大量页面, 而不需要高的计算处理能力。
如附图中所示出的, 根据本公开内容的最佳实施方式的以下详细描述, 本公开内 容的这些以及其它目的、 特征和优点将变得更加明显。
附图说明 图 1 是示出了用于实现根据本公开内容实施方式的存储器管理设备的系统的配 置的方框图 ;
图 2 是示出了存储器管理设备执行的过程的流程图 ;
图 3 是示出了图 2 中的步骤 102 处的过程的流程图 ;
图 4 是示出了图 2 中的步骤 104 处的过程的流程图 ;
图 5 是各自示出了写入数据的逻辑映像和物理存储器块的示图, 其示出了零页面 模式成为频繁出现模式的例子 ; 以及
图 6 是各自示出了写入数据的逻辑映像和物理存储器块的示图, 其示出了复制源 的数据模式成为频繁出现模式的例子。
具体实施方式
下文中, 将参考附图来描述本公开内容的实施方式。
[ 用于实现存储器管理设备的配置 ]
图 1 是示出了用于实现根据本公开内容实施方式的存储器管理设备的系统的配 置的方框图。 该系统 100 由计算机上实现的硬件和软件构成, 并且包括存储器 (memory)28、 存储器管理器 27、 架构 26 和存储器用户 25。
虽然没有示出, 但是上面提到的计算机包括中央处理单元 (CPU)、 随机存取存储器(RAM)、 只读存储器 (ROM) 以及公知的硬件资源, 例如辅助存储单元。这里, 虽然存储器 28 主要与 RAM 相对应, 但是通过使用公知操作系统 (OS) 的虚拟存储器技术, 也可以将 RAM 和 辅助存储单元视为一个虚拟存储器。
在以下内容中, 当简单地描述 “存储器” 时, 其基本上是指物理存储器。然而, 当共 同地表示逻辑存储器和物理存储器时, 或者为了理解该实施方式的技术起见, 其可以是指 逻辑存储器和物理存储器中的任何一个。然而, 当简单地描述 “存储器” 使得难以理解时, 可以区分地将其描述为 “物理” 存储器或 “逻辑” 存储器。
存储器用户 25 在实际中请求分配存储器 28( 分配物理存储器 28) 并对存储器 28 进行读取和写入。这里, 在存储器管理器是垃圾收集器或虚拟计算机的主机 OS( 如稍后将 描述的 ) 的情况下, “分配存储器” 的上下文中的 “存储器” 并不是严格意义上的 “物理存储 器” 。
在从存储器用户 25 接收到指令后, 架构 26 执行在存储器 28 上复制并写入数据的 过程。
存储器管理器 27 管理存储器 28, 并对存储器 28 和架构 26 之间的读取操作和写入 操作进行中介 (intermediate)。
这种系统 100 的配置的具体例子包括如下的配置 : 其中, 存储器用户 25 是应用软 件 ( 下文简称为应用 ), 架构 26 是标准库, 而存储器管理器 27 是 OS。
除此以外, 存在如下配置 : 其中, 存储器用户 25 是应用, 而存储器管理器 27 是垃圾 收集器。可替换地, 举例说明了如下的配置 : 其中, 存储器用户 25 是虚拟计算机中的访客 OS, 架构 26 是虚拟机, 而存储器管理器 27 是主机 OS(host OS)。
在这种配置中, 如稍后将描述的, 架构 26 确定写入进程, 并向存储器管理器 27 发 送针对共享参考的指令。
[ 存储器管理设备执行的过程 ]
图 2 至图 4 是示出了存储器管理设备执行的过程的流程图。存储器管理设备执行 的以下过程是由 ROM 或辅助存储单元中存储的软件以及上面提到的硬件资源的合作来实 现的。另外, 在对这些流程图的描述中, 将描述如下例子 : 其中, 将应用用作存储器用户 25, 将标准 C 库用作架构 26, 并将 Linux 内核用作存储器管理器 27。如稍后将描述的, 以物理 存储器 28 的块大小为单位, 来重复地执行这些流程图中的过程。
首先, 应用调用向标准 C 库 ( 下文简称为库 ) 的存储器 28 写入的函数。具体地, 应用和库指定存储器 28 的写入目的地的逻辑块地址, 并通过存储器管理器 27 指定物理块 地址。
库确定写入数据的模式是否是频繁出现模式 ( 步骤 101), 其中, 该写入数据是作 为在存储器 28 中进行写入的指令的目标的数据。此时, CPU 和库作为用于执行确定过程的 确定模块。
这里, 例如, 在分页的过程中, 块大小与页单元相对应, 并且通常是 4KB, 其中页单 元是写入数据时写入大小的单元。
这里, 频繁出现模式是具有物理存储器 28 的一个块大小的数据模式, 以及以如下 方式定义的模式。
例如, 在步骤 101 处, 在写入固定值的函数 memset 中, 检查这些固定值中的每个固定值是否是频繁出现的值。例如, 在采用十六进制的情况下, 固定值是 00 值、 FF 值、 FE 值等 等。 也就是说, 在这种情况下, 将一个块中的所有值都是固定值的数据模式视为频繁出现模 式。实际上, 在步骤 101 处, 确定固定值是否是频繁出现的值、 以及包括连续的频繁出现的 值的数据大小是否等于或大于存储器 28 的块大小 ( 即, 一个块的大小 ) 就足够了。
可替换地, 作为频繁出现模式的例子, 在存储器复制函数 memcpy 中, 将复制源的 数据模式视为频繁出现模式。也就是说, 如稍后参考图 6A 和图 6B 将描述的, 在再一次提供 写入内容与过去写入的数据的内容相同的数据的请求时, 频繁出现模式是指具有相同内容 的数据模式。
如上面描述的, 通常提前将预期要频繁出现的模式定义为频繁出现模式。
替代预先定义频繁出现模式, 可以通过计算机学习来定义频繁出现模式。 例如, 存 在如下方法 : 其中, 在步骤 101 处的写入数据的信息被累积 ( 受到分析 (profiling)), 并且 写入具有相同内容的信息的请求的数量大于阈值的情况下, 将该写入数据的模式设置为频 繁出现模式。此外, 可以采用各种公知方法作为学习方法。
这里, 将参考图 5A 和图 5B 来描述图 2 的流程图中的步骤 101、 103 和 105 至 107。 图 5A 示出了在写入数据被写入之前, 物理存储器 28 中的块及其逻辑映像, 并且进一步, 它 们之间的视图示出了存储器块的参考指针。图 5A 中的这个例子示出了四个块, 并且在这四 个块中的每个块中保持不同的数据。 图 5B 是示出了当在图 5A 中所示的存储器上执行对写入数据的写入 ( 重写 ) 操作 时的存储器状态。作为图 5B 的 “写入数据” 的例子, 示出了三个块的数据, 其中, 第二块中 的一些值以及第三和第四块中的所有值是 00 值。因而, 第二块的数据模式不是频繁出现模 式, 而第三和第四块的数据模式中的每个数据模式均是频繁出现模式。 应当注意, 如上面描 述的, 以块为单位重复地执行图 2 的过程。
在步骤 101 处, 例如, 在写入数据的模式不是频繁出现模式的情况下, 如在图 5B 的 重写映像中的第二块中, 使用传统的方法来在存储器 28 中执行写入操作 ( 步骤 102)。之 后, 该过程返回至应用。图 3 是示出了该步骤 102 的内容的流程图, 即传统过程。
在图 3 中, 首先, 确定被指定为写入数据的写入目的地的存储器块 ( 下文简称为 块 ) 是否是共享块。通常, 在多个进程期间共享物理存储器 28 的情况下, 共享块是成为在 其上将进行共享参考的目标的块。在写入目的地的块是共享块的情况下, 禁止对这种块的 写入, 因而分配存储器 28 的新块 ( 步骤 202)。然后, 如图 5B 的物理存储器块的第二块中所 示的, 复制该块的数据 ( 步骤 203), 并执行对写入数据的写入操作 ( 步骤 204)。此时, 应用 所请求的写入数据可以是一个块的一部分的数据。
将描述图 2 的流程图的其余部分。在步骤 101 处, 在确定写入数据的模式是频繁 出现模式的情况下 ( 如在图 5B 的例子中的第三块中 ), 执行以下过程。确定在整个写入数 据 ( 这里, 超过一个块大小的数据 ) 中是否分配了其数据具有的内容与对应于频繁出现模 式的模式 ( 下文称为指定模式 ) 的数据的内容相同的块 ( 步骤 103)。换句话说, 确定是否 已经在物理存储器 28 中保持了指定模式的数据。 在图 5B 的第三块的例子的情况中, 尚未在 存储器 28 中保持作为其块模式 ( 作为全部用 00 值填充的页面的零页面 ) 的指定模式 ( 步 骤 103 为 NO), 因而执行传统过程 ( 步骤 104)。
图 4 是示出了该步骤 104 的过程的流程图。该过程基本上与图 3 中所示的过程相
同, 但是与图 3 中所示的过程的不同之处在于不存在图 3 的步骤 203。在步骤 101 处, 确定 写入数据的模式是频繁出现模式, 并且确保用频繁出现模式的数据来重写一个块中的所有 数据, 因而复制块数据变得不必要。然而, 根据存储器管理器的实现, 可以执行复制数据。
另一方面, 在图 5B 的重写映像的第四块的例子的情况中, 该过程进行到步骤 101、 102 和 103, 并且在步骤 103 处, 确定为 “是” 。 也就是说, 在第四块的例子中, 在关于第三块的 过程中, 已经分配了指定模式的块, 因而进行了为 “是” 的确定, 并且该过程进行到步骤 105。
在步骤 105 处, 确定被指定为写入目的地的块是否初始就是共享块。 例如, 如图 5A 中所示的, “初始” 表示写入数据被写入之前的时间点。在图 5A 和图 5B 的例子中, 在第四块 初始不是共享块的情况下 ( 步骤 103 为 “否” ), 对第四块的处理变成自由的和不必要的, 并 因而取消分配第四块 ( 步骤 106)。 然后, 关于具有其指定模式的第三块, 设置共享参考 ( 步 骤 107)。在图 5B 中, 由虚线来指示被取消分配的第四块。
应当注意, 由 Linux 内核来执行块的取消分配、 共享参考的设置等, 并且 CPU 和 Linux 内核作为共享参考的设置模块。
另一方面, 在步骤 105 确定为 “是” 的情况下, 保持共享参考的设置 ( 步骤 107)。
图 6A 和图 6B 示出了写入数据的另一例子。 该例子示出了对数据进行复制的模式, 并且是其中如图 6A 和图 6B 的逻辑映像中所示对第一和第二块的数据进行复制的例子。作 为复制源的第一和第二块中的每个块的数据模式被视为频繁出现模式。根据图 2 中所示的 过程, 关于第一和第二块设置共享参考, 将第三和第四块设置为空闲空间。 如上面描述的, 在这个实施方式中, 在写入数据的模式是频繁出现模式的情况下, 如果在存储器 28 中已经保持了写入数据, 则关于具有该频繁出现模式的后续写入数据设 置共享参考。以这种方式, 能够抑制在存储器中累积具有频繁出现模式的大量数据。因而, 增加了存储器 28 中的空闲空间, 并从而可以高效地使用存储器 28。
本发明人实际上使用系统 100 进行了存储器管理实验。作为该实验的结果, 与相 关技术相比, 在该实验中证实了将零数据减少了大约 13%的效果。
此外, 在该实施方式的过程中, 例如, 在步骤 103 至 105 中, 可以省略写入具有相同 数据的块的过程, 并因而提高处理速度。此外, 对具有相同内容的数据的块进行共享参考, 因而也提高了 CPU 的数据高速缓存的命中率。
此外, 在该实施方式中, 没有像相关技术那样使用散列数据, 因而不需要高的计算 处理能力。
尤其是, 考虑到大部分应用在分配了块之后用零页面来填充所有所分配的块这一 事实, 系统 100 会有效地在这种应用上工作。
在该实施方式中, 如上面描述的, 库执行步骤 101 处的确定过程, 因而确定过程以 及搜索保持相同数据的块变得很容易。另外, 不必为实现系统 100 而改变存储器用户的程 序 ( 例如应用 )。
根据本公开内容的实施方式并不限于上面提到的实施方式, 并且在不脱离本公开 内容的要点的情况下, 可以做出本公开内容的其它各种实施方式。
本公开内容包括与 2010 年 7 月 1 日在日本专利局递交的日本在先专利申请 JP2010-150846 中公开的主题相关的主题, 该在先专利申请的整个内容通过引用方式并入 本文。
本领域技术人员应当理解, 在处于所附权利要求及其等价形式的范围的程度上, 根据设计要求和其它因素可以出现各种修改、 组合、 子组合和改变。