【Linux】用户级缓冲区

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、缓冲区现象
  • 二、缓冲区的刷新策略
  • 三、为什么要有缓冲区
  • 四、缓冲区在哪
  • 五、缓冲区 + fork

一、缓冲区现象

以下代码使用了C语言库函数如printffprintffwrite以及系统调用接口write,它们都是向显示器文件打印相应的语句,最后在程序结束之前将显示器文件关闭。

请添加图片描述

请添加图片描述

由上图我们发现:而我们非常好奇的是,首先能保证先是调用打印语句,最后再关闭显示器文件,那么为什么调用C语言的函数没有在显示器上显示结果(重定向也一样)?而程序却打印出系统调用接口write对应的语句!

而且非常奇怪的是:以上printf等C语言库函数不是封装了系统调用write吗?按道理write打印出结果,那么C语言函数也会打印出结果呀?

因此,我们能肯定的是:数据存储在缓冲区中,只是没有被刷新出来!并且这个缓冲区一定不在操作系统内部(不是系统级缓冲区),如果在的话,printf底层调用write就把结果显示出来了。因此,这个缓冲区是用户级缓冲区

请添加图片描述

  • 当调用系统调用接口 write 时,实际上是向操作系统发出了一个写入文件的请求,而操作系统会负责将数据直接写入到文件中。此过程仍然会经过操作系统内核的缓冲区,这部分由操作系统帮我们做的。

  • printf 等接口不会直接将内容直接写入文件中,而是将数据写入到用户空间的缓冲区,然后通过一定条件,再将缓冲区的内容写入到文件中。主要是提高IO效率。

因此我们就可以解释为什么C语言接口打印不出结果的原因了:首先调用printf等接口是将数据写到用户级缓冲区了,而缓冲区正在等待条件将内容通过write写入到文件中,可是半路上遇到了close(1),即显示器文件关闭,而数据还在缓冲区没有被刷新出来,自然而然就无法在显示器上显示。

二、缓冲区的刷新策略

  • 无缓冲:直接刷新。即直接调用write接口将缓冲区的内容写在文件缓冲区(操作系统)中,如直接调用fflush函数刷新缓冲区。
  • 行缓冲:缓冲区不刷新,直到遇到'\n'才刷新缓冲区。默认向显示器文件打印的刷新策略就是行刷新。
  • 全缓冲:缓冲区不刷新,直到缓冲区满了才刷新缓冲区。向文件写入的刷新策略就是全缓冲。
  • 进程退出会强制刷新缓冲区。(特殊情况)

因此,刷新本质就是缓冲区满足某个条件后,可以通过调用write函数写入到文件中

三、为什么要有缓冲区

如果用户想要向一个文件读写数据,由于文件存储在磁盘中,那么要访问文件必定要访问磁盘。然而根据存储金字塔原理,磁盘访问的速度非常慢!若每次向文件读写一次内容,就要和磁盘进行一次IO,效率就十分低下。

因此就有了缓冲区的概念:缓冲区其实就是一段内存空间,用于存储临时数据。需要注意的是,用户级缓冲区通常是通过动态内存分配函数(如 mallocnew)在堆区分配的,大小是不固定的。

当向文件写入时,会将数组先存储到缓冲区中,当达到一定条件,才会写入到文件中。这样就可以减少对磁盘的访问,大大提高了读写效率。

感性理解:如果这个世界上没有快递公司,那么你寄东西就要亲自寄,浪费的是你的时间;而如果有快递公司,你只需要把快递交给快递公司即可,让快递公司帮你寄,转而你可以做你自己的事情。因此,你就相当于进程,而快递就相当于缓冲区。因此,缓冲区的出现大大提高了用户效率。而快递公司并不是拿到你的快递就马上派送,而是等待一定的条件(如用户加急、仓库满了等情况)才寄出。因此,缓冲区的出现可以集中处理数据,减少IO的次数

四、缓冲区在哪

以C语言为例(每个编程语言都一样),我们知道C语言中文件操作通常都是通过 FILE 结构体来进行的,因此,FILE 结构体一定包含了有关文件的信息,包括文件描述符、缓冲区等。

我们可以打开/usr/include/libio.h来看看源码

请添加图片描述

五、缓冲区 + fork

以下有一个非常有趣的代码

请添加图片描述

程序直接运行的话是这样的

请添加图片描述

但如果对进程实现输出重定向呢? 我们发现结果变成了:

请添加图片描述

我们发现:C语言调用的函数均输出了2次,而系统调用write只输出了一次。为什么呢?这肯定和fork有关!

  • 当程序运行时,是直接向显示器文件写入,而写入显示器文件的刷新策略是行缓冲,即遇到\n就会刷新。

  • 当重定向到普通文件时,C库函数写入文件由行缓冲变为全缓冲,因此虽然有\n,但全缓冲的特点是缓冲区满了才会刷新(无视\n)。

  • fork()系统调用会创建一个子进程,该子进程是父进程的副本,所以在fork()之后,子进程会与父进程共享相同的内存空间。这意味着fork()调用后,子进程会继承父进程的用户级缓冲区。当子进程退出时,强制刷新用户层缓冲区[子进程],此时会触发写时拷贝机制;当父进程结束后,强制刷新用户层缓冲区[父进程],因此,C语言调用的函数均输出了2次。而write只打印了一份,也证明了它不经过用户级缓冲区。

请添加图片描述

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

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

相关文章

微服务项目收获和总结---第4天(文章审核和保存)

文章审核以及APP端保存文章 业务流程: App端保存接口: 数据库表详情 文章的基本信息表:id,标题,作者id,频道id...... 文章的权限/配置表:存储文章是否可以评论,是否上架&#xff…

开源实用!猫抓媒体嗅探浏览器插件

CatCatch:网络资源,一触即发 - 精选真开源,释放新价值。 概览 CatCatch是一个专为浏览器设计的资源嗅探扩展,旨在帮助用户轻松捕获和分析网页中的各种资源。无论是视频、音频还是其他类型的文件,猫爪都能提供直观的界…

在XP/Vista系统下使用Node.js的babel-cli命令行工具转码ES6语法的js文件,让IE8浏览器也能运行

在XP系统下IE浏览器最高只能装到IE8,在Vista系统下最高只能装到IE9。 2015年以后,JavaScript新增了很多语法,比如class、extends,还有let和const等等,这些语法都是XP下的终端浏览器IE8所不支持的。要想让使用了这些新式…

AI爆文写作:关注热点,提前埋伏好关键词,吃系统的热点推荐,吃搜索流量,让你的文章直接爆了!

做内容,要对热点敏感。 小米汽车的发布会时间,我们是不是提前就知道,发布会前,大家最关注的就是价格。 你看这个相关关键词搜索,10W太多了。 我看到有博主在发布会前,埋伏了一篇,公众号也有推…

读人工智能时代与人类未来笔记13_网络57

1. jun背控制 1.1. 威慑的目的是通过威胁发动盒站来防止盒站 1.2. jun背控制的目的是通过限制甚至废除57(或57类别)本身来防止盒站真 1.2.1. 与盒不扩散相配合,以一整套详尽的条约、技术保障措施、监管和其他控制机制为支撑,所…

B站pink老师CSS学习(二)

文章目录 一、emmet语法1.快速生成HTML结构语法 二、复合选择器1.什么是复合选择器2.后代选择器3.子选择器4.并集选择器5.伪类选择器6.链接伪类选择器7:focus伪类选择器8.总结 三、元素的显示模式1.什么是元素显示模式2.块元素3.行内元素4.行内块元素5.总结6.元素显…

08.1.jenkins安装方法

安装 配置官方下载源 #配置jenkins源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key下载jak、jenkins服务 #下载jdk11环境,并且配置yu…

C++ | Leetcode C++题解之第110题平衡二叉树

