在我們的產品中,我們使用專門依賴mmap進行內存分配的malloc
實現。我們也合理使用alloca
ing。我們剛剛遇到了一個問題,其中mmap將分配應爲保留的區域(因此當我們的一個較大的alloca溢出到malloc'd區域時會導致非常糟糕的事情發生)。從保留堆棧空間分配mmap區域?
我們進程的分配限制是我們的虛擬機地址空間,而不是物理內存。當進程運行時,我們已經觀看了/ proc/*/maps文件,並且看到malloc吃掉了任何可用的地址空間。它最終要求在堆棧rlimit-set範圍內分配地址,並最終擴展到一個大的alloca
。
我們試圖通過alloca
解決它荷蘭國際集團我們在啓動整個堆棧的限制,但是這並沒有跨平臺證明了穩定的(它的段錯誤試圖訪問我的2.4 dev的框alloca
d內存,而它的工作原理在2.6生產機器上)。
有沒有什麼辦法來實際保留地址空間?還有什麼可以做的?
對於malloc()使用mmap()是一個非常糟糕的主意。濫用alloca()更糟......我第一次聽說有人耗盡了虛擬內存空間。或者我們在這裏談論32位? – Dummy00001 2010-07-28 09:30:36
至少有兩個廣泛使用的malloc實現(phkmalloc和jemalloc)使用匿名mmap。我們使用的(jemalloc)是最近發佈的stdlib的malloc庫。有人必須認爲這是一個好主意。 是的,32位使用PME的半內核用戶空間分割。此外,我們正在將內核中的一部分內存映射到用戶空間,所以我們可用的地址範圍僅僅是一個大門。 – jdizzle 2010-07-28 10:39:12
@ Dummy00001:我讀過OpenBSD的malloc()mmap()s everything> = pagesize。 dlmalloc()(用於glibc和uClibc等)有一個MMAP_THRESHOLD,我認爲它通常在128Kb左右。 – ninjalj 2010-07-28 17:05:07