【问题标题】:File Access (read/write) synchronization between 'n' processes in LinuxLinux 中“n”个进程之间的文件访问(读/写)同步
【发布时间】:2015-07-04 05:21:51
【问题描述】:

我这学期正在学习操作系统,只是想知道 Linux 如何处理文件访问(读/写)同步,它使用信号量、互斥体或监视器的默认实现是什么?您能告诉我在源代码或我自己的 Ubuntu 副本中哪里可以找到它,以及如何禁用它?

我需要禁用它,这样我才能检查我自己的实现是否有效,以及如何将我自己的实现添加到系统中。

这是我目前的计划,如果可以,请告诉我:

  1. 禁用默认实现,添加我自己的。 (如果需要,重新编译内核)
  2. 我自己的版本会跟踪每个传入的进程并维护他们正在使用的文件的列表,每当文件重复时,我会检查它是读取器进程还是写入器进程
  3. 我将使用读者首选的解决方案来解决读者作者问题。

【问题讨论】:

    标签: linux ubuntu linux-kernel operating-system file-access


    【解决方案1】:

    内核不强制进程同步(它应该由进程执行,而内核只提供工具),但它可以保证某些操作的原子性:原子操作不能被中断,并且它的结果不能被其他并行运行的操作改变。

    说到写入文件,它有一些原子性保证。来自man -s3 write

    原子/非原子:如果在一个操作中写入的全部量没有与来自任何其他进程的数据交错,则写入是原子的。当有多个写入器向单个读取器发送数据时,这很有用。应用程序需要知道可以以原子方式执行的写入请求有多大。此最大值称为 {PIPE_BUF}。本卷 IEEE Std 1003.1-2001 并未说明超过 {PIPE_BUF} 字节的写入请求是否是原子的,但要求 {PIPE_BUF} 或更少字节的写入应该是原子的。

    关于SO的一些讨论:Atomicity of write(2) to a local filesystem.

    为了保持原子性,各种内核例程都持有一个inode 的i_mutex 互斥锁。 IE。在generic_file_write_iter():

    mutex_lock(&inode->i_mutex);
    ret = __generic_file_write_iter(iocb, from);
    mutex_unlock(&inode->i_mutex);
    

    所以其他write() 电话不会干扰您的电话。但是,读者不会锁定i_mutex,因此他们可能会获得无效数据。读者的实际锁定是在page cache 中执行的,因此一个页面(x86 上为 4096 字节)是保证内核中原子性的最小数据量。

    说到重新编译内核以测试您自己的实现,有两种方法可以做到这一点:从http://kernel.org/(或从 Git)下载 vanilla 内核,修补并构建它 - 这很容易。重新编译 Ubuntu 内核更难——它需要使用 Debian 构建工具:https://help.ubuntu.com/community/Kernel/Compile

    我不清楚您尝试通过自己的实现来实现什么。如果你想应用更严格的同步规则,也许是时候看看TxOS了?

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 2014-07-18
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多