内核aio_NIO2(AIO) 在Tomcat的应用

本文详细介绍了内核aio(NIO2)在Tomcat中的应用,通过生动的比喻解释了异步IO的概念,并提供了NIO2的DEMO示例。文章还探讨了Tomcat NIO2模型,包括Acceptor、LimitLatch和I/O处理器的角色,强调了不要阻塞I/O线程的重要性,并给出了如何调试Tomcat的指导。
摘要由CSDN通过智能技术生成

概述

注: NIO2(AIO) 即异步IO

NIO2 简介

AIO和NIO2其实是一回事,如同孙行者、者行孙其实都是孙猴子,只是名称不同本质都一样

那么如何理解这个概念呢?举个例子

假设一个妹子有许多的舔狗(SpareTire),如果妹子想要完成某件事最简单、高效的方法是什么?

答案是,舔狗那么多,交给他们去办就ok了。那么狗子办事期间,妹子会一直等待狗子把事情做好吗?不行,这期间当然可以继续将其他任务派发给其他狗子。当狗子办事期间,如果有需要妹子处理的事情,通知处理一下即可。

当然狗子一般都是处理一些重活累活,比如数据拷贝、I/O啊,接收新连接啥的(太惨了)。妹子则专注于核心业务的处理。

在这个例子中,妹子相当于核心业务线程,主要用来处理业务逻辑,而狗子们则是(内核+I/O线程)的抽象。

P.S.

  • 如果你了解NIO2,建议你直接阅读NIO2模型解读章节,不需要再阅读NIO2 DEMO章节(时间宝贵)
  • 你可以直接越过所有章节去看总结,也可以简单阅读附录直接上手调试代码

NIO2 DEMO

NIO2中有个核心点,就是内核负责主要负责通知程序有什么事件,而连接的接收以及数据的拷贝还是需要程序提供线程来做这些事情,你可以理解为妹子(核心业务线程)需要提供舔狗池(线程池)给内核来做这些事情

talk is cheap, show me your hair

如果你想要学习一下NIO2,可以点击 https://github.com/anxpp/Java-IO/tree/master/src/com/anxpp/io/calculator/aio

该源码的注释为GBK编码,如果你看到注释为乱码,最好将其改为GBK编码

这是一个Demo,值得注意的是虽然该例子中并没有显式的创建线程池,这是因为如果你在open()服务端的时候,如果没有显示指定,系统将会默认分配给ServerSocketChannel一个线程池,用于事件的处理,我们可以打开JConsole验证一下.

channel = AsynchronousServerSocketChannel.open();
e091b70feec0a370223f44a3bc458da5.png

如图所示thread-0到thread-4就是系统默认分配的线程池,用来处理I/O事件。(天赐舔狗)

想象一下,如果我们在处理I/O事件的时候将所有线程都阻塞住了,那么整个系统的I/O都将陷入阻塞, 如下图所示。

54bd0f0b822496dac6951431def0118c.png

在有新的I/O事件到来的时候,内核会选择一个线程来处理这些I/O事件,如果处理I/O的线程陷入阻塞,那么来自客户端的请求将会一直被阻塞住,无法返回。

因此处理I/O事件的线程最好只处理I/O事件(接收新连接、将数据从内核拷贝到线程中)

你可以理解为,舔狗最好只做舔狗该做的事情,即重活累活,至于核心业务或者会发生阻塞的情况的事件最好提交给妹子(业务逻辑处理线程池)来处理。


Tomcat NIO2 模型

关键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值