page_cache和buffer_cache的直观理解

本文通过实验探讨了Linux系统中pagecache与buffercache对文件读取速度的影响。首次读取文件耗时较长,随后读取同一文件速度明显加快,证实了缓存在提高读取效率方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这篇博客上http://blog.youkuaiyun.com/cheungjustin/archive/2010/08/31/5853399.aspx

看到关于page cachebuffer 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

根据实际的测试效果来看,按照以上的理解是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值