[Linux]缓冲区

一、概念

缓冲区,也称为缓存,是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,用来缓冲输入或输出的数据。这个保留的空间称为缓冲区。

缓冲区的主要作用就是提高效率:

  • 提高使用者的效率(将数据交给缓冲区后就认为把数据发完了)
  •  提高发送的效率(积累一部分数据后再统一发送(刷新策略:行刷新、全刷新等))

二、刷新方案 

 缓冲区由于能够暂存数据,必定要有一定的刷新方式:

一般策略:

  1. 无缓冲(立即刷新)
  2. 行缓冲(行刷新)
  3. 全缓冲(缓冲区满了,再刷新)
  4. ······

特殊情况:

  1. 强制刷新
  2. 进程退出时,一般需要进行刷新缓冲区

注:

一般对于显示器文件,我们的缓冲策略是行缓冲(行刷新)。

一般对于磁盘上的文件,我们的缓冲策略是全缓冲(缓冲写满,再刷新)。

三、用户缓冲区(语言级缓冲区)

1.

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


int main()
{
  printf("C: printf\n");
  fprintf(stdout, "C: fprintf\n");
  const char* str = "system call: write\n";
  write(1, str, strlen(str) );

  return 0;
}

2.

我们可以看到,在fork一个子进程后,运行结果就改变了:

对于fork不了解的同学,可以查看该篇博客学习:

fork

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


int main()
{
  printf("C: printf\n");
  fprintf(stdout, "C: fprintf\n");
  const char* str = "system call: write\n";
  write(1, str, strlen(str) );


  fork();
  return 0;
}

我们知道fork之后的子进程并不会从头开始执行代码,而是从fork时的代码开始执行。那么为什么会出现fork之前的代码的输出语句出现两次的情况呢?

  • 当我们直接向显示器打印的时候,显示器文件的刷新方式是行刷新, 而且代码输出的所有字符串都带有“\n”,说明数据全部已经被刷新,包括系统调用system call。
  • 当我们进行输出重定向到log.txt,本质是向磁盘文件中写入(而不是显示器),所以我们系统对于数据的刷新方式已经由行刷新变成了全缓冲
  • 全缓冲意味着缓冲区变大,实际写入的数据不足以把缓冲区写满,那么fork执行的时候,数据依旧在缓冲区中。
  • 我们所谈的“缓冲区”(用户缓冲区),和操作系统是没有关系的,只和C语言本身有关。我们日常用得最多的其实是C/C++提供的语言级别的缓冲区。
  • C/C++提供的缓冲区,里面一定保存的是用户的数据,属于当前进程在运行时自己的数据。如果我们把数据交给了操作系统,那么这个数据就属于操作系统,和进程没关系了。
  • 当进程退出时,一般要进行刷新缓冲区,即使数据没有满足刷新条件!
  • 刷新缓冲区属于“清空”/"写入"操作,上面的缓冲区是属于进程自己的数据,fork时数据还在,fork后不管是父子进程总有一个进程先退出,则总有一个先刷新,那么就总有一个先进行类似于“清空”或“写入”,而父子进程默认情况下数据共享,一方写入则发生写时拷贝,所以我们的数据出现了两份。( fork立马退出,任意一个进程在退出的时候,刷新缓冲区,就要发送写时拷贝)
  • write系统调用,没有使用C的缓冲区。直接写入到操作系统,不属于进程,不发生写时拷贝。

而从C缓冲区写入操作系统的这个工作叫做刷新。 

注: 

我们已知:任何情况下,我们输入输出的时候,都要有一个FILE,FILE是一个结构体,FILE里面包含了fd。

如果对fd不了解的同学,可以参考:文件描述符fd

此外,FILE结构体里面也包含了缓冲区。 

任何一个文件都要在C标准库中通过FILE来创建一个属于它自己的文件级别的用户级缓冲区。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA SDK 整合 AI 大语言模型

