1

あるプロセスがサイズ(およびアラインメント)S(たとえば8KB)のwrite()を実行する場合、別のプロセスが古いものとアラインメントS(および同じファイル)の混合を確認する読み取り(サイズとアラインメントSおよび同じファイル)を実行することは可能ですか?新しいデータ?

書き込みプロセスは各データブロックにチェックサムを追加します。読み取りプロセスを使用してバックグラウンドでチェックサムを検証できるかどうかを知りたいのですが。リーダーが部分的な書き込みを確認できる場合、それは誤って破損を示します。

ここではどのような基準または文書が適用されますか?できれば多くのロックを導入せずに、ここで問題を回避するためのポータブルな方法はありますか?

4

1 に答える 1

3

他のプロセス/スレッド/何かが半分完成した状態で物事を見る可能性がない状態で関数が完了することが保証されている場合、それはアトミックであると言われます。それは起こったか起こらなかったかのどちらかであり、途中の方法はありません。私はWindowsと話すことはできませんが、アトミックであることが保証されているPOSIXのファイル操作(Linux / BSD / etcが固執しようとするもの)はほとんどありません。読み取りと書き込みはアトミックであることが保証されていません

ファイルに2バイトを書き込むことはほとんどありませんが、別のプロセスでは、書き込まれたバイトの1つだけが表示されますが、運が悪ければ、書き込みがメモリ内の2つの異なるページにまたがり、VMシステムが2番目のページを準備するために何かをしなければなりませんでした。ページでは、2番目のプロセスで1つのバイトが他のバイトなしで表示される可能性があります。通常、ファイル内でページが整列している場合、それらはメモリ内にありますが、これも信頼できません。

これは、POSIXでアトミックなもので作成されたリストです。これはかなり短いので、その信頼性を保証することはできません。(たとえば、リンク解除がリストされていない理由は考えられません)。

また、ネットワークファイルシステム(UnixのNFS、またはWindowsのSMBマウント)を介してファイルにアクセスし始めた瞬間に、動作しているように見えるものをテストして実行しないように注意します。長いです。

最初のプロセスがファイルを書き込んでいる間に2番目のプロセスでチェックサムを計算する場合は、2つのプロセス間のパイプを開き、最初のプロセスですべてのコピーをチェックサムプロセスに書き込むことができます。これは、ロックを処理するよりも高速な場合があります。

于 2012-11-19T18:08:56.613 に答える