f******e 发帖数: 164 | 1 【 以下文字转载自 Linux 讨论区 】
发信人: francise (小飞猫), 信区: Linux
标 题: "brk()" 和 mmap() 有什么区别?
发信站: BBS 未名空间站 (Sat Mar 29 23:41:09 2008)
我理解 brk(), but what if brk() reaches the boundary of the top of a heap (
4G memory)?
我的朋友告诉我说, mmap() maps kernal memory to user, but I really doubt him
. Is he right? |
m*****e 发帖数: 4193 | 2
brk() can fail.
him
mmap() creates separate memory mapping from heap.
【在 f******e 的大作中提到】 : 【 以下文字转载自 Linux 讨论区 】 : 发信人: francise (小飞猫), 信区: Linux : 标 题: "brk()" 和 mmap() 有什么区别? : 发信站: BBS 未名空间站 (Sat Mar 29 23:41:09 2008) : 我理解 brk(), but what if brk() reaches the boundary of the top of a heap ( : 4G memory)? : 我的朋友告诉我说, mmap() maps kernal memory to user, but I really doubt him : . Is he right?
|
f******e 发帖数: 164 | 3 谢谢。我的疑问是:如果reach top of heap(0x40000000),mmap()哪里来的memory
address for allocating?如果memory address仍然是增长的( >0x40000000 ),那么
为什么还需要brk()这种system call?大家在一开始都用mmap()不就行了?
【在 m*****e 的大作中提到】 : : brk() can fail. : him : mmap() creates separate memory mapping from heap.
|
m*****e 发帖数: 4193 | 4
mmap() was introduced later into Unix with virtual memory. Originally there
was only heap.
Also, mmap() is much more expensive than brk() so for efficiency reasons
small memory allocations always use heap.
【在 f******e 的大作中提到】 : 谢谢。我的疑问是:如果reach top of heap(0x40000000),mmap()哪里来的memory : address for allocating?如果memory address仍然是增长的( >0x40000000 ),那么 : 为什么还需要brk()这种system call?大家在一开始都用mmap()不就行了?
|
i*****r 发帖数: 265 | 5 One thing you must be clear is that all mmap and brk do nothing else but
allocate address space (no actual physical page allocated). brk simply play
with heap pointers thus will be more efficient for small allocations. mmap
create additional vma structure for the process (at least for Linux) and
could be more expensive. mmap() could fail to ... there is nothing
guaranteed to be successful. |
v**u 发帖数: 20 | 6 地址空间的大小是由地址指针宽度决定的,如果你的机器是32 位的,你的OS和应用程
序当然也是编译为32位,那末你的最大寻址空间就是4G,所以你担心的事情永远不会在
32位的机器上出现。
brk()是专为调整heap size 的,mmap() 有很多别的用途,比如把I/O地址map 到用户
空间, 比如文件map 到地址空间,等等,很强大很危险。 |
v**u 发帖数: 20 | 7 地址空间的大小是由地址指针宽度决定的,如果你的机器是32 位的,你的OS和应用程
序当然也是编译为32位,那末你的最大寻址空间就是4G,所以你担心的事情永远不会在
32位的机器上出现。
brk()是专为调整heap size 的,mmap() 有很多别的用途,比如把I/O地址map 到用户
空间, 比如文件map 到地址空间,等等,很强大很危险。而且mmap() map 的memory是独立于heap 之外的,这用超大malloc就不用占用heap了。 哎呀,嘴笨,说不清,反正是很不同的。:) |