虚拟内存是一种方便的方法,可以在进程之间隔离内存,并为每个进程提供自己的地址空间。它通过将虚拟地址转换为物理地址来工作。
我已经非常熟悉虚拟内存的工作原理和实现。我不知道的是虚拟内存相对于直接映射内存的性能影响,直接映射内存不需要翻译开销。
请不要说没有开销。这显然是错误的,因为遍历页表需要多次内存访问。TLB未命中可能很少,因此对性能的影响可以忽略不计,但是,如果是这种情况,应该有证据证明这一点。
我也意识到虚拟内存对于现代操作系统提供的许多功能的重要性,所以这个问题不是关于虚拟内存是好是坏(对于大多数用例来说这显然是一件好事),我只是问虚拟内存的性能影响。
我要寻找的答案在理想情况下是这样的:虚拟内存比直接映射增加了x%的开销,这是一篇文章。我试图寻找有这样结果的论文,但没有找到。
这个问题很难明确回答,因为虚拟内存是现代系统的一个组成部分。现代系统旨在支持虚拟内存,大多数软件都是使用具有虚拟内存的系统编写和优化的。
然而,在21世纪初,微软研究院开发了一种称为Signularity的研究操作系统,除其他外,它不依赖于虚拟内存进行进程隔离。作为该项目的一部分,他们发表了一篇论文,分析了进程隔离的硬件支持开销。本文的标题是解构过程隔离(此处为非付费链接)。研究人员在论文中写道:
大多数操作系统使用CPU的内存管理硬件来提供进程隔离,使用两种机制。首先,进程只允许访问物理内存的某些页面。其次,权限级别防止不受信任的代码操纵实现进程的系统资源,例如内存管理单元(MMU)或中断控制器。这些机制的非平凡性能成本在很大程度上是隐藏的,因为没有广泛使用的替代方法进行比较。由于异常处理、内联TLB查找、TLB重新加载和维护内核数据结构(如页表)[29],从虚拟地址到物理地址的映射可能会产生高达10%-30%的开销。此外,虚拟内存和权限级别增加了进程间通信的成本。
他们后来在论文中写道:
虚拟内存系统(除SPUR[46]等纯软件系统外)依赖于地址转换的硬件缓存,以避免每次处理器缓存未命中时访问页表。管理TLB条目有成本,Jacob和Mudge估计在模拟MIPS类处理器上的成本为5-10%[29]。虚拟内存系统还将其数据以及某些系统中的代码带入处理器的缓存,从而逐出用户代码和数据。Jacob和Mudge估计,使用小缓存时,这些引发的未命中可能会将开销增加到10%-20%。此外,他们发现虚拟内存引起的中断可以将开销增加到10–30%。其他研究发现,尽管实际成本非常依赖于系统细节和基准[3、6、10、26、36、40、41],但间接成本类似甚至更高。此外,TLB访问是许多处理器设计的关键路径[2,30],因此可能会影响处理器时钟速度。
总的来说,我对这些结果持保留态度,因为这项研究正在推广一种替代系统。但很明显,实现虚拟内存有一些开销,本文试图量化其中一些开销(在评估可能的替代方案的背景下)。我建议阅读这篇文章以了解更多细节。
问题内容: 我有一个用Golang编写的小守护程序,该守护程序可以循环运行并完成一些工作。我发现,在使用CGO_ENABLE = 1或CGO_ENABLED = 0进行编译时,守护程序的行为会有所不同。例如,在CGO_ENABLE = 1(默认设置)的情况下,程序的VSZ在短时间内(在一小时内)膨胀到1-2GB。如果CGO_ENABLED = 0,则VSZ在很长一段时间(几天内)都相同。查看以下数
本文向大家介绍JavaScript 事件对内存和性能的影响,包括了JavaScript 事件对内存和性能的影响的使用技巧和注意事项,需要的朋友参考一下 虽说事件处理程序可以为现代 Web 页面添加很强的交互能力,但是不分青红皂白就添加大量的事件处理程序绝对是一种愚蠢的行为。 我们来分析一下:事件处理程序本质上是一种函数,是一种对象,存放在内存中,设置大量的事件处理程序会使内存中的对象变多,Web
主要内容:虚拟内存如何工作?,按需分页,虚拟内存管理系统的快照虚拟内存是一种存储方案,为用户提供了一个拥有非常大的主内存的幻觉。 这是通过将辅助存储器的一部分作为主存储器来完成的。 在这种方案中,用户可以加载比可用主存更大的进程,因为存在内存可用于加载进程的错觉。 操作系统不是在主内存中加载一个大进程,而是在主内存中加载多个进程的不同部分。 通过这样做,多程序的程度将会增加,因此CPU利用率也会增加。 虚拟内存如何工作? 在现代语言中,虚拟内存近来变得非常普
处理器的虚拟内存子系统为每个进程实现了虚拟地址空间。这让每个进程认为它在系统中是独立的。虚拟内存的优点列表别的地方描述的非常详细,所以这里就不重复了。本节集中在虚拟内存的实际的实现细节,和相关的成本。 虚拟地址空间是由CPU的内存管理单元(MMU)实现的。OS必须填充页表数据结构,但大多数CPU自己做了剩下的工作。这事实上是一个相当复杂的机制;最好的理解它的方法是引入数据结构来描述虚拟地址空间。
系统调用在调用进程的虚拟地址空间中提供映射,将文件或设备映射到内存中。 下面是两种类型 - 文件映射或文件支持的映射 - 此映射将进程的虚拟内存区域映射到文件。 这意味着读取或写入这些内存区域会导致文件被读取或写入。这是默认的映射类型。 匿名映射 - 此映射映射进程的虚拟内存区域,不受任何文件的支持。 内容被初始化为零。 这种映射类似于动态内存分配(malloc()),在某些实现中用于某些分配。
我正在考虑在GPU上处理数据的可能性,这对于GPU内存来说太大了,我有几个问题。 在CUDA 6.0中,UM不允许超额订阅GPU内存(并且通常不允许分配比GPU拥有的内存更多的内存,即使在主内存中也是如此),但是在CUDA 8.0中,这是可能的(https://devblogs.nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-m