关键算法有问题
2014-03-28
poll模型最关键的算法是如何调度线程池来处理有读写的连接,但是本书在4400位置附近只提了一句:「muduo目前采用最简单的round-robin算法来选取poll中的EventLoop...」。
为什么有问题?1、采用轮询的方法不能保证线程之间调度的公平(即使线程池采用和CPU核数相同的线程数并绑定线程到各核心上),因为有些连接可能读写频繁,有些连接则可能数据寥寥,这样有的核心很忙有的却很闲,如此CPU就未被完全利用;2、如果采用比CPU核心数多的线程,则频繁的轮询调度可能导致频繁地切换线程,性能会大受影响。
也就是说调度的基本粒度应该是每个fd的每个读或者写,而不是每个fd(上所有的读写)。
比较高效地实现应该是Windows的IOCP,不过Linux从2.6Kernel开始已经支持异步IO了,叫做Linux native AIO。