缓冲区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将数据写到缓冲区里就可以立即返回了。

提高使用者的效率。

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

相关推荐
一次旅行19 分钟前
DeepSeek‑V4.1‑Flash‑1017完整解读:模型升级+Search/Fetch搜索API开放,Agent开发者要注意哪些坑
前端·网络·人工智能
Chenyu_3108 小时前
DPDK、TC 和 XDP:Linux 高性能网络到底在优化什么
linux·服务器·网络·缓存
原则猫9 小时前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路9 小时前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
陈让然9 小时前
WSL 桥接设置静态IP(快速)
linux·网络·ubuntu
乔旭伟9 小时前
Linux 服务器备份实战:一致性快照、日志归档与恢复演练
linux·运维·服务器
乔旭伟9 小时前
Linux 服务器安全加固实战:SSH、防火墙、补丁与入侵排查
linux·服务器·安全
裕晟资质规划10 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
ShineWinsu10 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
月夏10 小时前
Vue3 转 React:18 项对照表 + 5 个必踩的坑(附 7 天上手路线)
前端