Linux-缓冲区(简单理解)

1. 缓冲区是什么

缓冲区就是一段内存空间。

2. 为什么要有缓冲区

IO写入有两种:

  • 写透模式(WT) 成本高,效率低
  • 写回模式(WB) 成本低,效率高

写透模式:每次的文件写入都要立即刷新到文件所在的磁盘上,一次不论写多少大小的内容。

写回模式:先把内容存下来,存到缓冲区中,等到到了一定条件,再统一刷新到磁盘上

因为磁盘是电脑上的一个外设,也是唯一的机械设备,对其的读写速度相当慢,而内存相比磁盘是相当快的,所以如果采用写透模式,就会拖慢计算机的整体效率

写回模式采取一定的刷新策略:1.立即刷新 2.行刷新(\n),3. 满刷新,

对应的特殊情况:1. 用户强制退出, 2. 进程退出

3. 缓冲区在哪里

那么缓冲区在哪里呢?

谁提供的函数接口,谁就要提供缓冲区的实现,缓冲区在哪里也就有根据了

比如c语言的fprintf(),就有对应的缓冲区,缓冲区由c标准库提供,他会在用户空间定义一块空间作为缓冲区。准确的说,就是在FILE结构体中

操作系统的接口write也有对应的缓冲区,在内核空间。

c语言层面的缓冲区,最后还是要给内核空间的缓冲区,c++缓冲区要给c语言的缓冲区,所以一般越底层的接口,速度越快。

// 测试IO接口
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>int main()
{close(1);int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd < 0){perror("open");return 1;}printf("print\n");fprintf(stdout, "fprintf\n");fputs("fputs\n", stdout);write(fd, "write\n", sizeof "write\n");perror("perror");// fflush(stdout);// close(fd);fork();
}

 没有fflush文件log.txt的内容

fflush后文件的内容

我们发现两次打印的内容不同,其中c语言的函数接口都打印了两次,而系统的打印接口只有一次

这是为什么呢?

fork创建子进程会在用户空间上刷新的时候会发生写时拷贝,缓冲区的内容也会拷贝一份,再刷新的时候就会有两份内容,而write属于内核级的内存空间,并没有影响。

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

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

相关文章

【006期】用Processing写一个根据音乐变化的黑白格游戏

黑白格游戏 简述准备工作游戏设计实现代码注意事项优化二次优化 简述 为了创建一个简单的根据音乐变化的黑白格游戏&#xff0c;我们将利用Processing的简洁性和直观操作来实现。游戏的核心思想是&#xff1a;屏幕上呈现多个黑白格&#xff0c;随着音乐的播放&#xff0c;格子…

使用ClickHouse和Terraform进行CI/CD

本文字数&#xff1a;11047&#xff1b;估计阅读时间&#xff1a;28 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 简介 在 ClickHouse&#xff0c;我们致力于以 API 为先的开发方式来构建 ClickHouse Cloud。用户通过用户界面…

arm64-v8a和armeabi-v7a分别是什么?它们之间有什么区别

2024年4月22日&#xff0c;周一上午 arm64-v8a 和 armeabi-v7a 都是针对不同的 ARM 处理器架构的编译版本&#xff0c;它们之间的主要区别在于处理器架构和指令集。 arm64-v8a&#xff1a; arm64-v8a 是针对 ARMv8 架构的 64 位处理器的编译版本。ARMv8 架构引入了 64 位指令集…

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…

人工智能入门(一):基于Pytorch的手写数字识别模型

前言&#xff1a; 因为还在上学&#xff0c;时间不太够用&#xff0c;很多内容写到后面心有余力不足&#xff0c;未来有时间我会慢慢补充。人工智能的知识涉猎范围广又杂乱无章&#xff0c;啃书或上课学到的知识往往很早就过时了或者离实际的项目无关。所以&#xff0c;我很希…

VS调试、debug和release、栈区底层简单介绍、const 修饰指针变量介绍

文章目录 前言一、调试二、debug和release三、调试需要多用&#xff0c;多熟悉四、栈区底层简单介绍五、优秀的代码&#xff1a;常见的coding技巧: 六、const 修饰指针变量1. const 出现在 * 左边2. const 出现在 * 右边 七、strcpy函数的仿写1.版本12. 版本23. 版本34. 版本4 …

Corner case 数据处理方法

背景 特斯拉的纯视觉处理方法&#xff0c;在处理corner case的过程中&#xff0c;面对着数据量少&#xff0c;而且难以采集的问题。为了提升模型的数据量&#xff0c;通过一定的数据处理方法进行corner case的数据生成&#xff0c;不失为一种有效的办法。 "Corner case&…

Andorid进程间通信之 UNIX SOCKET

