为什么没有内存管理的硬件支持?

11

虚拟内存在现代硬件中得到了很好的支持,但应用程序级别的内存分配仍然完全由软件实现,不管是类似C和C ++的手动堆内存管理,还是VM级垃圾收集。

超越经典的手动内存管理与垃圾回收辩论,为什么没有基于硬件的原语可以帮助在用户空间中构建高效的内存管理和/或垃圾收集方案(可能由操作系统公开或内置,然后各种VM)。

硬件用于加速图形操作,卸载网络堆栈的各个部分,加密算法以及音频/视频编解码器经常在硬件中实现,为什么不能构建用于更高级别内存管理的构建块?它似乎是如此普遍,但我不知道任何硬件辅助实现。

考虑到我的硬件知识缺乏,这对我来说有点模糊不清,但我很感兴趣听听

  1. 是否存在这样的事物(至少处于研究阶段),或者
  2. 相对传统的内存管理,它是否会提供任何好处,或者
  3. 为什么在硬件中构建这样的东西不可行?
虚拟内存是一种现代硬件良好支持的技术,但应用程序级别的内存分配仍然完全由软件实现,无论是类似C和C++的手动堆内存管理还是VM级垃圾收集。除了经典的手动内存管理与垃圾回收辩论之外,为什么没有基于硬件的原语可以帮助在用户空间中构建高效的内存管理和/或垃圾收集方案(可能由操作系统公开或内置,然后各种VM)?虽然硬件已用于加速图形操作、卸载网络栈的各个部分以及实现加密算法、音频/视频编解码器,但为什么不能构建用于更高级别内存管理的构建块?这似乎是如此普遍,但我不知道是否存在硬件辅助实现。对于我这个缺乏硬件知识的人来说,这有些模糊,但我很感兴趣听到以下内容:1)是否存在这样的东西(至少处于研究阶段),2)它是否会相对传统的内存管理提供任何好处,或者3)为什么在硬件中构建这样的东西不可行?
6个回答

10

理论上,你可以在硬件中实现完整的Java虚拟机,包括内存管理,我相信有一些研究项目正在尝试这样做。但是,有几个很好的理由使用硬件实现:

  • 硬件是固定的,你不能轻易地修补错误或实现更新/更好的算法
  • 硬件很昂贵,对于像垃圾回收这样的复杂操作,你需要大量的硬件,而使用现有硬件资源进行软件实现要便宜得多
  • 硬件资源占用空间并消耗(静态)功率,即使不使用,而未使用的软件代码相对无害

最终,对于每个你想要的功能,你必须在这些成本和你所获得的收益之间做出权衡(更快或更低功耗的执行)。

对于通常是复杂算法但并不经常运行的内存管理,收益将会相当小(你可能能够将垃圾回收加速10倍,但如果它只占执行时间的1%,为什么要费心呢?)另一方面,成本将是一个更大的芯片,其中许多区域大部分时间都是闲置的,因此浪费了很多空间...


1
实际上,让我思考这个问题的原因是大多数程序往往会在热路径上积极避免动态内存分配,而且很多优化指南也会告诉你同样的事情。这是否是我们目前只有(声称的)1%的执行时间被内存管理占用的原因?如果这不是一个问题,我们几乎可以为所有东西使用更统一的内存模型,而不会为了性能而牺牲代码可维护性。我希望每次看到另一个malloc或内存池的重新实现时都能得到一美元。 - Alex B
1
尽管我同意并非所有类型的系统都需要这个功能(例如某些移动设备或低端嵌入式系统)。 - Alex B
1
那1%是谚语,我不知道实际数字;-) 我认为避免在关键路径中使用malloc()的原因是它们可能会失败,或导致交换或其他非确定性行为,而不是纯粹的性能。 - Wim
1
也许你看到这么多的malloc实现,这也表明使用的算法过于特定或者经常变化,这是不将它们放入硬件(尚)的原因之一。但你在另一条评论中是正确的,应该有一个好的折中方式,即硬件加速基元同时在软件中保留高级内容。 - Wim