题目: 题解: class Solution { public:int height(TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || abs(leftHeight - rightH…

10.3.k8s的附加组件-图形化管理工具dashboard

目录 一、dashboard介绍 二、部署安装dashboard组件 1.下载dashboard本地文件 2.修改nodeport的端口范围 3.创建和查看dashboard 4.电脑浏览器访问测试 5.token登录方式登录dashboard 5.1.查看dashboard的token 5.2.继续查看用户token的secrets资源详细信息 5.3.复制…

【Linux】icmp_seq=1 Destination Host Unreachable

执行ping 命令提示:From 192.168.XX.XX icmp_seq1 Destination Host Unreachable 这个错误消息通常表示以下几种情况之一: 网络连接问题:目标主机可能没有连接到网络,或者网络中的某个路由器无法将数据包转发到目标主机。 目标主…

软考--软件设计师-刷题总结

一、数据结构 贪心算法 归并排序将问题先分解、再处理、再合并的方式采用了分治法的思想 分治法:将一个大问题分成若干个小问题 希尔排序: 定义一个 i 变量指向这一组的第二个数据,定义一个 j 变量指向 i - gap 的位置。 将 i 下标的值放到…

那些网络安全上的事实,很多人不见得知道!

明月发现不少小白对网络安全的认知几乎为零,甚至明月还碰到一个说 VPN 能彻底隐匿自己的,至于现在这帮动不动就利用 DDos/CC 攻击被人网站来推销境外高防服务器、高防 CDN 的老鼠屎们更是网络安全知识白痴的水平,破坏和攻击的水平完全取决于能…

mac版本Phpstudy本地环境安装Discuz教程【2024】

此方法适用于m1版本的mac版本Phpstudy本地环境安装Discuz,当然同样使用更高版本的mac端。网上各种安装教程参差不齐,根本解决不了小白的入门需求,以下是最新且直接明了的安装教程。 Phpstudy本地环境安装Discuz教程: 1、安装Phps…

c++ vector实现出现的一些问题

目录 前言: 浅拷贝问题: typename指定类型: 前言: 最近学习了c vector的使用,然后也自己实现了一下vector的部分重要的功能。然后在其中出现了一些问题,在这就主要记录一下我解决哪些bug。 浅拷贝问题: 在实现res…

2024年顶级算法-黑翅鸢优化算法(BKA)-详细原理(附matlab代码)

黑翅鸢是一种上半身蓝灰色,下半身白色的小型鸟类。它们的显著特征包括迁徙和捕食行为。它们以小型哺乳动物、爬行动物、鸟类和昆虫为食,具有很强的悬停能力,能够取得非凡的狩猎成功。受其狩猎技能和迁徙习惯的启发,该算法作者建立…

PS —— 精修图像

PS —— 精修图像 修复污点修复画笔工具修复画笔工具 美白滤镜去杂锐化加杂减淡和锐化工具 我觉得今天这篇博客,无论是男同胞还是女同胞,都要熟练掌握(哈哈哈哈…) 今天我们来学习如何精修图像,精修图像一般分为几步——修复&…

面试准备【面试准备】

面试准备【面试准备】 前言面试准备自我介绍:项目介绍: 论坛项目功能总结数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别为什么要…

shell文本三剑客——awk命令【☆】

目录 一、akw原理 二、命令格式 三、常用变量 四、awk的用法 1.输出整行内容 2.按字段输出文本内容 3.按列输出文件内容 FS变量为列分隔符 4.awk的三个模式 5. awk ‘控制语句条件 {操作}’ 文件 6.awk的数组 7.awk的应用 一、akw原理 逐行读取文本,默认…

AI爆文写作:标题需要什么?情绪炸裂,态度要激烈,行为要夸张!

现在这个传播环境下,在公域中,轻声细语,慢慢的说,无法吸引到注意,没有人搭理。 标题要需要情绪张扬,态度激烈,行为夸张,大声喧闹。 唐韧的用户群是互联网产品经理,阅读量…

基于GA遗传优化的CNN-GRU的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN-GRU模型架构 4.2 GA优化CNN-GRU流程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...........................................…