Linux下清除缓存

一、强制把系统缓存写入文件sync和fsync函数, fflush和fsync的联系



传统的UNIX实现在内核中设有缓冲存储器,大多数磁盘I / O都通过缓存进行。当将数据写到文件上时,
通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满
或者当内核需要重用该缓存以便存放其他磁盘块数据时,再将该缓存排入输出队列,然后待其到达队首
时,才进行实际的I / O操作。这种输出方式被称之为延迟写。延迟写减少了磁盘读写次数,但是却降低
了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,
这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓存中内容的一致性,UNIX系
统提供了sync 和 fsync 两个系统调用函数。
#include <unistd.h>
void sync(void);
int fsync(int filedes) ;
返回:若成功则为0,若出错则为-1
sync只是将所有修改过的块的缓存排入写队列,然后就返回,它并不等待实际I / O操作结束。系统进程
(通常称为update )一般每隔3 0秒调用一次sync函数。这就保证了定期刷新内核的块缓存。
函数fsync只引用单个文件(由文件描述符 filedes 指定),它等待I / O结束,然后返回。fsync可用于数据
库这样的应用程序,它确保修改过的块立即写到磁盘上。比较一下 fsync 和 O_SYNC 标志。当调用fsync
时,它更新文件的内容,而对于 O_SYNC,则每次对文件调用 write 函数时就更新文件的内容。

fflush和fsync的联系和区别:
1.提供者fflush是libc.a中提供的方法,fsync是系统提供的系统调用。
2.原形fflush接受一个参数FILE *.fflush(FILE *);fsync接受的时一个Int型的文件描述符。fsync(int fd);
3.功能fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。
   fsync:是把内核缓冲刷到磁盘上。
总结: 

c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘


二、 下面说一下 drop_caches:(刷新系统缓存)

注意:在清空缓存之前使用sync命令同步数据到磁盘

# vim /proc/sys/vm/drop_caches

0

默认是0

1表示清空页缓存;2表示清空inode和目录树缓存;3清空所有的缓存

1.清空 pagecache:
sync
echo 1 > /proc/sys/vm/drop_caches
或者:
sync
sysctl -w vm.drop_caches=1


2.清空 dentries 和 inodes:
sync
echo 2 > /proc/sys/vm/drop_caches
或者:
sync
sysctl -w vm.drop_caches=2

3.清空所有缓存(pagecache、dentries 和 inodes):
sync
echo 3 > /proc/sys/vm/drop_caches
或者:
sync
sysctl -w vm.drop_caches=3


system("echo 3 > /proc/sys/vm/drop_caches"); //清理系统缓存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值