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;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群辉虚拟机安装openWRT作旁路由

最近在整活旁路由&#xff0c;基本就是要实现adguard和出国留学。openwrt这个的安装比较简单&#xff0c;就是先去找个镜像&#xff0c;然后导入即可。 我这里最后是去github上找了个大佬每天编译的地址链接。我用的是这个版本 1.下载解压得到img 下载完之后解压会得到一个…

GDPU unity游戏开发 角色控制器与射线检测

在你的生活中&#xff0c;你一直扮演着你的角色&#xff0c;别被谁控制了。 小试 1. 创建一个角色控制器&#xff0c;通过键盘控制角色控制器的移动&#xff0c;角色控制器与家具发生碰撞后&#xff0c;通过Debug语句打印出被碰撞物体的信息(搜索OnControllerColliderHit的使用…

Hotcoin Research | 市场洞察:2024年5月6日-5月12日

加密货幣市场表现 加密货幣总市值为1.24万亿&#xff0c;BTC占比53.35%。 本周行情呈现先涨后跌的一种態势&#xff0c;5月6日-9日大盘持续下跌&#xff0c;周末为震荡行情。本周的比特幣现货ETF凈流入&#xff1a;1.1262亿美元&#xff0c;其中&#xff1a;美国ETF流入&…

DE2-115开发板基于verilog和nioⅡ的流水灯实现

目录 一、 内容概要二、 实现2.1 基于Nios II软核的流水灯2.1.1 准备工作2.1.2 工程搭建2.1.3 硬件代码设计Ⅰ 连接IP核Ⅱ 编写代码Ⅲ 各种配置 2.1.4 软件代码设计Ⅰ 环境构建Ⅱ 编写代码 2.1.5 代码下载Ⅰ 硬件下载Ⅱ 软件下载 2.1.6 运行结果 2.2 Verilog流水灯 三、 心得体…

带你探索CA和SSL证书

目录 一、什么是CA&#xff1f; 二、什么是SSL证书&#xff1f; 三、SSL证书分类和文件种类&#xff1f; 3.1 证书的分类&#xff1a; 3.2证书格式&#xff1a; 四、SSL和TSL 五、PSK介绍 六、nginx配置介绍 一、什么是CA&#xff1f; CA是证书的签发机构&#xff0c;它是…

sumif的求和区域是文本格式怎么办?

sumif函数的求和区域是文本型数字&#xff0c;不更改源数据的情况下怎么求和呢&#xff1f; 一、不能使用SUMIF、SUMIFS函数 这两个函数的求和区域只能是引用&#xff0c;不能是公式运算的内存数组&#xff0c;因此不能用公式或运算符将求和区转换成数值。当引用来的数据是文本…

公司网页设计思路

在当今互联网时代&#xff0c;公司网页设计是一个极为重要的环节。一款精心设计的公司网页可以提升企业形象&#xff0c;增加用户粘性&#xff0c;吸引更多的潜在客户和合作伙伴。下面将为大家介绍一些公司网页设计的思路。 首先&#xff0c;要确立公司网页的整体风格。网页风格…

C++的数据结构(四):队列

在数据结构中&#xff0c;队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作。队列中没有元素时&#xff0c;称为空队列。队列的…

基于SSM的“网约车用户服务平台”的设计与实现(源码+数据库+文档)

基于SSM的“网约车用户服务平台”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能 首页 站内新闻浏览 打车信息查询功能 在线打车功能…

GD32用ST-Link出现internal command error的原因及解决方法

一、GD32 F407烧录时出现can not reset target shutting down debug session 搜寻网上资料&#xff0c;发现解决方式多种多样&#xff0c;做一个简单的总结&#xff1a; 1.工程路径包含中文名 2.需更改debug选项 3.引脚冲突 4.杜邦线太长 而先前我的工程路径包含中文名也仍…

(Java)心得:LeetCode——18.四数之和

一、原题 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; …

Git在windows和Linux安装并自动更新代码超详细讲解

202405122316 一、Git官网安装 1、官网安装地址&#xff1a; Git - Downloading Packagehttps://git-scm.com/download/win 官网下载比较慢建议使用下面链接 2、国内镜像下载地址&#xff1a; CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-fo…

Libcity 笔记:自定义模型

在/libcity/model/trajectory_loc_prediction/&#xff0c;我们复制一份Deepmove.py&#xff0c;得到DM_tst.py&#xff0c;我们不改变其中的机制&#xff0c;只动class name 然后修改相同目录下的__init__.py&#xff1a; 修改task_config文件&#xff1a; 在config/model/tra…

OGG几何内核-网格化的改进

OGG社区于4月19日发布了OGG 1.0 preview版本。相对于OCCT 7.7.0有很多改进&#xff0c;目前在持续研究中。最近测试了一下网格化&#xff0c;确实有很好的改进。对比展示如下&#xff1a; 几何内核&#xff1a; OGG 1.0 preview 几何内核&#xff1a;OCCT 7.7.0 采用OCCT几何内…

2024中国(重庆)VR/AR科技展8月举办

2024中国(重庆)VR/AR科技展8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办&#xff0c;同时举办第二届中国…

深圳晶彩智能ESP32-1732S019实时观看GPIO的状态

深圳晶彩智能ESP32-1732S019介绍 ESP32-1732S019开发板是基于ESP32-S3-WROOM-1模块作为主控&#xff0c;双核MCU ,集成WI-FI和蓝牙功能&#xff0c;主控频率可达240MHz , 512KB SRAM , 384KB ROM&#xff0c;8M PSRAM&#xff0c;16MB Flash&#xff0c;显示分辨率为170*320 I…

牛津大学和上海交大将SAM和Flow应用于移动目标,简单而有效,轻松分割运动目标!

光流可以在运动物体分割中发现运动物体并为分割提供清晰的边界。然而&#xff0c;如果物体暂时静止&#xff0c;就会面临分割挑战。 而我们知道SAM可以很好的分割静态图像对象。因此&#xff0c;是否可以利用SAM与光流结合来在视频中进行移动物体分割&#xff1f; 今天给大家介…

分享一个php常驻内存多进程任务的扩展

前言 最近在摸鱼的时候发现一个PHP常驻内存多进程任务扩展包&#xff1a;EasyTask: PHP常驻内存多进程任务管理器&#xff0c;支持定时任务(PHP resident memory multi-process task manager, supports timing tasks) (gitee.com)&#xff0c;支持php使用多线程处理任务。之前…

重写muduo之TcpServer

目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 不用依赖boost库&#xff0c;全部翻译成对C11的依赖&#xff0c;与多线程相关&#xff0c;也翻译成C11,与Linux底层的API的关联性减少&#xff0c;移植性更好 #pragma once#include <memo…

PV操作大题强化

1.生产者消费者问题——进程间关系为“生产资源-消费资源” 解题步骤 分析有几类进程——每类进程对应一个函数在每一个函数内部可以用中文描述动作(如果动作只做一次&#xff0c;就不用加while循环&#xff0c;如果动作要重复&#xff0c;就要加while循环)分析每一个动作在做…