linux: 单次调用中的 munmap 共享内存

linux: munmap shared memory in on single call

如果一个进程调用 mmap(...,MAP_ANONYMOUS | MAP_SHARED,...) 并分叉 N 个 children,这些进程(parent 或后代)中的任何一个是否有可能 munmap() 的内存一次性所有进程,从而释放物理内存,或者这些进程中的每一个都必须单独 munmap() 吗? (我知道内存将在进程退出时取消映射,但 children 还不会退出)。

或者,有没有办法从另一个进程 munmap 内存?我正在考虑类似 munmap(pid,...).

的调用

或者有没有办法使用 non-anonymous 映射并对相关文件描述符执行操作(例如关闭文件)来实现我正在寻找的东西?

我的进程对性能很敏感,当知道共享内存将不再被任何人使用时,我想避免执行大量 IPC。

  1. 不,无法一次性取消映射内存。
  2. 如果您根本不需要子进程中的映射内存,您可以在分叉之前用 madvise(MADV_DONTFORK) 标记映射。
  3. 在紧急情况下,您可以使用 gdb 从内部外部进程调用系统调用:

    1. 找出目标进程的PID
    2. 使用 cat /proc/<PID>/maps
    3. 列出映射内存
    4. 使用 gdb 附加到进程:gdb -p <PID>(它将暂停目标进程的执行)
    5. 运行 来自 gdb:call munmap(0x<address>, 0x<size>) 对于您需要取消映射的每个区域
    6. 退出 gdb(恢复执行进程)

    很明显,如果您的进程试图访问未映射的内存,它将收到 SIGSEGV。因此,您必须 100% 确定自己在做什么。