tomcat中的BIO与NIO发展

news2024/11/24 15:37:44

tomcat中的NIO发展

前言

Tomcat目前支持BIO(阻塞 I/O)、NIO(非阻塞 I/O)、AIO(异步非阻塞式IO,NIO的升级版)、APR(Apache可移植运行库)模型,本文主要介绍NIO模型,目前NIO模型在各种分布式、通信、Java系统中有广泛应用,如Dubbo、Jetty、Zookeeper等框架中间件中,都使用NIO的方式实现了基础通信组件

BIO

传统的BIO模型,每个请求都会创建一个线程,当线程向内核发起读取数据申请时,在内核数据没有准备好之前,线程会一直处于等待数据状态,直到内核把数据准备好并返回
在Tomcat中,由Http11Protocol实现阻塞式的Http协议请求,通过传统的ServerSocket的操作,根据传入的参数设置监听端口,如果端口合法且没有被占用则服务监听成功,再通过一个无限循环来监听客户端的连接,如果没有客户端接入,则主线程阻塞在ServerSocket的accept操作上(在Tomcat8、9的版本中已经不支持BIO)
第一次阻塞 connect调用:等待客户端的连接请求,如果没有客户端连接,服务端将一直阻塞等待
第二次阻塞 accept调用:客户端连接后,服务器会等待客户端发送数据,如果客户端没有发送数据,那么服务端将会一直阻塞等待客户端发送数据
在Tomcat中,维护了一个worker线程池来处理socket请求,如果worker线程池没有空闲线程,则Acceptor将会阻塞,所以在有大量请求连接到服务器却不发送消息(占用线程,阻塞与accept的调用)的情况下,会导致服务器压力极大

在这里插入图片描述
在这里插入图片描述

NIO

NIO模型弥补了BIO模型的不足,它基于选择器检测连接(Socket)的就绪状态通知线程处理,从而达到非阻塞的目的,Tomcat NIO基于I/O复用(select/poll/epoll)模型实现,在NIO中有以下几个概念:
Channel
Chnnel是一个通道,网络数据通过Channel读取和写入,通道和流的不同之处在于流是单向的,而通道是双向的
Selector
多路复用器Selector会不断轮询注册在其上的Channel,如果某个Channel上面发生读或者写,就表明这个Channel处于就绪状态,会被Selector选择,通过SelectionKey(通道监听关键字)可以获取就绪Channel的集合,再进行后续IO操作。那么只要有一个线程负责Selector轮询,那么就可以接入成千上万个客户端
在Tomcat中,由NioEndpoint处理非阻塞 IO 的 HTTP/1.1 协议的请求

bind()的作用在于:开启 ServerSocketChannel ,通过ServerSocketChannel 绑定地址、端口
startInternal()主要作用在于初始化连接,启动工作线程池poller 线程组、acceptor 线程组。
acceptor用于监听Socket连接请求,每个acceptor启动以后就开始循环调用 ServerSocketChannel 的 accept() 方法获取新的连接,然后调用 endpoint.setSocketOptions(socket) 处理新的连接,在endpoint.setSocketOptions(socket) 中 则会通过getPoller0().register(channel),将当前的NioChannel 注册到Poller中,此逻辑在Acceptor .run()中处理

调用getPoller0().register(channel)后,请求socket被包装为一个 PollerEvent,然后添加到 events 中,此过程是由poller线程去做的,poller 的 run() 会循环调用 events() 方法处理注册到 Selector (每一个poller会开启一个 Selector)上的channal ,监听该 channel 的 OP_READ 事件,如果状态为 readable,那么在 processKey ()中将该任务放到 worker 线程池中执行。整个过程大致如下图所示
在这里插入图片描述

在NIO模型,不是一个连接就要对应一个处理线程了,连接会被注册到Selector上面,当Selector监听到有效的请求,才会分发一个对应线程去处理,当连接没有请求时,是没有工作线程来处理的

Tomcat中修改

在Tomcat中指定连接器使用的IO协议,可以通过server.xml的《connector》元素中的protocol属性进行指定,默认值是HTTP/1.1,表明当前版本的默认协议,可以通过把HTTP/1.1修改为以下指定使用的IO协议
org.apache.coyote.http11.Http11Protocol:BIO
org.apache.coyote.http11.Http11NioProtocol:NIO
org.apache.coyote.http11.Http11Nio2Protocol:NIO2
org.apache.coyote.http11.Http11AprProtocol:APR

总结

BIO每个连接都会创建一个线程,对性能开销大,不适合高并发场景。
NIO基于多路复用选择器监测连接状态在通知线程处理,当监控到连接上有请求时,才会分配一个线程来处理,利用少量的线程来管理了大量的连接,优化了IO的读写,但同时也增加CPU的计算,适用于连接数较多的场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用CSS实现一个平滑过渡效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现平滑过渡效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚…

【FAQ】调用视频汇聚平台EasyCVR的iframe地址,视频无法播放的原因排查

有用户反馈,在调用iframe地址后嵌入用户自己的前端页面,视频无法播放并且要求登录。 安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中…

nginx反向代理流程

一、nginx反向代理流程 反向代理:使用代理服务器来接受internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将上游服务器得到的结果返回给请求连接的客户端,代理服务器对外表现就是一个web服务器。Nginx就经常拿来做…

