Python 使用fcntl锁的共享mmap协调?

Python 使用fcntl锁的共享mmap协调?,python,synchronization,shared-memory,mmap,fcntl,Python,Synchronization,Shared Memory,Mmap,Fcntl,使用mmap()共享内存(来自Linux或其他类似UNIX的系统)时,是否可以(且可移植)使用fcntl()(或flock()或lockf()函数)协调对映射的访问 对这一问题的回应似乎表明,它应该起作用 我的想法是使用进程/页面映射构造共享内存,以最小化锁定争用。每个进程都可以同时处理它们的页面,并且只需要在更新进程/页面映射时获取锁。(从无主页面的读取访问将涉及检查序列号、复制所需数据,然后验证该块的序列号没有更改) 从概念上讲,共享此文件映射的每个进程都将执行mmap(),在其中找到一个空

使用
mmap()
共享内存(来自Linux或其他类似UNIX的系统)时,是否可以(且可移植)使用
fcntl()
(或
flock()
lockf()
函数)协调对映射的访问

对这一问题的回应似乎表明,它应该起作用

我的想法是使用进程/页面映射构造共享内存,以最小化锁定争用。每个进程都可以同时处理它们的页面,并且只需要在更新进程/页面映射时获取锁。(从无主页面的读取访问将涉及检查序列号、复制所需数据,然后验证该块的序列号没有更改)

从概念上讲,共享此文件映射的每个进程都将执行
mmap()
,在其中找到一个空闲块,获取进程/页面区域的锁,使用自己的分配更新该锁,释放锁,然后愉快地继续工作。任何进程都可以搜索过时的映射(使用零作为信号的
kill()
)并清理进程/页表映射


(粗略地说,我在玩弄一个生产者/消费者处理引擎,它使用的是Python在Linux上的共享内存;我希望该解决方案能够移植到BSD和其他编程语言——只要支持
mmap()
fcntl()
flock()
lock()的必要接口).
我还对psuedo代码感兴趣,该代码显示了如何测量锁争用和检测任何同步失败。我知道线程和多处理及其各自的
队列()
对象是实现Python生产者/消费者处理模型的最直接的方法).

我肯定锁会提供互斥功能,但我不知道它们是否会给您带来记忆障碍。似乎跳入内核(fcntl、flock和lockf都会这么做)可能会导致无序的内存读写被提交,但我怀疑您是否会得到硬保证。我认为这是它可能起作用的事情之一,测试将表明它确实起作用,但除非你找到一个引用,否则你不会知道它总是起作用

我在C中做过类似的事情,但我在共享内存中使用了原子自旋锁。过去,您必须进行一点内联汇编,但gcc现在有一些您可以使用的内在操作:

如果您愿意编写一个非常简单的Python扩展,您可以包装uuu sync_lock_test_和u set(…)和uuu sync_lock_release(…)来完成所需的工作。这些应该是相当便携的


我相信也有办法将pthread互斥体放入共享内存中,但我对此没有任何经验。同样,您必须编写一个简单的C扩展才能从Python访问它。

实际上不需要编写Python扩展。您可以使用Python的
ctypes
模块通过Python代码直接访问C库。(不过,您仍然需要相当多的关于C的知识)