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");
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.