malloc()
可以通過擴展堆或通過足夠大的內存塊來分配內存。他們使用哪一種取決於你要求的尺寸和幾個選項。
如果它使用通常位於虛擬內存區域起始處的「真正的」堆區段,它可以增長到它碰到下一個分配的內存區塊的位置,該區塊離開始處很遠。
如果使用mmap()
,這取決於是否有可用連續的地址空間。
/proc/<PID>/maps
是找出一個進程的地址空間的情況下良好的查詢點。
我只是用我的Python和ctypes的64位服務器測試:
import ctypes
import ctypes.util
m=ctypes.CDLL(ctypes.util.find_library("c")).malloc
m.argtypes=(ctypes.c_uint64,)
m.restype = ctypes.c_uint64
現在我有m
,作爲對libc中的malloc()
函數的調用。現在
我可以做
>>> hex(m(2700000000))
'0x7f1345e3b010L'
>>> hex(m(2700000000))
'0x7f12a4f4f010L'
>>> hex(m(2700000000))
'0x7f1204063010L'
>>> hex(m(2700000000))
'0x7f1163177010L'
>>> hex(m(2700000000))
'0x7f10c228b010L'
>>> hex(m(2700000000))
'0x7f102139f010L'
>>> hex(m(2700000000))
'0x7f0f804b3010L'
但不論何種原因,我不能做
>>> hex(m(2900000000))
'0x0L'
因爲它返回0 RESP。一個NULL指針。
現在
print open("/proc/self/maps").read()
做給我看說文件的行;在某處
7f0ed8000000-7f0ed8021000 rw-p 00000000 00:00 0
7f0ed8021000-7f0edc000000 ---p 00000000 00:00 0
7f0edf5c7000-7f13e6d27000 rw-p 00000000 00:00 0
我得到了我的分配。
但是,如果我這樣做,而不是
>>> hex(m(1))
'0x1f07320L'
>>> hex(m(1))
'0x1f0c0e0L'
>>> hex(m(1))
'0x1f02d50L'
>>> hex(m(1))
'0x1f02d70L'
>>> hex(m(1))
'0x1ef94f0L'
>>> hex(m(1))
'0x1eb7b20L'
>>> hex(m(1))
'0x1efb700L'
>>> hex(m(270))
'0x1f162a0L'
>>> hex(m(270))
'0x1f163c0L'
>>> hex(m(270))
'0x1f164e0L'
>>> hex(m(270))
'0x1f16600L'
的內存地址來自
>>> print open("/proc/self/maps").read()
[...]
01d2e000-01f2b000 rw-p 00000000 00:00 0 [heap]
[...]
指定的堆。
請注意,雖然我可以分配此內存,但使用它會造成傷害,因爲我的進程可能會被着名的OOM殺手殺死。
一般被推向後備存儲(盤),因爲你有虛擬內存管理,因此可以分配超過16GB,這取決於你的交換空間大小。然而,精彩的表演並不能保證。 – Jiminion
它可能是一個64位機器......但它是一個64位*進程*?它有所作爲。 – WhozCraig
嘗試'printf(「%p \ n」,malloc(16ull * 1024 * 1204 * 1204))'並找出答案。 – chux