read和write的缓冲区

read()write()系统调用在操作磁盘文件时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区与内核缓冲区高速缓存( kernel buffer cache)之间复制数据。

Linux 内核对缓冲区高速缓存的大小没有固定上限。内核会分配尽可能多的缓冲区高速缓存页,而仅受限于两个因素:可用的物理内存总量,以及出于其他目的对物理内存的需求(例如,需要将正在运行进程的文本和数据页保留在物理内存中)。

<aside> 🚞 从内核 2.4 开始, Linux 不再维护一个单独的缓冲区高速缓存。相反,会将文件 I/O 缓冲区置于页面高速缓存中,其中还含有诸如内存映射文件的页面。只是还是习惯称之为 “缓冲区高速缓存”。

</aside>

自于内核 2.6.30,以及块大小为 4096 字节的 ext2 文件系统,并且每行显示为运行了 20 次后的均值。

读取100MB文件所需时间:

Untitled

Untitled

写100MB大小的文件所需时间:

Untitled

Untitled

stdio的缓冲

当操作磁盘文件时,缓冲大块数据以减少系统调用, C 语言函数库的 I/O 函数(比如,fprintf()、 fscanf()、 fgets()、 fputs()、 fputc()、 fgetc())正是这么做的。

setvbbuf

#include <stdio.h>
int setvbuf(FILE* stream, void* buf, int mode, int buf_size)

使用方式: