Linux学习之路 -- 文件系统 -- 缓冲区

news2024/11/23 20:50:04

前面介绍了文件描述符的相关知识,下面我们将介绍缓冲区的相关知识。

本质上来说,缓冲区就是一块内存区域,因为内核上的缓冲区较复杂,所以本文主要介绍C语言的缓冲区。

目录

1.为什么要有缓冲区

2.应用层缓冲区的默认刷新策略

3.如何证明缓冲区的存在?


1.为什么要有缓冲区

缓冲区的存在就是为了提高使用者的效率,我们可以以物流公司为例,如果每次物流公司送快递都一件一件送,那么效率就会变得非常底下,所以在日常生活中物流公司都是等到货物积攒到一定数量时再进行发送。同理,缓冲区的存在就相当于物流公司,缓冲区能够聚集数据,在需要时一次拷贝,提高整体的效率。拷贝的一次就叫刷新。                                                                                  

在正式介绍缓冲区前,我们需要知道的是,我们常说的缓冲区和内核中的缓冲区没有关系,我们常说的缓冲区是语言层面的缓冲区,我们熟知的C语言就自带缓冲区。因为调用系统调用是有成本的,所以我们在语言层面上创建了缓冲区,这样就不会造成我们输入一次就调用相关的系统调用向内核写入一次,而是等到数据量足够多时,再调用系统调用接口,向内核中写入。 这样就避免了频繁调用系统调用,减少了系统开销。                                                                                

2.应用层缓冲区的默认刷新策略

<1>无刷新,无缓冲

<2>行刷新,遇到\n时就刷新

<3>全缓冲,全部刷新 -- 普通文件里面,缓冲区写满才刷新。

当然,我们也可以通过强制刷新函数fflush,直接刷新缓冲区。在进程退出时,缓冲区也会刷新。

 缓冲区被谁维护?

前面我们了解到FILE其实是一个结构体,里面不仅仅封装了fd,还封装了其他的内容,其中就包括了文件缓冲区,并且每一个文件都包含一个缓冲区。所以我们在实施写入文件操作函数时,都要传递一个FILE*的指针,其实我们写入内容时,就是将我们所写的内容拷贝到FILE* 的指针里面维护的缓冲区,                       

3.如何证明缓冲区的存在?

下面为了验证缓冲区的存在,我们先通过一段代码来验证。

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>

#define filename "file.txt"
int main()
{
    //使用系统调用
    const char* str = "hello world\n";
    write(1,str,strlen(str));
    //使用C语言的相关接口
    const char* str1 = "hello fwrite\n";
    fwrite(str1,strlen(str1),1,stdout);

    const char* str2 = "hello fprintf\n";
    fprintf(stdout,"%s",str2);
    fork();
    return 0;
 }

正常执行结果

 

将执行结果重定向到文件里面的结果

我们可以发现向显示器打印,只会打印三条语句,这是因为刷新策略是行刷新,而这也符合我们的认知。而我们实行重定向时,对log.txt这个普通文件的刷新策略就变成了全缓冲,此时C语言的缓冲区就存放了两条语句“hello fwrite\n” 和 “hello fprintf\n”。因为这里我们使用了fork创建了子进程,所以这里就存在了两个进程。而前面我们提到过,当进程退出时,缓冲区会被强制地刷新。这里无论哪个进程先退出,缓冲区都会被刷新两次,将缓冲区保存地数据拷贝到操作系统。正常来说缓冲区的刷新会导致缓冲区内容清空,但是因为写时拷贝的存在,所以才会造成刷新两次相同的数据。而系统调用打印的数据只有一次的原因是系统调用写入数据是直接写入操作系统,一旦数据写入操作系统,数据就和进程无关了。

通过对上述内容的了解,我们可以回顾一下printf和scanf函数,scanf又叫格式化输入,printf叫格式化输出。键盘和显示器都是字符设备,其实我们无论是从显示器还是键盘上输入时,都是以字符的方式进行的。但是我们可以通过这两个函数从缓冲区读取或输出数据,并格式化成对应的数据类型。

以上就是全部内容,文章如有不对之处,还望各位大佬指正,谢谢!!!

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

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

相关文章

【C++】————类与对象(上)-基础知识

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 类的两种定义方式&#xff1a; 成员变量命名规则的建议&#xff1a; 4.类的访问限定符及封装 4.1 访问限定符 ​编辑 【面试题】问题&#xff1a;C中struct和class的区别是什么&#xff1f; 4.2 封装 【面试…

VPN方案和特点

VPN方案和特点 VPN&#xff0c;或者称为虚拟专用网络&#xff0c;是一种保护你的在线安全和隐私的技术。它可以创建一个加密的连接&#xff0c;使你的在线活动对其他人不可见。以下是一些常见的VPN协议和它们的特点&#xff1a; 开放VPN (OpenVPN)&#xff1a;这是一种极为可…

基于SSM的“学生网上请假系统 ”的设计与实现(源码+数据库+文档)

基于SSM的“学生网上请假系统 ”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 主页界面 登录界面 班级信息添加界面 院系信息…

(2024,KAN,MLP,可训练激活函数,样条函数,分层函数)Kolmogorov–Arnold 网络

KAN: Kolmogorov–Arnold Networks 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. KAN 2.1 KA 表示定理 2.2 KAN 架构 2.3 KAN 的逼近能力和缩放定律 2.4 对于…

【JS面试题】闭包

一、自由变量 在学习闭包之前&#xff0c;首先了解一下什么是自由变量&#xff1a; 一个变量在当前作用域&#xff08;比如函数内&#xff09;没有定义&#xff0c;但是被使用了&#xff0c;这个变量就是自由变量。在定义该函数的位置&#xff0c;向上级作用域&#xff0c;一…

C++笔试强训day20

目录 1.经此一役小红所向无敌 2.连续子数组最大和 3.非对称之美 1.经此一役小红所向无敌 链接 简单模拟即可。 需要注意的是&#xff1a; 除完之后有无余数&#xff0c;若有&#xff0c;则还可以再挨一次打。 #include <iostream> using namespace std; #define in…

离散化(算法竞赛)

Ⅰ 离散化简介 离散化&#xff1a;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 适用范围&#xff1a;数组中元素值域很大&#xff0c;但个…

imx91的uboot编译

一、准备操作 下载半导体厂家的uboot源码 如这里我要下载的是imx91的恩智浦linux芯片bootloader 进入半导体厂家官网 下载源码&#xff0c;略 更新linux源&#xff0c;这里我是替换成清华源 vi /etc/apt/sources.list deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ fo…

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译&#xff1a;在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…

分布式版本控制工具 - Git

文章目录 1. 概念介绍2. 客户端2.1 介绍2.2 仓库操作2.3 文件操作2.4 分支原理与操作2.5 标签2.6 远程仓库2.7 README与IGNORE 3. IDEA集成4. 版本号4.1 介绍4.2 文件操作4.2 分支操作 5. 命令5.1 介绍5.2 仓库操作5.3 文件操作5.4 分支操作5.5 标签操作5.6 远程仓库 1. 概念介…

关于Hash表,你不得不知道的知识点

定义&#xff1a; 哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&#xff0c;也称为hash函数&#xff0c;存放记录的数组叫做散列表。…

map 和 set 的介绍和简单使用

目录 1. 序列式容器和关联式容器 2. 键值对 2.1. make_pair 3. 树形结构的关联式容器 3.1. set (Key 模型) 3.1.1. std::set::find 和 std::set::count 3.2. map (Key-Value 模型) 3.2.1. std::map::insert 3.2.2. std::map::operator[] 3.3. multiset 3.4.1. std::…

Multisim 14二极管及其电路的应用

multisim multisim&#xff0c;即电子电路仿真设计软件。Multisim是美国国家仪器&#xff08;NI&#xff09;有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0…

周末可以做什么副业?

周末可以做很多种副业&#xff0c;具体可以根据个人兴趣和技能来选择。以下是一些常见的周末副业推荐 1. 线上销售 可以开设自己的网店&#xff0c;销售自己制作的产品、代理热门商品或者利用二手交易平台售卖闲置物品。 2. 做任务 空闲时间可以选择做的是百度的黑鲨阁&…

^_^填坑备忘^_^C#自动化编程实现STK+Exata对卫星互联网星座进行网络仿真

C#实际选择 STK11版本 or STK12版本的问题备注。 【C#自动化客户端调用STK时&#xff0c;实际选择 STK11版本 or STK12版本 的调试运行备注】 以下代码“更新并重新打包备份为”〔testSTKQualNetInterface备份08.1_★避坑★【种子卫星&#xff1a;天线直接安装在卫星上&#…

【刷题篇】滑动窗口(二)

文章目录 1、水果成篮2、找到字符串中所有字母异位词3、串联所有单词的子串4、最小覆盖子串 1、水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多…

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意&#xff1a;此种方式如果在远程服务器上的JupyterLab上运行&#xff0c;可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键&#xff0c;之后关闭所有窗口 cv2.w…

Jsp+Servlet实现图片上传和点击放大预览功能(提供Gitee源码)

前言&#xff1a;在最近老项目的开发中&#xff0c;需要做一个图片上传和点击放大的功能&#xff0c;在Vue和SpringBoot框架都有现成封装好的组件和工具类&#xff0c;对于一些上世纪的项目就没这么方便了&#xff0c;所以需要自己用原生的代码去编写&#xff0c;这里分享一下我…

MySQL性能优化(提升数据库性能的措施)

万物皆有裂痕&#xff0c;那是光照进来的地方。大家好&#xff0c;今天给大家分享一下关于MySQL性能优化&#xff0c;在处理大型数据集和高负载情况下&#xff0c;MySQL数据库的性能优化是至关重要的。通过合理的调优策略&#xff0c;可以有效提高数据库的响应速度和稳定性。本…