是否可以在不复制数据的情况下扩展间隙缓冲区?

时间:2019-02-15 01:03:02

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

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

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

  

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

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

1 个答案:

答案 0 :(得分:0)

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

对于Windows,您应结合使用AllocateUserPhysicalPages()MapUserPhysicalPages()VirtualAlloc()及其附近。

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

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