【问题标题】:Is it possible to expand a gap buffer without copying data?是否可以在不复制数据的情况下扩展间隙缓冲区?
【发布时间】:2019-02-15 01:03:02
【问题描述】:

我正在阅读this overview 一些可能的数据结构,用于存储用于文本编辑器的字符序列。一种流行且有效的方法是gap buffer

当间隙缓冲区填满以致不再存在间隙时,需要将数据复制到更大缓冲区的开头和结尾,以重新创建间隙以供进一步插入。但是,在概述的第 9 页上,它指出

在操作系统的帮助下,我们可以在不实际移动任何数据的情况下扩大差距。

我还没有找到一种方法来做到这一点,所以我想知道是否真的有可能。如果是这样,如何完成以及在哪些情况下完成。还是我误解了作者的意思?

【问题讨论】:

  • 内存映射。

标签: text memory-management data-structures virtual-address-space page-tables


【解决方案1】:

在 Linux 中,您可以使用例如mremap() 在虚拟地址空间中移动数据。

对于 Windows,您应该使用AllocateUserPhysicalPages()MapUserPhysicalPages()VirtualAlloc() 等的组合。

整个想法是,不是复制数据,而是更改物理内存(包含数据)在地址空间中的显示方式/位置。如果您不熟悉相关概念,请阅读页面翻译和页表。

更新:严格来说,当间隙消失并且光标位置接近内存页面的开头时,您最终可能仍会复制高达页面大小的数据。但这在现代系统上应该几乎不明显。您仍然没有复制所有其他页面中的数据。

【讨论】:

  • 当我们需要创建的间隙位于内存页面的中间时,我不确定这将如何应用,因为在大多数情况下都是如此。我们可以轻松地将仅包含“pre”和“post”间隙数据的其余页面重新定位到不同或相同扩展虚拟地址空间的开头和结尾。但是我们不需要手动将所有“post”数据从“gap”页面复制到它的新位置。当我们处理足够数量的页面时,该操作是否被认为足够便宜以忽略成本,因为它永远不会超过页面大小?
  • 换句话说,我的理解是,复制一些数据是不可避免的,最多复制一个页面大小,除非间隙正好在两个页面之间的边界。但是除了那种特殊情况之外,“不实际移动任何数据”是不是不可能扩展间隙缓冲区?如果确实如此,那么作者的说法在技术上就是错误的。
猜你喜欢
  • 2012-04-24
  • 2017-03-24
  • 2016-03-11
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2012-08-11
  • 2015-03-22
  • 2013-02-22
相关资源
最近更新 更多