2013-07-26 30 views
4

我有一段時間沒有編碼,所以請原諒。我有這個奇怪的問題。我一次嘗試malloc 8GB,我打算稍後管理與TLSF堆。也就是說,我想在整個應用程序中避免使用malloc,只需在開始時獲得一個大的glob並最終釋放它。儘管這是特點。在我的程序中,我一直在使用dlmalloc。鏈接它,一切都很順利。但是,現在當我一次嘗試malloc 8GB並鏈接到dlmalloc中使用它時,我在OSX上運行時遇到了段錯誤11,沒有使用dlmalloc,一切都很順利。如果我使用gcc或clang,無關緊要。系統雖然沒有8GB的RAM,但它有4GB。有趣的是,同樣的事情發生在Windows機器上,它具有32GB的RAM和Ubuntu的16GB的RAM。通過系統malloc它可以工作,分配通過,並且通過分配內存的簡單迭代按照預期在所有三個系統上工作。但是,當我在dlmalloc鏈接它失敗。試用了malloc和dlmalloc函數調用。系統malloc vs大malloc上的DLMalloc

分配本身是什麼了不起的事,普通的C99。

[...] 
size_t bytes = 1024LL*1024LL*1024LL*8LL; 
unsigned long *m = (unsigned long*)malloc(bytes); 
[...] 

我很困惑這裏的幾件事。即使沒有4GB或RAM的系統,系統malloc如何給我8GB malloc,這些虛擬頁面是什麼?爲什麼dlmalloc不這樣做?我知道可能沒有8GB RAM的連續塊分配,但爲什麼分段錯誤,爲什麼不是空ptr?

是否有可行穩健(希望與平臺無關的)解決方案獲得的RAM量一氣呵成通過malloc即使我不知道系統有那麼多內存?

編輯:程序是64位的是OS」這我跑的。

EDIT2: 所以我打了它更多一些。原來,如果我分解成1GB的塊,即8個獨立的malloc,然後它與dlmalloc一起工作。所以它似乎是一個連續範圍分配的問題,其中dlmalloc可能試圖僅在存在連續塊時分配。這使得我的問題更難以制定。是否有一種確定的方法可以在跨平臺的情況下獲得具有或不具有dlmalloc的內存塊的大小,並且如果沒有剩餘物理內存(可以在交換中,只要不失敗)就不會失敗。也可以通過跨平臺的方式來判斷malloc是否處於內存或交換狀態。

+0

您正在使用的系統的交換分區有多大? – Jiminion

+0

OSX上的100GB,600GB專用於其他兩個系統(Windows和其他Linux機器)的目的。 – Keyframe

+2

不知道DLmalloc和malloc之間的區別,但是您能夠使用malloc 8 GB的原因正是您所說的原因,它們是虛擬頁面。當一臺機器沒有足夠的物理RAM來支持所需的RAM時,它將使用硬盤空間。在功能上它有效,但讀取/寫入 – sedavidw

回答

2

我會給你只是有點角度來看,如果沒有徹底的答案。當我看到你試圖分配8GB的連續RAM時,我會畏縮。是的,對於64位計算和所有這可能是「合法」的,但在普通機器上,您可能會碰到很多邊緣情況,即64位大小的32位遺留代碼,以及只是簡單的可用性問題獲得足夠大的內存來完成這項工作。如果你想嘗試這樣的事情,可能試圖單個塊,然後如果失敗,使用更小的塊。這有點挫敗了1塊系統的目的。也許在操作系統中有某種「頁面大小」,你可以將你的malloc大小鏈接到 - 以幫助提高性能和簡單的獲取所需內存的能力。

在遊戲控制檯上,這種內存管理方式有點常見 - 在啓動時從操作系統中分配1個緩衝區,儘可能大,然後放置自己的內存管理器,以避免操作系統開銷和可能的劣質分配代碼。它還允許在這種虛擬內存不存在的系統上更好地控制內存碎片。但是在這些系統上,你也知道你有多少內存。

有沒有辦法,看看內存是獨立於平臺的方式物理或虛擬?我不這麼認爲,但也許別人可以給出一個很好的答案,我將編輯這部分。

所以不是100%的答案,但一些隨機的想法來幫助和我的內部想知道你在做什麼,當一塊聽起來像8GB的RAM,當它聽起來像多個塊將工作正常。 :)

+0

的速度明顯較慢首先回答你的問題。我嘗試了獲取大量內存的懶惰方法,以便可以將大量的exr圖像加載到內存中,以便更快地訪問並移動它們。我不認爲這是一個瘋狂的想法。 :)這是我的主要動機。其他,你已經描述過它。在路上,我想製作一款遊戲,我想按照它在遊戲機上的方式來完成,但顯然它不會像那樣工作。似乎我將不得不有兩個單獨的內存管理。一個用於一個大塊和另一個由多個塊組成的控制檯。是否有現有的解決方案? – Keyframe

+0

不是。 Cross開發的遊戲通常具有一個通用的高級內存接口,但在底層,每個都有本地代碼,可以利用這些系統怪癖。 8GB雖然。這是太多的空間!你在做什麼,你打算在哪裏進行移植,需要那種足跡?也許XBone或PS4的工作 - 這兩個都有8GB,但我會猜測操作系統和開銷會吃了不少。如果我記得的話,Wii U的可用容量大約爲1GB,下一代當代控制檯以及其他任何舊版本的控制檯都將小得多。 –

+0

順便說一句,如果這只是爲了優化,一個文件的大部分可能會跨越多個虛擬頁面,我的猜測是,可以吃任何你可能獲得的性能,使用單個緩衝區。只需分配您需要的大小並釋放它。這就是控制檯所做的事情 - 儘管分配和釋放的順序要仔細觀察以防止碎片化。 –