虽然这是一个一般性的问题,但任何Windows或Linux或Mac支持的文件系统的具体答案都是受欢迎的。
文件系统如何防止两个或多个进程并发地读取/写入本地驱动器的扇区?
我知道显然需要使用某种类型的扇形锁定,但是.
然而,我不知道或不明白的是,这个问题是如何由Linux上的ext*文件系统、Windows上的FAT*和NTFS处理的,Mac也是如此。
我问题的实际背景:最终,我必须为一个基于Java的定制文件系统应用上述答案,我正在使用Java 7 NIO2 FileSystemProvider编写该系统,其中两个或更多独立的Java进程可以访问附加的读取/写入驱动器中的许多扇区。在Java 7中,我所知道的实现进程间共享内存的唯一非JNI方式是通过MappedByteBuffer。但问题是,这个字节缓冲区将是“原始”内存,而我需要的是一个操作系统范围的互斥式机制,而且每个扇区也可能需要一个互斥。看来,我对这个MappedByteBuffer的更改不会在操作系统范围内执行,除非我也调用MappedByteBuffer.force。
将非常感谢所有的答复和评论。
发布于 2013-12-04 02:36:28
我认为您对一个现代文件系统是如何实现的感到困惑,而旧的系统通常不是多用户的;在这个序言中,让我们来看看一个叫做日志的东西。现在有一些选择
然而,最常见的可能是日志文件系统。它写入空块,只需在写入完成时移动指针(同时原子地写入“日志”),这允许在发生电源故障(或其他写中断)时“快速”恢复。
至于在系统级别锁定您的“日志”,我可能会使用类似于-
FileLock lock = null;
FileChannel channel = null;
try {
// Get a file channel for the file
File file = new File("journal");
channel = new RandomAccessFile(file,
"rw").getChannel();
// Try acquiring the lock without blocking.
try {
lock = channel.tryLock();
if (lock != null) {
// GOT THE LOCK.... DO WORK...
return true; // write success.
}
} catch (OverlappingFileLockException e) {
// File is already locked in this thread or virtual
// machine
} finally {
if (lock != null) {
lock.release(); // Release the lock
}
if (channel != null) {
channel.close(); // Close the file.
}
}
return false; // Write must be retried?https://stackoverflow.com/questions/20365316
复制相似问题