nio多路复用使用线程池的一个疑问?

常常会将线程池模型和多路复用模型进行对比,多路复用模型一个线程就能hold住所有链接,不需要像多线程模型那样造成线程切换,但是在真实使用多路复用模型的时候,都会搭配一个work线程池来对返回结果进行处理,多路复用只用来监听链接,那么这不就又回到多线程模型了么,这个work线程池难道不会造成上下文切换么?还是说这个work线程池的上下文切换很小和线程池大小也很小?

阅读 2.9k
1 个回答
  • java nio的实现

java nio 在 linux 是默认采用 selectpoll,或 epoll实现的,过程差不多。比如 epoll只是一组系统调用(包括epoll_create,epoll_ctl,epoll_wait),开发人员可以使用这组系统调用完成多路复用。每次epoll_wait的时候可以阻塞等待获得有事件的连接(poll_events),然后开发人员根据需要去readwrite每一个连接,此时你可以串行处理,或多线程处理,这个跟epoll没有关系。

那么问题就在于这个多线程,开发人员使用了线程池设置多少能最大限度发挥性能的问题了。

一般经验是这个线程池设置为合适的数目,减少上下文切换。

  • 线程数

针对io密集型,经验计算公式:线程数 = CPU核心数/(1-阻塞系数)

其中阻塞系统一般在0.8-0.9左右。

这个线程数还可以通过实际压测来确定。

  • 参考

https://segmentfault.com/a/11...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题