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 ロギング用装置に書き込まれる。