2016-06-28 125 views
1

我读过sbrk是一个不推荐的调用,其中一个更喜欢mmapMAP_ANONYMOUS标志。我需要一个可以增长的连续(逻辑)内存块。但是,mmap将第一个参数作为提示对待,因此可能会产生差距,这在我的情况下是不可接受的。我尝试使用MAP_FIXED标志(它不建议使用文档状态),并且我可以获得连续内存,但在映射多个页面后,我的程序出现了奇怪的行为:系统函数printfclock_gettime开始失败。我想第一个mmap,我呼吁没有MAP_FIXED返回页面,其中有一些映射后的页面,其中包含系统数据。那么使用mmap而不是sbrk的正确方法是什么?用`mmap`代替`sbrk`

回答

2

使用Linux,您可以使用mmapMAP_NORESERVE(也可能是PROT_NONE)来声明大块地址空间,而不实际分配任何内存。您可以映射您可能需要的最大区域(并且可以获取),然后根据需要使用MAP_FIXED重新映射它的位以实际分配内存。

+0

这是'malloc'实际上做了什么?以及MAP_NORESERVE使用的初始内存量是多少? –

+0

这个答案与我的答案相同:如果OP可以确定块的最大尺寸,那么他可以“mmap”整个最大尺寸。并且'MAP_NORESERVE'也不需要:如果OP没有触及内存,它将不会被分页。 –

+0

@EmployedRussian:没有MAP_NORESERVE,它将分配交换空间(可能会失败),并且肯定会分配PTE所有页面引用交换空间。使用MAP_NORESERVE和PROT_NONE它只会保留虚拟地址范围,甚至不会分配PTE。因此,在64位机器上,您可以快速保留多TB的区域,因此不需要其他库或任何其他库将尝试使用它。 –

0

我读过SBRK是一个过时的电话

不要相信你读到的一切,特别是在源是不具有权威性。

我需要一个可以增长的连续(逻辑)内存块。

在这种情况下,mmap不适合您,除非您愿意声明该块可以增长的最大大小。

我试图用MAP_FIXED标志(其作为文档状态不推荐),我可以得到连续的内存,但映射几页后,我让我的程序奇怪的行为

随着MMAP_FIXED你有小心:系统会愉快地映射过去的任何(如果有的话),包括libc之前的数据和代码。

+0

'map sbrk'是不是权威? “SUSv1,在SUSv2中标记为LEGACY,在POSIX.1-2001中删除。” –

+0

@AlexeyAndreev不,在Linux上的“man sbrk”不具有权威性,并且不声称该函数已被弃用。 –