以下均为自己整理的资料
通常Cache
的同步方式有两种,写穿和写回
,对应Linux的Page Cache
上所谓的写穿就是write () 操作将数据拷贝到页缓存后立即和下层进行同步的写操作
,完成下层的更新之后返回,写回正好相反,指的是写完Page Cache
直接返回,Page Cache
到下层的更新操作是异步进行的.
Linux 下的 Buffered IO 默认使用回写机制
,Page Cache
被修改的内存页称之为脏页,脏页在特定的时候会被pdflush
的内核线程写入磁盘,写入的时机和条件如下:
- 当空闲内存低于一个特定的值,内核必须将脏页返回磁盘,释放内存
- 脏页在内存中驻留时间超过一个阀值,内核必须将超时的脏页写回磁盘
- 用户进行
sync
,fsync
,fdatasync
系统调用,内核会执行写回操作
条件 我们可以 通过执行 sysctl -a | grep dirty
来进行查看
vm.dirty_background_ratio = 10
//脏页超百分之十进行写回
vm.dirty_expire_centisecs = 1500
//驻留15秒进行flush写入
vm.dirty_writeback_centisecs = 1500
//内存中驻留15秒进行flush
默认是写回方式,那如果我们想立马落到磁盘上怎么做?除了前文提及的fsync
之类的系统调用,在open
打开文件,传入O_SYNC
flag即可.
参考资料