【问题标题】:linux: munmap shared memory in on single calllinux:单次调用中的 munmap 共享内存
【发布时间】:2016-08-18 14:01:56
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为不可能unmap其他进程的映射。

标签: linux shared-memory mmap


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

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

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

【讨论】:

  • 1) 我想这就是答案。不是我想要的,而是答案。 2)在我的情况下,进程确实使用了一段时间的内存。否则我不会一开始就分享它。 3)这里不相关。这不是一个调试问题。无论如何感谢您的信息
  • 如果gdb 可以使用ptrace() 接口调用munmap,那么您可以编写一个程序来执行此操作 - 调试器没有特别的特权。不过,这可能不会是微不足道的,因为您需要重新实现 GDB 的大部分代码......
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多