使用 sync 和 fsync 调用
如果文件是用 O_SYNC 或 O_DSYNC 打开的,那么每次写操作会在写回磁盘之前产生用于刷新磁盘的数据。 如果写操作产生了新的磁盘分配(文件在被扩展而不是覆盖现存的页面),那么该次写操作也会产生一个相应的 JFS 日志写入。
在实存和磁盘中的强制同步内容产生于多种途径:
- 一个应用程序为一个特定的文件调用 fsync() 函数。 这样就引起所有包含修改过的数据的页面都要被写入磁盘。 写操作在 fsync() 调用返回程序时完成。
- 一个应用程序调用一次 sync() 函数。 这样就引起所有包含修改过的数据的文件页面要被调度以便写入磁盘。 写操作不一定在 sync() 调用返回程序时完成。
- 用户可输入 sync 命令,该命令接着发出 sync() 调用。 同样,有些写操作可能在用户被提示输入(或者下条在 shell 脚本中处理的命令)时还没有完成。
- /usr/sbin/syncd 守护程序以固定时间间隔发出 sync() 调用,通常为每 60 秒一次。 这就确保了系统没有积累大量只有在易失性内存中存在的数据。
sync 操作除了消耗了很小的 CPU,它还具有许多效应:
- 它引起写操作成堆化,而不是分散的。
- 它引起至少 28 KB 的系统数据要被写入,即使在 sync 操作以前没有 I/O 活动。
- 它加速了磁盘写入数据的速度,战胜了 write-behind 算法。 此效应主要在每次写操作后发出 fsync() 调用的程序中比较明显。
- 当 sync() 或者 fsync() 调用发生,日志记录被写入 JFS 日志记录设备以便表明被修改了的数据已被提交到磁盘。