假设我在 Linux 中有一个进程,我从中fork()
另一个相同的过程。后fork
ing,因为原始进程将开始写入内存,Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页。
在执行的某个时刻,我如何知道原始进程的哪些页面已被写入时复制?
我不想使用 SIGSEGV 信号处理程序并在开始时对所有页面进行只读访问,因为这会产生我不想要的开销。
跟踪系统调用 - fork()、clone():
copy_process()->copy_mm()->dup_mm()->dup_mmap()-->在这里你会找到通过VMA逐个VMA将它们标记为“写时复制”的算法:
http://www.cs.columbia.edu/~krj/os/lectures/L17-LinuxPaging.pdf http://www.cs.columbia.edu/~krj/os/lectures/L17-LinuxPaging.pdf
http://www.cs.columbia.edu/~junfeng/13fa-w4118/lectures/l20-adv-mm.pdf http://www.cs.columbia.edu/~junfeng/13fa-w4118/lectures/l20-adv-mm.pdf
本质上(参见幻灯片),如果 PTE 为不可写(基于硬件),并且 VMA 被标记为可写(基于软件) - 这意味着内存是写时复制的。
您始终可以编写一个内核模块来做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)