私はファイルの変更がディスクに直接保存されると思いました。つまり、ファイルを閉じて[保存]をクリック/選択することにしました。しかし、最近の会話では、私の友人はこれが一般的に本当ではないと言いました。オペレーティングシステム(特にLinuxシステムについて話しています)はメモリの変更を保持し、実際にメモリの内容をディスクに書き込むデーモンを持っています。
彼は外部フラッシュドライブの例も提示した。これらのドライブはシステムにマウントされ(メモリにコピーされ)、時にはデーモンがコンテンツをフラッシュメモリに保存しなかったため、データが失われます。これがまさに私たちがフラッシュドライブをアンマウントする理由です。
私はオペレーティングシステムの機能について何も知らないので、これが本当であるか、どのような状況でこのようなことが起こるのかわかりません。私の主な質問は次のとおりです。 Linux / Unixシステム(および他のオペレーティングシステム)で説明されているようにこれは発生しますか?たとえば、これは私がコンピュータの電源を切っていることを意味しますか?まもなくファイルを編集して保存した後に変更が失われる可能性がありますか?おそらくディスクの種類(既存のHDDとSSD)によって異なりますか?
この質問は、具体的に情報を保存するディスクを含むファイルシステムに関するものですが、明確な説明や比較が必要です。
ベストアンサー1
ファイルを編集して保存した直後にコンピュータの電源を切ると、変更が失われる可能性がありますか?
おそらくそうです。 「可能性が最も高い」とは言えませんが、可能性はさまざまな要因によって異なります。
ファイル書き込みパフォーマンスを向上させる簡単な方法は、オペレーティングシステムがデータをキャッシュし、アプリケーションに書き込みプロセスを通知し、後で実際に書き込みを実行することです。これは、他のディスクアクティビティが同時に発生する場合に特に便利です。オペレーティングシステムは、後で読み書きの優先順位を指定できます。また、後で一時ファイルをすばやく削除する場合など、実際の書き込み操作はまったく必要ありません。
キャッシュの問題は、ストレージが遅い場合にさらに明白になります。高速SSDからスローUSBスティックにファイルをコピーする場合は、USBスティックが追いつくことができないため、多くの書き込みキャッシュが必要になることがあります。ただし、cp
コマンドはより速く返されるため、操作を続行でき、コピーしたファイルを編集することもできます。
もちろん、このようなキャッシュには欠点があります。一部のデータは、実際に保存される前に失われる可能性があります。エディタが書き込みに成功したが、ファイルが実際にディスクにないと言うと、ユーザは怒ってしまう。だからこそfsync()
システムコール、ファイルが実際にディスクに到達した後にのみ返される必要があります。編集者はこれを使用して、ユーザーに書き込みが正常に報告される前にデータが正しいことを確認できます。
「しなければならない」と言った理由は、ファイルが実際にドライブ内の揮発性書き込みキャッシュにのみ存在する場合、ドライブ自体がオペレーティングシステムに同じ嘘をついて書き込みが完了したと言えるからです。ドライブによっては、この問題を解決する方法がない場合があります。
また、すべてのシステム全体の書き込み、または特定のファイルシステムからのすべての書き込みがディスクに到達したことを確認するようにシステムに要求するシステムコールがありますfsync()
。このユーティリティを使用してそれを呼び出すことができます。sync()
syncfs()
sync
そしてそこにO_DIRECT
次に表示open()
、「ファイルに対する I/O のキャッシュの影響を最小限に抑えるよう努めます」。キャッシュを削除するとパフォーマンスが低下するため、自分でキャッシュして制御するアプリケーション(データベース)で主に使用されます。 (O_DIRECT
問題がないわけではありませんが、マニュアルページにはこれについてやや興味深い説明があります。)
電源が切れたときに発生する状況は、ファイルシステムによって異なります。注意すべきことは、ファイルデータだけでなくファイルシステムメタデータも同様です。ファイルデータをディスクに保存しても見つからない場合は役に立ちません。単にファイルをより大きなサイズに拡張するには、新しいデータブロックを割り当てる必要があり、どこかに表示する必要があります。
ファイルシステムがメタデータの変更を処理する方法とメタデータとデータ書き込みの順序は非常に異なります。たとえばext4
、マウントフラグを設定すると、data=journal
すべての書き込み(データ書き込みを含む)がログを通過するため、かなり安全でなければなりません。これはまた2回書かれているため、パフォーマンスが低下することを意味します。デフォルトオプションは、メタデータが更新される前にデータがディスクにあるように書き込み順序を指定します。他のオプションや他のファイルシステムが良いかもしれないし悪いかもしれません。包括的な研究は試みません。
実際に負荷の少ないシステムでは、ファイルは数秒以内にディスクに到着する必要があります。リムーバブルストレージを扱う場合は、メディアをインポートする前にファイルシステムをアンマウントして、データが実際にドライブに転送され、アクティビティがなくなったことを確認してください。 (またはGUI環境でこれを実行してください。)