A.3. Fsync

Fsync 被​​​​​​​视​​​​​​​为​​​​​​​大​​​​​​​量​​​​​​​消​​​​​​​耗​​​​​​​ I/O 的​​​​​​​操​​​​​​​作​​​​​​​,但​​​​​​​这​​​​​​​并​​​​​​​不​​​​​​​完​​​​​​​全​​​​​​​正​​​​​​​确​​​​​​​。​​​​​​​例​​​​​​​如​​​​​​​:参​​​​​​​见​​​​​​​ Theodore Ts'o's 的​​​​​​​文​​​​​​​章​​​​​​​《​​​​​​​不​​​​​​​要​​​​​​​害​​​​​​​怕​​​​​​​ fsync!》​​​​​​​ [5] 以​​​​​​​及​​​​​​​附​​​​​​​带​​​​​​​的​​​​​​​讨​​​​​​​论​​​​​​​。​​​​​​​
Firefox 原​​​​​​​来​​​​​​​在​​​​​​​用​​​​​​​户​​​​​​​每​​​​​​​次​​​​​​​点​​​​​​​击​​​​​​​一​​​​​​​个​​​​​​​链​​​​​​​接​​​​​​​时​​​​​​​都​​​​​​​调​​​​​​​用​​​​​​​ sqlite 程​​​​​​​序​​​​​​​库​​​​​​​进​​​​​​​入​​​​​​​新​​​​​​​的​​​​​​​页​​​​​​​面​​​​​​​。​​​​​​​Sqlite 调​​​​​​​用​​​​​​​ fsync,且​​​​​​​由​​​​​​​于​​​​​​​文​​​​​​​件​​​​​​​系​​​​​​​统​​​​​​​设​​​​​​​置​​​​​​​(主​​​​​​​要​​​​​​​使​​​​​​​用​​​​​​​数​​​​​​​据​​​​​​​排​​​​​​​序​​​​​​​模​​​​​​​式​​​​​​​的​​​​​​​ ext3),什​​​​​​​么​​​​​​​都​​​​​​​不​​​​​​​发​​​​​​​生​​​​​​​时​​​​​​​会​​​​​​​有​​​​​​​一​​​​​​​个​​​​​​​长​​​​​​​时​​​​​​​间​​​​​​​延​​​​​​​迟​​​​​​​。​​​​​​​如​​​​​​​果​​​​​​​另​​​​​​​一​​​​​​​个​​​​​​​进​​​​​​​程​​​​​​​同​​​​​​​时​​​​​​​正​​​​​​​在​​​​​​​复​​​​​​​制​​​​​​​一​​​​​​​个​​​​​​​大​​​​​​​文​​​​​​​件​​​​​​​,这​​​​​​​就​​​​​​​需​​​​​​​要​​​​​​​很​​​​​​​长​​​​​​​的​​​​​​​时​​​​​​​间​​​​​​​(最​​​​​​​长​​​​​​​可​​​​​​​达​​​​​​​ 30 秒​​​​​​​)。​​​​​​​
但​​​​​​​在​​​​​​​另​​​​​​​一​​​​​​​个​​​​​​​示​​​​​​​例​​​​​​​中​​​​​​​根​​​​​​​本​​​​​​​不​​​​​​​使​​​​​​​用​​​​​​​ fsync,则​​​​​​​在​​​​​​​切​​​​​​​换​​​​​​​到​​​​​​​ ext4 文​​​​​​​件​​​​​​​系​​​​​​​统​​​​​​​时​​​​​​​出​​​​​​​了​​​​​​​问​​​​​​​题​​​​​​​。​​​​​​​Ext3 是​​​​​​​被​​​​​​​设​​​​​​​定​​​​​​​为​​​​​​​数​​​​​​​据​​​​​​​排​​​​​​​序​​​​​​​模​​​​​​​式​​​​​​​,它​​​​​​​会​​​​​​​每​​​​​​​几​​​​​​​秒​​​​​​​钟​​​​​​​排​​​​​​​空​​​​​​​一​​​​​​​次​​​​​​​内​​​​​​​存​​​​​​​并​​​​​​​将​​​​​​​其​​​​​​​保​​​​​​​存​​​​​​​到​​​​​​​磁​​​​​​​盘​​​​​​​中​​​​​​​。​​​​​​​但​​​​​​​ ext4 使​​​​​​​用​​​​​​​的​​​​​​​是​​​​​​​笔​​​​​​​记​​​​​​​本​​​​​​​电​​​​​​​脑​​​​​​​模​​​​​​​式​​​​​​​,保​​​​​​​存​​​​​​​内​​​​​​​存​​​​​​​的​​​​​​​时​​​​​​​间​​​​​​​间​​​​​​​隔​​​​​​​较​​​​​​​长​​​​​​​,且​​​​​​​可​​​​​​​能​​​​​​​在​​​​​​​系​​​​​​​统​​​​​​​意​​​​​​​外​​​​​​​关​​​​​​​闭​​​​​​​时​​​​​​​丢​​​​​​​失​​​​​​​数​​​​​​​据​​​​​​​。​​​​​​​现​​​​​​​在​​​​​​​ ext4 有​​​​​​​一​​​​​​​个​​​​​​​补​​​​​​​丁​​​​​​​,但​​​​​​​我​​​​​​​们​​​​​​​必​​​​​​​须​​​​​​​仍​​​​​​​在​​​​​​​设​​​​​​​计​​​​​​​应​​​​​​​用​​​​​​​程​​​​​​​序​​​​​​​时​​​​​​​小​​​​​​​心​​​​​​​谨​​​​​​​慎​​​​​​​,正​​​​​​​确​​​​​​​使​​​​​​​用​​​​​​​ fsync。​​​​​​​
下​​​​​​​面​​​​​​​读​​​​​​​取​​​​​​​和​​​​​​​写​​​​​​​入​​​​​​​配​​​​​​​置​​​​​​​文​​​​​​​件​​​​​​​的​​​​​​​简​​​​​​​单​​​​​​​示​​​​​​​例​​​​​​​演​​​​​​​示​​​​​​​了​​​​​​​如​​​​​​​何​​​​​​​备​​​​​​​份​​​​​​​文​​​​​​​件​​​​​​​或​​​​​​​者​​​​​​​数​​​​​​​据​​​​​​​是​​​​​​​怎​​​​​​​么​​​​​​​丢​​​​​​​失​​​​​​​的​​​​​​​:
/* open and read configuration file e.g. ~/.kde/myconfig */
fd = open("./kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT);
read(myconfig);
...
write(fd, bufferOfNewData, sizeof(bufferOfNewData));
close(fd);
更​​​​​​​好​​​​​​​的​​​​​​​方​​​​​​​法​​​​​​​可​​​​​​​能​​​​​​​是​​​​​​​:
open("/.kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT);
read(myconfig);
...
fd = open("/.kde/myconfig.suffix", O_WRONLY|O_TRUNC|O_CREAT);
write(fd, bufferOfNewData, sizeof(bufferOfNewData));
fsync; /* paranoia - optional */
...
close(fd);
rename("/.kde/myconfig", "/.kde/myconfig~"); /* paranoia - optional */
rename("/.kde/myconfig.suffix", "/.kde/myconfig");

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。