这篇文章将为大家详细讲解有关Tomcat NIO中epoll多路复用是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
从 linux 操作系统角度看有一个 socket 监听在某个端口,等待客户端的连接请求,我们称运行监听 socket 的线程为 acceptor thread 。
有多个客户端的连接请求过来,每个请求经过3次握手,监听线程 accept 请求,为每个连接请求在 server 端创建 socket 。
对于服务端的 socket 会尝试读取客户端发送的数据,如果客户端不发送数据,那么这个读取操作会一直阻塞,一直到有数据发送过来。
从操作系统的角度看,当客户端没有数据发送的时候,服务端这个读取数据的线程或进程就会进入 TASK_INTERRUPTIBLE 状态,也就是平时常用的 top 命令中的 S 状态。在操作系统的等待队列里,等待有客户端数据到来,然后唤醒这个读取线程或者进程来读取数据。
基于以上,一般对于每个连接请求的服务端 socket 都会创建一个线程来读取并操作数据。所以连接请求,服务端 socket ,服务端线程是一一对应的关系。
对于上述模型,在并发连接比较少的情况下没有问题。如果并发连接数量巨大,那么意味着操作系统要创建巨大数量的线程来支持并发,同时也需要对这些线程进行调度和上下文切换。这些大量多线带来的工作量对于操作系统来说都是巨大的负担,所以这种 IO 模型很难支持大量的并发。
从 linux 操作系统角度看有一个 socket 监听在某个端口,等待客户端的连接请求,我们称运行监听 socket 的线程为 acceptor thread 。
有多个客户端的连接请求过来,每个请求经过3次握手,监听线程 accept 请求,为每个连接请求在 server 端创建 socket 。
对于服务端的 socket 来说,linux 操作系统会为其注册一系列感兴趣的事件(例如读事件,当数据就绪可读的时候触发。写事件,当 buffer 有缓冲,可以写数据的时候触发)。这样所有的服务端 socket 可以形成一个 intreast list 。
对于 individual 的 server 端 socket 来说,如果客户端发送了数据,linux 操作系统会触发注册的读事件,然后会把这个 socket 加入一个就绪列表中,我们称之为 ready list。对于 ready list 之中的 socket 是一定可以读到数据的,因为已经触发了读事件,即数据就绪可读。
一般我们会有一个用户空间的线程或者进程来运行 java NIO 的 API ,在这个线程里通过来轮询 ready list ,如果 list 里有 socket 则进行读取数据和操作数据。如果 ready list 没有触发事件的 socket ,对于操作系统来说,该线程会进入 TASK_INTERRUPTIBLE 状态( top 命令中的 S 状态),在操作系统的等待队列里,等待 ready list 有数据,然后唤醒这个读取线程读取并操作数据。
对于 epoll 下的 tomcat io 线程池来说,数据的读取是同步的。从操作系统的角度来说,NIO API 发起读数据的系统调用,这个线程会一直等到数据读完返回。只是这个时候一定有数据可读,不必等待过长的时间,所以 tomcat NIO 是同步非阻塞 IO。
关于“Tomcat NIO中epoll多路复用是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。