目前主流模型厂商的 SDK 并没有很好的支持 JAVA 环境&#xff0c;主流还是使用的 Python &#xff0c;如果希望将 AI 功能集成到业务中来&#xff0c;则需要找找有没有一些现成的开源项目&#xff0c;但是这种项目一般需要谨慎使用&#xff0c;以防有偷取 app_key 等风险问题 前…

初阶 《操作符详解》 8. 逻辑操作符

8. 逻辑操作符 &&   逻辑与 ||   逻辑或 逻辑与和或的特点&#xff1a; &&左边为假&#xff0c;右边就不计算了 || 左边为真&#xff0c;右边就不计算了 例&#xff1a;360笔试题 #include <stdio.h> int main() {int i 0, a 0, b 2, c 3, d 4…

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因&#xff1a; 1.文件编码不一致&#xff1a;如果文件的编码方式与IDEA设置的编码方式不一致&#xff0c;就会产生乱码。确保文件和IDEA使用相同的编码&#xff0c;通常是UTF-8。2.IDEA设置问题&#xff1a;检查IDEA的全局编码设置和项目编码设置是否正确。3.终端…

Springboot整合Mongodb(含使用案例)

基础语法 插入 插入单条 // 插入一条数据到 "Books" 集合 db.Books.insertOne({title: "如何使用MongoDB",author: "IT小辉同学",year: 2023 })插入多条数据 // 插入十条数据到 "Books" 集合 db.Books.insertMany([{ title: "…

GitHub星标破千!斯坦福大学的284个机器学习小抄(漫画中文版)

说到人工智能必然要了解机器学习&#xff0c;从信息化软件&#xff0c;到电子商务&#xff0c;然后到高速发展互联网时代&#xff0c;到至今的云计算、大数据等&#xff0c;渗透到我们的生活、工作之中&#xff0c;在互联网的驱动下&#xff0c;人们更清晰的认识和使用数据&…

【事件总线】EventBus

文章目录 概述如何使用如何发布消息如何进行消息监听 来源 概述 事件总线是对发布-订阅模式&#xff08;观察者&#xff09;的一种实现&#xff0c;是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&#xff0c;达到一种解耦的目的。 …

Maven下载安装、环境配置(超详细)(包括Windows、IDEA)

目录 一、引言 二、下载和安装 Maven &#xff08;1&#xff09;首先保证 Java 的环境是正常的。 1、电脑桌面上右击 " 此电脑 "&#xff0c;点击属性。 2、点击高级系统设置。 3、点击环境变量。 4、找到系统变量中的 Path。 5、点击新建&#xff0c;然后把…

Jmeter插件管理器,websocket协议,Jmeter连接数据库,测试报告的查看

目录 1、Jmeter插件管理器 1、Jmeter插件管理器用处&#xff1a;Jmeter发展并产生大量优秀的插件&#xff0c;比如取样器、性能监控的插件工具等。但要安装这些优秀的插件&#xff0c;需要先安装插件管理器。 2、插件的下载&#xff0c;从Availabale Plugins中选择&#xff…

论文翻译 | SELF-RAG: 学习通过自我反思来检索、生成和评估

Akari Asai, Zeqiu Wu, Yizhong Wang, Avirup Sil, Hannaneh Hajishirzi 华盛顿大学&#xff0c;IBM人工智能研究院 摘要 尽管大语言模型&#xff08;LLMs&#xff09;具有非凡的能力&#xff0c;但是它们经常产生不符合事实的响应&#xff0c;因为它们只依赖于它们封装的参数…

MySQL字典数据库设计与实现 ---项目实战

软件准备✍&#xff1a;Mysql与Navicat可视化命令大全 ----项目实战 文章前言部分 目录 一.摘要 二.设计内容 三.项目实现 一.摘要 本项目关注于字典数据库表结构的设计和数据管理。通过现有的sql文件&#xff0c;实现system_dict_type和system_dict_data两个数据表。随后…

汽车信息安全硬件讨论:SE vs HSM

