Linux中“n”个进程之间的文件访问(读/写)同步

时间:2015-04-25 15:39:32

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

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

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

这是我目前的计划请告诉我它是否正常:

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

1 个答案:

答案 0 :(得分:2)

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

说到写入文件,它有一些原子性保证。来自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互斥锁。即在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