当进程fork()时,Unix系统如何跟踪共享内存?

当进程fork()时,Unix系统如何跟踪共享内存?,unix,memory-management,fork,shared-memory,virtual-memory,Unix,Memory Management,Fork,Shared Memory,Virtual Memory,进程A创建一个共享内存区域并与进程B共享。然后进程A分叉,从而创建进程C。根据定义,C现在可以访问相同的共享内存区域。如果A死了,C和B仍然可以访问内存区域。只有当C和B也死亡时,物理内存才能再次释放 Unix系统如何实现这一点?它们是否存储关于每个进程与谁共享哪个内存的信息,或者该信息是全局信息?共享内存区域有一个引用计数器。每当进程打开共享内存或从打开共享内存的进程分叉时,它就会递增。当进程关闭共享内存或退出时,它将递减。当计数器变为0时,共享内存区域将被丢弃。谢谢,但是,这是存储在进程中的

进程A创建一个共享内存区域并与进程B共享。然后进程A分叉,从而创建进程C。根据定义,C现在可以访问相同的共享内存区域。如果A死了,C和B仍然可以访问内存区域。只有当C和B也死亡时,物理内存才能再次释放


Unix系统如何实现这一点?它们是否存储关于每个进程与谁共享哪个内存的信息,或者该信息是全局信息?

共享内存区域有一个引用计数器。每当进程打开共享内存或从打开共享内存的进程分叉时,它就会递增。当进程关闭共享内存或退出时,它将递减。当计数器变为0时,共享内存区域将被丢弃。

谢谢,但是,这是存储在进程中的信息,还是关于现有共享内存区域的信息是全局的?它是全局的,因为每个共享内存区域都有一个计数器。怎么可能是在这个过程中?可能是的。在我的内核项目()中,我正在重新设计共享内存实现,以便实现分叉。在我当前的实现中,创建过程是它想要共享的区域的“物理所有者”。与该区域共享的进程没有此标志。因此,一旦共享内存的物理所有者死亡,内存将被释放。但是,正如您所看到的,这在fork中是行不通的,因为物理所有者可能会死亡,但物理页面仍然必须保留。如果共享内存的信息是全局的,那么如果共享区域后面的物理内存不连续会发生什么情况?系统是否存储共享区域具有的每个物理页的地址?它是针对每个页的。它是虚拟内存系统使用的页表的一部分。