缓冲区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 小时前
如何实现流式输出?一篇文章手把手教你!
前端·aigc·ai编程
前端 贾公子19 小时前
vue移动端适配方案 === postcss-px-to-viewport
前端·javascript·html
GISer_Jing20 小时前
AI营销增长:4大核心能力+前端落地指南
前端·javascript·人工智能
_w_z_j_21 小时前
Linux----mmap
linux
明远湖之鱼21 小时前
一种基于 Service Worker 的渐进式渲染方案的基本原理
前端
前端小端长21 小时前
Vue 中 keep-alive 组件的原理与实践详解
前端·vue.js·spring
FeelTouch Labs21 小时前
Nginx核心架构设计
运维·前端·nginx
程序员zgh1 天前
Linux系统常用命令集合
linux·运维·服务器·c语言·开发语言·c++
雪球工程师团队1 天前
别再“苦力”写后台,Spec Coding “跑” 起来
前端·ai编程