什么是缓冲区?
缓冲区的本质:一段内存
为什么要有缓冲区?
假设没有缓冲区,处理数据采取的方案,直接将数据进行刷新,IO次数较多,从而降低整机的效率。
因此:我们在进程中,取一段内存作为缓冲区,集中处理数据,减少IO次数,从而达到整机效率的目的
缓冲区是在哪?
由语言提供
以下为证明过程:
int main()
{
printf(" printf ");
fprintf(stdout," fprintf ");
const char* s1=" fgets ";
fputs(s1,stdout);
const char* s2=" write ";
write(1,s2,strlen(s2));
sleep(5);
return 0;
}
上面这段代码中执行结果是怎么的?
先输出write,,5秒后在输出,printf fprintf fgets
原因:缓冲区是语言层提供的,printf fprintf fgets先进入缓冲区,等待刷新,write为系统调用,没有缓冲区,直接刷新,sleep过后,进程退出,刷新缓冲区
缓冲区的刷新策略
常规:
- 立即刷新(无缓冲)
- 逐行刷新(行缓冲)
- 缓冲区满(全缓冲)
特殊:
- 进程退出
- 用户强制刷新(fflush)
对于显示器设备而言,一般采取逐行刷新
int main()
{
printf("printf\n");
fprintf(stdout,"fprintf\n");
const char* s1="fgets\n";
fputs(s1,stdout);
const char* s2="write\n";
write(1,s2,strlen(s2));
return 0;
}
write在后
对于磁盘而言,采取的方式为全缓冲
int main()
{
int fd = open("log.txt",O_WRONLY | O_CREAT |O_TRUNC,0666);
dup2(fd,1);//dup2为重定向
printf("printf\n");
fprintf(stdout,"fprintf\n");
const char* s1="fgets\n";
fputs(s1,stdout);
const char* s2="write\n";
write(1,s2,strlen(s2));
return 0;
}
write在前
最后为了加深对缓冲区,重定向,及进程的理解,看下这道题,log.txt的内容
int main()
{
int fd = open("log.txt",O_WRONLY | O_CREAT |O_TRUNC,0666);
dup2(fd,1);
printf("printf\n");
fprintf(stdout,"fprintf\n");
const char* s1="fgets\n";
fputs(s1,stdout);
const char* s2="write\n";
write(1,s2,strlen(s2));
fork();
return 0;
}
为什么会产生这样的现象?
write为系统调用,没有缓冲区