高效的异步日志

muduo库中高效的异步日志实现主要是用了多缓冲的思想

高效的异步日志

 

 

1.在生产者端:

  在构造函数的时候添加了两个变量,分别表示现在的缓冲区和下一个备用的缓冲区

高效的异步日志

  在生产者多线程写的时候,先锁住,然后往现在的缓冲区内写,如果缓冲区满,那么将该缓冲区加到buffers中(buffers用来当中间队列的)

然后把备用的缓冲区next取出作为cur缓冲区使用。最后使用条件变量通知后端线程队列不为空。

高效的异步日志

 

 

 2.在消费者端

  先创建两个空的缓冲区以及一个最后写文件的缓冲区

  高效的异步日志

 

  然后进行加锁并且使用条件变量等待队列不为空(前端向buffers加了数据,且发送了cond_.notify();

这时候把cur全部移动到buffers中,然后在把新申请的newbuffers1移动到cur中作为新的可用cur。最后把buffers全部缓存的数据

和bufferstowrite交换,这样在后面进行文件的写操作时,对buffertowrite进行操作不会影响buffers,那么就可以不进行加锁,就可以很

高效的进行文件的写入。

 高效的异步日志

3.如何处理前端写入队列太快问题

如果bufferstowirte的size超过25,表示buffers接收了太多的日志,且还没有来得及处理,那么就丢掉多余的日志

只剩两个buffer,然后把buffertowrite中的所有的buffer写入到output中,最后把buffertowrite中的前两个空间给newbuffer1和newbuffer2

高效的异步日志

 

上一篇:【转载】Oracle startup nomount、mount


下一篇:Nginx之——web网站图片显示过慢 超大附件不完全下载的解决方法