只是问题陈述,我如何使用mmap()在堆中分配内存?这是我唯一的选择,因为malloc()它不是可重入的函数.
我想通过在Linux中使用内存映射I/O来尝试将文件的内容复制到另一个文件mmap().目的是自己检查一下这是否比使用更好fread(),fwrite()以及它如何处理大文件(例如,像几个GiB,因为文件被读取整个我想知道如果我需要有这么多的内存量).
这是我正在使用的代码:
// Open original file descriptor:
int orig_fd = open(argv[1], O_RDONLY);
// Check if it was really opened:
if (orig_fd == -1) {
fprintf(stderr, "ERROR: File %s couldn't be opened:\n", argv[1]);
fprintf(stderr, "%d - %s\n", errno, strerror(errno));
exit(EX_NOINPUT);
}
// Idem for the destination file:
int dest_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
// Check if it was really opened:
if (dest_fd == -1) {
fprintf(stderr, "ERROR: File %s couldn't be …Run Code Online (Sandbox Code Playgroud) 在mmap()手册页中:
它的原型是:
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
Run Code Online (Sandbox Code Playgroud)
和描述:
The mmap() function asks to map 'length' bytes starting at offset 'offset'
from the file (or other object) specified by the file descriptor fd into
memory, preferably at address 'start'.
Run Code Online (Sandbox Code Playgroud)
最后,对于最后一个论点:
'offset' should be a multiple of the page size as returned by getpagesize(2).
Run Code Online (Sandbox Code Playgroud)
根据我的实践,offset必须是页面大小的倍数,例如,我的Linux上有4096,否则,mmap()会返回Invalid argument,offset是文件偏移量,为什么它必须是虚拟内存系统页面大小的倍数?
谢谢,
有谁知道为什么mmap()返回MAP_FAILED而不是NULL?在大多数系统上,似乎MAP_FAILED是(void*) - 1.为什么mmap()不使用NULL代替?我知道地址0x0在技术上是一个有效的内存页面,而(void*) - 1永远不会是一个有效的页面.但我的猜测是mmap()实际上永远不会实际返回页面0x0.例如,在Windows上,VirtualAlloc()在出错时返回NULL.
假设mmap()永远不会返回0x0是否安全?大概是对mmap()的成功调用应该将可用内存返回给调用者.地址0x0永远不可用,因此成功时永远不应返回.这种情况会让使用0x0作为失败的哨兵似乎是明智的,这就是为什么我首先对MAP_FAILED的存在感到困惑.
有人知道以下3个在速度方面的比较:
共享内存
tmpfs(/ dev/shm)
mmap(/ dev/shm)
谢谢!
我找不到任何关于numpy如何处理以前内存映射区域取消映射的文档:munmapfor numpy.memmap()和numpy.load(mmap_mode).
我的猜测是它只在垃圾收集时完成,这是正确的吗?
我使用JVM参数在生产环境(rhel 5.2 x64,oracle jre 1.7_05,tomcat 7.0.28)上运行我的应用程序:
-Xms8192m -Xmx8192m -XX:MaxPermSize=1024m
-Doracle.net.tns_admin=/var/ora_net -XX:ReservedCodeCacheSize=512m -XX:+AggressiveOpts -XX:+UseFastAccessorMethods
-XX:+UseStringCache -XX:+OptimizeStringConcat -XX:+UseCompressedOops -XX:+UseG1GC -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9026 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
Run Code Online (Sandbox Code Playgroud)
经过几次,我有像这样的堆栈跟踪:
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to allocate stack guard pages failed.
mmap failed for CEN and END part of zip file
[...]
Caused by: java.lang.OutOfMemoryError: null
at java.util.zip.ZipFile.$$YJP$$open(Native Method) ~[na:1.7.0_05]
at java.util.zip.ZipFile.open(Unknown Source) ~[na:1.7.0_05]
at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05]
at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05]
at …Run Code Online (Sandbox Code Playgroud) 我正在研究mmap().从手册中,我只知道在概念上文件被映射到虚拟地址空间,因此支持随机访问.但是,我也想知道映射文件是否立即加载到内存中?我猜这个内核按页面管理映射内存,并且按需加载它们,如果我只进行一些读写操作,只加载几页.这是对的吗?
在新安装的虚拟机中,我在编译x86架构的内核时遇到此错误:
$ Could not mmap file: vmlinux
$ make: *** [vmlinux] Error 1
Run Code Online (Sandbox Code Playgroud)
这是我第一次看到它.我已经将大小/proc/sys/kernel/shmmax增加到128MB,但它没有解决问题.有任何想法吗?
谢谢!:)
我似乎无法在我的服务器上的Docker容器中运行java.即使发布java -version,我也会收到以下错误.
root@86088d679103:/# java -version
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000035ce1000000, 2555904, 1) failed; error='Operation not permitted' (errno=1)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2555904 bytes for committing reserved memory.
# An error report file with more information is saved as:
# //hs_err_pid17.log
Run Code Online (Sandbox Code Playgroud)
据此,java无法为预留内存映射2.5Mb的空间?这似乎不对......
我在最后包含了完整的日志,但为了获得一些额外的信息,我的系统报告了以下内容:
root@86088d679103:/# uname -m
x86_64
root@86088d679103:/# free -mh
total used free shared buffers cached
Mem: 15G 9.7G 5.8G …Run Code Online (Sandbox Code Playgroud)