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

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

阅读 397
评论
    1 个回答
    • 489
    • 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...

      撰写回答

      登录后参与交流、获取后续更新提醒

      相似问题
      推荐文章