Articles of mmap

为什么munmap需要一个长度作为参数?

我想知道,为什么映射内存的大小是一个参数传入的,因为从同一个地址开始的映射不能多于一个映射(可​​以吗?),为什么linux内核不能同时logging起始地址和长度,但让用户空间程序记住它们。 我的意思是,为什么不这样做,只要使用起始地址作为主键来存储信息树。

为什么fopen / fgets同时使用mmap和read系统调用来访问数据?

我有一个小例子程序,只是fopen sa文件,并使用fgets来读取它。 使用strace ,我注意到第一次调用fgets运行一个mmap系统调用,然后读取系统调用用于实际读取文件的内容。 在fclose ,文件被munmap 。 如果我打开直接读/打开/读取文件,这显然不会发生。 我很好奇这个mmap的目的是什么,它正在完成什么。 在我的基于Linux 2.6.31的系统上,当虚拟内存需求很大的时候,这些mmap有时会挂几秒钟,在我看来是不必要的。 示例代码: #include <stdlib.h> #include <stdio.h> int main () { FILE *f; if ( NULL == ( f=fopen( "foo.txt","r" ))) { printf ("Fail to open\n"); } char buf[256]; fgets(buf,256,f); fclose(f); } 上面的代码运行时,这里是相关的strace输出: open("foo.txt", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=9, …}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, […]

何时以及如何将mmap存储器交换出来?

在我的理解中,将mmap映射到RAM中的文件就像在内存中一样。 假设我们有16G的RAM,而且我们首先映射一个我们使用了一段时间的10G文件。 这在访问方面应该是相当高效的。 如果我们再映射第二个10G文件,会导致第一个被换出? 还是其中的一部分? 如果是的话,这将发生在什么时候? 在mmap调用,或访问新加载的文件的内存区域? 而如果我们想再次访问第一个文件的指针的内存,是否会使它重新加载交换文件? 因此,如果我们在第一个文件和第二个文件相对应的内存之间交替读取,会导致灾难性的性能吗? 最后,如果这是真的,那么mmap几个较小的文件会更好吗?

什么是mmap内存保护PROT_NONE的目的

我正在阅读mmap的文档并落在这一行: PROT_NONE页面可能不被访问。 有什么用来映射文件到内存,但从来没有访问它?

mmap函数中的MAP_SHARED和MAP_PRIVATE有什么区别?

玩转mmap的乐趣,我有以下代码: (.. snip ..) fd = open("/home/me/straight_a.txt", O_RDONLY); if (fd == -1) { perror("open"); exit(1); } m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0); if (m == MAP_FAILED) { perror("mmap"); exit(1); } printf("m is %p\n", m); printf("*m = %c\n", *m); printf("*(m+1) = %c\n", *(m+1)); (.. snip ..) 这按预期工作。 但在这之前,我尝试了… m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, […]

随机caching内存访问速度比堆数据访问速度慢16%

我们的软件在内存中构build了大约80GB的数据结构。 然后,它可以直接使用这个数据结构来进行计算,或者将其转储到磁盘,以便以后可以重复使用。 在这个数据结构中发生大量的随机存储器访问。 对于更大的input,这个数据结构可能会变得更大(我们最大的一个超过300千兆字节大),我们的服务器有足够的内存来保存所有内容。 如果数据结构被转储到磁盘上,它将通过mmap被加载回地址空间,强制进入os页面caching,最后被mlocked(代码结尾)。 问题是在堆上立即使用计算的数据结构(请参阅Malloc版本)或转储文件(请参阅mmap版本)之间的性能差异大约为16%。 我没有一个很好的解释,为什么这是事实。 有没有办法找出为什么mmap变得如此慢? 我能否以某种方式closures这个性能差距? 我在一台运行Scientific Linux 7.2的服务器上运行一个3.10内核的测量,它有128GB RAM(足以容纳所有东西),并重复了几次,得到了类似的结果。 有时候差距会小一点,但不会太大。 新消息(2017/05/23): 我制作了一个最小的testing用例,效果可以看出来。 我尝试了不同的标志(MAP_SHARED等),没有成功。 mmap版本仍然较慢。 #include <random> #include <iostream> #include <sys/time.h> #include <ctime> #include <omp.h> #include <sys/mman.h> #include <unistd.h> constexpr size_t ipow(int base, int exponent) { size_t res = 1; for (int i = 0; i < exponent; i++) { res = […]

当使用PROT_READ时,mmap MAP_SHARED和MAP_PRIVATE之间是否有区别?

如果我创build了prot参数为PROT_READ的文件的mmap(2) ,并且支持它的文件也是只读的并且不会更改, MAP_SHARED和MAP_PRIVATE之间是否存在任何性能差异(或任何差异)? 内核会在两者之间做不同的事情吗? (文档只是指“更新”方面的行为差异,但是因为它是PROT_READ ,所以不会有更新,我想知道是否还有其他的区别?)

写入文件和映射的内存有什么区别?

我有以下有关处理文件和映射它们的问题( mmap ): 我们知道,如果我们创build一个文件,并写入该文件,那么无论我们正在写入内存。 那么为什么使用mmap将该文件映射到内存,然后写入? 如果是因为使用mmap PROT_NONE , PROT_READ , PROT_WRITE来实现保护,那么使用文件也可以实现相同的保护级别。 O_RDONLY , O_RDWR等。那为什么是mmap ? 我们将文件映射到内存,然后使用它有什么特别的优势吗? 而不是只创build一个文件并写入它? 最后,假设我们将一个文件mmap到内存,如果我们写入由mmap返回的内存位置,它是否也同时写入该文件? 请帮我回复所有的问题。 非常感谢。 *编辑:线程之间共享文件* 据我所知,如果我们在两个线程(不是进程)之间共享一个文件,那么build议将它mmap到内存然后使用它,而不是直接使用文件。 但是我们知道使用一个文件意味着,它肯定是在主内存中,那么为什么线程还需要被mmaped?

为什么我们可以分配一个1 PB(10 ^ 15)数组并获得最后一个元素的访问权限,但不能释放它?

众所周知: http : //linux.die.net/man/3/malloc 默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL时,不能保证内存真的可用。 如果事实certificate系统内存不足,OOM杀手会杀死一个或多个进程。 我们可以使用malloc(petabyte);成功分配1 PB的VMA(虚拟内存区域malloc(petabyte); : http : //ideone.com/1yskmB #include <stdio.h> #include <stdlib.h> int main(void) { long long int petabyte = 1024LL * 1024LL * 1024LL * 1024LL * 1024LL; // 2^50 printf("petabyte %lld \n", petabyte); volatile char *ptr = (volatile char *)malloc(petabyte); printf("malloc() – success, ptr = %p \n", ptr); […]

如果我使用mmap而不是malloc分配内存呢?

使用mmap (使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存比使用malloc什么缺点? 对于函数范围内的数据,我会使用堆栈内存,因此不使用malloc. 想到的一个缺点是dynamic数据结构,比如树和链表,你经常需要分配和取消分配小块数据。 使用mmap会有两个原因,其中一个是以4096字节的粒度进行分配,另一个是需要进行系统调用。 但在其他情况下,你认为malloc比mmap好吗? 其次,我是否高估了dynamic数据结构mmap缺点? mmap超过malloc一个优点我能想到的是内存立即返回到操作系统,当你做munmap ,而与malloc/free ,我猜内存uptil数据段断点永远不会返回,但保留重用。