在这篇博客上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
根据实际的测试效果来看,按照以上的理解是正确的。