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.hqwc.cn/news/637858.html

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

相关文章

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09; 文章目录 【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09;一、搭建…

JAVA日志学习(上)

JUL JUL全称Java util Logging是java原生的日志框架 基础概念 Loggers&#xff1a;被称为记录器&#xff0c;应用程序通过获取Logger对象&#xff0c;调用其API来来发布日志信息。Logger通常是应用程序访问日志系统的入口程序。Appenders&#xff1a;也被称为Handlers&#xf…

Delphi开发APP时的手势处理(缩放、旋转、平移、长按等)

在使用手机时&#xff0c;少不了使用手势了&#xff0c;像滑动&#xff0c;缩放&#xff0c;长按等&#xff0c; 那么如何在Delphi开发的APP中使用手势呢&#xff1f; Delphi自带有示例&#xff0c;在下面这个目录中&#xff0c; 可以看到ImageRotation图片旋转&#xff0c;I…

Spring AI Summary

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Spring AI is a project that aims to streamline the development of AI applications by providing abstractions and reusable components that can be easily integrate…

CSS——前端笔记

CSS 1、选择器1.1、基础选择器1.2、复合选择器1.2.4、伪类选择器 1.3、属性选择器1.4、结构伪类选择器1.5、伪元素选择器 2、CSS的元素显示模式2.1、块元素2.2、行内元素2.3、行内块元素2.4、元素显示模式转换 3、字体属性3.1、font-family 字体3.2、font-size 字体大小3.3、fo…

【批量区域识别内容重命名】批量识别图片区域文字并重命名,批量图片部分识别内容重命文件,PDF区域识别提取重命名

我们在工作和生活中经常遇到这样的需求&#xff1a;比如将以下的图片区域识别进行重命名&#xff0c;批量识别后改成以时间和工作内容重命名&#xff0c;便于日后检索&#xff0c;快速查询 首先我们拍摄照片用到的是水印相机&#xff0c;这里的文字呢我们需要加个背景&#xff…

ARM与单片机有啥区别?

初学者必知&#xff1a;ARM与单片机到底有啥区别&#xff1f;1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统&#xff1f;有什么好处嘛&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教…

C语言练习——上三角矩阵

前言 今天我们来看看如何使用代码实现上三角矩阵吧。首先我们来了解一下上上三角矩阵是什么&#xff0c;上三角矩阵就是在矩阵从左上到右下的对角线之下的数组元素都为0的数组方矩阵&#xff0c;例如&#xff1a; 以一个三阶矩阵为例&#xff0c;在对角线元素之下&#xff0c;就…

【Hadoop】- YARN概述[6]

目录 一、YARN & Reduce 二、分布式资源调度 - YARN 1、资源调度 2、YARN的资源调度 总结 一、YARN & Reduce MapReduce是基于YARN运行的&#xff0c;即没有YARN “无法” 运行MapReduce程序。 二、分布式资源调度 - YARN YARN&#xff08;Yet Another Resou…

springboot是什么?

可以应用于Web相关的应用开发。 选择合适的框架&#xff0c;去开发相关的功能&#xff0c;会有更高的效率。 为什么Spring Boot才是你该学的!学java找工作必会技能!在职程序员带你梳理JavaEE框架_哔哩哔哩_bilibili java工程师的必备技能 Spring是Java EE领域的企业级开发宽…

Golang汇编之通过map地址找到value的值

文章目录 背景gdb调试Go程序为什么不用dlvgdb调试Go可执行程序gdb打印地址内容 go汇编快速入门常用的寄存器和用法AMD64ARM64loong64riscv64 Go汇编常用命令及含义Go汇编和x86的区别找到map的赋值指令 Go中map的内存布局gdb中查看map结构map的存储结构map的内存布局计算bmap偏移…

【深度学习-番外1】Win10系统搭建VSCode+Anaconda+Pytorch+CUDA深度学习环境和框架全过程

专栏的老读者们都知道&#xff0c;以前的文章以使用MATLAB的为多。 不过后续陆续开始展开深度学习算法的应用&#xff0c;就会逐渐引入Python语言了&#xff08;当然MATLAB的代码也会同步更新&#xff09;&#xff0c;这是由于在深度学习领域&#xff0c;Python应用更为广泛。…