Tomcat中BIO和NIO的区别(Tomcat)

news2024/9/22 13:51:20

BIO

        Tomcat中BIO的模型和理论很简单,例图如下

        1.Acceptor线程死循环阻塞接收客户端的打过来的socket请求

        2.接收到请求之后打包成一个SocketProcessor(Runnable),扔到线程池中读取/写入数据

        参数配置

                1.Acceptor默认线程是1,可以设置参数自己去改

                2.Executor的线程池,一个Connector对应一个线程池,一个线程池可以被多个Connector公用,最小线程数是10,最大线程数是200

        BIO总结

        1.如果请求量很大,那么可以适当提高Acceptor线程池的线程数量 

        2.如果是那种处理起来效率不高的请求,那么可以适当提高Executor中的线程数

        3.线程池中的线程还是要根据线上实际情况设置的,并不是越多越好,自己去压测看一下,找一个适当的值

NIO

        Tomcat7中的NIO其实只有在读取请求头和请求行下才是非阻塞的,Servlet读取请求体的时候依旧还是阻塞的。执行流程如下

     

        1.Acceptor接收客户端连接,接收到之后将socketChannel推到一个Poller(本质上也是一个Runnable)的events队列中,客户端和服务端的交互就此结束

        2.推入到events队列中的是一个注册事件(要将其绑定到对应Poller中的Selector中)

        3.对应Poller中的线程会去循环查询Selector中是否有事件发生,在查询之前会现将Events中的注册事件执行了,所以在执行events队列中的事件时,就相当于将socketChannel注册到Selector中。

        4.socketChannel中的读写事件被Poller轮询到,就会socketChannel和读写事件打包成一个SocketProcessor,然后扔到Executor中执行读写逻辑

        5.当SocketProcessor中的线程运行时,就会从socketChannel中读取/写入数据时(非阻塞),如果发现请求行和请求头已经读写并且解析完了,那么就会将剩下的交给Servlet处理,Servlet中可能会读写数据,或者发起响应,Servlet的这两个操作都是阻塞的。如果SocketProcessor线程读取到了数据,但是发现请求行和请求头的数据还没有读完,那么本次请求直接结束,要处理的话只能等下一次就绪事件

        6.tomcat7中读取请求体的时候其实依旧是阻塞的,因为tomcat7本身并没有非阻塞这个概念,servlet读取请求体时底层依旧是用inputStream.read()方法读取,并且是阻塞的

        7.Servlet读取请求体inputStream.read()方法底层调用的是InternalNioInputBuffer.SocketInputBuffer.doRead(),在这个方法中会调用fill(param1,param2)方法从操作系统读取数据

        8.阻塞读取数据流的时候,还是得利用Selector,因为刚开始的时候socketChannel会被设置成非阻塞,然后socketChannel会被注册到一个Selector(称为主Selector),然后你如果再想把他改成阻塞,是会报错的(NIO中的限制),tomcat中为了实现这个阻塞,又构造了一个辅助Selector,将socketChannel重新注册到辅助Selector上,并设置成阻塞(在此之前已经取消了对主Selector的绑定)

        9.首先先InputStream.read(),然后加锁(为了实现阻塞),辅助Selector也有与之对应的Poller线程,也会去轮询辅助Selector上发生的就绪事件。一旦轮询到对应的事件,就会解锁,解阻塞

        10.从socketChannel中读取数据,结束

        NIO总结

        Tomcat7中的NIO其实相对于BIO并没有太多的性能提升,只是可以接收更多的客户端请求(NIO直接推到Events队列中就直接返回了),真正的在处理请求的时候并没有体现出太大的优势,如果是那种不用处理请求数据,并且不用响应什么数据的那种请求,那么NIO会有非常好的吞吐量

        

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

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

相关文章

Day06微信小程序微信登录

微信小程序微信登录 1. 第一:小程序要先发给后端code(只能用一次), 2. 后端要结合数据发给(用get的方式) https://api.weixin.qq.com/sns/jscode2session 数据: appidstring小程序的appIdsecretstring小程序的app…

华为为什么要做三折叠屏手机?

前些天我做了一条视频,关于讲华W的新的三折叠屏手机。我说我有点失望,结果引起了华W的同事的一些关注。于是,华W几位高管都跑过来,跟我解释为什么会出现这样的一个状态。 我才知道,这款手机他们其实是亏着钱在卖的。因…

【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍

最近在整理之前的一些实践工作,一方面是为了笔记记录,另一方面也是自己做一些温故知新,或许对于理解一些现在大模型工作也有助益。 1. 基于bert模型实现中文语句的embedding编码 首先是基于bert模型实现中文语句的embedding编码,…

使用库函数点亮一个LED灯

软件设计 STM32Gpio的介绍 如果想让LED0点亮,那么R12就要是高电平,LED0就要是低电平,也就是PF9就是低电平 F407系统主频要工作在168MHZ F103的话是工作在72mhz F429的话就180MHZ 接着我们就要使能Gpio的时钟,使能之后对GPIO相关…

