共享使用的fcntl锁MMAP统筹?
-
25-09-2019 - |
题
当使用mmap()
共享存储器(从Linux或其他类UNIX系统)是否有可能(和便携式)到使用fcntl()
(或flock()
或lockf()
函数)坐标获得了映射?
响应该SO问题似乎表明,它应该工作。
的想法我想到将具有共享存储器与进程/页映射,以尽量减少锁定争用构成。过程可以用自己的网页的同时,并锁定每个工作只需要在更新过程中/页映射时被收购。 (来自无主的网页浏览访问将涉及检查序列号,复制所需的数据,然后验证该没有改变该块的序列号)。
在概念上每个进程共享此文件映射将执行mmap()
,在其中寻找一个空闲块,获得锁的进程/页区域,更新与自己的任务,解除锁定,然后用其工作欢快地继续下去。任何过程可以搜索失效的映射(使用kill()
零作为信号)和清理过程/页表映射。
(在粗糙,通用术语,我使用的Python从共享存储器比Linux一个生产者/消费者处理引擎玩弄;我想的溶液可以移植到BSD和其他编程语言---只要作为支撑mmap()
和我也有兴趣伪代码示出了一个如何测量锁争用并检测任何同步失败至fcntl()
,flock()
或lockf().
必要的接口。我知道在线程和多与它们各自的Queue()
对象是实现一个Python生产者/消费者模型处理的最简单的方法)。
解决方案
我敢肯定,锁将提供相互排斥,但我不知道他们是否会给你一个内存屏障。好像跳进内核(它的fcntl,羊群,并提供lockf会做)可能做的的东西的顺序存储的出力读取和写入承诺,但我怀疑你会得到一个很难保证。我觉得这是那些东西在那里它可能工作之一,测试将显示,它的工作,但你不会知道它始终工作,除非你找到一个基准说那么多。
我已经做了类似这样由C的东西,但我在共享存储器本身使用原子自旋锁。它曾经是你不得不做内联的一点点的组装,但现在的gcc有一些内在的操作,您可以使用:
http://gcc.gnu.org/onlinedocs/gcc/Atomic- Builtins.html
如果你愿意写一个非常简单的Python扩展,你可以换__sync_lock_test_and_set(...)和__sync_lock_release(...)到你所需要的。这些应该是相当轻便。
我相信这是把并行线程互斥到共享内存也一种方式,但我没有与任何经验。同样,你必须写一个简单的C扩展到在Python可以访问到。