如果某个进程调用mmap(...,MAP_ANONYMOUS | MAP_SHARED,...)并派生N个子进程,则这些进程中的任何一个(父级或后代)是否有可能一次性对所有进程的内存进行munmap()编码,从而释放物理内存,或者这些进程中的每个进程都必须进行munmap ()个?
(我知道内存将在进程退出时取消映射,但子进程将不会退出)。

或者,是否有办法从另一个进程中对内存进行映射?我正在考虑像munmap(pid,...)这样的电话。

还是有一种方法可以使用非匿名映射并在相关文件描述符上执行操作(例如关闭文件)来实现我正在寻找的东西?

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

最佳答案

  • 不,无法一次性取消映射内存。
  • 如果您根本不需要子进程中的映射内存,则可以在 fork 之前用madvise(MADV_DONTFORK)标记映射。
  • 在紧急情况下,您可以使用gdb从外部进程内部调用syscall:
  • 找出目标进程
  • 的PID
  • 使用cat /proc/<PID>/maps列出映射的内存
  • 使用gdb附加到进程:gdb -p <PID>(它将暂停目标进程的执行)
  • 从gdb运行:每个需要取消映射
  • 的区域的call munmap(0x<address>, 0x<size>)
  • 退出gdb(恢复执行过程)

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

    关于linux - Linux : munmap shared memory in on single call,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36836178/

    10-09 22:08