18|高并发探讨:如何支持 NIO?
郭屹
你好,我是郭屹。今天我们继续手写 MiniTomcat。
上节课,我们已经构造出了 MiniTomcat + MiniSpring 的核心环境。但是我们知道,到目前为止,我们的 MiniTomcat 只实现了 BIO 模式,因此在高并发的情况下它的性能是不高的。我们能想到的一个解决办法就是把网络 BIO 换成 NIO,作为 MiniTomcat 的扩展部分,同时我们也会探讨一下怎么用 NIO 实现网络接口。
Java 中的 BIO 与 NIO
Java 网络访问的传统模式是 BIO(即在 java.io 包下的类),也就是线程要访问网络的时候,是等着网络 I/O 完成后,才接着运行线程后面的任务,你可以想象成几个任务串行的样子。从线程本身来看,就是在网络 I/O 这里阻塞住了,这也是 BIO 这个词的字面含义。因为线程阻塞住了,意味着一个线程只能响应一个网络请求,如果有多个网络请求就要开多个线程来处理。你可以看一下示意图。
在 BIO 模型下,accept 和 read 都是阻塞的。没有网络连接请求的时候,accept 方法死等,没有数据的时候,read 方法死等。
从处理线程的角度来看,网络 I/O 很耗费时间,而线程还要无所事事地死等着,这是很浪费资源的。我们希望在等待网络 I/O 的过程中可以干点别的,然后回头看看网络 I/O 的结果。这个思路就像我们日常生活中在烧开水的时候,一般是去看看书、看看电视,等到某个时刻再回头看看水烧开了没有。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Java NIO是一种非阻塞的网络通信方式,相比传统的BIO模式,NIO能够提高并发度。本文详细介绍了NIO的数据读取流程和Tomcat中NIO的实现结构。在NIO中,数据读取通过Channel和Buffer进行,通过代码示例生动地解释了其工作原理。同时,文章还分析了Tomcat中NioEndPoint的组件结构,包括LimitLatch、Acceptor、Poller、SocketProcessor和Executor等部分。这些组件共同实现了NIO模式的网络连接和轮询。通过对NIO的概念和程序流程的介绍,读者能够快速了解NIO的特点和工作原理。文章还提出了一个思考题,让读者思考如果将MiniTomcat的网络连接改造成支持NIO模式,是否能成功调用到Servlet。整体而言,本文通过对NIO的机制和编程流程的详细解释,帮助读者快速了解了NIO的特点和应用。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniTomcat》,新⼈⾸单¥59
《手把手带你写一个 MiniTomcat》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(1)
- 最新
- 精选
- peter请教老师几个问题: Q1:thread不属于服务器吗? 本课第一张图,几个thread连接到server。“server”如果是服务器,那thread难道不是服务器端的吗? Q2:selector.select(1000); 这行代码的行为是什么? 该行代码阻塞,一秒后阻塞结束,继续运行,是这样吗? Q3:BIO、NIO用户量的分界线是什么? 文中谈到,BIO适合小用户量,NIO适合大用户量。那么,两者的分界线是什么? Q4:《Tomcat 内核设计剖析》这本书怎么样? 京东上简单看了一下,作者好像没有特殊的经历,不知道这本书怎么样。 Q5:socketChannel与serverSocketChannel有什么区别? 搜“你可以看一个细化后的结构图”后找到的图中,有socketChannel和serverSocketChannel,两者有什么区别? (文中有多个图的时候,图有个编号还是比较好的) Q6:thread怎么从Multiplexer Selector读取数据? 搜“图示如下”后找到的图中,thread从Multiplexer Selector读取数据,具体是怎么实现的?轮询一个队列吗? (哎呀,图最好有个编号啊)
作者回复: Peter啊,你应该先了解一下Java网络编程的基础,之后再看看这些问题你自己都能解决掉。 小用户大用户没有什么绝对的分割线,我个人实际工作中,拍脑袋,普通项目,如果客户内部使用,<100人同时使用,我就认为是小用户。 《Tomcat 内核设计剖析》这本书我觉得是不错的进阶读物,大家也都很认可。
2024-01-21归属地:北京
收起评论