一分钟了解 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环境高级编程》

相关文章
|
3月前
|
Ubuntu Linux
内核实验(八):实现O-NONBLOCK非阻塞读写
本文通过修改之前的内核模块代码,介绍了如何在Linux内核中实现O_NONBLOCK非阻塞读写机制,并通过在Qemu虚拟机上的测试验证了非阻塞读写操作的正确性。
53 0
内核实验(八):实现O-NONBLOCK非阻塞读写
|
缓存 网络协议 Unix
Linux IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符)。
2834 0
|
6月前
|
Java
|
Linux Shell
Linux 基于flock命令实现多进程并发读写文件控制
Linux 基于flock命令实现多进程并发读写文件控制
628 0
|
存储 缓存