質問

一般に、何ができるのでしめされている場合には与えられた追加のファイルのUNIXから複数のプロセス?でもデータが失われること(一処理を上書きするその他の変更)?することは可能でデータを取得し難号化した?(例えば、各プロセスを追加一線の当たりに追加ログファイルにできるラインの取得難号化した?) の場合は追加しない原子は、上記の意味で、その後何が最良の方法の確保相互排除?

役に立ちましたか?

解決

「PIPE_BUF」の大きさの下だ書き込みはアトミックであると考えられます。それは容易に大きくすることができたもののすなわち、少なくとも512バイトであるべきである(Linuxは、それが4096に設定されているように見える)。

これは、あなたがすべて完全にPOSIX準拠のコンポーネントを話していることを前提としています。例えば、これはNFSに真実ではありません。

しかし、あなたは、あなたが「O_APPEND」モードで開かれ、長い「PIPE_BUF」バイトの下で(改行を含む)あなたのラインを保つログファイルに書き込むと仮定すると、あなたは、任意の破損の問題なしでログファイルに複数のライターを持っていることができるはずです。任意の割り込みはありません途中で、前または書き込みの後に到着します。あなたはまた、すべての書き込みの後にfsync(2)を呼び出す必要がありますが、それはパフォーマンスのためにひどいです。

再起動を生き残るためにファイルの整合性をしたい場合

の明確化の:コメントやオズソロモンの答えをお読みください。私はO_APPENDがそのPIPE_BUFサイズの原子性を持つことになっていることはよく分かりません。それはLinuxがwrite()を実装どれだけですか、それは根本的なファイルシステムのブロックサイズに起因する可能性があることは完全に可能です。

他のヒント

編集: 更新日2017年のWindowsディストリビューショる。

かを知ることができるための答えへのリンク試験のコードと結果として著者名の提案 が進みました。AFIO を実装する非同期ファイルシステムのファイルi/o C++ライブラリ。

まず、O_APPEND又はこれと同等のFILE_APPEND_DATA Windowsと単位の最大ファイルを続ける可能性があるファイルの"長さ") 原子 下並行う。これはPOSIX、Linux、FreeBSD、OS X、Windowsすべての実施を用い、正しく表してください。サンバを実装しているも正しくNFS前v5などに欠けているワイヤー形式の機能を原子的に追加.なばファイルの追加、 同時に書き込みません裂に関しても他の主要なOS なNFSてることを計画しています。

しかし同時 を読み込み 原子を追加する 見破れに書き込みによってOS、ファイリングシステム、フラグのお店のファイルに増分値の最大ファイル範囲は、原子が視認性の書き込みに関して読み込み可能か否かは問わない原子.ここでは、次のプロジェクトによるフラグ、OSやファイリングシステム:


なO_DIRECT/FILE_FLAG_NO_BUFFERING:

Microsoft Windows10NTFS:更新atomicity=1バイトまでを含む10.0.10240から10.0.14393少なくとも1Mbから無限(*).

Linux4.2.6とext4:更新atomicity=1byte

FreeBSD10.2とZFS:更新atomicity=少なくとも1Mbから無限(*)

O_DIRECT/FILE_FLAG_NO_BUFFERING:

Microsoft Windows10NTFS:更新atomicity=までを含む10.0.10240最大4096バイトがページ揃え、そうでない512バイトの場合FILE_FLAG_WRITE_THROUGH、他64バイトまでとなります。このatomicityも特徴のPCIe DMAではなく設計されます。以来、10.0.14393、少なくとも1Mbから無限(*).

Linux4.2.6とext4:更新atomicity=少なくとも1Mbから無限(*).ご注意先Linuxesとext4違を超える4096バイト蛍確実に使用してカスタムロックで、最近のLinuxにおいては、最後に固定します。

FreeBSD10.2とZFS:更新atomicity=少なくとも1Mbから無限(*)


では、生の実証試験結果 https://github.com/ned14/afio/tree/master/programs/fs-probe.注意試験を行っています。破れたオフセットのみ512バイトの倍数でない場合は部分的更新の512バイトの分野が涙の中で、読み込み-修正-書き込みます。

なので、回答のOPによる質問に対するO_APPENDに書き込みますとともに、これに干渉しませんが、読み込みと同時にO_APPENDに書き込みも見破れに書き込みLinux ext4なO_DIRECTは、且おO_APPENDに書き込みが必要となる場合があるセクターのサイズがある。


(*)"も無限"からこれらの条項は、POSIXスペック:

以下のすべての機能は原子力に関して各 その他の影響を指定するのはPOSIX.1-2008時の操作 通常のファイルまたはシンボリックリンク...[機能]...read()...write()...場合は二つのスレッドを呼び出しごとにこれらの機能の呼び出しごと は、いずれかの指定された影響、その他電話、もしくは なします。 [ソース]

書き直列化されるその他の読み込みおよび書き込みます.の場合 read()のファイルデータを証明できる(他の手段により発生した後、 write()のデータを反映していなければならないwrite()の場合でも通話 は異なるプロセス。 [ソース]

しかし、逆に:

この量はPOSIX.1-2008については規定しない挙動の同時 書き込むファイルから複数のプロセス。アプリケーションではあ の並行処理です。 [ソース]

お問い合わせください意味についてのこれらのこと答え

私は、経験的に、最大原子アペンドサイズをテストするためのスクリプトを書きました。 bashで書かれたスクリプトは、すべてが同じファイルへの労働者固有の署名を書き込む複数のワーカープロセスを生成します。その後、重複しているか、または破損した署名を探して、ファイルを読み込みます。あなたはこののブログ記事で、スクリプトのソースを見ることができますに。

実際の最大原子アペンドサイズはOSによって、しかし、ファイルシステムによるものだけ変化する。

のLinux + EXT3でサイズは4096で、Windows +上のサイズをNTFS 1024は、よりサイズの下のコメントを参照してくださいされます。

ここでは標準が言うことである: http://www.opengroup.org の/onlinepubs/009695399/functions/pwrite.htmlます。

  ファイル状態フラグのO_APPENDフラグがセットされている場合は、

、オフセットファイルは、ファイルオフセットと書き込み動作を変更する間に発生しなければならない各書き込みなし介在ファイル変更操作に先立ってファイルの末尾に設定されなければなりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top