【linux 同步IO: sync、fsync与fdatasync】

  传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)

  延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。

  sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

  通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。
  fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。
  fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。

参考:http://blog.csdn.net/cywosp/article/details/8767327

对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。

一个简单的问题:在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?

最新文章

  1. ## Android 6.0 权限申请 ##
  2. springmvc登陆拦截案例
  3. [ActionScript 3.0] 通过内联函数对addFrameScript方法传递参数
  4. 用hexo书写github.io博客 学习心得 教程
  5. win2003 老的ASP程序报错 Microsoft OLE DB Provider for Orac(0x80004005)
  6. Oracle学习系列3
  7. Knockout.Js官网学习(click绑定)
  8. Large-Scale Deployment of SharePoint Team Services
  9. 基础数据结构 之 队列(python实现)
  10. String的intern方法的用处
  11. Visual Studio 2012 Update3 安装失败错误“正在关闭管道'
  12. dapper的Dapper-Extensions用法(一)
  13. 【CQOI2017】小Q的表格
  14. Boost:shared_memory_object --- 共享内存
  15. Windows10安装.net3.5
  16. 5 admin的使用
  17. Java中的软(弱)引用
  18. int数组的下标为n
  19. ZooKeeper 学习资料积累
  20. ubuntu18 tensorflow faster_rcnn cpu训练自己数据集

热门文章

  1. bzoj1449&&bzoj2895
  2. 高并发数据采集的架构应用(Redis的应用)
  3. Beta阶段第1周/共2周 Scrum立会报告+燃尽图 07
  4. Property 'submit' of object #<HTMLFormElement> is not a function
  5. 启动tornado项目,hello world
  6. Yii隐藏单入口
  7. Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件
  8. BZOJ3270: 博物馆【概率DP】【高斯消元】
  9. PAT 1007 素数对猜想 C语言
  10. mongodb下cpu高的查询方式(慢查询)