假设我在Linux中有一个进程,我fork()
另一个相同的进程。在fork
之后,当原始进程将开始写入内存时,Linux copy-on-write 机制将为进程提供唯一的物理内存页面,这些页面不同于分叉过程。
在某些执行点,我如何知道原始进程的哪些页面已被写入?
我不想使用SIGSEGV信号处理程序,并且只允许对开头的所有页面进行只读访问,因为这会导致我不想要的开销。
答案 0 :(得分:0)
你可能不得不接受一些开销。
如果您有特权,可以pread / proc / self / pagemap(64位,偏移8 *(addr / PAGE_SIZE))来获得PFN(它是低54位)。然后在/ proc / kpagecount中查找PFN以查看页面是否已共享。
如果您没有权限,可以比较父母和子女的页面地图中的PFN。
通过比较Pss(比例集大小)与/ proc / smaps中的总大小,可以判断映射中的任何页面是否共享。