当前位置:嗨网首页>书籍在线阅读

24-O_SYNC标志位

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.4.3 O_SYNC标志位

系统调用open()可以使用O_SYNC标志位,表示该文件的所有I/O操作都需要同步:

42.jpg 读请求总是同步操作。如果不同步,无法保证读取缓冲区中的数据的有效性。但是,正如前面所提到的,write()调用通常是非同步操作。调用返回和把数据写入磁盘没有什么关系,而标志位O_SYNC则将二者强制关联,从而保证write()调用会执行I/O同步。

O_SYNC标志位的功能可以理解成每次调用write()操作后,隐式执行fsync(),然后才返回。这就是O_SYNC的语义,虽然Linux内核在实现上做了优化。

对于写操作,O_SYNC对用户时间和内核时间(分别指用户空间和内核空间消耗的时间)有些负面影响。此外,根据写入文件的大小,O_SYNC可能会使进程消耗大量的时间在I/O等待时间,因而导致总耗时增加一两个数量级。O_SYNC带来的时间开销增长是非常可观的,因此一般只在没有其他方式下才选择同步I/O。

一般来说,应用要确保通过fsync()或fdatasync()写数据到磁盘上。和O_SYNC相比,调用fsync()和fdatasync()不会那么频繁(只在某些操作完成之后才会调用),因此其开销也更低。