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