Netty权威指南~第一章Java的I/O演进之路

article/2025/9/14 14:28:29

本章内容如下:

  1. 5种网络I/O模型的介绍
  2. I/O多路复用的介绍

1、I/O基础入门

在Java1.4之前,Java对I/O的支持不完善,开发人员在开发高性能I/O的程序时,会面临以下问题:

  • 没有数据缓冲区,I/O性能存在问题
  • 没有C++中的Channel概念,只有输入和输出流
  • 同步阻塞式I/O通信(BIO),会导致通信线程被长时间阻塞
  • 支持的字符集有限,硬件可移植性不好

1.1 Linux网络I/O模型简介

Linux的内核将所有外部设备当做一个文件来处理,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符是一个数字,指向内核中的一个结构体(文件路径、数据区等属性)。

根据UNIX网络编程对I/O模型的分类,UNIX提供了以下5种I/O模型:

  1. 阻塞I/O模型(默认)
    以套接字接口为例讲解此模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才被返回,进程从调用recvfrom开始到返回都是被阻塞的。
    在这里插入图片描述
  2. 非阻塞I/O模型
    recvfrom从应用层到内核的时候,如果该缓冲区没有数据,就直接返回ewouldblock错误,一般都轮询检查内核是否有数据到来。
    在这里插入图片描述
  3. I/O复用模型
    Linux提供select/poll,进程通过将一个或多个fd传递给select或poll调用,阻塞在select操作上,这样select/poll可以侦测多个fd是否就绪。select/poll是顺序扫描fd是否就绪,支持的fd数量有限。Linux还提供了epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,性能更高。当有fd就绪时,立即调用回调函数rollback。
    在这里插入图片描述
  4. 信号驱动I/O模型
    首先开启套接口信号驱动I/O功能,通过系统调用sigaction执行一个信号处理函数(系统调用立即返回,进程继续工作,非阻塞)。当数据准备就绪时,就为该进程生成一个sigio信号,通过信号回调通知应用程序调用recvfrom读取数据,并通知主循环函数处理数据。
    在这里插入图片描述
  5. 异步I/O
    告知内核启动某操作,并让内核在操作完成后(数据从内核复制到用户的缓冲区)通知我们。此模型与信号驱动模型的区别是:信号驱动I/O由内核通知我们何时开始一个I/O操作;异步I/O由内核通知我们I/O操作何时已经完成。
    在这里插入图片描述

1.2 I/O多路复用技术

在I/O编程中,需要同时处理多个客户端接入请求时,可以利用多线程或I/O多路复用处理。I/O多路复用将多个I/O阻塞到一个select上,从而使得系统在单线程下可同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的优势是系统开销小,系统不需要创建额外的进程或者线程,也不需要维护这些进程和线程的运行,降低系统维护的工作量,节省系统资源。I/O多路复用的场景有:

  • 服务器需同时处理多个处于监听状态或者多个连接状态的套接字
  • 服务器需同时处理多种网络协议的套接字

目前支持I/O多路复用的系统调用有select、pselect、poll、epoll。select先出现,因其固有缺陷(支持的fd数量有限),被epoll代替。epoll的改进点如下:

  1. 进程打开的socket描述符(fd)不受限制
    fd数目仅受限于操纵系统的最大文件句柄数,例如,1GB内存的机器上大约是10万个句柄,通常该值与系统内存的关注较大。
  2. I/O效率不会随着fd数目的增加而线性下降
    使用select/poll时,当socket的集合很大时,由于网络延时护着链路空闲,任一时刻只有少部分的socket是“活跃”的,select/poll每次调用都会线性扫描全部的集合,导致效率线性下降。而epoll只会对“活跃”的socket进行操作,这是因为在内核实现中epoll是根据fd上的callback函数实现的,只有“活跃”的socket才会主动调用callback函数。在这点上,epoll实现了一个伪AIO。对epoll和select性能对比的测试结果表明:
  • 若所有的socket都处于活跃态,epoll比select/poll的效率高的不多;相反,若过多的使用epoll-ctl,效率会稍微下降
  • 若非活跃的socket慢慢增加的时候,epoll的效率就会远在select/poll之上
  1. 使用mmap加速内核与用户空间的消息传递
    select,poll和epoll均需内核将fd消息通知给用户空间,epoll通过内核和用户空间mmap使用同一块内存避免内核态和用户态的内存复制。
  2. epoll的API更加简单
    epoll的API有创建epoll描述符、添加监听事件、阻塞等待所监听的事件发生、关闭epoll描述符等。

