双缓冲技术

双缓冲技术属于生产者和消费者模型的一种较好方案。

对生产者(前端)而言,要尽量做到低延迟、低CPU开销、无阻塞
对消费者(后端)而言,要做到足够大的吞吐量,并占用较少资源

一个比较经典的开源项目是muduo网络库:GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C++11

其中网络日志的部分就很好地使用了双缓冲技术。

https://github.com/chenshuo/muduo/blob/master/muduo/base/AsyncLogging.cc

muduo日志库是用双缓冲技术。基本思路是准备两块buffer:A和B, 前端负责往buffer A填数据(日志消息), 后端负责将buffer B的数据写入文件;当buffer A写满之后, 交换A和B, 让后端将buffer A的数据写入文件, 而前端则往buffer B填入新的日志消息, 如此往复。

  使用两个buffer的好处是在新建日志消息的时候不必等待磁盘文件操作,也避免每条新日志消息都触发后端日志线程。换句话说,前端不是将一条条日志消息分别送给后端,而是将多条日志消息拼接成一个大的buffer传送给后端,相当于批处理,减少了线程唤醒的开销。
 

实际上实现如下:
 

在后端设置一个已满缓冲队列(Buffer1~n,2<=n<=16),用于缓存一个周期内临时要写的日志消息。

这样做到好处在于:
1)线程安全;2)非阻塞。

这样,2个buffer在前端写日志时,不必等待磁盘文件操作,也避免每写一条日志消息都触发后端线程。

异常处理:
当一个周期内,产生过多Buffer入队列,当超过队列元素上限数量值25时,直接丢弃多余部分,并记录。

ref:

muduo网络库学习——日志系统 - 只取一瓢饮 - 博客园

muduo笔记 日志库(一) - 明明1109 - 博客园

muduo笔记 日志库(二) - 明明1109 - 博客园

muduo网络库:17---高效的多线程日志之(多线程异步日志、其他方案)_mb6128aabee41d4的技术博客_51CTO博客

双缓冲异步日志(Async Logging)_~青萍之末~的博客-CSDN博客

muduo网络库:16---高效的多线程日志之(日志概述、功能需求、性能需求)_mb6128aabee41d4的技术博客_51CTO博客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值