sync および fsync コール

ファイルが O_SYNC または O_DSYNC を使用してオープンされた場合は、各書き込みごとに書き込みのデータをディスクにフラッシュしてから、 書き込みが終了します。 書き込みによって新しいディスクの割り当てが行われる (既存のページが上書きされるのではなく、ファイルが拡張される) 場合は、対応する JFS ログの書き込みも行われます。

実メモリーとディスクの内容の同期は、次の幾つかの方法で強制的に行われます。

  • アプリケーション・プログラムが指定されたファイルに対して fsync() を呼び出す。 これにより、そのファイルの変更済みデータが含まれているすべてのページが、 ディスクに書き出されます。 書き込みは、fsync() コールがプログラムに戻ると完了します。
  • アプリケーション・プログラムが sync() を呼び出す。 これにより、変更済みデータが含まれているメモリー内のすべてのファイル・ページが、 ディスクへの書き出しのためにスケジューリングされます。 書き込みは、sync() コールがプログラムに戻っても、 必ずしも完了するとは限りません。
  • ユーザーは sync コマンドを入力できます。これにより、 sync () 呼び出しが発行されます。 この場合も、 書き込みによっては、ユーザーが入力を促されても (またはシェル・スクリプト内の次のコマンドが処理されても)、完了しないことがあります。
  • /usr/sbin/syncd デーモンが、一定の間隔で (通常は 60 秒ごとに) sync() コールを発行する。 これにより、システムは、 揮発性の RAM 内にのみ存在する大量のデータを累積しなくなります。

sync 操作には、CPU の使用量が少ないことのほかにも、次のような幾つかの効果があります。

  • 書き込みが拡散されず、集結する。
  • 直前の sync 操作以降、入出力アクティビティーがなかった場合でも、28 KB 以上のシステム・データが書き込まれる。
  • 遅延書き込みアルゴリズム以上に、ディスクへのデータの書き出しが加速される。 この効果は、すべての書き込み後に fsync() コールを発行するプログラム内で主に見られます。
  • sync() または fsync() が呼び出されると、 変更済みデータがディスクにコミットされたことを示すために、ログ・レコードが JFS ロギング用装置に書き込まれる。