标签: mmap

如何使用mmap在堆中分配内存?

只是问题陈述,我如何使用mmap()在堆中分配内存?这是我唯一的选择,因为malloc()它不是可重入的函数.

c heap memory-management mmap

12
推荐指数
2
解决办法
2万
查看次数

为什么mmap()失败并且文件复制程序的目标文件被拒绝?

我想通过在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)

c linux file-io mmap copy

12
推荐指数
1
解决办法
2万
查看次数

为什么mmap()中的文件起始偏移量必须是页面大小的倍数

在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 offset page-size

12
推荐指数
1
解决办法
8834
查看次数

为什么mmap()使用MAP_FAILED而不是NULL?

有谁知道为什么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的存在感到困惑.

linux macos posix mmap ios

12
推荐指数
1
解决办法
4924
查看次数

Shmem vs tmpfs vs mmap

有人知道以下3个在速度方面的比较:

  • 共享内存

  • tmpfs(/ dev/shm)

  • mmap(/ dev/shm)

谢谢!

c++ linux mmap

11
推荐指数
1
解决办法
2万
查看次数

取消NumPy memmap的映射

我找不到任何关于numpy如何处理以前内存映射区域取消映射的文档:munmapfor numpy.memmap()numpy.load(mmap_mode).

我的猜测是它只在垃圾收集时完成,这是正确的吗?

python mmap numpy

11
推荐指数
1
解决办法
1865
查看次数

Java OutOfMemory异常:加载zip文件时出现mmap错误

我使用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)

java mmap out-of-memory java-7

11
推荐指数
1
解决办法
1万
查看次数

mmap:将映射的文件立即加载到内存中吗?

我正在研究mmap().从手册中,我只知道在概念上文件被映射到虚拟地址空间,因此支持随机访问.但是,我也想知道映射文件是否立即加载到内存中?我猜这个内核按页面管理映射内存,并且按需加载它们,如果我只进行一些读写操作,只加载几页.这是对的吗?

linux mmap

11
推荐指数
1
解决办法
4524
查看次数

错误:无法mmap文件:vmlinux

在新安装的虚拟机中,我在编译x86架构的内核时遇到此错误:

$ Could not mmap file: vmlinux

$ make: *** [vmlinux] Error 1
Run Code Online (Sandbox Code Playgroud)

这是我第一次看到它.我已经将大小/proc/sys/kernel/shmmax增加到128MB,但它没有解决问题.有任何想法吗?

谢谢!:)

linux kernel mmap

11
推荐指数
2
解决办法
2426
查看次数

在Docker容器中运行时,JVM无法映射保留的内存

我似乎无法在我的服务器上的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)

java jvm mmap docker

11
推荐指数
2
解决办法
2万
查看次数

标签 统计

mmap ×10

linux ×5

c ×2

java ×2

c++ ×1

copy ×1

docker ×1

file-io ×1

heap ×1

ios ×1

java-7 ×1

jvm ×1

kernel ×1

macos ×1

memory-management ×1

numpy ×1

offset ×1

out-of-memory ×1

page-size ×1

posix ×1

python ×1