【muduo】关于自动增长的缓冲区

news2025/1/16 11:15:33

目录

  • 为什么需要缓冲区
  • 自动增长的缓冲区
  • buffer数据结构
    • buffer类

写详细比较费时间,就简单总结下。

总结自Linux 多线程服务端编程:使用 muduo C++ 网络库

Muduo网络编程:
IO-multiplex+non-blocking

为什么需要缓冲区

Non-blocking IO 的核心思想是避免阻塞在 read() 或 write() 或其他 IO 系统调
用上,所以应用层的缓冲是必须的,每个 TCP socket 都要有 input buffer
和 output buffer。

自动增长的缓冲区

一方面希望减少系统调用,所以缓冲区越大越好
另一方面希望减少内存占用,如果缓冲区很大而连接很多,将会占用大量内存空间。而大多数时候缓冲区的使用率又很低。

buffer数据结构

在这里插入图片描述

buffer类

Muduo Buffer的size()是自适应的,一开始的初始值是1k。

抽取相关代码:

class Buffer:public muduo::copyable{
 public:
  static const size_t kCheapPrepend = 8;
  static const size_t kInitialSize = 1024;

  explicit Buffer(size_t initialSize = kInitialSize)
    : buffer_(kCheapPrepend + initialSize),
      readerIndex_(kCheapPrepend),
      writerIndex_(kCheapPrepend){...}
      ...
      
      std::vector<char> buffer_;
}

vector数组,保证了可以扩展,初始化了1k可用空间,并在头部预留了1Byte。

具体做法是,在栈上准备一个 65536 字节的 extrabuf,然后利用 readv() 来读取数据。
iovec 有两块,第一块指向muduo Buffer 中的 writable 字节,另一块指向 栈上的 stackbuf。
这样如果读入的数据不多,那么全部都读到Buffer 中去了;如果长度超过 Buffer 的 writable 字节数,就会读到栈上的 extrabuf 里,然后程序再把extrabuf 里的数据 append 到 Buffer 中。

这么做利用了临时栈上空间,避免开巨大 Buffer 造成的内存浪费,也避免反复 调用 read() 的系统开销(通常一次 readv()系统调用就能读完全部数据)。

代码相关实现:Buffer::readFd()

ssize_t Buffer::readFd(int fd, int* savedErrno)
{
  // saved an ioctl()/FIONREAD call to tell how much to read
  char extrabuf[65536];
  struct iovec vec[2];
  const size_t writable = writableBytes();
  vec[0].iov_base = begin()+writerIndex_;
  vec[0].iov_len = writable;
  vec[1].iov_base = extrabuf;
  vec[1].iov_len = sizeof extrabuf;
  // when there is enough space in this buffer, don't read into extrabuf.
  // when extrabuf is used, we read 128k-1 bytes at most.
  const int iovcnt = (writable < sizeof extrabuf) ? 2 : 1;
  const ssize_t n = sockets::readv(fd, vec, iovcnt);
  if (n < 0)
  {
    *savedErrno = errno;
  }
  else if (implicit_cast<size_t>(n) <= writable)
  {
    writerIndex_ += n;
  }
  else
  {
    writerIndex_ = buffer_.size();
    append(extrabuf, n - writable);
  }
  return n;
}

首先写buffer,写不下的写extrabuf,然后把extrabuf的写入buffer,具体函数是append。

  void append(const char* /*restrict*/ data, size_t len)
  {
    ensureWritableBytes(len);
    std::copy(data, data+len, beginWrite());
    hasWritten(len);
  }

ensureWritableBytes检查buffer是否有空余空间可以被写入,没有就vector.resize(len),扩展len。然后通过std::copy,把extrabuf上的内存copy到buffer上。最后更新writerIndex_。

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

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

相关文章

1990-2021年上市公司绿色专利和绿色使用新型申请获得分类号数据

