假设我在Linux中有一个进程,我从其中fork()另一个相同的进程。在Linux之后,由于最初的进程将开始写入内存,所以Linux的即插即用机制将给出不同于分叉进程使用的进程独特的物理内存页。
如何在某个执行点知道原始进程的哪些页面已在写入时被复制?
我不想使用SIGSEGV信号处理程序,在开始时只允许对所有页面进行读访问,因为这会导致我不想要的开销。
发布于 2016-04-11 04:04:15
跟踪syscall -叉(),克隆():
在这里,您可以找到通过VMA遍历VMA的算法,将它们标记为“在写上复制”:
http://www.cs.columbia.edu/~krj/os/lectures/L17-LinuxPaging.pdf
http://www.cs.columbia.edu/~junfeng/13fa-w4118/lectures/l20-adv-mm.pdf
本质上(指幻灯片),如果PTE在不可写(这是基于硬件的)和VMA标记为可写(这是基于软件的)-这意味着内存是复制上写.。
您可以编写一个内核模块来完成这个任务。
发布于 2012-06-02 04:48:55
你可能得接受一些开销。
如果您有特权,您可以扩展/proc/self/pagemap (64位,偏移8*(addr / PAGE_SIZE))以获得PFN (它是低54位)。然后查找/proc/kpagecount中的PFN,查看页面是否共享。
如果您没有特权,您可以比较父级和子级页面中的PFN。
您可以通过比较Pss (比例设置大小)和/proc/smaps中的总大小来判断映射中的任何页面是否是共享的。
https://stackoverflow.com/questions/10284181
复制相似问题