代码之家  ›  专栏  ›  技术社区  ›  kjv

RAM内存重新分配-Windows和Linux

  •  2
  • kjv  · 技术社区  · 16 年前

    我正在从事一个项目,涉及优化系统内的能源消耗。该项目的一部分在于基于局部性分配RAM内存,即为一个程序分配尽可能接近彼此的内存段。有没有一种方法可以让我知道我分配的内存(内存芯片)的确切位置,我还想知道是否有可能以确定性的方式强制分配。我对Windows和Linux都感兴趣。此外,该项目将在Java和.NET中实现,因此我对实现这一点的托管API感兴趣。

    8 回复  |  直到 16 年前
        1
  •  13
  •   user9876    16 年前

    你在错误的抽象层次上工作。

    Win32和Linux应用程序(如JavaVM)使用虚拟地址引用内存。RAM芯片上有一个从虚拟地址到物理地址的映射。内核可以随时更改此映射(例如,如果数据被分页到磁盘,然后读回不同的内存位置),而应用程序看不到任何差异。

    对于原型,一种方法可能是使用mem=参数引导Linux,将内核的内存使用限制在小于您拥有的内存量,然后查看是否可以mmap备用内存(可能通过将/dev/mem映射为root?)。然后,您可以将Java VM中对malloc()的所有调用更改为使用您自己的特殊内存分配器,该分配器从可用空间进行分配。

    对于这一点的真正实现,您应该通过更改内核和保持用户空间兼容性来实现。看看已经完成的工作 memory hotplug in Linux ,例如。 http://lhms.sourceforge.net/

        2
  •  2
  •   Mike Burrows    16 年前

    如果您想在具有大型运行时的语言中尝试这一点,您必须调整该运行时的实现,或者编写一个DLL/共享对象来完成示例应用程序的所有内存管理。在这一点上,整个系统的行为不太可能像那些运行时的常规操作那样。

    最简单、最干净的测试环境来检测引用的位置(可能很小)的优点,将在C++中使用自定义分配器。此环境将消除运行时数据中产生噪音的几个潜在原因(主要是垃圾收集)。您还将失去与启动CLR/JVM或保持其运行状态相关的任何电源开销,这在项目中可能也会受到欢迎,以最大限度地降低功耗。您自然希望为测试应用程序本身提供一个处理器内核,以消除线程切换噪音。

        3
  •  1
  •   comingstorm    16 年前

    身体的 内存,您必须询问操作系统。如果您只关心数据是否在同一个MMU块中,那么请查看操作系统文档,查看它使用的块大小(x86通常使用4KB,但我听说现在的孩子们正在玩16M巨型块?)。

        4
  •  1
  •   blispr    16 年前

    预先分配更大的块(比需要的块)是一种选择吗?它是否会破坏最初的目的?

        5
  •  0
  •   Alon    16 年前

        6
  •  0
  •   user215054 user215054    16 年前

    这种方法需要专门的硬件。在普通内存中,记忆棒和插槽的排列设计为尽可能均匀地为每个芯片散热。例如,每个物理芯片的每个总线字中有1位。

        7
  •  0
  •   Chris Thompson    16 年前

    这是一个有趣的话题,尽管我认为它超出了Java或.NET等托管语言的能力。这些语言的主要原则之一是 必须管理内存,因此他们会为您提取内存。C/C++在实际分配内存方面提供了更好的控制,但即使在这种情况下,如前所述,操作系统也可以通过内存分配进行一些手动和间接操作,从而难以确定如何一起分配内存。即使这样,你参考实际的芯片,那就更难了,我想这取决于硬件。我将认真考虑使用一个原型板,您可以在程序集级别进行代码,并实际控制每个内存单元分配,而不受编译器优化或操作系统安全实践的任何干扰。这将为您提供最有意义的结果,因为它将使您能够控制程序的各个方面,并最终确定任何功耗改进都是由于您的算法,而不是由编译器或操作系统执行的一些不可见的优化。我想这是某种研究项目(非常有趣),所以在我看来,花100美元在原型板上绝对是值得的。

        8
  •  0
  •   valiano    7 年前

    在.NET中,有一个COM接口用于分析.NET应用程序,它可以为您提供详细的地址信息。我认为您需要将其与一些对操作系统的调用结合起来,以转换虚拟地址。

    以下是有关分析API的几个链接: