一、什么是缓冲区
缓冲区是一段内存空间,由语言(C/C++/JAVA等)维护的缓冲区是语言级别缓冲区,由操作系统维护的缓冲区是内核级别缓冲区(此处重点讲解语言级别缓冲区)
二、语言级别缓冲区的作用
语言级别缓冲区有两个作用:解耦和提高效率(此处重点讲解提高效率的作用)
C语言使用printf/fprintf函数输出时,其实是向语言级别缓冲区写入。根据缓冲区刷新策略再将数据拷贝到内核级别缓冲区,内核级别缓冲区再根据缓冲区刷新策略将数据拷贝到磁盘中。语言级别缓冲区的存在,可以等待大量数据写入缓冲区,再一起刷新到内核级别缓冲区,这样可以大大提高效率。
如果直接向内核级别缓冲区写入,还需要等待操作系统的响应,效率低。
三、语言级别缓冲区的刷新策略
语言级别缓冲区有三种刷新策略
1.立即刷新:fflush(stdout), int fsync(int fd)
2.行刷新:适用于显示器,缓冲区写满一行即刷新(遇到\n即刷新)
3.全缓冲:适用于普通文件,缓冲区全部写满再刷新
四、缓冲区行刷新代码演示
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
//C语言
printf("hello printf!\n");//向语言级别缓冲区写入
fprintf(stdout,"hello fprintf!\n");//向语言级别缓冲区写入
//系统调用
const char* msg="hello write!\n";
write(1,msg,strlen(msg));//向内核级别缓冲区写入
return 0;
}