当前位置: 首页 > news >正文

C语言——文件缓冲区

一、用户缓冲区和系统缓冲区

缓冲区的概念确实可以分为多个层次,其中最常见的两个层次是用户缓冲区和系统缓冲区。

这里的用户缓冲区和系统缓冲区都包括输入输出缓冲区。

1、用户缓冲区(User-space Buffer)

用户缓冲区是指由用户程序(如C语言程序)在用户空间(即非内核空间)中分配和管理的内存区域。在C语言中,当使用标准I/O库(如stdio.h中定义的函数)进行文件操作时,标准I/O库会自动为每个打开的文件流(FILE*)分配一个用户缓冲区。这个缓冲区用于暂存读取或写入的数据,以减少对系统调用的依赖,从而提高I/O效率。我们下面将对这个缓冲区进行详细的讲解。

用户缓冲区的特点:

  • 由用户程序控制,通常由C标准I/O库管理。

  • 用于减少系统调用的次数,提高I/O效率。

  • 可以通过setvbufsetbuf函数来设置缓冲区的大小和类型(全缓冲、行缓冲、无缓冲)。

2、系统(内核)缓冲区(Kernel-space Buffer)

系统缓冲区是指由操作系统内核在系统空间中分配和管理的内存区域。当用户程序通过系统调用(如readwrite)进行文件I/O操作时,操作系统会在内核中为这些操作分配缓冲区。系统缓冲区用于暂存从磁盘读取的数据或准备写入磁盘的数据,以减少对物理设备的直接访问,提高I/O性能。

系统缓冲区的特点:

  • 由操作系统内核控制,用户程序无法直接访问。

  • 用于减少对物理设备的访问次数,提高I/O效率。

  • 在某些情况下,用户程序需要显式地调用fsyncfdatasyncsync等函数来确保数据被写入磁盘,以避免数据丢失。

3、总结

用户缓冲区和系统缓冲区都是为了提高I/O操作的效率而设计的,但它们位于不同的内存空间,由不同的实体管理。用户缓冲区是用户程序的一部分,而系统缓冲区是操作系统内核的一部分。在实际的文件I/O操作中,这两种类型的缓冲区可能会同时存在,共同协作以优化性能。例如,用户程序可能首先将数据写入用户缓冲区,然后由C标准I/O库将数据从用户缓冲区转移到系统缓冲区(这里是通过调用系统接口),最终由操作系统内核将数据写入磁盘。

二、文件缓冲区

1、介绍

缓冲文件系统(Buffered I/O)是标准C(ANSI C)中处理文件输入输出的一种机制。它是C语言标准库提供的一种文件处理方式,旨在提高文件读写的效率,同时减少对系统调用接口的调用次数。缓冲文件系统通过在内存中为每一个正在使用的文件自动开辟一个文件缓冲区来实现这一目的。

Word文档在编辑时创建的带有 "~$" 前缀的同名文件是一个临时文件,它就是作为一种缓冲机制来提高数据处理效率。

磁盘的访问速度是小于RAM的,当我们在对Word文档进行编辑时,数据其实是先保存在这个临时文件中的,然后在我们按下Ctrl + S(即完成编辑并保存文档时),Word才会将临时文件中的数据写入原始文档。这种一次性写入原始文件而不是多次写入可以减少磁盘损耗并提高性能。

这里的这个临时文件就可以看做一种缓冲区的技术。

2、缓冲区的刷新策略

缓冲区的刷新策略是操作系统或编程语言库用来管理输入输出(I/O)缓冲区的一种机制。不同的刷新策略适用于不同的I/O场景,以优化性能和效率。以下是三种缓冲区刷新策略的详细解释:

1)立即刷新(无缓冲,Unbuffered)

特点:数据一旦产生就立即被写入到目的地,每次写入操作都会立即发送到目标设备,不使用缓冲区来暂存数据。

适用场景:适用于需要立即看到输出结果的场景,比如标准错误输出(stderr)通常是无缓冲的,以便错误信息可以立即显示给用户,或者对于数据一致性要求极高的应用。

由于每次操作都需要与设备交互,这种策略可能会导致较低的I/O效率。在C语言中,可以使用setbuf(stdout, NULL)来关闭标准输出的缓冲。

2) 行刷新(行缓冲,Line Buffered)

特点:在这种策略下,缓冲区会暂存数据,当缓冲区中遇到换行符(\n)时,或者缓冲区满时,数据会被写入到目的地。

适用场景:适用于交互式程序,如终端I/O,因为用户通常期望在输入换行符后看到输出。比如向终端或控制台输出文本。

在C语言中,标准输出(stdout)默认是行缓冲的,当程序输出换行符时,数据会被立即写入到终端。行缓冲可以提高效率,因为它减少了与设备的交互次数,同时保持了良好的用户体验,因为用户可以看到按行输出的内容。

3)全缓冲(Fully Buffered)

特点:只有当缓冲区满时,直到缓冲区满、程序显式调用刷新函数(如 fflush)、或者程序结束时,数据才会被写入到目的地。

适用场景:适用于大量数据传输的场景,如向磁盘文件写入数据,因为这样可以减少磁盘I/O操作的次数,提高效率。

在C语言中,文件I/O默认是全缓冲的,可以使用setvbuf函数来设置缓冲区的大小和类型。全缓冲可以最大化I/O效率,因为它允许操作系统或库函数以最优的方式与设备交互,减少了小数据块的频繁写入。

3、证明缓冲区的存在

我们可以通过下面的代码来证明缓冲区是存在的:

#include <stdio.h>
#include <Windows.h>int main() {FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return -1;}fputs("abcdef", pf);//写入内容,实际上会存入输出缓冲区printf("下面会暂停,但是缓冲区不会刷新,所以打开文件会发现文件没有内容\n\n");system("pause");//暂停,这时可以打开文件,发现文件内没有内容,表明缓冲区是存在的fflush(pf);//刷新缓冲区,这时缓冲区中的内容会写入文件中printf("下面会暂停,缓冲区在上面的fflush语句就已经刷新,所以打开文件会发现文件有内容了\n\n");system("pause");//暂停,这时可以打开文件,发现文件内出现内容,表明fflush刷新缓冲区fclose(pf);//实际上,fclose也会刷新缓冲区pf = NULL;return 0;
}

运行结果:

相关文章:

C语言——文件缓冲区

一、用户缓冲区和系统缓冲区 缓冲区的概念确实可以分为多个层次&#xff0c;其中最常见的两个层次是用户缓冲区和系统缓冲区。 这里的用户缓冲区和系统缓冲区都包括输入输出缓冲区。 1、用户缓冲区&#xff08;User-space Buffer&#xff09; 用户缓冲区是指由用户程序&…...

如何快速检测原理图中的元器件与PLM系统的一致性,提高原理图设计准确性

背景介绍 保证原理图中的元器件来源于公司的PLM系统、ERP系统的&#xff0c;是输出有效BOM的根源&#xff0c;初始BOM的准确率&#xff0c;能大大降低ECN的数量&#xff0c;提高生产备料的时效&#xff0c;缩短采购周期。 然而&#xff0c;原理图设计过程中&#xff0c;由于…...

英特尔处理器排行

英特尔的处理器性能排行通常是根据其发布的不同代数和型号来划分的&#xff0c;以下是一些高性能的英特尔处理器&#xff1a; Intel 酷睿 i9 14900K&#xff1a;这是目前英特尔桌面平台中的旗舰处理器之一&#xff0c;提供了极高的性能&#xff0c;适合高端游戏和专业工作负载…...

【日志革新】在ThinkPHP5中实现高效TraceId集成,打造可靠的日志追踪系统

问题背景 最近接手了一个骨灰级的项目&#xff0c;然而在项目中遇到了一个普遍的挑战&#xff1a;由于公司采用 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作为日志收集和分析工具&#xff0c;追踪生产问题成为了一大难题。尽管 ELK 提供了强大的日志分析功…...

英译汉早操练-(二十)

hello大家好&#xff0c;这篇跟随十九&#xff0c;继续真题学习。如果想看全部请返回到第十九篇。 英译汉早操练-&#xff08;十九&#xff09;-CSDN博客 The political upheaval in Libya and elsewhere in North Africa has opened the way for thousands of new migrants to…...

Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

前言 上一篇文章带你实现了Go-Zero和goctl&#xff1a;解锁微服务开发的神器&#xff0c;快速上手指南&#xff0c;本文将继续深入探讨Go-Zero的强大之处&#xff0c;并介绍如何使用goctl工具实现模板定制化&#xff0c;并根据实际项目业务需求进行模板定制化实现。 通过本文…...

(五)STM32F407 cubemx IIC驱动OLED(1)IIC协议篇

&#xff08;五&#xff09;STM32F407 cubemx IIC驱动OLED&#xff08;1&#xff09;IIC协议篇 这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。   废话不多说直接开始主题&#xff0c;本人是基于STM32F407V…...

OpenCV特征匹配总结

1.概述 在深度学习出现之前&#xff0c;图像中的特征匹配方法主要有 2.理论对比 3.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 3) {std::cerr << "Usage: " << argv[0] <…...

二叉树的四种遍历代码实现

二叉树的遍历大致能分为以下几种 1.前序&#xff1a;根 左 右 2.中序&#xff1a;左 根 右 3.后序&#xff1a;左 右 根 4.层序&#xff1a;从根开始一层一层的向下 如上图访问顺序: 前序&#xff1a;1 2 3 N N N 4 5 N N 6 N N 中序&#xff1a;N 3 N 2 N 1 N 5 N 4 N …...

系统和功能测试:确保软件的功能和易用性

目录 概述 功能测试 LOSED 模型 用例的设计 等价类划分 边界值分析 循环结构测试的综合方法 因果图 决策表 功能图 正交实验设计 易用性测试 内部易用性测试 外部易用性测试 功能性测试 正向功能性测试 负向功能性测试 功能性测试工具 结语 概述 在软件开发…...

关于服务端接口知识的汇总

大家好&#xff0c;今天给大家分享一下之前整理的关于接口知识的汇总&#xff0c;对于测试人员来说&#xff0c;深入了解接口知识能带来诸多显著的好处。 一、为什么要了解接口知识&#xff1f; 接口是系统不同模块之间交互的关键通道。只有充分掌握接口知识&#xff0c;才能…...

树(数据结构)

树的定义 一个根结点&#xff0c;其余结点分为 m 个不相交的集合&#xff0c; 其中每个集合本身又是一棵树&#xff0c;并且称为根的子树。 树的根结点没有前驱&#xff0c;其他结点有且仅有一个前驱。 所有结点可以有0个或多个后继。 基本术语 结点的度 树的度 &#xff1a; 树…...

Spring底层入门(十一)

1、条件装配 在上一篇中&#xff0c;我们介绍了Spring&#xff0c;Spring MVC常见类的自动装配&#xff0c;在源码中可见许多以Conditional...开头的注解&#xff1a; Conditional 注解是Spring 框架提供的一种条件化装配的机制&#xff0c;它可以根据特定的条件来控制 Bean 的…...

优质资料:大型制造企业等级保护安全建设整改依据,系统现状分析,网络安全风险分析

第1章 项目概述 XX 大型制造型企业是国内一家大型从事制造型出口贸易的大型综合企业集团&#xff0c;为了落实国家及集团的信息安全等级保护制度&#xff0c;提高信息系统的安全防护水平&#xff0c;细化各项信息网络安全工作措施&#xff0c;提升网络与信息系统工作的效率&am…...

几种监控工具学习

在Linux上有很多监控工具&#xff0c;比如Zabbix、Prometheus、APM和ELK 监控工具是确保系统稳定运行的关键组件之一&#xff0c;它可以帮助系统管理员和开发人员及时发现并解决问题。 以下是几种流行的监控工具的简要介绍&#xff1a; Zabbix&#xff1a; Zabbix 是一个企…...

树莓派python开发

树莓派自带thonny 点亮LED灯 import RPi.GPIO as GPIO import time# 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM)# 设置LED引脚 led_pin 18# 设置LED引脚为输出 GPIO.setup(led_pin, GPIO.OUT)# 点亮LED GPIO.output(led_pin, GPIO.HIGH)# 延时2秒 time.sleep(2)# 关闭LED GPI…...

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景&#xff0c;利用translate和opacity实现动效的移动和缩放&#xff0c;并将界面沉浸式&#xff08;全屏&#xff09;显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…...

苹果cms:开启高速缓存加快访问速度

由于苹果cms采集的影片数据过多,如果不设置缓存,可能会造成网站访问缓慢,或者CPU消耗过高。随着用户访问量的上升&#xff0c;添加缓存设置是有这个必要的。目前cms提供了四种缓存方式 1&#xff09;file&#xff1a;以文件形式&#xff0c;通俗说直接访问Mysql&#xff0c;要达…...

实时数据推送——长轮询,短轮询,长连接

短轮询 短轮询是最简单的一种数据推送方式&#xff0c;客户端在固定的时间间隔&#xff08;例如每隔5秒&#xff09;向服务器发送请求&#xff0c;询问是否有更新的数据。服务器立即处理请求并返回数据&#xff0c;不论数据是否真的已经更新。 长轮询 长轮询是对短轮询的改进…...

七.音视频编辑-创建视频过渡-应用

引言 在上一篇博客中&#xff0c;我们已经介绍了创建视频过渡的实现方案&#xff0c;步骤非常繁琐&#xff0c;在生成AVMutableVideoCompositionInstruction和AVMutableVideoCompositionLayerInstruction的计算也十分复杂&#xff0c;但其实还有一个创建视频组合的捷径。不过我…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...