虽然这是一个普遍的问题,但对于任何Windows、Linux或Mac支持的文件系统的具体答案都可以接受。
文件系统如何防止2个或更多进程并发读/写本地驱动器的扇区?
我知道显然需要使用某种类型的扇区锁定,但是...
文件系统如何防止2个或更多进程并发读/写本地驱动器的扇区?
我知道显然需要使用某种类型的扇区锁定,但是...
这个操作系统级别的扇区锁的“类型”会是什么:
a)命名互斥体/命名信号量/文件映射?(在Windows上)
b)共享内存?(在Linux上)
这个扇区锁存储在哪里:内存中?磁盘上?无论在哪种情况下,无论这个锁存储在哪里,我都知道...
a)锁的存储必须是逻辑上临时的存储,因为如果其所有者进程崩溃,锁不应永久地挂起或无限期地挂起。因此,如果这些锁存在于内存中,则有所帮助。
b)锁的位置必须通过名称或ID公开地由所有进程发现,该名称或ID是找到扇区号函数的一部分。因此,如果进程A需要锁定扇区S,A应该知道如何首先访问扇区S的锁L(S),如果它不存在,则创建L(S),尝试锁定L(S),并原子地返回或阻止 - 因为另一个进程B也可能与A一起竞争,试图执行相同的步骤序列。
对于大型存储设备,扇区的数量也会很大。因此,每个扇区的锁显然不能预先分配在内存或磁盘上。
我的问题的实际背景:最终,我需要将以上答案应用于我正在使用Java 7 NIO2 FileSystemProvider
编写的基于Java的自定义文件系统,其中2个或多个独立的Java进程可以访问所附加驱动器的一堆扇区进行读/写。在Java 7中,我所知道的唯一非JNI方式来实现进程间共享内存的方法是通过MappedByteBuffer
。但问题是,这个字节缓冲区将是“原始”内存 - 而我需要的是一种全局的、互斥型机制,并且可能还需要一个每个扇区S的互斥体。看起来,除非我也调用MappedByteBuffer.force
,否则我的更改不会在整个操作系统范围内原子地执行。
非常感谢所有答案和评论。