Tomcat 中 NIO 和 BIO 的根本区别是什么?
What is fundamental difference between NIO and BIO in Tomcat?
在 Tomcat 中设置 NIO 连接器后,我们有 N 个池线程和 M 个工作线程。
通过设置 BIO 连接器,我们可以在线程池中拥有 N*M 个线程。那么两个连接器之间的区别是什么?
在 BIO 中,每个新连接都从连接器线程池中分配一个线程,并且该线程一直分配给该连接,直到连接关闭。这意味着线程在请求之间长时间处于空闲状态(即在 HTTP 保持活动期间)。
在 NIO 中,每个新连接都传递给 Poller。当连接上有数据要处理时,会通知 Poller 线程。然后轮询器从连接器线程池中为连接分配一个线程,并且该线程一直分配给该连接,直到所有数据都已 read/written。然后将连接传递回轮询器,以便轮询器可以监视更多数据。
简而言之,这使得 NIO 更具可扩展性。 BIO 要求线程池中有一个线程用于每个连接。 NIO可以比BIO维护更多的连接,并且对于每个并发处理的请求只需要线程池中的一个线程。
在 Tomcat 中设置 NIO 连接器后,我们有 N 个池线程和 M 个工作线程。
通过设置 BIO 连接器,我们可以在线程池中拥有 N*M 个线程。那么两个连接器之间的区别是什么?
在 BIO 中,每个新连接都从连接器线程池中分配一个线程,并且该线程一直分配给该连接,直到连接关闭。这意味着线程在请求之间长时间处于空闲状态(即在 HTTP 保持活动期间)。
在 NIO 中,每个新连接都传递给 Poller。当连接上有数据要处理时,会通知 Poller 线程。然后轮询器从连接器线程池中为连接分配一个线程,并且该线程一直分配给该连接,直到所有数据都已 read/written。然后将连接传递回轮询器,以便轮询器可以监视更多数据。
简而言之,这使得 NIO 更具可扩展性。 BIO 要求线程池中有一个线程用于每个连接。 NIO可以比BIO维护更多的连接,并且对于每个并发处理的请求只需要线程池中的一个线程。