相关疑难解决方法(0)

更快的替代memcpy?

我有一个正在执行memcpy的功能,但它占用了大量的周期.有没有比使用memcpy移动内存更快的替代/方法?

c performance memcpy

37
推荐指数
5
解决办法
6万
查看次数

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

我有一个通过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
查看次数

mmap on/proc/pid/mem

有没有人成功用Linux内核2.6 mmap'/proc/pid/mem文件?我收到一个ENODEV(没有这样的设备)错误.我的电话看起来像这样:

char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset);
Run Code Online (Sandbox Code Playgroud)

我通过在调试时查看/ proc/pid/maps文件进行验证,当执行到达此调用时,offset具有堆栈顶部的值减去PAGE_SIZE.我还用ptrace验证了mmap是将errno设置为ENODEV.

c linux mmap systems-programming procfs

10
推荐指数
1
解决办法
4263
查看次数

获取fork()的copy-on-write行为,不带fork()

我有一个大缓冲区:

char *buf = malloc(1000000000); // 1GB
Run Code Online (Sandbox Code Playgroud)

如果我分叉一个新进程,它将有一个buf,它与父进程的buf共享内存,直到一个或另一个写入它.即使这样,内核也只需要分配一个新的4KiB块,其余的将继续共享.

我想复制一下buf,但我只想改变一点副本.我想要不写分支的写时复制行为.(就像你在分叉时免费获得的那样.)

这可能吗?

c fork copy-on-write

8
推荐指数
1
解决办法
2010
查看次数

使用VirtualProtect将页面标记为写时复制(Windows上的穷人分叉)

我使用VirtualAlloc(Ex)来分配和提交大量页面.

稍后在执行中我希望"分叉"该内存,启动一个可以在其当前状态下读取它的新进程,而父进程将其视为写时复制内存.

可以使用VirtualAlloc(Ex)和VirtualProtect(Ex)完成吗?

由于fork(),这在posix系统上是微不足道的.我可以在Windows上有效地模拟这部分fork吗?

谢谢,-Dan

c# c++ windows fork

7
推荐指数
1
解决办法
2289
查看次数

如何在linux上使用copy-on-write来处理共享内存

我尝试编写一个小应用程序来熟悉用户空间中的写时复制概念.我已经阅读了MSalters的回答,并认为只有当我开始使用mmap'ed文件存储我的数据时它才会起作用.因为我不需要基于文件的持久性,我试图用共享内存做同样的事情.首先我mmap编写并初始化了一个shm fd,然后我MAP_PRIVATE再次映射了第二个副本并从中读取.但是,只需读取它就会导致内核复制整个内容,花费更多时间并占用内存的两倍.为什么不做COW?

这是我提出的用于说明行为的程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <assert.h>

static const size_t ARRAYSIZE = 1UL<<30;

void init(int* A)
{
    for (size_t i = 0; i < ARRAYSIZE; ++i)
        A[i] = i;
}

size_t agg(const int* A)
{
    size_t sum = 0;
    for (size_t i = 0; i < ARRAYSIZE; ++i)
        sum += A[i];
    return sum;
}

int main()
{
    assert(sizeof(int) == 4);
    shm_unlink("/cowtest");
    printf("ARRAYSIZE: …
Run Code Online (Sandbox Code Playgroud)

c++ linux memory memory-management shared-memory

7
推荐指数
1
解决办法
1361
查看次数