相关疑难解决方法(0)

在进程内的写入内存上分配副本

我有一个通过mmap使用获得的内存段MAP_ANONYMOUS.

如何分配引用第一个相同大小的第二个内存段并在Linux中进行复制写入(目前正在使用Linux 2.6.36)?

我想要与完全相同的效果fork,只是没有创建一个新的过程.我希望新映射保持在同一个进程中.

整个过程必须在原始页面和复制页面上都是可重复的(就像父母和孩子一样会继续fork).

我不想分配整个段的直接副本的原因是因为它们是几千兆字节大而且我不想使用可以写入时复制的内存.

我尝试过的:

mmap该段分享,匿名.复制mprotect它为只读并创建第二个映射remap_file_pages也是只读的.

然后使用libsigsegv拦截写入尝试,手动制作页面的副本然后mprotect两者进行读写.

诀窍,但非常脏.我本质上是实现自己的VM.

令人遗憾的是,当前的Linux不支持mmaping /proc/self/mem,否则MAP_PRIVATE就可以实现映射.

写时复制机制是Linux VM的一部分,必须有一种方法可以在不创建新进程的情况下使用它们.

作为一个注释: 我已经在Mach VM中找到了合适的机制.

以下代码在我的OS X 10.7.5上编译并具有预期的行为: Darwin 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64 i386

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#ifdef __MACH__
#include …
Run Code Online (Sandbox Code Playgroud)

c linux virtual-memory

33
推荐指数
2
解决办法
3165
查看次数

我可以在Linux上进行写时复制memcpy吗?

我有一些代码,我经常复制一大块内存,通常只需要对它进行非常小的更改.

我已经实现了一个跟踪更改的系统,但我认为如果可能的话,可以告诉操作系统对内存进行"写时复制",并让它只处理那些部分的副本哪个改变了.然而,虽然Linux执行copy-on-write,例如fork()时,我找不到一种控制它并自己动手的方法.

c linux memory-management

24
推荐指数
1
解决办法
7896
查看次数

将mmap'd内存区域从MAP_SHARED更改为MAP_PRIVATE

所以我有一个我用mmap()分配的内存区域,类似于下面的代码:

void * ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
Run Code Online (Sandbox Code Playgroud)

这里的关键是我正在使用MAP_SHARED标志.与相关的问题不同,只需再次调用mmap()以获取MAP_PRIVATE和Copy-on-Write语义就足够了,我不能让内核为我分配不同范围的虚拟地址.另外,在我再次调用mmap()之前,我不想调用munmap()并冒险让内核将部分/全部地址范围提供给进程中的其他内容.

是否存在将mmap内存区域从MAP_SHARED切换到MAP_PRIVATE以获取写时复制语义而不取消映射块的现有机制?

c mmap

5
推荐指数
1
解决办法
1584
查看次数

标签 统计

c ×3

linux ×2

memory-management ×1

mmap ×1

virtual-memory ×1