NIO与BIO
当谈到 Java 网络编程时,经常会听到两个重要的概念:BIO(Blocking I/O,阻塞 I/O)和 NIO(Non-blocking I/O,非阻塞 I/O)。它们都是 Java 中用于处理 I/O 操作的不同编程模型。
一、介绍
1. BIO(Blocking I/O)
BIO 是 Java 最早的 I/O 模型,也是最简单的一种。在 BIO 模型中,每个 I/O 操作都会阻塞当前线程,直到数据准备就绪或者超时,才会继续执行下一步操作。这意味着如果有大量的并发连接,就需要创建大量的线程来处理这些连接,会造成资源浪费和性能下降。
在 BIO 模型中,通常采用的是一对一的客户端-服务器模型,即每个客户端连接都需要对应一个服务器端的线程来处理。这样的模型适用于连接数较少且连接持续时间较长的场景,但不适合高并发、短连接的场景。
2. NIO(Non-blocking I/O)
NIO 是 Java 在 JDK 1.4 引入的新的 I/O 模型,相比于 BIO,它提供了更为灵活和高效的网络编程方式。NIO 主要通过以下几个核心组件来实现非阻塞 I/O:
- 通道(Channel):提供了全双工、非阻塞的数据传输通道,可以通过通道读取和写入数据。
- 缓冲区(Buffer):用于在通道和应用程序之间传输数据的中介,存储读取或写入的数据。
- 选择器(Selector):用于监听多个通道的事件,当通道发生读写事件时,可以通过选择器来选择感兴趣的事件进行处理。
NIO 模型中的关键是非阻塞通道和选择器。通过使用单线程或少量线程配合选择器,可以实现同时处理多个连接,从而提高了系统的并发处理能力。
NIO 模型适用于高并发、短连接的场景,如 Web 服务器、游戏服务器等。它的设计理念是通过少量线程处理大量并发连接,避免了线程资源的浪费和上下文切换的开销,从而提高了系统的性能和吞吐量。
"Non-blocking I/O"(非阻塞 I/O)通常也被称为 "New I/O"(新 I/O)。在 Java 中,NIO(New I/O)包提供了一套非阻塞的 I/O 操作方式,因此人们常常将其简称为 "New I/O"。这个术语可能源自于 Java 1.4 版本中引入 NIO 的时代,当时这种非阻塞 I/O 模型被认为是一种新的、先进的技术。
所以,虽然 "New I/O" 并不是一个严格意义上的术语,但在 Java 社区中,它通常被用来指代 NIO(Non-blocking I/O)相关的技术和包。
3、总结
BIO 和 NIO 是 Java 中常用的两种 I/O 模型,各有优缺点:
- BIO 简单易懂,适用于连接数较少且连接持续时间较长的场景,但在高并发情况下性能较差。
- NIO 提供了非阻塞、多路复用的网络编程方式,适用于高并发、短连接的场景,能够提高系统的性能和吞吐量,但编程复杂度较高。
二、Tomcat文件配置
在Tomcat的配置文件中也涉及到NIO(Non-blocking I/O,即非阻塞 I/O)与BIO(Blocking I/O,阻塞式I/O)的设置。
Tomcat 是一个流行的开源的 Java Servlet 容器,用于实现 Java Servlet 和 JavaServer Pages 技术。它支持多种 I/O 模型,包括 NIO 和 BIO。
在 Tomcat 的配置文件中,一般通过 Connector 元素配置连接器,其中的 protocol 属性用于指定使用的协议。在使用 NIO 或 BIO 时,通常会设置对应的协议,如下所示:
<!-- 使用NIO协议 -->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"redirectPort="8443" /><!-- 使用BIO协议 -->
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
在上面的示例中,当 protocol 属性设置为 org.apache.coyote.http11.Http11NioProtocol 时,表示使用 NIO 协议;当 protocol 属性设置为 HTTP/1.1 时,表示使用 BIO 协议。
通过配置连接器的协议,可以选择不同的 I/O 模型来处理请求,以满足应用程序的性能和需求。 NIO 模型相比 BIO 模型具有更好的性能和扩展性,特别适用于高并发的场景。
三、NGINX 的配置相关
在 NGINX 的配置中,并没有像 Tomcat 那样直接涉及到具体的 I/O 模型的配置选项。NGINX 是一个高性能的 Web 服务器,它使用了事件驱动的异步架构来处理连接和请求,但是具体的事件驱动模型对用户是透明的,不需要用户手动配置。
NGINX 的事件驱动模型默认使用了 epoll(在 Linux 上)或 kqueue(在 BSD 和 macOS 上)等高性能的事件模型,以实现高并发、高吞吐量的请求处理。这些细节对于用户来说是不可见的,NGINX 会根据系统和编译时的参数自动选择最佳的事件模型,并且在大多数情况下不需要用户进行额外的配置。
因此,在 NGINX 的配置文件中,一般不需要关心具体的 I/O 模型,用户只需要关注配置 NGINX 的监听端口、虚拟主机、反向代理、负载均衡等功能即可。
四、涉及到的框架与中间件
在Java生态系统中,许多中间件和框架都涉及到了NIO(New I/O)和BIO(Blocking I/O)的使用,以实现高性能的网络通信。以下是一些常见的中间件和框架,它们可能涉及到NIO和BIO:
-
Netty:Netty 是一个高性能的异步事件驱动的网络应用框架,它基于 NIO 实现了网络通信的高性能和可扩展性。
-
Apache MINA:Apache MINA 是一个基于 Java 的网络应用框架,提供了可扩展的高性能的基于 NIO 的网络通信。
-
Tomcat:Tomcat 是一个流行的 Java Servlet 容器,它在处理 HTTP 请求时可以选择使用 NIO 或 BIO,通过配置 Connector 的协议来指定。
-
Jetty:Jetty 是另一个流行的 Java Servlet 容器和 Web 服务器,它也支持使用 NIO 或 BIO 来处理网络连接。
-
Apache HTTP Server:Apache HTTP Server 是世界上最流行的 Web 服务器之一,它在处理 HTTP 请求时可以使用 NIO 或者传统的多线程模型。
-
Redis:Redis 是一个内存数据库,它的网络通信层使用了 NIO 来实现高性能的异步 I/O。
-
MySQL Connector/J:MySQL 的 Java 连接器,它可以使用 NIO 来实现异步的数据库访问。
-
Spring Framework:Spring Framework 是一个全面的 Java 开发框架,其中的 Spring Web 模块在处理 HTTP 请求时可以选择使用 NIO 或者传统的阻塞 I/O。
这些是常见的一些中间件和框架,在网络通信方面涉及到了 NIO 和 BIO 的使用。选择适合的 I/O 模型可以根据具体的应用场景和性能需求来决定,以提高系统的性能和吞吐量。
相关文章:
NIO与BIO
当谈到 Java 网络编程时,经常会听到两个重要的概念:BIO(Blocking I/O,阻塞 I/O)和 NIO(Non-blocking I/O,非阻塞 I/O)。它们都是 Java 中用于处理 I/O 操作的不同编程模型。 一、介…...
YOLOv5实战记录05 Pyside6可视化界面
个人打卡,慎看。 指路大佬:【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后,无法pip install了。解决如下: activate.bat中修改…...
HTML5.Canvas简介
1. Canvas.getContext getContext(“2d”)是Canvas元素的方法,用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中,首先通过getElementById方法获取id为"myCanvas"的Canvas元素,然后使用getContext(“2d”)方法获取该Ca…...
excel统计分析——多项式回归
参考资料:生物统计学 多项式回归属于单变量曲线回归,但其形式和求解方法与多元线性回归相似。多项式回归的数学模型为: 令,,,,则 由于X不可逆,两边同时乘以X得,ÿ…...
SQLyog连接数据库8.0版本解析错误问题解决方案
问题描述: 解决方案: alter userrootlocalhostidentified with mysql_native_password by 密码; 再次连接就可以了。...
【数据库】SQL简介
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库管理系统(RDBMS)的标准化语言。它用于访问和操作数据库中的数据,执行各种任务,如插入、更新、删除和检索数据&#x…...
AWS入门实践-利用S3构建一个静态网站
使用Amazon S3托管静态网站是一个流行的选择,因为它简单、成本效益高,并且易于维护。静态网站由不含服务器端脚本的文件组成,如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤: 如果大家没有AWS免费账号&#x…...
使用Linux strace追踪系统调用: 一个详细指南
使用Linux strace追踪系统调用: 一个详细指南 Linux strace是一个强大的命令行工具,用于监视和调试进程中发生的系统调用和信号。它对于系统管理员和开发人员来说是理解程序行为和解决问题的重要工具。 什么是strace? strace是一种跟踪运行中的进程执…...
python 笔记
文章目录 pdbpdb开始调试pythonpdb设置断点单步执行进入到函数的内部执行到下一个断点或程序结束调用栈查看命令查看当前函数调用堆栈向上一层函数查看调用堆栈查看源代码 importimport 用法 numpy导入numpy模块numpy常用函数np.argmaxnp.sum range生成连续序列生成不连续序列 …...
软考 系统架构设计师系列知识点之数据库基本概念(4)
接前一篇文章:软考 系统架构设计师系列知识点之数据库基本概念(3) 所属章节: 第6章. 数据库设计基础知识 第1节 数据库基本概念 6.1.3 数据库管理系统 DBMS(DataBase Management System,数据库管理系统&am…...
Vue - 3( 15000 字 Vue 入门级教程)
一:初识 Vue 1.1 收集表单数据 收集表单数据在Vue.js中是一个常见且重要的任务,它使得前端交互变得更加灵活和直观。 Vue中,我们通常使用v-model指令来实现表单元素与数据之间的双向绑定,从而实现数据的收集和更新。下面总结了…...
上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 做过isp的同学都知道,图像处理里面有一个3A,即自动曝光、自动白平衡和自动对焦。其中自动对焦这个,就需要用输入…...
数据结构和算法:分治
分治算法 分治(divide and conquer),全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。 1.分(划分阶段):递归地将原问题分解为两个…...
增强Java技能:使用OkHttp下载www.dianping.com信息
在这篇技术文章中,我们将探讨如何使用Java和OkHttp库来下载并解析www.dianping.com上的商家信息。我们的目标是获取商家名称、价格、评分和评论,并将这些数据存储到CSV文件中。此外,我们将使用爬虫代理来绕过任何潜在的IP限制,并实…...
用友 NC saveXmlToFIleServlet 任意文件上传漏洞复现
0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC saveXmlToFIleServlet接口处存在…...
JS第九天
今天是第九天,学习了JS中的设置日期和倒计时,计时器以及验证码倒计时,那么话不多说我们开始今天的学习吧 一、日期设置 1.1日期创建 调用 new Date() 来创建一个新的 Date 对象。在调用时可以带有一些参数,创建一个 Date 对象&…...
CSS设置字体样式
目录 前言: 1.font-family: 2.font-style: 3.font-weight: 4.font-size: 5.font-variant: 6.font: 前言: 在网页中字体是重要的组成部分,使用好字体可以让网页更…...
[Java线程池]ExecutorService|CompletionService的区别与选择
这段时间对业务系统做了个性能测试,其中使用了较多线程池的技术,故此做一个技术总结。 这次总结的内容比较多,主要是四个: ExecutorServiceCompletionServiceRunnableCallable 前两个是线程池相关接口,后两个是多线…...
MySQL-SQL编写练习:基本的SELECT语句
基本的SELECT语句 1. SQL的分类 DDL:数据定义语言。CREATE \ ALTER \ DROP \ RENAME \ TRUNCATEDML:数据操作语言。INSERT \ DELETE \ UPDATE \ SELECT (重中之重)DCL:数据控制语言。COMMIT \ ROLLBACK \ SAVEPOINT \ GRANT \ REVOKE 学习技巧…...
C++经典面试题目(十九)
1、什么是析构函数?它有什么作用? 析构函数是类的特殊成员函数,用于在对象被销毁时执行清理工作。它的名称与类名相同,前面加上波浪号(~)。析构函数的作用在于确保在对象被销毁时释放占用的资源࿰…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
