首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件系统如何实现扇区锁定?

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

Stack Overflow用户
提问于 2013-12-04 01:47:56
回答 1查看 275关注 0票数 3

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

文件系统如何防止两个或多个进程并发地读取/写入本地驱动器的扇区?

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

  1. 什么是操作系统范围内扇区锁的“类型”: ( a)命名-互斥/命名-信号/文件映射?(在Windows上) ( b)共享内存?(在Linux上)
  2. 这个扇形锁存放在哪里:在记忆中?在磁盘上?不管是哪种情况,不管这个锁在哪里,我都知道. ( a)锁的存储必须是逻辑上的临时存储,因为如果其所有者进程崩溃,锁不应永久或无限期地悬空。因此,如果这些锁存在于内存中,则会有所帮助。 ( b)所有进程必须通过找到扇区号函数的名称或ID公开发现锁的下落。因此,如果进程A需要锁定扇区S,A应该知道如何首先访问扇区S的锁L(S),如果L(S)不存在,则创建L(S),尝试锁定L(S),然后返回或阻塞--所有这些都是原子性的,因为另一个进程B也可能与A一起运行,试图执行相同的步骤。
  3. 对于大型存储设备来说,扇区的数量也会很大。因此,每个扇区的锁显然不能在内存或磁盘上预先分配。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-04 02:36:28

我认为您对一个现代文件系统是如何实现的感到困惑,而旧的系统通常不是多用户的;在这个序言中,让我们来看看一个叫做日志的东西。现在有一些选择

  1. 软更新
  2. 日志结构文件系统
  3. 抄写

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

至于在系统级别锁定您的“日志”,我可能会使用类似于-

代码语言:javascript
复制
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?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20365316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档