1. 程式人生 > >Linux下清除快取

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