为了账号安全,请及时绑定邮箱和手机立即绑定

Linux文件同步写的阻塞时间疑惑

Linux文件同步写的阻塞时间疑惑

慕神8447489 2019-04-08 11:19:19
这里有两份代码,都是读1.dat的内容同步写到2.dat。1.dat的内容是1亿个1,大小95.37MB。另:延迟写的速度大概是2s1.利用fcntl函数#include"apue.h"#include#defineBUFFSIZE4096voidset_fl(intfd,intflags);intmain(){intn;charbuf[BUFFSIZE];set_fl(STDOUT_FILENO,O_SYNC);while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)if(write(STDOUT_FILENO,buf,n)!=n)err_sys("writeerror");if(n
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

我想你读的是apue第二版,在第三版中,Figure3.13,作者给出了linux/ext4,从一个文件到另一个文件拷贝492.6MB的数据,buffersize4096.
按照原文的说法:
Inthiscase,theLinuxoperatingsystemisn’tallowingustosettheO_SYNCflagusingfcntl,insteadfailingwithoutreturninganerror(butitwouldhavehonoredtheflagifwewereabletospecifyitwhenthefilewasopened).
所以你的观察是对的,fcntl对O_SYNC不起作用,在open时使用O_SYNC是起作用的.按照文中的数据,write后跟fsync,比不带fsync,clocktime差不多增加一倍.
                            
查看完整回答
反对 回复 2019-04-08
?
开满天机

TA贡献1786条经验 获得超13个赞

O_SYNC保证要写到硬盘上的数据真正被硬盘收到以后才会返回,注意此时其实也不能保证硬盘真正将数据写到了磁盘上,因为硬盘内部还有缓存。在没有O_SYNC的时候,要写入磁盘的内容很可能被内核缓存在内存中,然后write函数就可以返回了,会快很多。缓存在内存中的数据会被内核在适当的时候写入硬盘。这就是时间上差别的主要来源。
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信