gpt4 book ai didi

c# - 使用 VirtualProtect 将页面标记为写时复制(windows 上的穷人 fork )

转载 作者:可可西里 更新时间:2023-11-01 13:11:53 31 4
gpt4 key购买 nike

我使用 VirtualAlloc(Ex) 来分配和提交大范围的页面。

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

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

感谢 fork(),这在 posix 系统上是微不足道的。我可以在 Windows 上高效地模拟 fork 的这一部分吗?

谢谢,-丹

最佳答案

我认为这些都不能完全回答原始发帖者提出的问题。也许我可以冒险举出下面的例子。假设一个人在“bufferA”中有一些数据,一个人将它复制到“bufferB”,然后修改两个缓冲区。现在检查两个缓冲区,并决定将“bufferA”或“bufferB”复制到“bufferC”并对“bufferC”进行更多修改,等等。

假设缓冲区很大而修改很小,问题是在主机上使用 MMU 的写时复制功能是否是一种优化,以及是否有 API 允许这样做.

内存映射文件的使用不太有效,因为一旦使用 PAGE_WRITECOPY,似乎就没有办法说“现在复制包含更改的虚拟页面”。例如,如果“bufferA”和“bufferB”都是同一文件的映射,并且在映射时其中一个被标记为“WRITECOPY”,则似乎无法将这些修改映射到“bufferC”。当然可以只复制这些位,但问题是是否有潜在的优化。

有一个名为 VirtualCopy() 的函数,但它似乎是特定于 Windows CE 的,并且适用于物理地址。这里的问题是是否有类似“VirtualCopy”的东西,但是以虚拟地址为源。

请注意,虽然“fork()”(在具有它的系统上)执行此操作,但一个“fork”是整个过程,而不仅仅是缓冲区。这里有一个关于“写时复制 memcpy”的相关讨论(Can I do a copy-on-write memcpy in Linux?)。

所以正在寻找的 API 可能看起来像这样: void * VirualCopyVirtualAddressSpace( void* src, size_t length);

到目前为止,我还没有看到任何系统上的 API 允许在进程内或现有进程之间复制缓冲区。虽然我不是专家,但我认为通过写时复制机制复制正确对齐的虚拟内存段会相当简单,至少在单个地址空间内是这样。

关于c# - 使用 VirtualProtect 将页面标记为写时复制(windows 上的穷人 fork ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134454/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com