在這篇博客上http://blog.csdn.net/cheungjustin/archive/2010/08/31/5853399.aspx
看到關於page cache,buffer cache的解釋。
針對博客裏面一開始提出的問題:一個程序,需要讀入文件,它第一次執行時間和第二次執行時間一樣嗎?將文件改名後呢,umount文件系統後再mount上呢?
這篇文章的作者的理解是程序第一次執行時,讀取文件過程,從磁盤讀取到buffer cache 到page cache再到應用程序的進程空間。第二次執行時由於buffer cache中已經有了部分或全部的文件內容,這樣執行時間就要減少些。當然這也要視情景而定,具體有很多。當文件改名後,其數據的物理地址未變,程序執行時通過文件指針仍能在內存上找到正確數據所以執行時間應該和第二次相同,但是umount文件系統後,這些buffer cache 和page cache信息應該會刪除,因爲若重新掛載另一文件系統時,同樣的文件名可能不對應同一個文件,所以這時執行時間應該和第一次一樣。
爲了驗證這種理解是否正確,寫了一個讀文件的程序來測試。程序代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main(void)
{
FILE *fp=fopen("/mnt/dw.c","r+b");
struct timeval t1, t2;
long spend_us;
char buf[5];
int size;
gettimeofday(&t1, NULL);
while((size = fread(buf, sizeof(char), 5, fp)) > 0);
gettimeofday(&t2, NULL);
spend_us = 1000000 * (t2.tv_sec - t1.tv_sec) + (t2.tv_usec - t1.tv_usec);
printf("spend time:%ld/n", spend_us);
fclose(fp);
return 0;
}
其中dw.c是一個大小爲107k的源代碼文件。/mnt/下掛載的是/dev/sda5分區
第一次運行程序:./cache_test
程序運行時間:spend time:5596
第二次運行:./cache_test
程序運行時間:spend time:2241
將dw.c改了名字之後再運行時
程序運行時間:spend time:2062
umount /mnt,然後再mount /dev/sda5 /mnt/
然後再運行程序,
運行時間:spend time:5584
根據實際的測試效果來看,按照以上的理解是正確的。