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

提高使用者的效率。

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

相关推荐
不可求~9 分钟前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
三言老师1 小时前
秘诀-如何远程SSN访问家里的八台电脑(frp 实操方案)
linux·运维·ssh
躺不平的理查德1 小时前
ARCH与交叉编译器的关系
服务器·arm
举手2 小时前
Dispatcher模块剖析
linux·c++
AC赳赳老秦3 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
谢慧琼3 小时前
2026零基础做企业网站,低成本搭建官方网站
服务器·前端·javascript
allforgood4 小时前
运行容器
linux
Light_It5 小时前
Linux 内核参数 pci-stub.ids=
linux·kernel
weixin_431600445 小时前
前端数据埋点(1):一次点击如何变成一条埋点
前端·js·数据埋点
IT_陈寒5 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端