|
|
1
13
你在错误的抽象层次上工作。
Win32和Linux应用程序(如JavaVM)使用虚拟地址引用内存。RAM芯片上有一个从虚拟地址到物理地址的映射。内核可以随时更改此映射(例如,如果数据被分页到磁盘,然后读回不同的内存位置),而应用程序看不到任何差异。
对于原型,一种方法可能是使用mem=参数引导Linux,将内核的内存使用限制在小于您拥有的内存量,然后查看是否可以mmap备用内存(可能通过将/dev/mem映射为root?)。然后,您可以将Java VM中对malloc()的所有调用更改为使用您自己的特殊内存分配器,该分配器从可用空间进行分配。 对于这一点的真正实现,您应该通过更改内核和保持用户空间兼容性来实现。看看已经完成的工作 memory hotplug in Linux ,例如。 http://lhms.sourceforge.net/ |
|
|
2
2
如果您想在具有大型运行时的语言中尝试这一点,您必须调整该运行时的实现,或者编写一个DLL/共享对象来完成示例应用程序的所有内存管理。在这一点上,整个系统的行为不太可能像那些运行时的常规操作那样。 最简单、最干净的测试环境来检测引用的位置(可能很小)的优点,将在C++中使用自定义分配器。此环境将消除运行时数据中产生噪音的几个潜在原因(主要是垃圾收集)。您还将失去与启动CLR/JVM或保持其运行状态相关的任何电源开销,这在项目中可能也会受到欢迎,以最大限度地降低功耗。您自然希望为测试应用程序本身提供一个处理器内核,以消除线程切换噪音。
|
|
|
3
1
身体的 内存,您必须询问操作系统。如果您只关心数据是否在同一个MMU块中,那么请查看操作系统文档,查看它使用的块大小(x86通常使用4KB,但我听说现在的孩子们正在玩16M巨型块?)。
|
|
|
4
1
预先分配更大的块(比需要的块)是一种选择吗?它是否会破坏最初的目的? |
|
|
5
0
|
|
|
6
0
这种方法需要专门的硬件。在普通内存中,记忆棒和插槽的排列设计为尽可能均匀地为每个芯片散热。例如,每个物理芯片的每个总线字中有1位。 |
|
|
7
0
这是一个有趣的话题,尽管我认为它超出了Java或.NET等托管语言的能力。这些语言的主要原则之一是 必须管理内存,因此他们会为您提取内存。C/C++在实际分配内存方面提供了更好的控制,但即使在这种情况下,如前所述,操作系统也可以通过内存分配进行一些手动和间接操作,从而难以确定如何一起分配内存。即使这样,你参考实际的芯片,那就更难了,我想这取决于硬件。我将认真考虑使用一个原型板,您可以在程序集级别进行代码,并实际控制每个内存单元分配,而不受编译器优化或操作系统安全实践的任何干扰。这将为您提供最有意义的结果,因为它将使您能够控制程序的各个方面,并最终确定任何功耗改进都是由于您的算法,而不是由编译器或操作系统执行的一些不可见的优化。我想这是某种研究项目(非常有趣),所以在我看来,花100美元在原型板上绝对是值得的。 |
|
|
8
0
在.NET中,有一个COM接口用于分析.NET应用程序,它可以为您提供详细的地址信息。我认为您需要将其与一些对操作系统的调用结合起来,以转换虚拟地址。
以下是有关分析API的几个链接: |
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |