当前位置: 首页 > news >正文

阻塞非阻塞IO(BIO和NIO),IO多路复用

1.概念

NIO(New Input/Output)和BIO(Blocking Input/Output)是Java中用于处理输入输出的两种不同的模型。

 

55201a5d1cba4de29eee7a7eae9961d3.png

BIO阻塞,等有了消息,立刻返回,一个线程处理一个recv(需要很多线程)。

NIO 有没有消息,都返回(但程序要自己判断,返回空就循环重复);一个线程可以处理多个recv(好处:不用很多线程;坏处:线程空转,cpu浪费严重)。

 

52ae4451f73d4d0c8ce0cb2c55740d5a.png

Java中新的NIO包可以通过上述形式设置是否开启阻塞,从而设置NIO或BIO,两者都支持;

 

IO多路复用

IO多路复用(IO Multiplexing)是一种通过单线程处理多个I/O操作的机制。它允许一个进程同时监听多个文件描述符(如Socket),并在有数据可读或可写时进行相应的处理,从而提高系统的并发性能。

在传统的阻塞I/O模型中,每个I/O操作都需要一个独立的线程来处理,当并发量增加时,线程数量会急剧增加,导致系统资源消耗过大。而使用IO多路复用,只需要一个线程就可以同时处理多个I/O操作,大大减少了线程的数量和系统开销。

常见的IO多路复用机制包括:

  1. select:select是Unix系统最早引入的IO多路复用机制。它通过select函数来监听多个文件描述符,当其中任意一个文件描述符准备就绪时,select函数会返回,然后可以通过遍历文件描述符集合来确定哪些文件描述符可读或可写。

  2. poll:poll是select的一种改进版本。它使用一个pollfd结构体数组来管理文件描述符,并通过poll函数来监听多个文件描述符的状态。与select相比,poll没有最大文件描述符数量的限制。

  3. epoll:epoll是Linux系统引入的一种高效的IO多路复用机制。它使用一个事件表来管理文件描述符,并通过epoll_ctl函数来注册和删除事件,通过epoll_wait函数来等待事件的发生。epoll提供了三种工作模式:边沿触发(EPOLLET)、水平触发(EPOLLIN、EPOLLOUT)和一次性触发(EPOLLONESHOT),可以根据具体需求选择适合的模式。(epoll可以理解为多了个记事本,)

IO多路复用适用于处理大量的并发连接,如服务器端的网络编程。它可以有效地减少线程的数量,提高系统的并发性能和资源利用率。

可以说:

select内核无状态,每次从零开始

eqoll内核维护一个状态,可以异步做很多事情,调用的时候能够立刻给出结果集

额外拓展

1.epoll机制详解

epoll是Linux系统引入的一种高效的IO多路复用机制,它提供了一种事件驱动的方式来处理多个文件描述符的I/O操作。相比于传统的select和poll机制,epoll在处理大量并发连接时具有更高的性能。

epoll的核心概念包括以下几个部分:

  1. epoll实例(epoll instance):epoll实例是一个内核数据结构,用于管理文件描述符和事件。通过epoll_create函数来创建一个epoll实例。

  2. 文件描述符(file descriptor):文件描述符是操作系统对文件或I/O设备的引用。在epoll中,需要将需要监听的文件描述符添加到epoll实例中。

  3. 事件(event):事件是对文件描述符的一种状态变化的表示,如可读、可写等。在epoll中,通过epoll_event结构体来表示事件。

  4. 事件表(event table):事件表是epoll实例中用来存储事件的数据结构,可以通过epoll_ctl函数来注册和删除事件。

epoll的工作流程如下:

  1. 创建epoll实例:通过epoll_create函数创建一个epoll实例,并返回一个文件描述符,用于后续的操作。

  2. 添加文件描述符:通过epoll_ctl函数将需要监听的文件描述符添加到epoll实例中,并指定需要监听的事件类型。

  3. 等待事件:通过epoll_wait函数等待事件的发生。当有文件描述符的事件发生时,epoll_wait函数会返回,并将事件信息填充到一个epoll_event数组中。

  4. 处理事件:遍历epoll_event数组,根据事件类型进行相应的处理。

  5. 循环操作:重复执行等待事件和处理事件的过程,实现持续的事件驱动。

epoll提供了三种工作模式:

  1. 边沿触发(EPOLLET):只有在文件描述符状态发生变化时才触发事件,适用于高效处理大量的并发连接。

  2. 水平触发(EPOLLIN、EPOLLOUT):只要文件描述符处于可读或可写状态,就会触发事件,适用于普通的网络编程。

  3. 一次性触发(EPOLLONESHOT):只触发一次事件,需要在处理完事件后重新注册。

epoll的优势在于可以处理大量的并发连接,具有更高的性能和资源利用率。它避免了传统select和poll机制中遍历文件描述符集合的开销,同时提供了更灵活的事件触发方式。因此,epoll被广泛应用于高性能的网络服务器编程。

2.BIO什么时候会阻塞?

BIO(Blocking I/O,阻塞I/O)是一种同步的I/O模型,在进行I/O操作时会阻塞当前线程,直到操作完成或出现错误。以下情况下,BIO会发生阻塞:

  1. 读取阻塞:当从输入流(如Socket的InputStream)读取数据时,如果没有可读取的数据,读取操作将会阻塞,直到有数据可读或者发生超时或错误。

  2. 写入阻塞:当向输出流(如Socket的OutputStream)写入数据时,如果输出缓冲区已满,写入操作将会阻塞,直到有空间可写或者发生超时或错误。

  3. 连接阻塞:在使用ServerSocket等待客户端连接时,accept()方法会阻塞当前线程,直到有客户端连接成功或发生超时或错误。

BIO的阻塞特性意味着在进行I/O操作时,线程会一直等待,不能处理其他任务。这可能导致资源浪费和性能下降。因此,对于高并发的网络应用,通常使用NIO(Non-blocking I/O,非阻塞I/O)或AIO(Asynchronous I/O,异步I/O)模型来避免阻塞。

3.上文提到的缓冲区(详解)

概念和作用:缓冲区(Buffer)是在进行I/O操作时用于临时存储数据的一块内存区域。它提供了一种缓冲数据的机制,可以减少实际的I/O操作次数,提高数据读写的效率。

在Java中,缓冲区是通过Buffer类的实例来表示的。Java NIO(New I/O)库提供了一组缓冲区类,如ByteBuffer、CharBuffer、ShortBuffer等,用于处理不同类型的数据。

缓冲区有以下几个重要的属性

  1. 容量(Capacity):缓冲区的容量表示它可以存储的最大数据量。一旦创建,缓冲区的容量就是固定的,不能改变。

  2. 位置(Position):缓冲区的位置表示当前读写操作的位置。初始时,位置为0,随着读写操作进行,位置会自动更新。

  3. 上界(Limit):缓冲区的上界表示有效数据的末尾位置。读写操作不能超过上界。

  4. 标记(Mark):缓冲区的标记是一个备忘位置,可以通过mark()方法设置,并通过reset()方法恢复到标记位置。

缓冲区的基本操作包括:

  1. 写入数据:通过put()方法将数据写入缓冲区,同时位置会自动向后移动。

  2. 读取数据:通过get()方法从缓冲区读取数据,同时位置会自动向后移动。

  3. 翻转缓冲区:通过flip()方法将上界设置为当前位置,位置重置为0,用于将缓冲区从写模式切换到读模式。

  4. 清空缓冲区:通过clear()方法将位置设置为0,上界设置为容量,用于将缓冲区从读模式切换到写模式。

缓冲区的使用可以提高I/O操作的效率,特别是在处理大量数据时。它可以减少系统的调用次数,提高数据读写的速度。

 

相关文章:

阻塞非阻塞IO(BIO和NIO),IO多路复用

