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

发布于 2022-09-12 02:50:21 字数 189 浏览 28 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水水月牙 2022-09-19 02:50:21
  • 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...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文