[Linux]缓冲区

news2024/12/28 20:59:14

一、概念

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

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

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

二、刷新方案 

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

一般策略:

  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.coloradmin.cn/o/1857714.html

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

相关文章

【吊打面试官系列-Mysql面试题】NULL 是什么意思?

大家好&#xff0c;我是锋哥。今天分享关于 【NULL 是什么意思&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; NULL 是什么意思? 答&#xff1a;NULL 这个值表示 UNKNOWN(未知):它不表示“”(空字符串)。对 NULL 这个值的任何比较都会生产一个 NULL 值。您不能…

Qt项目天气预报(6) - 引入QMap: debug+更新天气图片

QMAP 解决bug (&#xff09; bug描述 由于json文件中有的地方不带市&#xff0c;有的地方带县&#xff0c;有的地方是区&#xff0c;我们匹配不上这个地方&#xff0c;我们可以使用QString进行字符串拼接来实现。 另外&#xff0c;我们之前的 getCityCodeFromName()函数写得…

使用python连接dy直播间的websocket消息,竟然一会就自动断开了

使用python的websocket创建一个客户端连接直播间的消息&#xff0c;可是过一会就自动断开了&#xff0c;使用rust尝试连接也是一样的效果&#xff0c;过一会就自动断开了&#xff0c;而且报错&#xff1a; 我们先使用python建立一个客户端试一下&#xff1a; # 导入websocket-…

免费的AI在线写作工具,让写作变的更简单

在如今的时代&#xff0c;写作已经成为了我们日常生活中不可或缺的一部分。无论是自媒体创作者、学生还是办公职场人员&#xff0c;都有内容创作的需求。然而&#xff0c;写作过程往往伴随着灵感枯竭、查找资料费时等问题。下面小编就来和大家分享几款免费的AI在线写作工具&…

桌面编辑器ONLYOFFICE 功能多样性快来试试吧!

目录 ONLYOFFICE 桌面编辑器 8.1 ONLYOFFICE介绍 主要功能和特点 使用场景 1.PDF编辑器 2.幻灯片版式 3.编辑&#xff0c;审阅和查看模式 4.隐藏连接到云版块 5.RTL语言支持和本地化选项 6.媒体播放器 7、其他新功能 8.下载 总结 ONLYOFFICE 桌面编辑器 8.1 官网地…

视频监控EasyCVR视频汇聚/智能边缘网关:EasySearch无法探测到服务器如何处理?

安防监控EasyCVR智能边缘网关/视频汇聚网关/视频网关属于软硬一体的边缘计算硬件&#xff0c;可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时…

数字人视频剪辑解决方案,个性化定制服务

如何高效、专业地剪辑出高质量的数字人视频&#xff0c;却成为众多企业面临的难题。针对这一挑战&#xff0c;美摄科技凭借其在人工智能、计算机视觉等领域的深厚积累&#xff0c;推出了面向企业的数字人视频剪辑解决方案&#xff0c;为企业带来前所未有的视频制作新体验。 一…

Spring Cloud学习:如何实现Gateway 服务网关限流

目录 一、Spring Cloud介绍二、什么是服务网关三、Gateway的优势和应用场景四、如何实现Gateway 服务网关限流 一、Spring Cloud介绍 Spring Cloud是一个基于Spring Boot的微服务架构开发工具集&#xff0c;它整合了多种微服务解决方案&#xff0c;为开发者提供了一站式的微服…

智慧协同革新工业设计,创作评审无界畅达

工业产品研发是一个结合了创意、艺术和技术的综合性行业。设计师们通过深入理解文化、市场和消费者需求&#xff0c;运用各种材料和工艺&#xff0c;创造出具有独特魅力和价值的工业产品。这个行业涵盖了从设计、制作到销售等多个环节&#xff0c;需要团队成员之间的紧密协作和…

银联支付,你竟然还不知道它怎么工作?

银联支付咱都用过&#xff0c;微信和支付宝没这么“横行”的时侯&#xff0c;我们取款、转账、付款时用的ATM机、POS机&#xff0c;都是银联支付完成的。 今天&#xff0c;就让咱们了解一下银行卡支付的工作原型。 首先&#xff0c;说说中国银联 中国银联&#xff08;China U…

如何区分应用所在的运行环境?

常见的应用运行环境主要有&#xff1a;物理机、虚拟机、容器或 K8s&#xff0c;那么如何确定应用运行在哪种未知环境下呢&#xff1f;本文主要介绍如何通过一种简单方式来判断应用当前所在的运行环境。 1 物理机 物理机和虚拟机因为都是完整的操作系统。因此可以用dmidecode来…

ETO MARKETS:美股涨势告急?通胀风暴或成市场新拐点

摘要&#xff1a; 近期美股涨势引发了市场对其可持续性的质疑。随着通胀数据的发布&#xff0c;全球利率前景可能面临新的变化。投资者需关注即将到来的通胀数据及其对市场的影响。本周的市场波动加剧&#xff0c;政治风险和经济数据共同作用&#xff0c;将为未来的市场走向提…

《计算机英语》Unit 1 Computer Overview 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译&#xff08;单词词组&#xff0c;参照课后习题&#xff09; 4、翻译2道&#xff08;一道原题&#xff0c;参照作业&#xff09; SectionA About Computer 关于计算机 algorithm n. 算法 operate v.…

华媒舍:8个使你东南亚地区媒体发稿方式

下面我们就为大家介绍8种方法&#xff0c;能够帮助你在东南亚地区的媒体发稿环节中游刃有余。无论您是一名公关人员、市场营销专家还是普通的新闻记者&#xff0c;这个方法也将对你具有协助。 1.掌握总体目标受众在东南亚地区公布媒体稿子时&#xff0c;最重要的步骤是掌握总体…

小米录屏怎么录?教你2种方法轻松录屏

“最近新换的小米手机&#xff0c;但不知道怎样打开小米手机的录屏功能啊&#xff1f;而且有没有办法能录制到手机的高清画面啊&#xff1f;谁能教教我啊&#xff1f;” 随着科技的飞速发展&#xff0c;录屏功能逐渐成为我们手机使用中不可或缺的一部分。在众多录屏工具中&…

一文搞懂Linux多线程【上】

目录 &#x1f6a9;引言 &#x1f6a9;再次理解页表 &#x1f6a9;初识线程 &#x1f6a9;线程和pthread库 &#x1f680;线程创建 &#x1f6a9;线程的资源共享问题 &#x1f6a9;线程的优缺点 &#x1f6a9;引言 今天&#xff0c;我们开始学习Linux中的线程部分。Lin…

双 μC 的 PWM 频率和分辨率

该方法是过滤 PWM 信号的 HF 分量&#xff0c;只留下与占空比成正比的 LF 或 DC 分量。然而&#xff0c;低通滤波器并不能完全滤除PWM频率&#xff0c;因此LF/DC信号一般会有一些纹波。 有两种方法可以降低 PWM DAC 的纹波。可以降低低通滤波器的截止频率&#xff0c;或者提高…

javaScript(八) 对象

}, “arm”:{ //属性名 configurable:true, //允许删除&#xff0c;允许使用defineProperty()修改属性描述符 enumerable:true, //允许被搜索到 set:function (value) { //给这个属性设置一个函数&#xff0c;注意&#xff0c;调用对象的函数的方法是xm.xarm()&#xff0c;…

MacOS - ToDesk 无法远程操控鼠标键盘解决方案

问题描述 远程后发现画面显示正常&#xff0c;但是键盘和鼠标的操作没有响应。 原因分析 可能是辅助功能没有勾选ToDesk_Session的权限。 解决方案 系统设置 - 隐私与安全性 - 辅助功能 进去后找到 ToDesk&#xff0c;开关打开&#xff0c;输入系统密码&#xff0c;重启 App …

从0构建一个录制UI测试工具

很多UI自动化测试工具都具备录制UI自动化测试的能力&#xff0c;例如playwright&#xff0c;可以通过playwright vscode插件完成录制&#xff0c;如下图所示&#xff0c;当选择录制脚本时&#xff0c;会打开一个浏览器&#xff0c;在浏览器中输入被测应用url&#xff0c;用户在…