gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:12:43 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

  1. 不,没有办法一次性取消映射内存。
  2. 如果您根本不需要子进程中的映射内存,您可以用madvise(MADV_DONTFORK) 标记映射。在 fork 之前。
  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% 确定自己在做什么。

关于linux:单次调用中的 munmap 共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36836178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com