1.概念 NIO(New Input/Output)和BIO(Blocking Input/Output)是Java中用于处理输入输出的两种不同的模型。 BIO 会阻塞,等有了消息,立刻返回,一个线程处理一个recv(需要很多线程&…...

HTTP协议初识·中篇

加上目录,会出现导向不正确的情况,可能是bug,目录一长就容易出错? 本篇主要讲解了: 网页分离(网页代码和.c文件分离) html链接跳转 网页添加图片 确认并返回资源类型 填写正文长度属性 添加表单 临时重定向 补充知识&a…...

数学建模:拟合算法

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:拟合算法 文章目录 数学建模:拟合算法拟合算法多项式拟合非线性拟合cftool工具箱的使用 拟合算法 根据1到12点间的温度数据求出温度与时间之间的近似函数关系 F ( t ) F(…...

计算机网络-笔记-汇总

目录 📚 前言 🌸章节汇总 🚀 学习心得 ⌛2023年8月31日 星期四 📚 前言 在学习了【操作系统】、【计算机组成原理】之后 再来学习【计算机网络】,对计算机之间如何通信,有了一个大致的认识。 可以想象…...

STM32定时器定时及其应用

STM32定时器定时及其应用 定时器概述☆定时器相关配置CubeMX工程配置及程序实现固件库程序设计及实现 定时器概述 1. 工作原理 使用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数器 2. 定时器分类   基本定时器(TIM6~TIM7…...

(牛客) 游游的字符重排(next_permutation的使用)

题目描述 游游定义一个字符串是“好串”,当且仅当该字符串相邻的字符不相等。例如"arcaea"是好串,而"food"不是好串。 游游拿到了一个字符串,她可以将该字符串的各个字符顺序随意打乱。她想知道一共可以生产多少种不同的…...

RTPEngine 通过 HTTP 获取指标的方式

文章目录 1.背景介绍2.RTPEngine 支持的 HTTP 请求3.通过 HTTP 请求获取指标的方法3.1 脚本配置3.2 请求方式 1.背景介绍 RTPEngine 是常用的媒体代理服务器,通常被集成到 SIP 代理服务器中以减小代理服务器媒体传输的压力,其架构如下图所示。这种使用方…...

聚鑫数藏平台——引领数字资产管理新风向

随着数字经济的飞速发展,新金融生态应运而生。区块链技术的崭新突破,使数字资产的重要性日益凸显,为投资者带来了前所未有的机遇和挑战。在此背景下,聚鑫数藏平台横空出世,引领着数字资产管理的新风向。 聚鑫数藏平台&…...

web3j solidity 转java

需要使用的环境 web3j,nodejs 安装编译sol工具 1 $ npm install -g solc 保存为hello.sol文件到本地 1 2 3 4 5 6 7 8 pragma solidity 0.4.19; contract hello { function main(uint a) constant returns (uint b) { uint result a * 8; …...

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置

目录 系列往期文章(点击跳转)uniapp项目实战系列(1):导入数据库,启动后端服务,开启代码托管(点击跳转)uniapp项目实战系列(2):新建项目,项目搭建,微信开发工具…...

Jwt工具类

导入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> <dependency><groupId>javax.xml.bind</groupId><artifactId>jax…...

计算机网络-笔记-第五章-运输层

&#x1f338;章节汇总 一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录 五、第五章——运输层 1、运输层概述 2、运输层端口号、复用、分用 &#xff08;1&#xff0…...

java-参数传递机制

java参数传递机制都是值传递。 基本类型参数传输都是数据值。 传递到方法中的值是拷贝后的值。 引用类型参数传输的都是地址值。 如果是数组的参数传递&#xff0c;那么是引用传递&#xff08;本质上还是值传递&#xff0c;但是由于数组的值传递是传递数组的内存地址&#xf…...

Python编程练习与解答 练习96:字符串是否表示整数

本练习将编写一个名为isInteger的函数&#xff0c;用于确定字符串中的字符是否代表有效整数&#xff0c;确定字符串是否表示整数时&#xff0c;则应忽略开通要或者结尾的任何空白。一旦这个空白被忽略&#xff0c;如果字符串的长度至少是1&#xff0c;且只包含数字&#xff0c;…...

Scala的特质trait与java的interface接口的区别,以及Scala特质的自身类型和依赖注入

1. Scala的特质trait与java接口的区别 Scala中的特质&#xff08;trait&#xff09;和Java中的接口&#xff08;interface&#xff09;在概念和使用上有一些区别&#xff1a; 默认实现&#xff1a;在Java中&#xff0c;接口只能定义方法的签名&#xff0c;而没有默认实现。而在…...

检查js中的字符串是否可以成为回文

探索 JavaScript 中的字符串操作领域揭示了一个令人着迷的挑战&#xff1a;确定给定的字符串是否可以转换为回文。回文&#xff0c;即正反读相同的单词或短语&#xff0c;具有固有的吸引力&#xff0c;并激发了寻求揭开其神秘属性的开发人员的好奇心。在本文中&#xff0c;我们…...

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09; 目录 时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1…...

WebSocket--技术文档--基本概念--《快速了解WebSocket协议》

阿丹&#xff1a; 不断学习新技术&#xff0c;丰富自己了解更多才能扩展更多世界可能。 官网 WebSocket首页、文档和下载 - HTML5开发相关 - OSCHINA - 中文开源技术交流社区 软件简介 WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebS…...

flutter报错-cmdline-tools component is missing

安装完androidsdk和android studio后&#xff0c;打开控制台&#xff0c;出现错误 解决办法 找到自己安装android sdk的位置&#xff0c;然后安装上&#xff0c;并将下面的勾选上 再次运行 flutter doctor 不报错&#xff0c;出现以下画面 Doctor summary (to see all det…...

torch.bmm功能解读

bmm 是 batched matrix multiple 的简写&#xff0c;即批量矩阵乘法&#xff0c;矩阵是二维的&#xff0c;加上batch一个维度&#xff0c;因此该函数的输入必须是两个三维的 tensor&#xff0c;三个维度代表的含义分别是&#xff1a;&#xff08;批量&#xff0c;行&#xff0c…...

基于django+vue的智慧物业来访预约报修管理系统

目录功能模块划分核心业务功能特色功能设计技术实现要点扩展性设计项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作功能模块划分 后台管理&#xff08;Django&#xff09; 用户权限管理&#xff1a;业主、物业管理员、维修人员…...

AppleRa1n开源工具:iOS 15-16激活锁绕过完整解决方案

AppleRa1n开源工具&#xff1a;iOS 15-16激活锁绕过完整解决方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 激活锁&#xff08;Activation Lock&#xff09;作为iOS设备的重要安全机制&#xff0…...

Docker构建速度太慢?试试替换Debian基础镜像的APT源为阿里云(附多版本Dockerfile写法)

加速Docker构建&#xff1a;Debian基础镜像APT源优化全指南 每次等待Docker镜像构建完成时&#xff0c;看着缓慢下载的进度条&#xff0c;是不是感觉时间仿佛被拉长了&#xff1f;特别是在国内网络环境下&#xff0c;从官方Debian源拉取软件包的速度简直让人抓狂。我曾经的一个…...

利用Python和快速傅里叶变换解析振动传感器数据:从趋势图到频谱分析的完整指南

1. 振动传感器数据分析入门指南 当你第一次拿到振动传感器采集的数据时&#xff0c;可能会被满屏的数字搞得一头雾水。别担心&#xff0c;我刚开始接触时也是这样。振动数据就像是一本用密码写成的日记&#xff0c;而Python和快速傅里叶变换(FFT)就是我们破译这些密码的神奇工具…...

OpenClaw对话日志分析:GLM-4.7-Flash任务执行成功率提升

OpenClaw对话日志分析&#xff1a;GLM-4.7-Flash任务执行成功率提升 1. 为什么需要分析对话日志 上个月我把本地部署的OpenClaw智能体从Qwen切换到了GLM-4.7-Flash模型&#xff0c;本以为会获得更好的任务执行效果&#xff0c;结果却遇到了意想不到的问题。每天早上打开电脑&…...

PyTorch 2.8镜像多场景落地:从Diffusers文生视频到Transformers微调全流程

PyTorch 2.8镜像多场景落地&#xff1a;从Diffusers文生视频到Transformers微调全流程 1. 开箱即用的深度学习环境 PyTorch 2.8深度学习镜像基于RTX 4090D 24GB显卡和CUDA 12.4深度优化&#xff0c;为各类AI任务提供稳定高效的运行环境。这个镜像最吸引人的特点是它的"万…...

告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库

告别官方驱动&#xff1a;深入解读ES7210寄存器&#xff0c;打造你自己的ESP32音频采集库 在嵌入式音频开发领域&#xff0c;ES7210作为一款高性能多通道麦克风ADC芯片&#xff0c;因其出色的信噪比和灵活的配置选项&#xff0c;成为ESP32平台上音频采集的热门选择。然而&#…...

Multisim 13.0 仿真 LC 振荡器:从起振到稳定,手把手教你分析波形与频率稳定度

Multisim 13.0 仿真 LC 振荡器&#xff1a;从起振到稳定&#xff0c;手把手教你分析波形与频率稳定度 在电子工程领域&#xff0c;LC振荡器作为基础电路之一&#xff0c;其设计与分析能力是每位硬件工程师的必修课。Multisim作为业界广泛使用的电路仿真软件&#xff0c;为我们…...

告别死记硬背!信息系统项目管理师(高项)思维导图活用法:从考前3个月到考前一天的全周期规划

信息系统项目管理师备考革命&#xff1a;用思维导图构建你的动态知识引擎 备考信息系统项目管理师&#xff08;高项&#xff09;的过程&#xff0c;常常让考生陷入两难困境&#xff1a;一方面要掌握庞杂的知识体系&#xff0c;另一方面又要应对实际工作中的时间压力。传统死记硬…...

Kronos创新应用实战指南:从技术原理到跨行业落地

Kronos创新应用实战指南&#xff1a;从技术原理到跨行业落地 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos Kronos作为金融市场的"语言模型"&a…...