前言

当我们修改了某个文件时,被修改的内容不会直接写入磁盘中,而是会写入由内核提供的一个buffer里,那么,内核会在一个特定的时间或者机制,再将buffer中的内容写进磁盘中去,为什么要这么做?原因就是减少开销,降低磁盘的读写次数。

 

缓存的三种机制

一般缓存有三种机制:

1.不缓存(nowrite):这种机制是跳过缓存,直接写入磁盘中。如果进行读操作时,还需要从磁盘中读取存入缓冲中。个人觉得在读操作时,使用的时间长。

2.写透缓存(write-through cache):当进行写操作时,会写入缓存中,并且马上再写入磁盘中。这种机制相对于上一种,写操作使用的时间长,但读操作使用的时间短。

3.回写:这种机制在写操作时,会先写入缓存中,但不会立即写入磁盘中,而是在一些特定条件或操作,才会把缓存中的数据写入磁盘。回写机制可以说是非常灵活,这是本笔记探讨的内容。

 

回写机制的Dirty标志

buffer在特定的时间里(查看/proc/sys/vm/dirty_writeback_centisecs 再除以 100 就是多少秒),会被标记为dirty page,被标记的dirty page会被加入到一个链表中,但并不会马上写入磁盘中。

 

回写机制的写入磁盘时机

有两种情况dirty page才会被写入磁盘中:

1.  当空闲的内存低于某一个值时(查看/proc/sys/vm/dirty_background_ration),会把1024个dirty page写回磁盘中,直到内存回到空闲状态。

2.  当dirty page超过一定的比例时(查看/proc/sys/vm/dirty_ratio),内核会启动pdflush线程把超过的那一部分启写入磁盘中。

3.  当dirty page超过了一定的时间(查看/proc/sys/vm/dirty_expire_centisecs),才会被写入磁盘中

4.  当用户程序调用了sync() 和 fsync()系统调用。