1990-2021年上市公司绿色专利申请获得分类号数据 1、时间&#xff1a;1990-2021年 2、来源&#xff1a;国家知识产权局 3、指标&#xff1a; 绿色专利申请数量&#xff08;分A类 B类C类D类E类F类G类H类&#xff09;、绿色专利获得数量&#xff08;分A类 B类C类D类E类F类G类…

商业智能BI,如何区别联机事务处理(OLTP)和联机分析处理(OLAP)

商业智能(Business Intelligence&#xff0c;简称&#xff1a;BI)&#xff0c;又称商业智慧或商务智能&#xff0c;指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。 商业智能BI - 派可数据数据可视化分析平台 定义为下列软件工具…

容器虚拟化基础之NameSpace

“只想从这无边的寂寞中逃出来。” 一、什么是虚拟化、容器化&#xff1f; 物理机:实际的服务器或者计算机。 这是相对于虚拟机而言的对实体计算机的称呼&#xff0c;物理机提供虚拟机以硬件环境&#xff0c;有时候也称为"宿主"或"寄主"。 虚拟机: 指通过软…

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models 1. 文章简介2. 文章概括3 文章重点技术3.1 预训练Pretraining3.1.1 预训练细节3.1.2 Llama2模型评估 3.2 微调Fine-tuning3.2.1 Supervised Fine-Tuning(FT)3.2.2 Reinforcement Learning with Human Feedback(…

mysql 技术总结

一、mysql 索引&#xff08;左小右大&#xff09; 下图中为二叉树 mysql索引类型以及数据结构 BTREE结构 BTree又叫多路平衡搜索树&#xff0c;一颗m叉的BTree特性如下&#xff1a; 树中每个节点最多包含m个孩子。 除根节点与叶子节点外&#xff0c;每个节点至少有[ceil(m/2…

SSH连接阿里服务器搭建JAVA环境

远程连接ssh windows利用PowerShell远程连接ssh 1.打开PowerShell 方法1 1&#xff09;.同时按下Windows R键以弹出“运行”对话框 2&#xff09;.在框中键入PowerShell&#xff0c;然后单击OK(确定)按钮 方法2 1&#xff09;在任意目录下&#xff0c;shift右键&#…

每日一题——寻找旋转排序数组中的最小值(I)

寻找旋转排序数组中的最小值——I 题目链接 思路 首先我们以数组[1,2,3,4,5,6,7]举个例子&#xff0c;经过旋转后它无非就这两种情况&#xff1a; 情况一&#xff1a;旋转过后数组变成两段有序数列&#xff1a; 情况二&#xff1a;旋转过后数组不变&#xff0c;仍然有序&…

流量,日志分析--理论

提供资料&#xff1a; Wireshark 基本语法&#xff0c;基本使用方法&#xff0c;及包过虑规则 : https://blog.csdn.net/qq_17457175/article/det ails/53019490 ctf 常见流量分析题目类型 : https://ctf-wiki.org/misc/traffic/introduction/ windows 日志 : https://jone…

内网横向移动—ARP攻击图片捕捉数据劫持DNS劫持

内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持 1. ARP1.1. APR介绍1.1.1. ARP工作原理1.1.2. APR欺骗工作原理 1.2. 环境准备1.3. 适用场景 2. ARP断网攻击演示2.1. 使用kali进行演示2.1.1. nmap判断存活2.1.2. 安装工具2.1.3. 攻击Windows 10虚拟机2.1.3.1. 查…

VMware 16 Pro将电脑里的文件移动到虚拟机中【附带可能出现的问题和解决】

VMware 16 Pro将电脑里的文件移动到虚拟机中 1.使用VM tools 打开VM ware会出现下面的&#xff0c;直接点击安装。 点击下一步 选哪个都行 之后会重启虚拟机&#xff0c;然后就可以使用了。 我没有程序可以打开压缩包&#xff0c;显示我的虚拟机网络没法用&#xff0c;点击…

Redis实战案例26-签到功能

1. BitMap 假如用户数量为一千万&#xff0c;平均每人每年签到次数为 10 次&#xff0c;则这张表一年的数据量为 1 亿条&#xff1b; 而每签到一次需要使用&#xff08;8 8 1 1 3 1&#xff09;共 22 字节的内存&#xff0c;一个月则最多需要 600 多字节&#xff0c;如果是…

配置Arduino+ESP32走过的巨坑

项目场景&#xff1a; 前几天去淘宝买了块ESP32拿来用&#xff0c;配置Arduino最新版ESP32 2.0.11走过的巨坑。 问题描述 先安装好了ArduinoIDE最新版&#xff08;教程里介绍去官网下&#xff09;&#xff0c;然后配置ESP32开发板&#xff0c;后面发现安装速度惊人。 去找加速…

SpringBoot项目(验证码整合)——springboot整合email springboot整合阿里云短信服务

目录 引出springboot整合email配置邮箱导入依赖application.yml配置email业务类测试类 springboot整合阿里云短信服务申请阿里云短信服务测试短信服务获取阿里云的accessKeyspringboot整合阿里云短信导包工具类 总结 引出 1.springboot整合email&#xff0c;qq邮箱&#xff0c;…

分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

文章目录 01. Kafka 消费者分区再均衡是什么&#xff1f;02. Kafka 消费者分区再均衡的触发条件&#xff1f;03. Kafka 消费者分区再均衡的过程&#xff1f;04. Kafka 如何判定消费者已经死亡&#xff1f;05. Kafka 如何避免消费者的分区再均衡?06. Kafka 消费者分区再均衡有什…

Matlab绘制圆形(rectangle函数、viscircles函数和圆的参数方程)

基于matlab绘制圆形 一、rectangle函数 对于绘制圆心坐标为&#xff08;x&#xff0c;y&#xff09;半径为r的圆形&#xff0c;函数为&#xff1a; x0; y0; r1; rectangle(Position, [x-r,y-r,2*r,2*r], Curvature, [1 1],EdgeColor, r); axis equalEdgeColor表示颜色 二、…

STM32F429IGT6使用CubeMX配置串口通信配置DMA

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置USART1引脚 4、生成工程配置 5、部分代码 /* USER CODE BEGIN 0 */ volatile uint8_t rx_len 0; //接收一帧数据的长度 volatile uint8_t recv_end_flag 0; //一帧数据接收完成标志 uint8…

42. range函数—生成器函数-更新

【目录】 文章目录 1. range( )函数是什么&#xff1f;2. 知识回顾-列表的切片3. range( )函数的语法3.1 range( )函数语法3.2 参数说明3.3 列表切片和range函数的区别 4. 实操练习4.1 参数为一个正整数4.2 参数为04.3 参数为一个负整数4.4 有2个参数4.5 有3个参数4.6 步长为负…

【Freertos基础入门】freertos任务的优先级

文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统&#xff08;RTOS&#xff09;的核心功能之一&#xff0c;它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS&…

使用关键词一站式精准搜索指定期刊或会议论文集中的论文

问题描述 如题&#xff0c;例如&#xff0c;想要找点某主题的相关文献&#xff0c;当然要看本领域权威刊物了&#xff0c;假如你想从CCF人工智能类A级期刊找点文本相似度的论文&#xff0c;逐个点开期刊主页进行搜索&#xff0c;那就有点繁琐&#xff0c;不是一站式。 解决方…

小程序商城开发制作

当开发一个商城小程序时&#xff0c;费用是一个非常重要的考虑因素。然而&#xff0c;准确回答这个问题是有一定困难的&#xff0c;因为开发商城小程序的费用取决于多个因素。以下是一些可能影响价格的主要因素&#xff1a; 1. 功能需求&#xff1a;商城小程序的复杂程度和功能…