muduo仿写笔记(1)——Eventloop和Channel

笔者最近在跟着陈硕大佬的树和源码仿写muduo。于是决定记录一些具体的细节,这里就是“开篇”之作,至于错误和不足还请大家多担待。能否坚持写下去,也未可知:)。

One loop per thread的编程模式

muduo使用这个模式来进行io的管理。具体来说,就是在一个线程中有一个死循环,进行io操作。假如说有许多socket需要io,则在死循环中利用epoll或者poll进行多路复用,然后处理每个socket,如下图。但是我们假设一种情况,有成千上万的socket需要io,这是可能一个线程的死循环就无法兼顾了,这时我们需要利用多线程的技巧,充分利用多核cpu的潜能。


一个eventloop示意图

muduo中的多线程

muduo中的多线程模型,是利用线程池进行的。对于io密集型任务,使用EventloopPool,而对于普通的cpu密集型任务则使用ThreadPool.这两者的主要区别是,EventloopPool中是Eventloop的池子,每次从中捞取的都是Eventloop;而ThreadPool则是普通的循环,没有epoll等io复用的开销,更适合cpu任务。接着上面的说,加入一个eventloop不够用来io的,我们可以利用线程池,多创建几个io线程,于是整体的运行模型就像下面这样。


EventloopPool示意图

muduo中的channel

连接好的socket可以视作是文件描述符进行管理。而muduo中的Channel就是为了一个文件描述符而被抽象出来的。我们只要记住一个Channel仅管理一个文件描述符就可以了。于是一个Eventloop就变成了下面的形式:


使用channel的Eventloop
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容