双缓冲技术
双缓冲技术属于生产者和消费者模型的一种较好方案。
对生产者(前端)而言,要尽量做到低延迟、低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网络库:17---高效的多线程日志之(多线程异步日志、其他方案)_mb6128aabee41d4的技术博客_51CTO博客
双缓冲异步日志(Async Logging)_~青萍之末~的博客-CSDN博客
muduo网络库:16---高效的多线程日志之(日志概述、功能需求、性能需求)_mb6128aabee41d4的技术博客_51CTO博客