gpt4 book ai didi

java - 文件系统如何实现扇区锁定?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:40 25 4
gpt4 key购买 nike

虽然这是一个一般性问题,但欢迎针对任何 Windows 或 Linux 或 Mac 支持的文件系统提供具体答案。

文件系统如何防止 2 个或更多进程同时读/写访问本地驱动器的扇区?

我知道显然需要采用某种类型的扇区锁定,但是...

  1. 这个操作系统范围的扇区锁的“类型”是什么:

    a) 命名互斥/命名信号量/文件映射? (在 Windows 上)

    b) 共享内存? (在 Linux 上)

  2. 这个扇区锁保存在哪里:在内存中?在磁盘上?无论哪种情况,无论此锁存储在何处,我都明白...

    a) 锁的存储必须是逻辑上临时的存储,因为如果它的所有者进程崩溃,锁不应该永久或无限期地悬空。因此,如果这些锁存在于内存中,它会有所帮助。

    b) 锁的位置必须能够被所有进程通过名称或 ID 公开发现,该名称或 ID 可以找到扇区号的函数。因此,如果进程 A 需要锁定扇区 S,A 应该知道如何首先访问扇区 S 的锁 L(S),如果 L(S) 不存在则创建 L(S),尝试锁定 L(S),返回或阻塞——所有操作均以原子方式进行,因为另一个进程 B 也可能与 A 并驾齐驱,试图执行相同的步骤序列。

  3. 对于大型存储设备,扇区数量也会很大。因此,显然不能在内存或磁盘上预先分配每个扇区的锁。

然而,我不知道或不明白的是,Linux 上的 ext* 文件系统、Windows 上的 FAT* 和 NTFS 以及 Mac 上的文件系统如何处理这个问题。

我的问题的实际背景:最终,我必须将上述答案应用于我使用 Java 7 NIO2 编写的基于 Java 的自定义文件系统FileSystemProvider,其中 2 个或更多独立的 Java 进程可以访问附加驱动器的一堆扇区以进行读/写。在 Java 7 中,我所知道的实现进程间共享内存的唯一非 JNI 方法是通过 MappedByteBuffer。但问题是,这个字节缓冲区将是“原始”内存——而我需要的是一个操作系统范围的互斥类型机制,并且可能每个扇区 S 都有一个互斥锁。看来,我对此 的更改MappedByteBuffer 不会在操作系统范围内自动执行,除非我也调用 MappedByteBuffer.force .

非常感谢所有的回答和评论。

最佳答案

我认为您对现代文件系统的实现方式感到困惑,而旧系统通常不是多用户的;有了这个序言,让我们看看一个叫做 journal 的东西。 .现在有一些替代方案 - 即

  1. Soft updates
  2. Log-structured file system
  3. Copy-on-write

然而,最常见的可能是日志文件系统。它写入空 block 并在写入完成时简单地移动指针(同时自动写入“日志”),这允许在发生电源故障(或其他写入中断)时“快速”恢复。

至于在系统级别锁定您的“日志”,我可能会使用 FileLock像这样 -

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?

关于java - 文件系统如何实现扇区锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20365316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com