1&#xff0c;什么是UNIX SOCKET UNIX SOCKET&#xff0c;域套接字&#xff0c;UNIX SOCKET可用于同一台设备进程间通信&#xff0c;它不需要经过网络协议栈&#xff0c;不需要打包拆包、计算校验和、维护序列号应答等&#xff0c;只需要将数据从一个进程复制到另一个进程&…

高精度加法及乘法

目录 字符串的高精度加法 为什么需要高精度加法&#xff1f; 怎么进行高精度加法&#xff1f; 链表的高精度加法 翻转链表&#xff08;带虚拟头节点&#xff09; 字符串的高精度乘法 字符串的高精度加法 大数加法_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.co…

linux下查看前10最耗内存的进程

lunux查找占用内存前10的进程 1、使用Top命令查询进程 输入 top 命令&#xff0c;然后按下大写M按照内存MEM排序&#xff0c;按下大写P按照CPU排序。 2、查询占用CPU最高的前10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head 3、查询占用内存最大的前10个进程…

2024年度西安市创新联合体备案申报条件时间要求须知

一、申报条件 组建市级创新联合体需具备牵头单位、成员单位、组建协议、首席科学家等四个条件。 (一)牵头单位 1.牵头单位应为在西安市注册登记的省市产业链龙头骨干企业&#xff0c;重点支持市级重点产业链“链主”企业; 2.牵头单位一般为1家。 (二)成员单位 1.成员单位…

excel 按照姓名日期年月分组求和

excel 需要按照 姓名 日期的年份进行金额求和统计&#xff0c;采用sumifs 进行统计 注意&#xff1a;sumifs 不支持 合并列拆分计算&#xff0c;合并列只会计算一个值 表格数据大概如下&#xff1a;(sheet) ABC姓名日期金额A2023/01/01500A2023/01/151500B2023/01/01200B202…

python 调试 c++源码

1. gdb常用调试命令概览和说明 2. 编译c库设置Debug模式 cmake设置debug 在CMake中设置debug模式通常意味着启用调试信息和优化。以下是一个简单的CMakeLists.txt文件示例&#xff0c;展示了如何设置项目以便在Debug模式下构建&#xff1a; cmake_minimum_required(VERSION 3…

LeetCode 2739.总行驶距离:不模拟直接算(很好算的)——相当于“满5返1”的活动

【LetMeFly】2739.总行驶距离&#xff1a;不模拟直接算&#xff08;很好算的&#xff09;——相当于“满5返1”的活动 力扣题目链接&#xff1a;https://leetcode.cn/problems/total-distance-traveled/ 卡车有两个油箱。给你两个整数&#xff0c;mainTank 表示主油箱中的燃料…

桐乡上元——管理会计,除了跳槽,还有四个更好的晋升方式!

基于多位财务资深从业者的经验&#xff0c;对于财会人员&#xff0c;尤其是有志于从事管理会计、向管理方向发展的从业者&#xff0c;至少有以下4个方式&#xff0c;可以让自己获得提升&#xff1a; 01寻求轮岗 财务工作分工比较细&#xff0c;涉及方方面面&#xff0c;是否具备…

cad中快速计算多个矩形面积的方法

1、输入命令reg&#xff0c;选中矩形创建面域 2、输入命令uni,选中刚刚创建的面域&#xff0c;组合成一个面域 3、输入命令&#xff1a;LI &#xff0c;选中面域&#xff0c;即可查看面积和周长 需注意的一点&#xff0c;开始创建的矩形或者多段线要在一个面内&#xff0c;就是…

【动态规划】Leetcode 322. 零钱兑换【中等】

零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

docker部署mysql5.7

docker部署mysql5.7 使用docker部署mysql比较方便&#xff0c;适合开发测试使用。 创建文件夹 创建文件夹持久化容器数据&#xff0c;同时映射本地配置文件&#xff0c;方便修改 mkdir -p /home/ubuntu/mysql/datamysql的配置文件如下&#xff1a; [mysqld] # 设置字符集 …

英文阅读~ McDonald‘s buys all 225 of Israeli franchise restaurants after boycotts

McDonald’s buys all 225 of Israeli franchise restaurants after boycotts McDonald’s 是个名字&#xff0c;它买&#xff5e; 遭遇抵制后&#xff0c;麦当劳回购了以色列全部 225 家特许经营餐厅 Israeli ɪzˈreɪli 以色列的&#xff0c;以色列人的 以色列人 boycotts 抵…

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources 最近开发中&#xff0c;出现了在Debug模式下完全正常&#xff0c;打包build后出现插件代码调用提示未实现。 No implementation found for method login on channel app_plugin 经过查找发现在build apk时候出现了混淆的问…