カーネルがファイルアクセスのための同期技術を実装する方法

カーネルがファイルアクセスのための同期技術を実装する方法

ファイルにアクセスすると、カーネルが同期メカニズムを実装していることを読みました。たとえば、read()他のプロセスで同時にファイルシステム上のファイルを使用、書き込み、または読み取ろうとすると、カーネルは競合状態を防ぎます。write()

どのように実装されますか?私はコードを書くときに異なるスレッドやプロセスがコードの一部を同時に実行するのを防ぐためにmutexとセマフォを使用しました。

この場合、カーネルは、複数のプロセスまたはスレッドが同じファイル記述子を読み書きする場合にのみロック機構を実装する必要があると仮定します。これはいつでも呼び出さread()れるか、write()ファイル記述子に適用できます。この目標を達成する方法は?

答え1

Linuxカーネルのファイルシステムのロックルールは次のとおりです。カーネルのドキュメントで説明されています。、徹底しているが、VFSコードにまだ慣れていない場合は理解するのが難しいかもしれません。

ほとんどのファイル操作は、inodeのロックを使用して同期されます。i_rwsem。このロックは一般的に直接動作しませんが、様々なロック機能inode_lockExt4で検索して、どのように使用されているかを確認できます。ext4/file.c

一部の操作ではロックも使用されますstruct filef_lock;バラよりllseek例えば。

関連情報