【lesson36】缓冲区的认识

news2024/9/22 19:38:39

文章目录

  • 缓冲区的认识

缓冲区的认识

上次我们已经介绍了缓冲区的刷新策略,并且遇到了一个问题,这次我们就继续延续上次的话题。
一般而言行缓冲的设备文件-------显示器文件
一般而言全缓冲的设备文件-------磁盘文件

所有设备永远倾向于全缓冲!—>缓冲区满了,才刷新—>需要I/O的次数就较少—>提高了效率---->和外设进行I/O的时候,数据量的大小不是主要矛盾,我们和外设预备I/O的过程才是最耗费时间的!

那么显示器为什么是行刷新?因为显示器是直接给用户看的,一方面要照顾效率,一方面要照顾用户体验

极端情况下,用户可以自定义刷新规则。

回答之前遇到的问题。
在这里插入图片描述
在这里插入图片描述
我们看到同一个程序,向显示器打印输出了4行文本。
用重定向的方法向普通文件(磁盘上的)打印的时候,变成了7行。
其中
C语言:每个接口打印2次
OS:每个接口打印1次

上篇博客我们知道是由fork引起的。但是fork之前所有代码已经执行完了啊,fork之后就应该没数据了啊,为什么还有?
因为fork之前的代码已经执行完了,但并不代表数据已经刷新了

但是我们从上面有可以知道不管有没有fork,都并不影响系统接口。
那么缓冲区是由谁维护呢?
我们可以知道缓冲区绝对不是由OS提供的。如果由OS提供提供,那么上面代码表现的现象应该一样。

在这里插入图片描述
C接口:
1.如果想显示器打印则刷新策略就是行刷新,那么最后执行fork的时候------一定是函数执行完了 并且 数据一定是被刷新了。----则fork就无意义了
2.如果对应程序进行了重定向,要向磁盘文件打印,那么隐形的刷新策略就变成了全缓冲,那么每行的’\n’便没有意义。
fork的时候一定是数据执行完了,但是数据还没有刷新。-----在当前进程对应的C标准库的缓冲区!

这部分的数据是不是父进程数据?是的。
那么刷新策略是不是写入的过程?是的。

所以fork的时候数据发生了写时拷贝,所以数据打印了2次。

C标准库给我们提供的用户级缓冲区!还有内核级缓冲区。

用户级缓冲区在哪里?
我们来看一段代码
在这里插入图片描述
在这里插入图片描述
我们看到加了fflush(stdout)重定向也变成4条了,fflush我们之前学过,就是强制刷新缓冲区。

但是为什么fflush中,只传入stdout就可以了呢?

C语言打开文件
FILE* fopen(const cahr* path,const char* mode);
我们是到FILE*指向的struct FILE 结构体一定封装了fd,但是只封装了fd吗?
不只是包含了fd,还有该fd文件对应的语言层缓冲区。

//缓冲区相关
 /* The following pointers correspond to the C++ streambuf protocol. */
 /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
 char* _IO_read_ptr; /* Current read pointer */
 char* _IO_read_end; /* End of get area. */
 char* _IO_read_base; /* Start of putback+get area. */
 char* _IO_write_base; /* Start of put area. */
 char* _IO_write_ptr; /* Current put pointer. */
 char* _IO_write_end; /* End of put area. */
 char* _IO_buf_base; /* Start of reserve area. */
 char* _IO_buf_end; /* End of reserve area. */
 /* The following fields are used to support backing up and undo. */
 char *_IO_save_base; /* Pointer to start of non-current get area. */
 char *_IO_backup_base; /* Pointer to first valid character of backup area */
 char *_IO_save_end; /* Pointer to end of non-current get area. */

所以缓冲区在C语言的FILE文件中。
C语言有缓冲区,C++也有,缓冲区在cout重载的operator<<()函数中。

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

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

相关文章

git常用一些操作

1. git status // 查看当前目录更新 2. git checkout -b <NEW_BRANCH> // 新切一个分支&#xff08;只在第一次操作的时候做&#xff0c;后面就不用做了&#xff09; 3. git pull origin <BRANCH_NAME> …

JSR303参数校验-SpringMVC

文章目录 JSR303技术标准简介JSR303标准几个具体实现框架validation-apijakarta.validation-apihibernate-validatorspring-boot-starter-validation Spring Validationjavax.validation.constraints包下提供的注解org.hibernate.validator.constraints包扩展的注解校验注解默认…

如何在个人PC的桌面创建一个类似网吧的游戏菜单并分类?

GGTools 免费的桌面图标管理器、软件菜单、游戏菜单 单机版游戏菜单、个人/家用/家庭版游戏菜单、轻量级图标收纳软件

两台电脑怎么互传文件?4个方法提高传输效率!

