linux内核之buffer cache

最近在张哥的建议下,看i/o buffer cache这一块,真是有很大收获~~~

write系统调用实质上就是将数据从用户空间拷贝到内核缓冲区(buffer cache),拷贝完成后立即返回。
read系统调用是将数据从磁盘拷贝到内核缓冲区,然后应用从内核缓冲区拷贝到用户空间,由此可以看出read系统调用disk io是不可避免的。

也就是,write系统调用速度比read要快。(假设物理内存很大,要read的file在buffer cache中并不存在)

库函数的fwrite是在应用层建立一个缓冲区,通过setvbuf函数设置,fwrite的数据先写到这个缓冲区,缓冲区写满后调用write拷贝到buffer cache;也就是说,glibc的缓冲区的目的是为了减少write等系统调用的次数。

unix最强大的系统调用:posix_fadvise()
通过此调用,应用告诉内核想访问文件的方式,以便内核做出优化;
POSIX_FADV_NORMAL:默认的选项,linux中预读窗口为128K;
POSIX_FADV_SEQUENTIAL:linux中预读窗口为256K;通过预读,明显加快了应用读取文件的速度;
POSIX_FADV_RANDOM:不预读;

绕过内核缓冲区:打开文件时,指定标志为O_DIRECT
数据库的实现,就使用此方式,数据库会有自己的文件读取和缓存机制,不需要内核再重复做这个事情;

你可能感兴趣的:(linux,cache,buffer,write,read,fadvise)