文件系统 fdatasync fsync sync 详解

发布时间 2023-05-08 10:58:39作者: IT随笔

一、Buffer和Cache简介

 

数据写入内存空间,这段空间就是缓冲区buffer,写入缓冲区

把数据从内存空间读出,这段空间就是缓存器cache,读取缓存区

 

 

1、 cache

Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器。

 

Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。

脏页: linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。

2、buffer

Buffer,一般是用在写入磁盘的,例如:某个进程要求多个字段被读入,当所有要求的字段被读入之前已经读入的字段会先放到buffer中。

 

Buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据;通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时。

 

3、buffer和cache区别

buffer与cache操作的对象就不一样。

1)buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。

2)cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计的,也就是平常见到的一级缓存、二级缓存、三级缓存。

 

 

 

二、系统调用

延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。

当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘与缓冲区的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。

 

1、sync

sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

2、fsync

fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

3、fdatasync

fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。