缓冲区io

缓冲区是内存空间的一部分,也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的。

读写文件时,如果不会开辟对文件操作的缓冲区,直接通过系统调用对磁盘进行操作(读、写等),那么每次对文件进行一次读写操作时,都需要通过读写系统调用来处理此操作,即需要执行一次系统调用,执行一次系统调用将涉及到CPU状态的切换,即从用户空间切换到内核空间,实现上下文的切换,这将损耗一定的CPU时间,频繁的磁盘访问对程序的执行效率造成很大影响。

为了减少使用系统调用的次数,提高效率,我们可以采用缓冲机制。比如我们从磁盘里取信息,可以在磁盘文件进行操作时,可以一次从文件中读出大量的数据到缓冲区中,以后对这部分的访问就不需要再使用系统调用了,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

缓冲区就是一块内存区,用在输入输出的设备和CPU之间,用来缓存数据,使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU使其能够高效率工作。

刷新条件:

cpp 复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <unistd.h>

int main()
{
	//库函数
	printf("hello printf\n");
	fprintf(stdout,"hello fprintf\n");
	const char* s = "hello fwrite\n";
	fwrite(s, strlen(s), 1, stdout);

	//系统调用
	const char* ss = "hello write\n";
	write(1, ss, strlen(ss));	

	return 0;
} 

代码最后加上fork创建子进程

cpp 复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <unistd.h>

int main()
{
	//库函数
	printf("hello printf\n");
	fprintf(stdout,"hello fprintf\n");
	const char* s = "hello fwrite\n";
	fwrite(s, strlen(s), 1, stdout);

	//系统调用
	const char* ss = "hello write\n";
	write(1, ss, strlen(ss));	

	//??
	fork();

	return 0;
} 

刷了七次

原因是因为fork时对应缓冲区的库函数的三条消息在fork执行的时候还在缓冲区里,父子进程代码共享就要各自都刷新一遍。系统调用的函数当程序进行到ss传给write时就已经传给系统了,fork时就不存在刷新问题了。而向显示器写入就不会发生刷新两次的问题,向文件写入就会刷新两次,文件在磁盘里。重定向还更改了缓冲区的刷新方式。

对于写入来讲,提供用户级缓冲区,把字符串拷贝到里面,就可以通过缓冲区的存在大大减少系统调用的次数。操作系统也有缓冲区,提供文件内核缓冲区,提高系统调用的效率,write将数据写到缓冲区里就可以立即返回了。

提高使用者的效率。

缓冲区分用户级和内核级.

相关推荐
不会Android的潘潘13 小时前
受限系统环境下的 WebView 能力演进:车载平台 Web 渲染异常的根因分析与优化实践
android·java·前端·aosp
建军啊13 小时前
java web常见lou洞
android·java·前端
阳无13 小时前
宝塔部署的前后端项目从IP访问改成自定义域名访问
java·前端·部署
数智工坊13 小时前
【操作系统-IO调度】
java·服务器·数据库
Galloping-Vijay13 小时前
解决 WSL2 + Windows Hosts + 开启 VPN 后无法访问本地 Web 服务的问题
前端·windows
475.3514 小时前
linux-journal日志清理
linux·运维·服务器
weixin_4387321014 小时前
ChromeDriver谷歌驱动下载
linux·chrome·selenium·自动化·mac·chrome devtools·chromedriver
wuhen_n14 小时前
TypeScript的对象类型:interface vs type
前端·javascript·typescript
见路不走!14 小时前
后端返回Blob文件流,前端实现导出
前端
lindd91191114 小时前
4G模块应用,内网穿透,前端网页的制作第七讲(智能头盔数据上传至网页端)
前端·后端·零基础·rt-thread·实时操作系统·项目复刻