目录 1.什么是Secure Element 2.芯片内置HSM和SE 3.未来HSM的发展 现在的智能网联汽车看起来像是一个连接万物的智能移动终端&#xff0c;它不仅可以与OEM云服务器通信接收OTA推送&#xff0c;还可以与手机蓝牙、Wifi交互完成远程汽车解锁、座舱内环境设置等等&#xff0c;借…

2024年通信技术与计算机科学国际学术会议(ICCTCS 2024)

2024年通信技术与计算机科学国际学术会议&#xff08;ICCTCS 2024&#xff09; 2024 International Academic Conference on Communication Technology and Computer Science&#xff08;ICCTCS 2024&#xff09; 会议简介&#xff1a; 2024年通信技术与计算机科学国际学术会议…

2023年零信任落地关键词:整合、身份、普及

2023年&#xff0c;全球企业纷纷加快了落地零信任的步伐。虽然落地的功能、落地的场景不尽相同&#xff0c;但企业对零信任的诉求、落地零信任的优先级却殊途同归&#xff0c;不同的零信任产品的应用场景也日益明晰。 全面整合和协同运行&#xff0c;是2023年企业用户对零信任…

LVGL使用GUI Guider配置STM32界面详细笔记教程

0、说明 接着前面几篇博客对LVGL的使用和介绍&#xff0c;这篇博客主要是使用和介绍快速配置LVGL图形界面编程的工具&#xff0c;GUI Guider。本文使用的工程代码&#xff0c;均是基于前几篇博客的基础上的&#xff0c;如需下载已配置好的LVGL-MCU工程环境&#xff0c;可通过如…

ANSYS Electronics 电磁场仿真工具下载安装,ANSYS Electronics强大的功能和灵活性

ANSYS Electronics无疑是一款在电磁场仿真领域表现卓越的软件工具。它凭借强大的功能和灵活性&#xff0c;帮助用户在产品设计阶段就能精确预测和优化电磁场性能&#xff0c;从而极大地降低了实际测试成本&#xff0c;并显著提升了产品的可靠性。 这款软件不仅在电子设计领域有…

标准立项 | 温室气体排放核算与报告要求 废油资源化企业

国内由于现有的废油再生企业规模较小&#xff0c;承担社会责任能力不强&#xff0c;在技术创新尤其是需要通过工程基础研究解决关键科技问题的创新积极性不高&#xff0c;由于经济成本的原因&#xff0c;多采用较落后的加工工艺&#xff0c;没有对废油中的特征污染物及毒害组分…

智慧在线医疗在线诊疗APP患者端+医生端音视频诊疗并开处方

智慧在线医疗&#xff1a;音视频诊疗新纪元 &#x1f310; 智慧医疗新篇章 随着科技的飞速发展&#xff0c;智慧医疗正逐步走进我们的生活。特别是在线医疗&#xff0c;凭借其便捷、高效的特点&#xff0c;已成为许多患者的首选。而其中的“智慧在线医疗患者端医生端音视频诊疗…

Databend 开源周报第 149 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持递归公共表…

Python数据分析-运用机器学习的方法对保险反欺诈的预测分析

一、研究背景及意义 保险欺诈不仅会造成暂时性的损失、增加公司的运营管理难度&#xff0c;而且对于合法的消费者来说负担了本不属于自身承担的风险&#xff0c;损害了其合法权益。因此&#xff0c;提高对车险欺诈的识别率并据此形成防范对策对提高保险公司的利润与维护消费者…

VERYCLOUD睿鸿股份亮相亚马逊云科技中国峰会2024

5月30日&#xff0c;为期两天的亚马逊云科技中国峰会在上海世博中心圆满落幕。 多位大咖现场分享&#xff0c;生成式AI时代的数据战略&#xff0c;企业级AI应用&#xff0c;最新技术、产品重磅发布&#xff0c;创新行业解决方案 …… 作为亚马逊云科技的生态合作伙伴&#x…