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

这里有两份代码,都是读1.dat的内容同步写到2.dat。
1.dat的内容是1亿个1,大小95.37MB。
另:延迟写的速度大概是2s
1.利用fcntl函数
#include"apue.h"
#include
#defineBUFFSIZE4096
voidset_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<0)
err_sys("readerror");
exit(0);
}
voidset_fl(intfd,intflags)
{
intval;
if(val=fcntl(fd,F_GETFL,0)<0)
err_sys("fcntlF_GETFLerror");
val|=flags;
if(fcntl(fd,F_SETFL,val)<0)
err_sys("fcntlF_SETFLerror");
}
./a.out<1.dat>2.dat
real0m3.080s
user0m0.002s
sys0m0.174s
2.使用O_SYNC打开文件2.dat
#include"apue.h"
#include
#defineBUFFSIZE4096
intmain()
{
intn;
charbuf[BUFFSIZE];
intfd=open("2.dat",O_WRONLY|O_SYNC);
while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)
if(write(fd,buf,n)!=n)
err_sys("writeerror");
if(n<0)
err_sys("readerror");
exit(0);
}
./a.out<1.dat
real0m50.386s
user0m0.010s
sys0m0.706s
如果加上O_TRUNC标志,则需要2~3min。(是因为截断文件长度需要很多时间??)
APUE上面写ext2文件系统并不支持O_SYNC,所以设置O_SYNC与否在写文件时间基本上没区别。
我机器上文件系统是ext4,可能还是不支持O_SYNC?
如果真的不支持,但是open(constchar*pathname,O_SYNC)又显著地增加了写时间。
这是为什么呢?
慕神8447489
浏览 279回答 2
2回答

UYOU

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

开满天机

O_SYNC保证要写到硬盘上的数据真正被硬盘收到以后才会返回,注意此时其实也不能保证硬盘真正将数据写到了磁盘上,因为硬盘内部还有缓存。在没有O_SYNC的时候,要写入磁盘的内容很可能被内核缓存在内存中,然后write函数就可以返回了,会快很多。缓存在内存中的数据会被内核在适当的时候写入硬盘。这就是时间上差别的主要来源。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript