を呼び出すときに関数グラフを追跡してみると、write()
関数内で呼び出しによってext4_file_write_iter()
最初にinode->i_rwsem
ロックされていることがわかりました。その後、ファイルにデータを書き込むためにinode_lock(inode)
呼び出されます。__generic_file_write_iter()
そしてinode
ついにロックが解除されました。
それでは、inode->i_rwsem
同じファイルへの同時書き込みを保護するために使用されますか?
ところで、ファイルの同じ領域に同時にデータを書き込むプログラムを作成しましたが、書き込みが直列化されていないことpwrite(fd,buf,SIZE,0)
がわかりました。 .dllファイルに従って同時書き込みをシリアル化するにはflock
/を使用する必要があることがわかりました。fcntl
inode->i_flctx
私が尋ねたいのはこれの目的は何ですかinode->i_rwsem
?
inode->i_rwsem
これら、inode->i_flctx
そしての違いは何ですかinode->i_lock
?
ありがとうございます。
ベストアンサー1
inode->i_rwsem
カーネル自体が破損や競合状態を回避するためにファイルを同時に読み書きするのを防ぐために、カーネルによって内部的に使用されます。ユーザー空間には影響しません。同時に、複数のプロセスで読み書きできるようにファイルを開いたままにすることができます。ただし、複数のプロセスが同時にファイルを読み書きしようとすると、カーネルは実際には後でこの操作を順番に実行します。
pwrite(fd,buf,SIZE,0)
あなたの場合、内部ロック機構(使用されているものと同じ)なしで同じ領域に書き込もうとする2つのプロセスがある場合、i_rwsem
カーネルは最初のプロセスでいくつかのデータを書き始めることができ、同時に2つのプロセスはデータの書き込みを開始しますが書き込み操作はありません。最初プロセスが完了しました。ファイルシステム全体の整合性に影響を与え、カーネルパニックを引き起こす可能性があります。競争条件。
カーネルの内部ロックは、このような状況が発生するのを防ぎます。最初のプロセスの最初の書き込みは、2番目の書き込みが実行される前に完了します(どちらもファイルのまったく同じ領域に書き込む場合は、最初のプロセスの「書き込み」を上書きできます)。
inode->i_flctx
すでに見つけたように、プロセス自体が同時にファイルを開くことができるプロセスの数を制限したい場合は、flock
ユーザースペースの/呼び出しによって制御されます。fcntl
たとえば、あるプロセスが書き込み用にファイルをロックし、別のプロセスが同じファイルを解放する前に別のプロセスがファイルをロックしようとすると、そのファイルは拒否またはブロックされます。
同じファイルに書き込み、異なる書き込みを実行する2つのプロセスの例を見てみましょう。各プロセスは、他のプロセスによって書き込まれたデータを上書きできます。避けるためにユーザースペース、これアプリケーション自体flock
/は、fcntl
両方のプロセスが同じファイルを開くのを防ぐために使用できます。
別の例は次のとおりです。
- 1つのプロセスはファイルに書き込み、2番目のプロセスは同じファイルを読み込みます。
- 最初のプロセスはまだ書き込みを完了していないため、2番目のプロセスはデータの一部を読み取ることができます。
この場合、これを防ぐには、次のようにします。
- 最初のプロセスは、書き込みが完了するまで他のプロセスがファイルを開くのを防ぐためにファイルのロックを取得する必要があります。
- 2番目のプロセスは同じファイルのロックを取得しようとしますが、すでに別のプロセスによってロックされているためブロックされます(またはファイルロックの試行に応じて失敗します)。
- 最初のプロセスは書き込みを終了してロックを解除します(再び、明示的にユーザースペース言及されたシステムコールのいずれかを呼び出すことによって)
- その後、2番目のプロセスだけが読み取りのためにファイルをロックできます。
- 2番目のプロセスがファイルを読み込んでいる間に、ファイルロックを取得しようとしている他のプロセスは、次になるまで再びブロックされます。
- 読み出し処理により読み出しが完了する。
したがって、flock
/を使用すると、fcntl
この状況を処理できます。プログラム的にアプリケーションのソースコードでは、カーネルは、プロセスがファイルのロックをi_flctx
取得したことを確認し、最初のプロセスがロックを解除するまで他のプロセスが他のロックを取得しないようにするために使用されます。
inode->i_lock
、 like は、inode->i_rwsem
カーネルで inode 状態を処理するときに競合状態からカーネルを保護するためにカーネルでのみ使用されます。 inode状態のi_rwsem
書き込みと変更を保護するために使用されます。i_lock
つまり、カーネル開発者でない限り、カーネル inode 実装メカニズムの一部であるか、ユーザー空間でファイルをロックするカーネル内部実装の一部であるか、いずれかについてinode->i_lock
心配する必要はありません。inode->i_rwsem
inode->i_flctx