2、Java的I/O演进

从BIO到NIO是Java通信类库迈出的一小步,却对Java在高性能通信领域的发展起到了关键性的推动作用。随着基于NIO的各类NIO框架的发展,以及基于NIO的Web服务器的发展,Java在很多领域取代了C和C++,成为企业服务端应用开发的首选语言。

在JDK1.4推出Java NIO之前,基于Java的所有socket通信都采用同步阻塞模式BIO,这种一对一的请求应答的通信模型简化了上层的应用开发,但在性能和可靠性方面存在着巨大瓶颈。因此,很长一段时间内,大型的应用服务器采用C或者C++开发,因为C和C++可直接使用系统提供的异步I/O或者AIO。当并发访问量增大、响应时间延迟增大后,采用BIO开发的服务端软件只能通过硬件的扩容来满足高并发和低时延,增大企业成本,随着集群规模的扩大,系统的维护性将会面临巨大挑战,只能通过采购性能更高的硬件服务器解决问题,导致恶性循环。这一切使得人们对Java非阻塞I/O的呼声日渐高涨,最终,JDK1.4提供了NIO类库,Java终于可以支持非阻塞I/O了。

参考:
《Netty权威指南》


http://chatgpt.dhexx.cn/article/djvfEdVZ.shtml

相关文章

Netty权威指南(第2版)

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”)购买正版 封页 编辑推荐 1、Hadoop、Storm、Spark、Facebook、…

Netty权威指南——WebSocket协议开发

一、简介 由于HTTP协议的开销,导致他们不适于用于低延迟应用,为了解决这些问题,WebSocket将网络套接字引入到了客户端和服务端,浏览器和服务器之间可以通过套接字建立持久的连接,双方随时可以互发数据给对方&#xff…

netty权威指南 微云_《Netty权威指南》(二)NIO 入门

2.1 BIO 采用 BIO 通信模型的服务器,通常由一个独立的 Acceptor 线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完成后,通过输出流返回应答给客户端,线程销毁。 grap…

netty 权威指南~第11章——WebSoket协议开发

本章主要学习内容如下: 1、WebSocket入门 2、Netty WebSocket协议开发 第节一:WebSocket入门 WebSocket是HTML5开始提供的一种浏览器与服务器进行全双通信的网络技术,WebSocket通信协议与2011年被IEIF定位标准RFC6455,WebsSock…

Netty权威指南 第2版

https://www.cnblogs.com/plxz/p/9910493.html 第一章  Java的I/O演进之路 1.I/O基础入门 1.Linux网络I/O模型简介 1.阻塞I/O模型:最常用的I/O模型,缺省情况下, 所有文件操作都是阻塞的 2.非阻塞I/O模型:recvform从应用层到内…

Netty权威指南总结(一)

一、为什么选择Netty: API使用简单,开发门槛低,屏蔽了NIO通信的底层细节。 功能强大,预制了很多种编解码功能,支持主流协议。 定制能力强,可以通过ChannelHandler对通信框架进行灵活地拓展。 性能高、成熟、…

Netty权威指南

Chapter1.java I/O演进之路 1.1I/O基础入门 在java 1.4之前,java程序员在开发高性能I/O程序的时候,会面临的问题主要有: 1.没有数据缓冲区,I/O性能存在问题 2.没有c或者c中的Channel概念,只有输入和输出流 3.同步…

三维视觉传感器的类型

三角法测量原理 视觉传感器的坐标系统 单一摄像机二维传感器 点结构光视觉传感器 线结构光视觉传感器 条纹结构光视觉传感器 条纹编码三维视觉传感器 彩色编码视觉传感器 被动双目视觉传感器 编码照明双目视觉传感器

传感器sensor

传感器分类 转换原理 传感器名称 典型应用 转换形式 中间参量 电 参 数 电 阻 移动电位器角点 改变电阻 电位器传感器 位移 改变电阻丝或片尺寸 电阻丝应变传感器、半导体应变传感器 微应变、力、负荷 利用电阻的温度效应 热丝传感器 气流速度、液体流量 电阻…

多任务多传感器数据融合实现3D目标检测

转载自:自动驾驶之心 01 引言 本文介绍一篇uber公司在CVPR上发表的一篇论文,即使用多种传感器(LiDAR和RGB相机)数据,以及多任务进行数据融合,实现准确高效的3D目标检测。简而言之,自动驾驶领域…

压力传感器

压力传感器 压力传感器是最常用的一种传感器,其应用范围有各种工业互通环境,涉及航空,航天,军工,石化,电力等。按照不同的测试,压力类型可分表压传感器,差压传感器,绝压…

多传感器融合定位(一)——3D激光里程计

目录 一、点云地图整体流程 二、激光里程计方案 2.1 ICP点到点 2.1.1 ICP推导 2.1.2 ICP改进 2.2 NDT 2.2.1 NDT推导 2.2.2 NDT改进 2.3 LOAM系 2.3.1 LOAM 2.3.2 A-LOAM 2.3.3 LEGO-LOAM 2.4 数据集及评价指标 2.4.1 KITTI简介 2.4.2 指标 一、点云地图整体流程…

MMDetection3D 1.1:统一易用的 3D 感知平台

自从两年前 MMDetection3D 发布以来,我们收到了很多用户的反馈,其中有不少有价值的建议,同时也有很多吐槽(当然我们非常欢迎大家来吐槽),也有很多社区用户参与到我们代码库的完善中,我们也非常高…

关于传感器

人的眼睛就是传感器。人对光的感应靠眼睛,在光亮条件下,人眼能分辨各种颜色。首先从人眼构造开始讲起。眼睛最里面的膜是视网膜,它布满了整个眼睛后部的内壁。当眼球适当地聚焦时,来自眼睛外部的光在视网膜上成像。在视网膜表面分…

ToF 3D视觉传感技术详解、应用场景和市场前景

‍转载自:3d tof 现行的深度传感镜头作为智能手机的一大创新,已在目前主流智能手机上广泛应用。现因苹果在最新版iPad Pro上搭载了D-ToF(直接飞行时间法)深度传感镜头引起了极大的关注,推动了3D视觉在消费场景的新应用…

奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明

作者:童虎 编辑:3D视觉开发者社区 Orbbec Astra Pro传感器在ROS(indigo和kinetic)使用说明 这款摄像头使用uvc输入彩色信息,需要libuvc和libuvc_ros这样才能在ROS正常使用彩色功能。 请在下面网址,分别下载…

3D传感相关

这里涉及了各种3D传感相关的工作,包含单目、双目、ToF等传感器,涉及了计算摄影、ToF深度测量、双目深度估计、多视角深度估计、相机离线标定、相机在线标定、NeRF等技术,可谓3D视觉集大成者。 这里简单介绍下本文将会提到的两种3D成像技术&a…

3D激光雷达SLAM算法学习02——3D激光雷达传感器

1.本篇思维导图 2. 3D激光雷达传感器分类 3. 机械激光雷达 直观视频感受:Velodyne 优点:360视野,精度高,工作稳定,成像快 缺点:成本较高,不符合自动驾驶车规,生命周期短&#xff0c…

Lidar 3D传感器点云数据与2D图像数据的融合标注

2D&3D融合 以自动驾驶场景为例,自动驾驶汽车需要使用传感器来识别车辆周围的物理环境,用来捕获2D视觉数据,同时在车辆顶部安装雷达,用以捕捉精确目标定位的3D位置数据。 激光雷达生成的点云数据可用于测量物体的形状和轮廓,估…

3D视觉传感器产业现状-2018年

总结一下,主要参考于MEMS市场调研 MEMS.ME, 必须找专业的分析和咨询公司才行,或者活跃在前沿的资深行业专家。市场分析只能给出大致的销售状况,还不能给出详细的技术数据对比。 从三维重建的算法、技术原理和效果参数上分析&#…