2010-07-28 70 views
1

在我們的產品中,我們使用專門依賴mmap進行內存分配的malloc實現。我們也合理使用alloca ing。我們剛剛遇到了一個問題,其中mmap將分配應爲保留的區域(因此當我們的一個較大的alloca溢出到malloc'd區域時會導致非常糟糕的事情發生)。從保留堆棧空間分配mmap區域?

我們進程的分配限制是我們的虛擬機地址空間,而不是物理內存。當進程運行時,我們已經觀看了/ proc/*/maps文件,並且看到malloc吃掉了任何可用的地址空間。它最終要求在堆棧rlimit-set範圍內分配地址,並最終擴展到一個大的alloca

我們試圖通過alloca解決它荷蘭國際集團我們在啓動整個堆棧的限制,但是這並沒有跨平臺證明了穩定的(它的段錯誤試圖訪問我的2.4 dev的框alloca d內存,而它的工作原理在2.6生產機器上)。

有沒有什麼辦法來實際保留地址空間?還有什麼可以做的?

+0

對於malloc()使用mmap()是一個非常糟糕的主意。濫用alloca()更糟......我第一次聽說有人耗盡了虛擬內存空間。或者我們在這裏談論32位? – Dummy00001 2010-07-28 09:30:36

+0

至少有兩個廣泛使用的malloc實現(phkmalloc和jemalloc)使用匿名mmap。我們使用的(jemalloc)是最近發佈的stdlib的malloc庫。有人必須認爲這是一個好主意。 是的,32位使用PME的半內核用戶空間分割。此外,我們正在將內核中的一部分內存映射到用戶空間,所以我們可用的地址範圍僅僅是一個大門。 – jdizzle 2010-07-28 10:39:12

+0

@ Dummy00001:我讀過OpenBSD的malloc()mmap()s everything> = pagesize。 dlmalloc()(用於glibc和uClibc等)有一個MMAP_THRESHOLD,我認爲它通常在128Kb左右。 – ninjalj 2010-07-28 17:05:07

回答

0

舊版本的心跳保證堆棧空間是通過調用每次memset()ed 1Kb爲0xff的遞歸函數來提交的。 Heartbeat做到了這一點,以便能夠mlock()所有可能需要的內存。

+0

理想情況下,我可以以某種方式保留地址而不強迫它們被內存支持,但就目前而言,我認爲像這樣的東西是它可以工作的唯一方式。 – jdizzle 2010-07-28 19:09:20