shm_open()
mmap()
带有预定义的大length
fork()
(几次)ftruncate()
随意
这样做的目的是确保由其产生的每个进程fork()
在同一地址上都有一个共享段。然而,我不想让 RAM 一直忙,而是动态调整它的大小(大小跨越 0 - big length
)。
这能行吗?有UB吗?
shm_open()
mmap()
带有预定义的大length
fork()
(几次)ftruncate()
随意这样做的目的是确保由其产生的每个进程fork()
在同一地址上都有一个共享段。然而,我不想让 RAM 一直忙,而是动态调整它的大小(大小跨越 0 - big length
)。
这能行吗?有UB吗?
不,没关系。您可以随时截断基础文件,但SIGBUS
如果您访问超出文件范围的内存,您可能会收到。因此,您需要非常小心,不要触摸超出文件当前长度的内存(或捕获SIGBUS
并处理它)。
来自man 2 mmap
:
使用映射区域可能会产生以下信号:
SIGBUS
尝试访问与文件不对应的缓冲区部分(例如,超出文件末尾,包括另一个进程截断文件的情况)。
不要调整它的大小。
我不想让 RAM 一直忙
这就是内核将为您使用虚拟内存所做的事情。只要您不使用mlock()
或,它将根据需要/适当分页MAP_LOCKED
。
创建任意大小的映射,除非您实际使用它,否则它不会“让 RAM 保持忙碌”。
如果您担心在使用完 RAM后会保持忙碌状态,请致电madvise(MADV_DONTNEED)
- 如果您再次访问它们,这将清除页面并从零池中返回新页面。