本学期我正在学习操作系统,只是想知道Linux如何处理文件访问(读/写)同步,它使用信号量,互斥量或监视器的默认实现是什么?你能否告诉我在源代码或我自己的Ubuntu副本中如何找到它以及如何禁用它?
我需要禁用它,以便我可以检查我自己的实现是否有效,以及如何将我自己的实现添加到系统中。
这是我目前的计划请告诉我它是否正常:
答案 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?