当mmap()
用于共享内存(来自 Linux 或其他类 UNIX 系统)时,是否可以(并且可移植)使用fcntl()
(flock()
或lockf()
函数)来协调对映射的访问?
对这个 SO question的回应似乎表明它应该起作用。
我想到的想法是使用进程/页面映射来构建共享内存,以最大限度地减少锁定争用。进程可以同时使用它们的页面,并且只需要在更新进程/页面映射时获取锁。(从无主页面读取访问将涉及检查序列号,复制所需数据,然后验证该块的序列号没有更改)。
从概念上讲,每个共享这个文件映射的进程都会执行mmap()
,在其中找到一个空闲块,获取进程/页面区域的锁,用自己的分配更新它,释放锁,然后愉快地继续它的工作。任何进程都可以搜索过时的映射(使用kill()
零作为信号)并清理进程/页表映射。
(粗略的通用术语,我正在玩弄一个生产者/消费者处理引擎,它使用来自 Linux 上的 Python 共享内存;我希望该解决方案可以移植到 BSD 和其他编程语言 --- 只要支持mmap()
以及必要的接口fcntl()
,flock()
或者lockf().
我也对显示如何测量锁争用和检测任何同步失败的伪代码感兴趣。我知道线程和多处理及其各自Queue()
的对象是实现Python 生产者/消费者处理模型)。