muduo网络库中buffer的设计

本文探讨了非阻塞网络编程中应用层buffer的重要性,详细阐述了output buffer和input buffer的使用场景,并介绍了muduo buffer的设计要点,包括初始值设定和数据结构。通过栈上extrabuf的使用,实现了动态调整buffer大小以减少系统调用,同时优化内存占用。
摘要由CSDN通过智能技术生成

1.为什么非阻塞网络编程中应用层buffer是必须的

非阻塞I/O(在这里可以理解为非阻塞I/O加T/O复用)的核心思想就是避免将当前线程阻塞在I/O系统调用上,这样可以使我们的I/O线程只阻塞在I/O复用函数上(epoll_wait或poll,select)使其能够服务更多的连接socket那么如何才能做到这一点呢?这里我们就需要实现应用层的输入输出buffer

(1)什么情况下用到output buffer?

假设我们要通过TCP连接来发送100k的数据,在执行write()时,操作系统受某些因素的影响只接受了70k数据,那么由于还剩20k我们该如何处理?是等待内核腾出空间来接受余下的20k?那如果等很久杂么办?难道我们的事件循要在你的等待时间内什么都做不成么?针对以上的问题我们就可以用一个应用层的write buffer来解决,把那些暂时内核无法接受的数据先存在buffer中,然后注册POLLOUT事件,一单该socket可写了,我们就把缓存中的数据写进去,如果下次还写不完那么就继续注册POLLOUT事件下次继续写,如果buffer中的数据还没写完,程序又来了数据,那么此时的数据就应该直追加到buffer数据尾部中。有了应用层的write buffer后我们的程序就完全不用关心数据到底一次能不能发完,这些都有网络库来操心

(2)什么 情况下用到input buffer?

我们在处理socket可读事件时,必须一次把socket数据读完,否则就会反复触发POLLIN事件(这里所述针对epoll的LT模式),造成主循环busy-loop,但是话又说回来,我们如果一次把socket的数据都读完,就没法保证具体某条消息的完整性了。那么我们的网络库该杂么做呢?我们的网络库因该先把读到的内容存在input buffer中,等input buffer中有完整的消息了,在通知业务程序,这样就可提高速度

2.buffer 的功能设计

(1)muduo buffer的设计要点
.对外表现为一块连续的内存
.其大小可自动增长,以适应不断增长的消息,它不能是固定大小的buffer
.内部以std::vector来保存数据,并提供相应的访问函数
.input buffer,是程序从socket中读取数据然后写入input buffer,客户代码从input buffer读取数据
.output buffer,客户代码会把数据写入output buffer中,然后再从output buffer中读取数据并写入socket中

muduo buffer类的主要数据成员

  //vector用来保存数据
  std::vector<char
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值