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"); //清理系統快取