网络缓冲区的4种实现方法

本文介绍了网络缓冲区的重要性和四种实现方式:单块连续内存缓冲、环形缓冲区、环形分块缓冲和链表分块缓冲。不同方案适用于不同场景,如预估大小的小型缓冲区可选方案一或二,大型或未知大小的缓冲区则适合方案三或四。

一、概述

网络缓冲区用于缓冲待发送的数据或接收了待处理的数据,发送缓冲区可以积累一定量的数据再发送,接收缓冲区可以积累一定量的数据,解决粘包导致的没有收到完整的数据包,缓冲起来等包数据完整了再提交给业务逻辑处理。

二、实现方案

根据我的经验,这里将介绍四种实现机制,包括单块连续内存缓冲,环形缓冲,环形分块缓冲,链表分块缓冲。

1. 单块连续内存缓冲
单块连续缓冲是最简单地实现机制。这种方案采取一块连续的内存来作为缓冲区,随着数据的写入和读取,有效数据块会逐渐往后移动,在合适的时机把整块有效数据移动到头部。如果整块内存都被写完,也可以新分配一块更大内存,并把老的块上数据拷贝过来,并释放掉老的块,具体的实现,看下图。
在这里插入图片描述

2. 环形缓冲区
环形缓冲区也是一块连续内存,与第一种方案的区别是end到达内存块尾部时,end可以移动到块的头部,可以无限接近start,但不会超过start。相比第一种方案,当数据写到内存块得的尾部时,不需要拷贝整块有效数据到头部。如果环形缓冲区是固定大小,支持一个线程读,另一个线程写的无锁操作。
在这里插入图片描述
3. 环形分块缓冲
分块环形缓冲也采用了环形结构,不过环形的每个元素不是一个字节,而是一个内存块(每个内存块可以是固定大小,方便做内存池,也可以采用不同的大小)。没有内存块可写入的时候,会分配一个内存块,当一块内存上的数据都被读取的,可以释放掉这个内存块。这种实现避免了单块内存的最大内存限制(不能超过2G),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值