A.3. fsync


Fsync 称为 I/O 昂贵的操作,但这并不完全正确。
每次点击链接时,Firefox 用于调用 sqlite 库,以转至新页面。名为 fsync 的 SQLite 和因为文件系统设置(主要是 ext3 带有数据排序模式)的 SQLite,在没有发生任何发生时会有一个较长的延迟。如果另一个进程同时复制大型文件,则可能需要很长时间(最多 30 秒)。
然而,在其它情况下,如果 fsync 没有被全部使用,交换机会出现到 ext4 文件系统的问题。Ext3 设置为数据排序模式,每几秒钟刷新内存并将其保存到磁盘中。但是,在使用 ext4 和 laptop_mode 时,保存的间隔较长,数据可能会在系统意外关闭时丢失。现在 ext4 被修补,但我们仍然必须仔细考虑应用程序的设计,并根据情况使用 fsync
以下简单示例显示了如何备份文件或如何丢失数据:
/* open and read configuration file e.g. ./myconfig */
fd = open("./myconfig", O_RDONLY);
read(fd, myconfig_buf, sizeof(myconfig_buf));
close(fd);
...
fd = open("./myconfig", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
write(fd, myconfig_buf, sizeof(myconfig_buf));
close(fd);
更好的方法是:
/* open and read configuration file e.g. ./myconfig */
fd = open("./myconfig", O_RDONLY);
read(fd, myconfig_buf, sizeof(myconfig_buf));
close(fd);
...
fd = open("./myconfig.suffix", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR
write(fd, myconfig_buf, sizeof(myconfig_buf));
fsync(fd); /* paranoia - optional */
...
close(fd);
rename("./myconfig", "./myconfig~"); /* paranoia - optional */
rename("./myconfig.suffix", "./myconfig");
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.