我读过sbrk
是一个不推荐的调用,其中一个更喜欢mmap
和MAP_ANONYMOUS
标志。我需要一个可以增长的连续(逻辑)内存块。但是,mmap
将第一个参数作为提示对待,因此可能会产生差距,这在我的情况下是不可接受的。我尝试使用MAP_FIXED
标志(它不建议使用文档状态),并且我可以获得连续内存,但在映射多个页面后,我的程序出现了奇怪的行为:系统函数printf
和clock_gettime
开始失败。我想第一个mmap
,我呼吁没有MAP_FIXED
返回页面,其中有一些映射后的页面,其中包含系统数据。那么使用mmap
而不是sbrk
的正确方法是什么?用`mmap`代替`sbrk`
回答
使用Linux,您可以使用mmap
和MAP_NORESERVE
(也可能是PROT_NONE
)来声明大块地址空间,而不实际分配任何内存。您可以映射您可能需要的最大区域(并且可以获取),然后根据需要使用MAP_FIXED
重新映射它的位以实际分配内存。
我读过SBRK是一个过时的电话
不要相信你读到的一切,特别是在源是不具有权威性。
我需要一个可以增长的连续(逻辑)内存块。
在这种情况下,mmap
不适合您,除非您愿意声明该块可以增长的最大大小。
我试图用MAP_FIXED标志(其作为文档状态不推荐),我可以得到连续的内存,但映射几页后,我让我的程序奇怪的行为
随着MMAP_FIXED
你有很小心:系统会愉快地映射过去的任何(如果有的话),包括libc
之前的数据和代码。
'map sbrk'是不是权威? “SUSv1,在SUSv2中标记为LEGACY,在POSIX.1-2001中删除。” –
@AlexeyAndreev不,在Linux上的“man sbrk”不具有权威性,并且不声称该函数已被弃用。 –
- 1. mmap vs sbrk,性能对比
- 2. mmap替代malloc
- 3. mmap(2)vs mmap(3)
- 4. 虚拟内存和sbrk
- 5. 了解C malloc和sbrk()
- 6. 用sbrk自定义内存管理
- 7. 开销使用mmap
- 8. MMAP使用结构
- 9. mmap使用案例
- 10. 当mmap()
- 11. Ç - SBRK(大小)返回有效的指针但SBRK(0)是负值
- 12. 使用`/ *`代替`//`代替文件头
- 13. 替换使用替代
- 14. 用Javascript代替“
- 15. 使用mmap分配内存
- 16. 通过文件使用mmap
- 17. 正确的mmap使用 - Python
- 18. 当调用mmap两次SIGSEGV
- 19. 使用/ dev/zero的mmap
- 20. mmap()返回EINVAL
- 21. Python,ctypes和mmap
- 22. Python mmap/dev/port
- 23. 了解mmap
- 24. Mmap和结构
- 25. malloc vs mmap C
- 26. 跨平台内存分配器sbrk/virtualalloc
- 27. 为什么代码一直在调用mmap和munmap?
- 28. 如何使用Mmap共享内存。请纠正我的代码
- 29. 替代蟒蛇代替
- 30. img用JQuery替代
这是'malloc'实际上做了什么?以及MAP_NORESERVE使用的初始内存量是多少? –
这个答案与我的答案相同:如果OP可以确定块的最大尺寸,那么他可以“mmap”整个最大尺寸。并且'MAP_NORESERVE'也不需要:如果OP没有触及内存,它将不会被分页。 –
@EmployedRussian:没有MAP_NORESERVE,它将分配交换空间(可能会失败),并且肯定会分配PTE所有页面引用交换空间。使用MAP_NORESERVE和PROT_NONE它只会保留虚拟地址范围,甚至不会分配PTE。因此,在64位机器上,您可以快速保留多TB的区域,因此不需要其他库或任何其他库将尝试使用它。 –