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。
- 不,无法一次性取消映射内存。
- 如果您根本不需要子进程中的映射内存,您可以在分叉之前用
madvise(MADV_DONTFORK)
标记映射。
在紧急情况下,您可以使用 gdb 从内部外部进程调用系统调用:
- 找出目标进程的PID
- 使用
cat /proc/<PID>/maps
列出映射内存
- 使用 gdb 附加到进程:
gdb -p <PID>
(它将暂停目标进程的执行)
- 运行 来自 gdb:
call munmap(0x<address>, 0x<size>)
对于您需要取消映射的每个区域
- 退出 gdb(恢复执行进程)
很明显,如果您的进程试图访问未映射的内存,它将收到 SIGSEGV。因此,您必须 100% 确定自己在做什么。
如果一个进程调用 mmap(...,MAP_ANONYMOUS | MAP_SHARED,...)
并分叉 N 个 children,这些进程(parent 或后代)中的任何一个是否有可能 munmap()
的内存一次性所有进程,从而释放物理内存,或者这些进程中的每一个都必须单独 munmap() 吗?
(我知道内存将在进程退出时取消映射,但 children 还不会退出)。
或者,有没有办法从另一个进程 munmap 内存?我正在考虑类似 munmap(pid,...)
.
或者有没有办法使用 non-anonymous 映射并对相关文件描述符执行操作(例如关闭文件)来实现我正在寻找的东西?
我的进程对性能很敏感,当知道共享内存将不再被任何人使用时,我想避免执行大量 IPC。
- 不,无法一次性取消映射内存。
- 如果您根本不需要子进程中的映射内存,您可以在分叉之前用
madvise(MADV_DONTFORK)
标记映射。 在紧急情况下,您可以使用 gdb 从内部外部进程调用系统调用:
- 找出目标进程的PID
- 使用
cat /proc/<PID>/maps
列出映射内存
- 使用 gdb 附加到进程:
gdb -p <PID>
(它将暂停目标进程的执行) - 运行 来自 gdb:
call munmap(0x<address>, 0x<size>)
对于您需要取消映射的每个区域 - 退出 gdb(恢复执行进程)
很明显,如果您的进程试图访问未映射的内存,它将收到 SIGSEGV。因此,您必须 100% 确定自己在做什么。