ES7 -- ES13

1. ES7 – 2016 1. 数组的includes方法 数组中是否包含某个元素,返回值为boolean let arr [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; arr.includes(5); // true2. ** 幂次方 let res 2 ** 3; // 82. ES8 --2017 1. 字符串补全 基本使用 let str 123;str.padStart…

Django 请求配置

http请求配置 请求流程 urls.py配置 from first_app import viewsurlpatterns [path(admin/, admin.site.urls),path(test/,views.first_test), ] views.py配置 from django.shortcuts import render,HttpResponse# Create your views here. def first_test(request):prin…

Kubernetes 安装网络插件flannel报错Init:ImagePullBackOff,flannel下载镜像报错问题解决

Kubernetes1.28安装网络插件flannel,报错Init:ImagePullBackOff ,flannel安装下载镜像失败 问题 1.安装flannel kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml 2.flannel报错信息 执行查看安装…

Flutter 约束布局

配置插件依赖 设置组件大小 通过属性 childConstraints 实现 分别设置 约束布局一 和 约束布局二 大大小为:160 和 200 点击查看代码文件 class SummaryPageState extends State<SummaryPage1> {ConstraintId constraintId_1 = ConstraintId(ConstraintId_1);Constrain…

【GUI设计】基于Matlab的图像处理GUI系统(1),用matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像处理GUI系统&#xff0c;用matlab实现。 本次内容主要分为两部分&a…

专题七_分治_快排_归并_算法专题详细总结

目录 分治 一、分治思想的概念 二、分治思想的步骤 1. 颜⾊分类&#xff08;medium&#xff09; 解析&#xff1a; 2. 快速排序&#xff08;medium&#xff09; 解析&#xff1a; 总结&#xff1a; 3. 快速选择算法&#xff08;medium&#xff09; 解析&#xff1a; …

【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9&#xff09; 实验一 Lab: Reflected XSS into HTML context with nothing…

maven手动导入本地仓库

maven手动导入本地仓库 1.在maven仓库下载对应的依赖 一定要把jar包下载到maven仓库的bin下 2.找到自己仓库的maven仓库下的bin目录cmd进去 在cmd窗口中输入以下命令&#xff1a;&#xff08;这里根据你的groupId、artifactId、version修改即可&#xff09; <!-- https:…

乱弹篇(53)丹桂未飘香

今天是2024年“秋分”节气&#xff0c;也是第7个中国“农民丰收节”&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《文化中国行看丰收之美》。 截图&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff1a;“春华秋实&#xff0c;岁物丰成。”又说&#…

dhtmlxGantt 甘特图 一行展示多条任务类型

效果如图: 后台拿到数据 处理之后如图: 含义: 如上图所示, 如果一行需要展示多个 需要给父数据的那条添加render:split属性, 子数据的parent为父数据的Id即可 切记 父数据的id 别为0 为0 时 会出现错乱 因为有些小伙伴提出分段展示的数据结构还是有点问题,下面展示一个完整…

机器人时代的“触觉革命”:一块小传感器如何颠覆你的认知?

你是否曾经想过,机器人也能像人类一样有“触觉”?不再是简单的机械操作,而是具备真正的感知能力,能够学会精细的任务。今天我想和你聊聊一种让机器人“长出触觉”的技术:一种小巧的触觉传感器,它的名字叫“AnySkin”。别看它小,它的潜力可一点都不小,或许能彻底改变我们…

Windows下如何定时执行自定义任务

目录 一.前言二.设置定时自动执行自定义任务 一.前言 本文环境是Windows11系统。 有时候我们希望能够在Windows下定时自动执行自定义任务&#xff0c;比如检测数据库服务的状态。那在Windows下怎么定时自动执行自定义任务&#xff0c;这篇文章介绍一种方法。 二.设置定时自动…

NLP 主流应用方向

主流应用 文本分类文本匹配序列标注生成式任务 应用细分 文本纠错话者分离 本质为文本分类任务数字归一化 实现数字映射&#xff0c;提高内容可读性 如将一九九九转1999

AI基础 L26 Introduction to Automated Planning - II

ADL Action Description Language (ADL) is a richer language than STRIPS. It allows for • Positive and negative literals in states • The open world assumption • Quantified variables in goals as well as conjunctions and disjunctions • Conditional effects …

Web_php_include 攻防世界

<?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) { 以是否检测到php://为判断执行循环$pagestr_replace("php://", "", $page);//传入空值&#xff0c;替换 } include($page); ?&g…

226. 翻转二叉树之多种解法(递归法、深度优先(迭代法)、广度优先【层序遍历】)

文章目录 226. 翻转二叉树题外话思路递归法迭代法:深度优先遍历层序遍历&#xff1a;广度优先遍历拓展总结 226. 翻转二叉树 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;r…