簡體   English   中英

RAM內存重新分配 - Windows和Linux

[英]RAM memory reallocation - Windows and Linux

我正在開展一個涉及優化系統內能耗的項目。 該項目的一部分在於根據位置分配RAM內存,即為程序分配盡可能彼此接近的內存段。 有沒有辦法我可以知道我分配的內存的確切位置(內存芯片),我也想知道是否有可能以確定的方式強制分配。 我對Windows和Linux都很感興趣。 此外,該項目將在Java和.NET中實現,因此我對托管API感興趣以實現此目的。

[我知道這可能不會轉化為直接的能源消耗減少,但該項目應該是一個概念證明。]

你在錯誤的抽象層面上工作。

Java(可能是.NET)是指使用句柄而不是原始指針的對象。 底層Java VM可以隨時在虛擬內存中移動對象; Java應用程序沒有看到任何區別。

Win32和Linux應用程序(例如Java VM)使用虛擬地址引用內存。 存在從RAM芯片上的虛擬地址到物理地址的映射。 內核可以隨時更改此映射(例如,如果數據被分頁到磁盤然后讀回到不同的內存位置),應用程序看不到任何差異。

因此,如果您使用的是Java和.NET,我不會更改您的Java / .NET應用程序來實現這一目標。 相反,我會改變底層的Linux內核,或者可能是Java VM。

對於原型,一種方法可能是使用mem =參數啟動Linux以將內核的內存使用量限制為小於您擁有的內存量,然后查看是否可以mmap備用內存(可能通過映射/ dev / mem)作為根?)。 然后,您可以更改Java VM中對malloc()的所有調用,以使用您自己的特殊內存分配器,該分配器從該可用空間分配。

要真正實現這一點,您應該通過更改內核並保持用戶空間兼容性來實現。 看一下Linux中內存hotplug的工作,例如http://lhms.sourceforge.net/

如果您想在具有大型運行時的語言中嘗試此操作,則必須調整該運行時的實現或編寫DLL /共享對象來為您的示例應用程序執行所有內存管理。 此時整個系統行為不太可能像那些運行時的常規操作那樣。

檢測參考局部性(可能很小)優點的最簡單,最干凈的測試環境是使用自定義分配器的C ++。 此環境將消除運行時數據中的幾個潛在噪聲原因(主要是垃圾收集)。 您還將失去與啟動CLR / JVM或維持其運行狀態相關的任何功率開銷 - 這可能在項目中受歡迎,以最大限度地降低功耗。 您自然希望為測試應用程序提供一個處理器核心,以消除線程切換噪音。

編寫自定義分配器為您提供當前頁面上預分配的塊之一應該不會太難,但考慮到要在C / C ++中實現引用的局部性,通常只使用堆棧似乎不太可能有一個你可以找到,下載和使用。

在C / C ++中,如果強制指向int的指針,則會告訴您該地址。 但是,在Windows和Linux下,這是一個虛擬地址 - 操作系統確定到物理內存的映射,並且處理器中的內存管理單元執行它。

因此,如果您關心數據在物理內存中的位置,則必須詢問操作系統。 如果您只是關心您的數據是否在同一個MMU塊中,那么請查看操作系統文檔以查看它使用的大小阻塞(x86通常是4KB,但我聽說孩子們現在玩的是16M巨型塊?)。

Java和.NET增加了第三層,但我擔心我無法幫助你。

預先分配更大的塊(比需要的話)一個選項嗎? 它會破壞最初的目的嗎?

我認為,如果你想要對內存分配進行這樣的潮流控制,你最好使用C語言等編譯語言,JVM,從硬件中隔離出語言的實際實現,包括用於數據存儲的芯片選擇。

在.NET中,有一個COM接口公開用於分析.NET應用程序,可以為您提供詳細的地址信息。 我認為你需要將它與對操作系統的一些調用相結合來翻譯虛擬地址。

正如zztop所說,.NET CLR每次完成垃圾收集時都會壓縮內存。 雖然對於大型物體,它們不會被壓實。 這些是大對象堆上的對象。 大對象堆可以包含許多分散在OS調用VirtualAlloc周圍的段。

以下是分析API的幾個鏈接:

該方法需要專門的硬件。 在普通的記憶棒中,插槽和插槽設計成盡可能地每個芯片散熱。 例如,每個物理芯片的每個總線字中有1位。

這是一個有趣的話題,盡管我認為它遠遠超出Java或.NET等托管語言的能力。 這些語言的主要原則之一是您不必管理內存,因此它們會為您提取內容。 C / C ++在實際分配內存方面為您提供了更好的控制,但即使在這種情況下,如前所述,操作系統可以通過內存分配進行一些揮手和間接操作,這使得很難確定如何分配內存。 即使這樣,你也會參考實際的芯片,這更難,而且我認為這將取決於硬件。 我認真考慮使用原型板,您可以在匯編級別進行編碼,並實際控制每個內存單元分配,而不受編譯器優化或操作系統安全實踐的任何干擾。 這將為您提供最有意義的結果,因為它將使您能夠控制程序的每個方面,並確定任何功耗改進都是由您的算法而不是由編譯器或操作系統執行的某些不可見的優化。 我想這是一些研究項目(非常有趣)所以在我看來,在原型板上花費100美元肯定是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM