Select,poll,epoll和IO多路复用和NIO

Select,poll,epoll和IO多路复用和NIO

  • IO 多路复用:是一种 I/O 处理机制,它允许单个线程同时处理多个 I/O 流(如多个文件描述符对应的网络连接、文件操作等)的输入输出操作,通过一种机制来监听这些 I/O 流的状态变化(如可读、可写等),一旦某个 I/O 流有状态变化,就可以对其进行相应的处理。Select、Poll、Epoll 都是实现 IO 多路复用的具体技术手段,它们属于 IO 多路复用这个大的范畴。

  • NIO(New Input/Output):是 Java 中对传统 I/O(BIO,Blocking I/O)的一种改进,它提供了非阻塞 I/O 和基于通道(Channel)与缓冲区(Buffer)的 I/O 操作方式等特性。NIO 在实现过程中也会用到 IO 多路复用的思想,并且在 Java 的 NIO 实现中,底层实际上是可以基于 Select、Poll 或 Epoll(取决于不同的操作系统和 Java 运行时环境)等方式来实现对多个 I/O 事件的监听和处理,所以 NIO 与 IO 多路复用紧密相关,它是在 Java 语言层面应用 IO 多路复用机制的一种体现。

Select,poll,epoll区别

他们是NIO中多路复用的三种实现机制,是由Linux操作系统提供的。

用户空间和内核空间: 操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备,必须通过内核空间。

文件描述符 File Descriptor(FD): 是一个抽象的概念,形式上是一个整数,实际上是一个索引值。指向内核中为每个进程维护 进程所打开的文件的记录表。当程序打开一个文件或者创建一个文件时,内核就会向进程返回一个FD。Unix,Linux中才有

select机制: 会维护一个FD的结合 fd_set,将fd_set从用户空间复制到内核空间,激活socket。 x64位机器上受限 2048, fd_set是一个数组结构

Poll机制: 和selecter机制是差不多的,把fd_set结构进行了优化,FD集合的大小就突破了操作系统的限制。 pollfd结构来代替fd_set,通过链表实现的。操作跟Selecter机制一样都是遍历FD集合

EPoll: Event Poll.Epoll不再扫描所有的FD,只将用户关心的FD的事件存放到内核的一个事件表当中。这样,可以减少用户空间与内核空间之前需要拷贝的数据

  • Select,poll,epoll都是底层C++的API

java的NI0当中是用的那种机制?

可以查看DefaultSelectorProvider类的源码,

在windows下,WindowsSelectorProvider. 而Linux下,根据Linux的内核版本,2.6版本以上,就是EPollSelectorProvider,否则就是默认的PollSelectorProvider.

1. Select

  • 实现原理:Select 通过一个文件描述符集合fd_set(通常有三个集合,分别对应可读、可写和异常事件)来监听多个 I/O 流的状态变化。在调用 Select 函数时,它会遍历这个集合中的所有文件描述符,逐个检查它们是否有对应的可读、可写或异常事件发生。如果有事件发生,Select 会返回,并告知哪些文件描述符发生了何种事件,然后程序就可以针对这些发生事件的文件描述符进行相应的处理。

  • 性能特点:

    • 随着监听的文件描述符数量增加,性能会显著下降。因为每次调用 Select 都需要遍历整个文件描述符集合来检查状态变化,当文件描述符数量很大时,遍历的开销就会变得很大。

    • 每次调用 Select 后,返回的结果只是告知哪些文件描述描述符有事件发生,但并没有提供详细的事件信息,例如对于可读事件,它不会告诉你到底有多少数据可读,还需要进一步通过读取操作来确定。

  • 平台支持:Select 是最早1984年出现的 IO 多路复用技术,几乎在所有的操作系统上都有支持,具有很好的跨平台性。

2. Poll

  • 实现原理:Poll 的工作原理与 Select 类似,也是通过一个结构体数组pollfd(类似文件描述符集合)来监听多个 I/O 流的状态变化。不同的是,Poll 使用的结构体数组可以动态分配大小,不像 Select 那样有固定大小的集合限制。在调用 Poll 函数时,同样会遍历这个结构体数组来检查各 I/O 流的状态变化,一旦有事件发生,Poll 会返回并告知相关信息。

  • 性能特点:

    • 虽然 Poll 解决了 Select 文件描述符集合固定大小的问题,但它在性能上与 Select 类似,当监听的文件描述符数量较多时,遍历结构体数组的开销同样会导致性能下降。

    • 与 Select 一样,返回的结果也只是告知哪些文件描述符有事件发生,没有提供更详细的事件信息,需要进一步操作来确定具体情况。

  • 平台支持:Poll 也具有较好的跨平台性,在很多操作系统上都有支持,不过在实际应用中,由于性能方面的原因,使用频率相对 Select 可能会低一些。1997年

3. Epoll

  • 实现原理:Epoll 是 Linux 特有的一种高性能的 IO 多路复用技术。它采用了事件驱动的设计思想,通过在内核中创建一个红黑树来管理所有监听的文件描述符,同时还有一个就绪队列来存放已经发生事件的文件描述符。当有事件发生时,内核会直接将发生事件的文件描述符放入就绪队列,而不是像 Select 和 Poll 那样需要遍历整个集合或数组来查找。应用程序只需要从就绪队列中获取发生事件的文件描述符并进行处理即可。

  • 性能特点:

    • 具有非常高的性能,尤其是在监听大量文件描述符时优势明显。因为它不需要遍历所有监听的文件描述符来查找发生事件的文件描述符,大大减少了遍历开销。

    • 提供了更详细的事件信息,例如对于可读事件,它可以告知有多少数据可读等详细情况,这使得应用程序在处理 I/O 事件时更加高效。

  • 平台支持:Epoll 仅在 Linux 操作系统上有支持,不具有跨平台性。

4. NIO(从 Java 角度看)

  • 实现原理:Java 的 NIO 基于通道(Channel)和缓冲区(Buffer)进行 I/O 操作。它提供了非阻塞 I/O 模式,即当进行读或写操作时,如果没有数据可读或可写,不会像传统的 BIO 那样阻塞等待,而是立即返回并告知当前状态。在监听多个 I/O 事件方面,Java 的 NIO 底层会根据不同的操作系统采用不同的 IO 多路复用实现方式(如在 Linux 下可能采用 Epoll,在 Windows 下可能采用类似 Select 的实现,在 Mac OS 等其他操作系统下也有相应的实现方式),通过这些方式来实现对多个 I/O 通道的监听,一旦某个通道有事件发生,就可以进行相应的处理。

  • 性能特点:

    • 相比于传统的 BIO,NIO 的非阻塞特性使得它在处理多个 I/O 事件时可以更高效地利用系统资源,减少了因阻塞等待而浪费的时间。

    • 不过,NIO 的实现相对复杂一些,尤其是在处理复杂的 I/O 场景时,需要对通道、缓冲区以及事件监听等方面有较好的理解和运用。

  • 平台支持:Java 的 NIO 具有良好的跨平台性,因为它会根据不同的操作系统采用合适的底层 IO 多路复用实现方式来保证在各种操作系统上都能正常运行。

综上所述,Select、Poll、Epoll 是实现 IO 多路复用的不同技术手段,各有其性能特点和适用场景,而 NIO 是 Java 中应用 IO 多路复用思想的一种实现,它与这些 IO 多路复用技术紧密相关,并且在不同的操作系统下会依托不同的 IO 多路复用实现方式来实现其功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

希尔排序(C语言)

一、步骤: 希尔排序的基本思想:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后取重复上述分组和排序的工作。当到gap 1时,所有记录在…

自动驾驶为什么需要时间同步?高精度时间同步如何实现?

自动驾驶作为汽车与物联网技术、人工智能等高新技术融合的产物,具有新颖性、复杂性和巨大的挑战性。自动驾驶需要实时传输、处理海量数据,并实时做出决策,这不仅要求有通畅网络通信环境、强大的数据算力,更要求时间同步的超低时延…

【信号处理】基于联合图像表示的深度学习卷积神经网络

Combined Signal Representations for Modulation Classification Using Deep Learning: Ambiguity Function, Constellation Diagram, and Eye Diagram 信号表示 Ambiguity Function(AF) 模糊函数描述了信号的两个维度(dimensions):延迟(delay)和多普勒(Doppler)。 …

C++20 概念与约束(1)—— SFINAE

●《C20 概念与约束(1)—— SFINAE》 《C20 概念与约束(2)—— 初识概念与约束》 《C20 概念与约束(3)—— 约束的进阶用法》 1、从模板说起 众所周知,C在使用模板时,如果有多…

[极客大挑战 2019]PHP 1

[极客大挑战 2019]PHP 1 审题 猜测备份在www.zip中,输入下载文件。 知识点 反序列化 解题 查看代码 看到index.php中包含了class.php,直接看class.php中的代码 查看条件 当usernameadmin,password100时输出flag 构造反序列化 输入select中&#…

Kubebot:一款Google云平台下的Slackbot安全测试工具

Kubebot 今天给大家介绍的是一款名叫Kubebot的安全测试Slackbot,该工具基于Google 云平台搭建,并且提供了Kubernetes后端。 项目架构 数据流 1.API请求由Slackbot发起,发送至API服务器,API服务器以Kubernetes(K8s)集群中的Docke…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一,什么是pod1.1pod在k8s中使用方法(1)使用方法一(2)使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理(1)pause容器的作用 1.4 Pod分类:(1)自主式…

Redis安装(Windows环境)

目录 1.下载2.双击安装后配置环境变量3.启动服务4.设置Windows服务5.启动客户端6.常用的Redis服务命令7.使用图形化界面工具查看Redis内部数据情况类似Navicat 连接数据库 1.下载 1.点击github下载地址 2.上方资源链接下载安装 2.双击安装后配置环境变量 3.启动服务 上图虽然…

windows下qt5.12.11使用ODBC远程连接mysql数据库

1、下载并安装mysql驱动,下载地址:https://dev.mysql.com/downloads/ 2、配置ODBC数据源,打开64位的ODBC数据源配置工具:

【AI写作宝-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

GFPS技术原理(四)GATT特征值

Fast Pair服务 fast pair 服务的UUID 是0xFE2C,然后它又包含多个特征值,下面一一分析: Model ID UUID是0x1233,设备在谷歌云注册的时候会分配一个24 bit的ID。 Key-based Pairing UUID是0x1234,这个是用来做DH密钥…

3.2 软件需求:面对过程分析模型

面对过程分析模型 1. 需求分析的模型概述1.1 面对过程分析模型-结构化分析方法1.2 结构化分析的过程 2. 功能模型:数据流图初步2.1 加工2.2 外部实体(数据源点/终点)2.3 数据流2.4 数据存储2.5 注意事项 3. 功能模型:数据流图进阶…

ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=2)

mongodb 开启验证后出现这个问题 邪门的问题 居然是格式问题 要用两个空格表示缩进 而不是tab

数据分析——学习框架

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

YOLOV8应用|排球垫球计数|附带全部数据集与源码(见文末百度云盘链接)

项目简介: 该项目旨在利用YOLOv8算法实现排球垫球动作的自动识别与计数。YOLOv8作为计算机视觉领域的先进目标检测算法,具备高精度和实时性的特点,非常适合用于体育训练和测试中的自动化计数。项目将排球垫球视频作为输入,通过YOLOv8算法检测视频中的排球及垫球动作,自动…

今天给在家介绍一篇基于jsp的旅游网站设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

CAN总线数据帧格式详细介绍

目录 1. CAN总线数据帧格式 2. 数据帧 2.1 帧起始 2.2 仲裁段 2.3 控制段 2.4 数据段 2.5 CRC 段 2.6 ACK段 2.7 帧结束 2.8 总结 3. 遥控帧 4. 错误帧 4.1 错误标志 4.1.1 主动错误标志 4.1.2 被动错误标志 4.2 错误界定符 5. 过载帧 6. …

Java面试要点02 - 自动装箱与拆箱的原理与性能解析

本文目录 一、引言二、自动装箱与拆箱的底层原理2.1 编译器的处理机制2.2 字节码层面的分析2.3 缓存机制的实现 三、性能影响的深度分析3.1 内存开销分析3.2 CPU开销分析 四、实际应用中的常见陷阱4.1 空指针异常陷阱4.2 包装类型的比较陷阱 五、最佳实践与优化建议5.1 性能优化…

速通LoRA:《LoRA: Low-Rank Adaptation of Large Language Models》全文解读

文章目录 总览AbstractIntroductionProblem StatementAren’t Existing Solutions Good Enough?Our MethodLow-Rank-Parametrized Update MatricesApplying LoRA to Transformer 何为高斯随机初始化Empirical ExperimentsBaselinesRoBERTa base/largeDeBERTa XXLGPT-2 medium/…

【Java学习】电脑基础操作和编程环境配置

CMD 在Windows中用命令行的方式操作计算机。 打开CMD Win R输入CMD按下回车键 Win E 进入我的电脑 常用的CMD命令 盘符名称冒号 说明:盘符切换 举例:E:回车,表示切换到E盘 dir 说明:查看当前路径下的内容 cd目录 说明&a…