【问题标题】:How do Unix systems keep track of shared memory when processes fork()?处理 fork() 时,Unix 系统如何跟踪共享内存?
【发布时间】:2014-11-12 08:35:55
【问题描述】:

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

Unix 系统是如何做到这一点的?它们是否存储有关每个进程与谁共享内存的信息,或者这些信息是全局信息?

【问题讨论】:

    标签: unix memory-management fork shared-memory virtual-memory


    【解决方案1】:

    共享内存区域有一个引用计数器。每当一个进程打开共享内存或通过从一个打开它的进程派生它来获取它时,它就会递增。当进程关闭共享内存或退出时,它会减少。当计数器变为 0 时,共享内存区域被丢弃。

    【讨论】:

    • 谢谢,但是,这些信息是存储在进程中还是关于现有共享内存区域的信息是全局的?
    • 它是全局的,因为每个共享内存区域都有一个计数器。怎么会在这个过程中?
    • 有可能。在我的内核项目 (ghostkernel.org) 中,我正在重新设计我的共享内存实现,以便实现分叉。在我当前的实现中,创建过程是它想要共享的区域的“物理所有者”。该区域与之共享的进程没有此标志。因此,一旦共享内存的物理所有者死亡,内存就会被释放。但是,正如您所看到的,这不适用于 fork,因为物理所有者可能会死,但物理页面仍然必须保留。
    • 如果共享内存的信息是全局的,如果共享区域后面的物理内存不连续怎么办?系统是否存储共享区域的每个物理页面的地址?
    • 每一页都有。它是虚拟内存系统使用的页表的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2015-07-20
    • 2010-12-30
    • 2021-12-04
    相关资源
    最近更新 更多