Pyqt5打开电脑摄像头进行拍照

目录 1、设计UI界面 2、设计逻辑代码,建立连接显示窗口 3、结果 1、设计UI界面 将ui界面转为py文件后获得的逻辑代码为:(文件名为 Camera.py) # -*- coding: utf-8 -*-# Form implementation generated from reading ui file …

虚拟拍摄,如何用stable diffusion制作自己的形象照?

最近收到了某活动的嘉宾邀请,我将分享: 主题:生成式人工智能的创新实践 简要描述:从品牌营销、智能体、数字内容创作、下一代社区范式等方面,分享LLM与图像等生成式模型的落地应用与实践经验。 领域/研究方向&#xff…

Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

gdb、make/Makefile 引言调试器gdb介绍常用指令 自动化构建工具make/Makefile介绍使用依赖关系与依赖方法编辑Makefile伪目标 总结 引言 在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g: 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具&…

Puppeteer+RabbitMQ:Node.js 批量加工pdf服务架构设计与落地

学情分析:根据学生阶段性的学习和考试情况进行学情分析、归纳、总结,汇总学情数据;精准推荐:推荐算法基于学情数据结合知识图谱进行精准练习题推荐;错题回顾:错题的阶段性回顾复习。 第一部分学情分析的PDF…

Springboot 封装整活 Mybatis 动态查询条件SQL自动组装拼接

前言 ps:最近在参与3100保卫战,战况很激烈,刚刚打完仗,来更新一下之前写了一半的博客。 该篇针对日常写查询的时候,那些动态条件sql 做个简单的封装,自动生成(抛砖引玉,搞个小玩具&a…

ModStartBlog v8.0.0 博客归档页面,部分组件升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装会…

引领行业高质量发展|云畅科技参编《低代码开发平台创新发展路线图(2023)》

8月8日-9日,中国电子技术标准化研究院于北京顺利召开《低代码开发平台创新发展路线图(2023)》封闭编制会。云畅科技、浪潮、百度、广域铭岛等来自低代码开发平台解决方案供应商、用户方、科研院所等近30家相关单位的40余位专家参与了现场编制…

ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用)

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

【腾讯云Cloud Studio实战训练营】用Vue+Vite快速构建完成交互式3D小故事

👀前置了解:(官网 https://cloudstudio.net/) 什么是Cloud Studio? Cloud Studio 是基于浏览器的集成式开发环境(IDE),为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#…

虚拟机怎么连接加密狗?USB Sever连接方法

公司想把软件都迁移到虚拟机,但是没法连接加密狗,怎么办? 让USB Sever来连接就行了! 第一步, 根据加密狗的数量, 选一台合适的朝天椒USB Sever, 第二步, 将加密狗全部插在朝天椒U…

JMM内存模型之happens-before阐述

文章目录 一、happens-before的定义二、happens-before的规则1. 程序顺序规则:2. 监视器锁规则:3. volatile变量规则:4. 传递性:5. start()规则:6. join()规则: 一、happens-before的定义 如果一个操作hap…

C++坦克大战源代码

源码: #include <iostream> #include <time.h> #include <windows.h>#define W 1 //上 #define S 2 //下 #define A 3 //左 #define D 4 //右 #define L 5 // 坦克有4条命void HideCursor() { //隐藏光标 …

[LeetCode]两数相加

解题 思路1 : 先将每个链表的节点数求出来,将短的链表的每个节点的值加到长链表对应的节点上,在判断加上之后的值是否大于10,若大于则该节点减10,下一个节点加1,由此循环之后,只有长链表的最后一个节点的数可能大于10,则对最后一个节点进行判断,如果大于10,则new一个新的节点,将…

videojs 播放视频

背景&#xff1a;在项目中使用第三方插件videojs进行播放视频&#xff0c;点击事件更改播放的数据源。 一、视频相关理论 (一)、背景 网络流媒体的呈现形式分为两种&#xff1a;直播点播 (二)、流媒体的3种协议 分类&#xff1a;HTTPHLSRTMP定义&#xff1a;基于HTTP的流媒体…

踩坑串口通信 serialPort.RtsEnable = true

背景&#xff1a; 最近在调试一个激光模块&#xff0c;使用的是422通信&#xff0c;然后买了一个485转422的转换器。 通过串口监控软件观察&#xff0c;明明和串口助手发的东西一模一样&#xff0c;但是就是不返回&#xff01; 解决方案&#xff1a; 我加了&#xff0c;这句&…

2023年最新国内八款低代码平台盘点,国内低代码是否已经跑出独角兽?

什么是低代码平台&#xff1f;低代码平台的优势在哪里&#xff1f;低代码平台是否已经形成了自己的核心竞争力&#xff1f;低代码平台是否在国内跑出独角兽&#xff1f;本篇&#xff0c;我们将一起针对上述问题深入浅出的分析低代码平台的特点和前景&#xff0c;并且为大家盘点…

【推荐】深入浅出学习Spring框架【中】

目录 1.AOP是什么? 2.案列&#xff1a; 3.spring的aop的专业术语 4.代码模拟 4.1 前置通知 3.2.后置通知 3.3.环绕通知 3.4.异常通知 3.5.过滤通知 1.AOP是什么? 面向切面编程&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它的主要…