“我在工作时总是需要将文件传给同小组的同事&#xff0c;想问问大家有什么两台电脑互传文件的简单操作方法吗&#xff1f;希望大家教教我呀&#xff01;” 在日常生活和工作中&#xff0c;我们经常需要将文件从一台电脑传输到另一台电脑。除了传统的U盘或移动硬盘等存储设备外…

【DBF格式转换器.exe】

一、概要 DBF文件是一种数据库文件格式&#xff0c;通常用于存储表格数据。这种文件格式曾经被广泛使用&#xff0c;尤其是在一些较旧的数据库系统中。然而&#xff0c;随着时间的推移&#xff0c;其他更现代的文件格式&#xff0c;如XLS&#xff08;Excel&#xff09;、CSV、D…

深入Spring MVC的工作流程

深入Spring MVC的工作流程 在Spring MVC的面试问题中&#xff0c;常常被询问到的一个问题。Spring MVC的程序中&#xff0c;HTTP请求是如何从开始到结束被处理的。为了研究这个问题&#xff0c;我们将需要深入学习一下Spring MVC框架的核心过程和工作流程。 1. 启动请求生命周…

代码随想录算法训练营29期|day39 任务以及具体任务

第九章 动态规划part02 62.不同路径 /*** 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类* 2. 递推公式 dp[i][j] dp[i-1][j] dp[i][j-1]* 3. 初始化 dp[i][0]1 dp[0][i]1 初始化横竖就可* 4. 遍历顺序 一行一行遍历* 5. 推导结果 。。。。。。。。** param m* p…

Windows内存管理 - 虚拟内存地址概念(Virtual Memory Address)

虽然可以寻址4GB的内存&#xff0c;而在PC里往往没有如此多的真实物理内存。操作系统和硬件&#xff08;这里指的是CPU中的内存管理单元MMU&#xff09;为使用者提供了虚拟内存的概念。Windows的所有程序&#xff08;包括Ring0层和Ring3层的程序&#xff09;可以操作的都是虚拟…

GPT3.5\GPT4系列计算完整prompt token数的官方方法

前言: ChatGPT如何计算token数&#xff1f;https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502 GPT3.5\GPT4系列计算完整prompt token数的官方方法&#xff1…

航母编队反无人机蜂群作战能力需求分析

源自&#xff1a;指挥控制与仿真 作者&#xff1a;樊辉锦、巫银花、毕月、苏泽亚 “人工智能技术与咨询” 发布 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff…

01 JDK的安装

JDK的安装 1 JDK的安装&#xff1a;参考&#xff1a; 1 JDK的安装&#xff1a; 说到Java&#xff0c;永远都有一个绕不开的话题&#xff0c;就是JDK(Java Development Kit)。JDK 是整个Java的核心&#xff0c;包括了Java运行环境&#xff0c;Java工具和Java基础的类库。安装JD…

来了来了,5000个红包封面免费领

今年公众号很慷慨&#xff0c;给长期运营的作者免费发放了6w个红包封面&#xff0c;感谢公众号平台。 往年还是自己花钱找别人设计&#xff0c;平台审核通过后才能正常发放给大家&#xff0c;自从AI绘画工具问世后&#xff0c;自己也能设计了。 下面的两个封面都是我用AI工具St…

05、全文检索 -- Solr -- Solr 全文检索之图形界面的文档管理(文档的添加、删除,如何通过关键字等参数查询文档)

目录 Solr 全文检索之文档管理添加文档使用 JSON 添加文档&#xff1a;使用 XML 添加文档: 删除文档使用 JSON 删除文档&#xff1a;使用 XML 删除文档&#xff1a; 查询文档查询文档的详细参数fq&#xff08;Filter Query&#xff09;&#xff1a;过滤sort&#xff1a;排序sta…

隧道穿透:常规反弹、加密反弹

目录 1、常规反弹 &#xff08;1&#xff09;Windows正向连接shell &#xff08;2&#xff09;Windows反向连接shell &#xff08;3&#xff09;Linux正向连接shell &#xff08;2&#xff09;利用Linux自带bash反弹Shell 2、加密反弹 1、常规反弹 假设在内网环境中发现…

寒假 day2

1、请编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> enum{FALSE-1,SUCCESS}; typedef int datatype; //定义节点结构体 //节点&#xff1a;数据域、指针域 typedef struct Node {//数…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…

leetcode刷题(剑指offer)138.随机链表的复制

138.随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原…

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1&#xff08;网络框架&#xff09; 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点&#xff1a;网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…

使用 IntelliJ IDEA 配合 Docker 对 Weblogic 中间件进行远程调试

使用idea对jar包远程调试&#xff1a; 打开一个springboot的项目进行远程调试设置&#xff1a; 运行&#xff1a; 其实我不太明白远程调试的意义&#xff0c;本地直接debug不好嘛。。。 点击debug的按钮&#xff0c;打断点测试&#xff1a; 跑到断点处&#xff1a; 远程de…

JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …