14

似たような質問が既にあることは知っており、それらを調べてみましたが、私の質問に対する明確な一義的な答えを見つけることができませんでした。これらの機能とメモリ層との関係についてオンラインで調査していました。特に、メモリ層についての良い洞察を与えてくれるこの美しい記事を見つけました

メモリ層

fflush()アプリケーションからカーネル ファイルシステム バッファにデータを移動するようで、問題ありません。誰もがこの点に同意しているようです。私を困惑させた唯一のことは、同じ記事で、fsync()「データは安定したストレージレイヤーに保存される」と書かれたライトバックキャッシュを想定し、「ストレージ自体が書き込み時にデータを保存する可能性がある」と付け加えたことです。 -バックキャッシュなのでfsync()、データを安定したストレージに保存するために、O_DIRECT で開かれたファイルにはまだ必要です。"

あちこちを読むと、真実のように見えますが、データをストレージデバイスに入れますが、これにキャッシュレイヤーがある場合は、ここに移動するだけで、すぐに永続的なストレージに移動するのではなく、電源障害が発生した場合にデータが失われる可能性さえあります. バリアが有効になっているファイルシステムがない限り、「/およびその他の操作により、適切な CACHE FLUSH (ATA) または SYNCHRONIZE CACHE (SCSI) コマンドがデバイスに送信されます」[Web サイトの回答から]fsync()sync()sync()fsync()

質問:

  1. 更新するデータが既にカーネル バッファーにあり、デバイスにライトバック モードの揮発性キャッシュ レイヤーがある場合、記事で述べたように、fsync()[そしてsync()私が推測する] ような操作はデータを安定したメモリ レイヤーに同期するというのは本当ですか?揮発性のものをスキップしますか?これは、ライトバック キャッシュではなく、ライトスルー キャッシュで起こることだと思います。私が読んだことから、ライトバックキャッシュをオンにfsync()すると、データを揮発性キャッシュに入れるデバイスにデータを送信することができ、後でのみ永続メモリに入ることがわかりました

  2. fsync()私はそれがファイル記述子で動作し、次に単一のファイルで動作することを読みsync()ましたが、バッファの全体的な展開が発生するため、更新されるすべてのデータに適用されます。また、このページから、ディスクへの実際の書き込みの終了を待たずfsync()に、ディスクへの書き込みの終了を待機します。sync()2 つの間のメモリ データ転送に関連する他の違いはありますか?

助けようとする人々に感謝します

4

4 に答える 4

0

「私には解決策がありませんが、確かに問題を賞賛しています。」

あなたの良い参考文献から私が読んだすべてから、標準がないということです. 標準はカーネルのどこかで終わります。カーネルはデバイス ドライバーを制御し、デバイス ドライバー (おそらくディスク メーカーによって提供される) は API を介してディスクを制御します (デバイスには小さなコンピューターが搭載されています)。メーカーは、電源障害が発生した場合にデバイスのバッファーをフラッシュするのに十分な電力を備えたコンデンサー/バッテリーを追加したか、そうでない可能性があります。デバイスは同期機能を提供する場合がありますが、これが本当にデバイス バッファを同期 (フラッシュ) するかどうかは不明です (デバイスによって異なります)。そのため、仕様に従ってデバイスを選択してインストール (およびそれらの仕様を確認) しない限り、確信は持てません。

于 2015-05-12T10:15:25.833 に答える