Memory 当搜索一个非常大的文本文件时,最常见的是文本编辑器提供的,内存是如何分配的?

Memory 当搜索一个非常大的文本文件时,最常见的是文本编辑器提供的,内存是如何分配的?,memory,memory-management,Memory,Memory Management,当搜索一个非常大的文本文件时,最常见的是文本编辑器提供的,如何分配内存,以便在搜索“空间不足”错误时不会发生。有什么特别的算法吗?如果我没有误解你的问题,你会问: 将任意大的文件映射到内存时,进程如何将其全部映射到内存 这实际上是一个非常迷人、非常深刻的问题。 当然,这意味着答案将同样冗长复杂。所以不用再麻烦了 首先,我们需要探索我们的理论文本编辑器最多可以有多少内存。这方面的第一个限制是现代计算机可以物理寻址的数量(同时过分简化并忽略页面文件的存在,使其寻址的内存比现有内存多),这受到地址总线

当搜索一个非常大的文本文件时,最常见的是文本编辑器提供的,如何分配内存,以便在搜索“空间不足”错误时不会发生。有什么特别的算法吗?

如果我没有误解你的问题,你会问: 将任意大的文件映射到内存时,进程如何将其全部映射到内存

这实际上是一个非常迷人、非常深刻的问题。 当然,这意味着答案将同样冗长复杂。所以不用再麻烦了

首先,我们需要探索我们的理论文本编辑器最多可以有多少内存。这方面的第一个限制是现代计算机可以物理寻址的数量(同时过分简化并忽略页面文件的存在,使其寻址的内存比现有内存多),这受到地址总线的限制。在现代64位系统上,只有地址总线较低的48位是公开的。这意味着CPU最多可以物理寻址256 TB的ram

与普通的16G系统相比,杀伤力明显过高

然而,现在我们又有了另一个限制;虚拟内存和页面文件的大小。在现代操作系统中,进程具有虚拟内存页,操作系统会将这些虚拟内存页分配给每个进程(这就是为什么每个进程都可以将其代码放在内存中相同的地址,而不会发生冲突和非常糟糕的事情)。操作系统可以为每个进程提供最大数量的页面,这取决于平台和系统设置。然而,通常情况下,它甚至比我们通常看到的有限的物理内存要少得多。然而,它是否仍然是一个同样荒谬的数量(通常如此之多,以至于一个平均的程序只使用所提供的总内存的约2%)

(这里需要注意的是,进程已分配和正在使用的页面与已分配但未触及的页面之间存在差异。分配页面时,它最初是所谓“零页面”的克隆,因为所有页面都初始化为零。一旦开始写入页面,操作系统就会为该pr分配页面(过程)

这就是我们对理论文本编辑器的下一个限制

其次,我们需要了解这些进程如何将文件映射到内存中

以Linux为例,当您使用
mmap
函数加载文件时,可以指定要映射多少文件的窗口。因此,程序在工作时一次只能映射文件的一部分

不过,根据前面关于提供多少内存的陈述,显然这不是问题所在

第三,我们到达了瓶颈和解决方案:分页

一个进程可以很好地将一个数千兆字节的文件映射到内存中,但是一次只有该文件的一小部分驻留在ram中。操作系统将“分页”磁盘上没有被访问到页面文件的部分。(记得我之前提到过这种行为吗?)所以,这就是你问题的答案。我们的小文本编辑程序真的不需要关心这些问题。它可能映射任意大的窗口(达到某种荒谬的限制。例如,在32位操作系统上,它一次只能处理4G内存,现代64位系统也没有类似的限制。)并让操作系统根据需要管理将所关心的数据移入和移出ram


我希望这有帮助!:)

如果我没有误解你的问题,你是在问: 将任意大的文件映射到内存时,进程如何将其全部映射到内存

这实际上是一个非常迷人、非常深刻的问题。 当然,这意味着答案将同样冗长复杂。所以不用再麻烦了

首先,我们需要探索我们的理论文本编辑器最多可以有多少内存。这方面的第一个限制是现代计算机可以物理寻址的数量(同时过分简化并忽略页面文件的存在,使其寻址的内存比现有内存多),这受到地址总线的限制。在现代64位系统上,只有地址总线较低的48位是公开的。这意味着CPU最多可以物理寻址256 TB的ram

与普通的16G系统相比,杀伤力明显过高

然而,现在我们又有了另一个限制;虚拟内存和页面文件的大小。在现代操作系统中,进程具有虚拟内存页,操作系统会将这些虚拟内存页分配给每个进程(这就是为什么每个进程都可以将其代码放在内存中相同的地址,而不会发生冲突和非常糟糕的事情)。操作系统可以为每个进程提供最大数量的页面,这取决于平台和系统设置。然而,通常情况下,它甚至比我们通常看到的有限的物理内存要少得多。然而,它是否仍然是一个同样荒谬的数量(通常如此之多,以至于一个平均的程序只使用所提供的总内存的约2%)

(这里需要注意的是,进程已分配和正在使用的页面与已分配但未触及的页面之间存在差异。分配页面时,它最初是所谓“零页面”的克隆,因为所有页面都初始化为零。一旦开始写入页面,操作系统就会为该pr分配页面(过程)

这就是我们对理论文本编辑器的下一个限制

其次,我们需要了解这些进程如何将文件映射到内存中

以Linux为例,当您使用
mmap
函数加载文件时,可以指定要映射多少文件的窗口。因此,程序在工作时一次只能映射文件的一部分

然而,在前面关于提供多少内存的陈述中,很明显这不是问题所在