5
我们在上世纪70年代和80年代拥有很多这种硬件设备。所有这些Lisp机器都非常擅长通过间接和双重间接访问来帮助内存管理(如果您的GC移动对象,则需要)。我们中的一些人还记得80286的最初几天,当时人们认为段可以用于更好的内存管理,但性能却惨不忍睹。
迄今为止,智慧的当前状态是,优化CPU以进行通用用途比添加仅在某些时候需要的特殊功能要好得多。
现代垃圾收集器已经使用了一些操作系统功能,如虚拟页面的脏标记来实现写屏障,但除此之外,算法非常简单、直接和高级。实际上并不需要特殊的硬件。
我最近在使用HP-UX时发现了一个惊人的结果。您可以将虚拟页面大小设置为256MB,这将有效地关闭虚拟内存。这使得该CPU的性能提高了120%。 TLB缺失真的很严重,甚至比高速缓存缺失更严重。这让我想起了好老的MIPS架构,它在TLB中存储了进程ID,因此不需要在每个进程切换时完全清除TLB。
仍然有很多关于内存管理的改进空间,这比一些高级垃圾收集功能更重要。

4

是的,有几款CPU内置了内存管理和垃圾回收功能。其中之一是定制版N320xx CPU,它为Ceres工作站提供动力。它使用34位内存(即32位数据+2位额外内存)。

今天很少有硬件支持GC的原因有几个:

  1. 您需要一个特殊的主板->昂贵
  2. 您需要一个特殊的CPU->非常昂贵
  3. 您需要能够使用CPU和主板的额外功能的特殊软件
  4. 目前仍在进行大量研究,以使GC更加高效。这是一个非常活跃的领域,可与我们通过设置单个像素来绘制图像的时代相媲美。当我们学习到哪些部分可以标准化时,就有意义为其构建硬件。
  5. 它会浪费所有不使用此功能的程序的内存
[编辑]下一代"通用CPU"可能会配备可编程区域(FPGA),您可以在其中定义新的"汇编器操作码"。这将允许软件根据其特定需求修改CPU。需要解决的问题是使FPGA的加载更快,以便可以将其内容与它们的进程切换。
这将允许为硬件创建支持。

这在某种程度上证实了我的猜想。例如,显卡的性能还远未定型,仍有很多研究在进行中。即使如此,图形加速硬件正在以大宗商品价格制造和销售,并不断发展。 - Alex B
好的,从比较基础的东西开始,比如画线和填充多边形。而且,今天的显卡并不是魔法,它们只是大规模并行多核 CPU(非常简单的)。这并不是新概念。但由于演化呈指数增长,我们看到更多的新事物出现得更快。当第一批 FPGA CPU 推出时,我们将看到类似的游戏用自定义 CPU 代码编写。最初的版本会很慢、很丑陋,每个人都会抱怨,三年后,我们会感到“我们怎么能没有它活下去?” :-) - Aaron Digulla

3
在像 Pentium 这样的现代处理器中,有支持虚拟内存管理的功能。但是它的实现必须由操作系统完成,因为可能有很多算法可以管理内存。哪种算法最适合取决于内存的使用方式。计算机上运行哪些应用程序?它们运行多长时间?运行多少个应用程序?以及任务切换是如何组织的。这是无法在硬件中进行固定的。操作系统更好地知道如何高效地管理内存,因为它是针对特定类型的计算机(服务器与桌面操作系统)制作的,并且对计算机上运行的进程具有更高级别的视图。

1
我看它的实现并不是完全由CPU处理,而是CPU提供了一些明确定义的低级原语来帮助操作系统实现它(就像虚拟内存并不是由CPU在一个整体模块中神奇地处理,操作系统仍然需要做这项工作)。 - Alex B
没错。处理器支持虚拟内存管理,因为它具有内置的MMU(内存管理单元),提供低级API,使操作系统能够实现高级API。 - codymanix

2
在嵌入式领域,Ajile Systems Inc. http://www.ajile.com/ 生产一系列带有可选 GC 的芯片级别 JVM 产品。他们还提供多个 JVM 特性,其中 Java 进程在自己的 VM 中独立执行,采用确定性、分时调度和完整的内存保护。他们似乎提供了三种 GC 算法和一个关闭模式。因此,这不仅是一个芯片上的 JVM,更像是一个芯片上的操作系统。

这与我所想的有些相似,但不够通用。 - Alex B

1

这个问题有很多不同的算法和方法,没有人找到它们的共同原理。


虽然我同意,但也有一些经典的分配器实现(不是每个小版本都像GLIBC分配器那样发生变化)。硬件分配器也会不断发展,因为似乎每隔几年就会出现新的CPU代。就如我在对另一个答案的评论中所说,情况也适用于图形卡。 - Alex B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接