笔者最近在跟着陈硕大佬的树和源码仿写muduo。于是决定记录一些具体的细节,这里就是“开篇”之作,至于错误和不足还请大家多担待。能否坚持写下去,也未可知:)。
One loop per thread的编程模式
muduo使用这个模式来进行io的管理。具体来说,就是在一个线程中有一个死循环,进行io操作。假如说有许多socket需要io,则在死循环中利用epoll或者poll进行多路复用,然后处理每个socket,如下图。但是我们假设一种情况,有成千上万的socket需要io,这是可能一个线程的死循环就无法兼顾了,这时我们需要利用多线程的技巧,充分利用多核cpu的潜能。
muduo中的多线程
muduo中的多线程模型,是利用线程池进行的。对于io密集型任务,使用EventloopPool,而对于普通的cpu密集型任务则使用ThreadPool.这两者的主要区别是,EventloopPool中是Eventloop的池子,每次从中捞取的都是Eventloop;而ThreadPool则是普通的循环,没有epoll等io复用的开销,更适合cpu任务。接着上面的说,加入一个eventloop不够用来io的,我们可以利用线程池,多创建几个io线程,于是整体的运行模型就像下面这样。
muduo中的channel
连接好的socket可以视作是文件描述符进行管理。而muduo中的Channel就是为了一个文件描述符而被抽象出来的。我们只要记住一个Channel仅管理一个文件描述符就可以了。于是一个Eventloop就变成了下面的形式: