一分钟了解 sync、fsync、fdatasync 系统调用

简介: Hi,大家好!我是白日梦。今天我要跟你分享的话题是:“了解fsync这个系统调用嘛?谈谈看!”

Hi,大家好!我是白日梦。

今天我要跟你分享的话题是:“了解fsync这个系统调用嘛?谈谈看!”


一、缓冲#


传统的UNIX实现的内核中都设置有缓冲区或者页面高速缓存,大多数磁盘IO都是通过缓冲写的。


当你想将数据write进文件时,内核通常会将该数据复制到其中一个缓冲区中,如果该缓冲没被写满的话,内核就不会把它放入到输出队列中。


当这个缓冲区被写满或者内核想重用这个缓冲区时,才会将其排到输出队列中。等它到达等待队列首部时才会进行实际的IO操作。



这里的输出方式就是大家耳熟能详的: 延迟写

这个缓冲区就是大家耳熟能详的:OS Cache


二、延迟写的优缺点#


很明显、延迟写降低了磁盘读写的次数,但同时也降低了文件的更新速度。

这样当OS Crash时由于这种延迟写的机制可能会造成文件更新内容的丢失。而为了保证磁盘上的实际文件和缓冲区中的内容保持一致,UNIX系统提供了三个系统调用:sync、fsync、fdatasync


三、sync、fsync、fdatasync#


#include<unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
int sync();


sync系统调用:将所有修改过的缓冲区排入写队列,然后就返回了,它并不等实际的写磁盘的操作结束。所以它的返回并不能保证数据的安全性。通常会有一个update系统守护进程每隔30s调用一次sync。


命令sync(1)也是调用sync函数。


fsync系统调用:需要你在入参的位置上传递给他一个fd,然后系统调用就会对这个fd指向的文件起作用。fsync会确保一直到写磁盘操作结束才会返回。所以fsync适合数据库这种程序。


后续白日梦会续跟大家分享MySQL的redolog、binlog等日志。MySQL都提供了相应的参数让MySQL写日志文件的使用fsync这个系统调用。欢迎关注,敬请谅解~

fdatasync系统调用:和fsync类似但是它只会影响文件的一部分,因为除了文件中的数据之外,fsync还会同步文件的属性。


参考:《UNIX环境高级编程》

相关文章
|
Java API Android开发
Java通过JNI调用C++的DLL库
Java通过JNI调用C++的DLL库
593 0
|
Linux 开发者
Linux时间和日期函数:管理时间与日期的重要工具
在Linux系统编程中,处理时间和日期是至关重要的任务。Linux提供了一系列的时间和日期函数,允许开发者获取、操作和格式化时间信息。本文将深入介绍Linux时间和日期函数的使用,包括获取当前时间、格式化时间字符串、计算时间差等功能,帮助读者充分了解如何在程序中有效地处理时间和日期。
515 3
|
SQL 运维 关系型数据库
阿里云DTS踩坑经验分享系列|数据不一致修复大法
阿里云数据传输服务DTS在帮助用户迁移数据、同步数据时,在某些复杂场景下会出现源库与目标库数据不一致的问题,造成数据错误,给用户带来困扰。由于数据不一致的问题很难完全避免,为了及时修复不一致的数据,DTS产品推出数据订正功能,保障用户在同步\迁移数据时的数据一致性。本文介绍了产生数据不一致的一些典型场景,并重点阐述了如何使用DTS数据订正功能来修复不一致的数据。
1691 4
|
边缘计算 算法 安全
CDN百科第五讲 | CDN和游戏加速器有什么区别?
很多懂IT的游戏玩家都会将CDN和游戏加速器混淆,实际上从效果上看,CDN和网游加速器都具备让网络访问变快的能力,可以帮助玩家游戏的体验和访问效率提升,但是在它们在原理上是有本质区别的,本期CDN百科为你解答。
3738 0
CDN百科第五讲 | CDN和游戏加速器有什么区别?
|
Shell Linux API
【Shell 命令集合 磁盘管理 】Linux 列出目录中的文件和子目录 ls命令使用教程
【Shell 命令集合 磁盘管理 】Linux 列出目录中的文件和子目录 ls命令使用教程
608 1
|
Linux
Linux tmp目录自动清理总结
在Linux系统中/tmp文件夹下的文件是会被清理、删除的,文件清理的规则是如何设定的呢? 以Redhat为例,这个主要是因为作业里面会调用tmpwatch命令删除那些一段时间没有访问的文件。   那么什么是tmpwatch呢?其实tmpwatch是一个命令或者说是一个包。
4512 0
|
7月前
|
安全 Linux 数据安全/隐私保护
深入理解Linux ln命令:软链接与硬链接的完全指南
本文深入解析Linux中`ln`命令的使用,涵盖硬链接与软链接的核心区别、基本语法、常用选项及实际应用场景。通过示例讲解链接创建、批量操作、版本管理等技巧,并提供注意事项与故障排除方法,帮助用户高效、安全地管理文件链接,提升系统操作效率。(238字)
967 0
|
Java Maven
Maven配置阿里云镜像与JDK编译版本
Maven配置阿里云镜像与JDK编译版本
8019 0
Maven配置阿里云镜像与JDK编译版本