Unix I/O 模型及Java I/O 模型详解

在Unix Socket的输入操作中,可以将其分为以下几个阶段:

  1. 等待数据就绪(内核空间)
    在这个阶段,应用程序通过调用阻塞式的读取函数(如recv)或非阻塞式的读取函数(如recv、recvfrom)等待数据的到达。如果没有数据到达,阻塞式的读取函数会一直等待,而非阻塞式的读取函数会立即返回一个错误码或标识表示数据未准备好。

  2. 数据拷贝到内核缓冲区(内核空间)
    当数据就绪后,操作系统会将数据从网络中拷贝到内核缓冲区中。这个阶段是在内核空间中进行的,应用程序无法直接访问或操作内核缓冲区。

  3. 数据拷贝到用户缓冲区(用户空间)
    在这个阶段,从内核缓冲区将数据拷贝到应用程序提供的用户缓冲区中。这个步骤涉及了将数据从内核空间切换到用户空间的操作。

  4. 数据处理和应用程序操作(用户空间)
    一旦数据被拷贝到用户缓冲区,应用程序就可以对数据进行处理和操作。这可能包括解析数据、执行特定的业务逻辑或对数据进行进一步的处理

在整个输入操作过程中,数据从网络到达应用程序的用户空间,经过了多次拷贝和处理。故而产生零拷贝的方案,以减少用户空间与CPU内核空间的拷贝过程,减少用户上下文与CPU内核上下文间的切换,提高系统效率

不同的IO模型可能会对输入操作的阶段和执行方式有所影响。例如,阻塞IO模型和非阻塞IO模型在等待数据就绪阶段的行为上有差异,而异步IO模型可以在数据到达后异步地通知应用程序,使应用程序可以进行其他操作而不必等待数据的拷贝和处理过程

I/O 模型

在这里插入图片描述

常用的为阻塞I/O 及 多路复用I/O

阻塞 I/O

在阻塞IO模型中,应用程序发起一个IO操作后,会一直阻塞等待,直到IO操作完成

  • 当应用程序执行IO操作时,如果数据没有准备好或无法立即写入目标,应用程序会一直等待,直到数据就绪。

阻塞IO模型是最简单的IO模型,易于理解和使用,适用于IO操作相对较少或IO时间短暂的场景

非阻塞 I/O

在非阻塞IO模型中,应用程序发起一个IO操作后,会立即返回,而不会等待IO操作的完成

  • 当应用程序执行非阻塞IO操作时,如果数据没有准备好或无法立即写入目标,应用程序会立即返回一个错误码或标识
  • 应用程序可以通过轮询或使用select、poll、epoll等函数来检查IO操作的状态,以确定数据是否已经就绪

非阻塞IO模型需要应用程序自行处理IO操作的就绪状态,适用于需要同时处理多个IO操作的场景

多路复用 I/O

多路复用IO模型通过使用select、poll、epoll等函数,将多个IO操作集中在一起进行管理。应用程序将多个IO操作注册到多路复用机制(Selector)中,并在调用多路复用函数时等待就绪的IO操作

多路复用IO模型可以同时管理多个IO操作,减少了轮询的开销,提高了效率。多路复用IO模型适用于需要同时处理大量IO操作的场景

信号驱动 I/O

信号驱动IO模型中,应用程序通过注册信号处理函数,并将文件描述符设置为非阻塞模式。

  • 当IO操作就绪时,操作系统会发送一个信号给应用程序,应用程序在信号处理函数中进行IO操作的处理

信号驱动IO模型可以在IO操作就绪时异步地通知应用程序,适用于需要异步IO操作的场景

异步 I/O

异步IO模型中,应用程序发起IO操作后,可以继续执行其他任务,而不需要等待IO操作的完成

  • 当IO操作完成后,操作系统会通知应用程序,应用程序可以异步地获取或处理已完成的IO结果

异步IO模型不需要应用程序自行管理IO操作的状态,适用于需要高性能异步IO操作的场景

I/O 模型对比

同步 I/O 与异步 I/O

  • 阻塞等待 vs 非阻塞操作:同步I/O需要应用程序阻塞等待操作完成,而异步I/O可以让应用程序在操作进行时继续执行其他任务。
  • 应用程序控制 vs 操作系统控制:同步I/O模型需要应用程序主动发起和等待I/O操作的完成,而异步I/O模型中,应用程序发起I/O操作后,操作系统负责管理和执行操作,并在完成时通知应用程序。
  • 阻塞模式 vs 异步通知:同步I/O模型中,应用程序需要等待数据就绪或写入目标后才能继续执行,而异步I/O模型中,应用程序可以在操作发起后立即返回,并在操作完成后得到通知

Java I/O 模型

BIONIOAIO
阻塞 vs 非阻塞阻塞非阻塞非阻塞
同步 vs 异步同步同步异步
线程资源消耗需要为每个连接分配独立的线程通过单线程处理多个连接利用操作系统的异步通知机制,不需要额外的线程资源
数据处理能力阻塞等待使用缓冲区(Buffer)进行数据处理,提供了更高效的数据读写能力通过异步I/O操作提供高性能的异步操作机制

BIO

同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善

public class BioExample {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8888);System.out.println("Server started, waiting for connections...");while (true) {Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress());InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}socket.close();System.out.println("Client disconnected.");}}
}

NIO

异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。当进行读写操作时,只须直接调用API的read或write方法

这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数

public class NioExample {public static void main(String[] args) throws IOException {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(8888));serverSocketChannel.configureBlocking(false);System.out.println("Server started, waiting for connections...");ExecutorService executorService = Executors.newFixedThreadPool(10);while (true) {SocketChannel socketChannel = serverSocketChannel.accept();if (socketChannel != null) {System.out.println("Client connected: " + socketChannel.getRemoteAddress());executorService.submit(() -> {try {ByteBuffer buffer = ByteBuffer.allocate(1024);while (socketChannel.read(buffer) != -1) {buffer.flip();socketChannel.write(buffer);buffer.clear();}socketChannel.close();System.out.println("Client disconnected: " + socketChannel.getRemoteAddress());} catch (IOException e) {e.printStackTrace();}});}}}
}

AIO

异步IO模型中,应用程序发起IO操作后,可以继续执行其他任务,而不需要等待IO操作的完成。当IO操作完成后,操作系统会通知应用程序,应用程序可以异步地获取或处理已完成的IO结果

public class AioExample {public static void main(String[] args) throws IOException {AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8888));System.out.println("Server started, waiting for connections...");serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {@Overridepublic void completed(AsynchronousSocketChannel socketChannel, Object attachment) {serverSocketChannel.accept(null, this);try {System.out.println("Client connected: " + socketChannel.getRemoteAddress());ByteBuffer buffer = ByteBuffer.allocate(1024);socketChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer buffer) {if (result == -1) {try {socketChannel.close();System.out.println("Client disconnected: " + socketChannel.getRemoteAddress());} catch (IOException e) {e.printStackTrace();}return;}buffer.flip();socketChannel.write(buffer, buffer, this);buffer.clear();}@Overridepublic void failed(Throwable exc, ByteBuffer buffer) {exc.printStackTrace();}});} catch (IOException e) {e.printStackTrace();}}@Overridepublic void failed(Throwable exc, Object attachment) {exc.printStackTrace();}});try {Thread.sleep(Long.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();}}
}

使用了CompletionHandler来处理异步操作的完成和错误处理


参考资料:

  1. 《Unix网络编程第1卷》
  2. Redis之IO线程、IO多路复用,BIO、NIO和AIO区别

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

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

相关文章

入门级10寸加固行业平板—EM-I10J

亿道信息以其坚固耐用的智能终端设备而闻名&#xff0c;近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J​​ 这是一款 10 英寸的平板电脑&#xff0c;主要运行 Windows 10操作系统&#xff0c;带有硬化塑料外壳&#xff0c;具有 IP65 防水防尘功能和 MIL-STD 8…

线性dp之石子合并

设有 N堆石子排成一排&#xff0c;其编号为 1,2,3,…,N。 每堆石子有一定的质量&#xff0c;可以用一个整数来描述&#xff0c;现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆&#xff0c;合并的代价为这两堆石子的质量之和&#xff0c;合并后与这两堆石子相邻的…

注册及搭建小程序开发环境

一、注册小程序账号 打开微信公众平台&#xff0c;通过邮箱注册小程序账号&#xff08;每个邮箱账号&#xff0c;只能注册一个小程序&#xff09;。 注册完成后&#xff0c;登录邮箱&#xff0c;打开激活地址&#xff0c;按照邮件提示&#xff0c;填写信息&#xff0c;激活账号…

Eclipse - 查看工程或者文件的磁盘路径

Eclipse - 查看工程或者文件的磁盘路径 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explorer 4.1.0 -> Install2. right-click -> Open in ExplorerReferences 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explo…

门店数字化之旅:如何跨越那些难以逾越的鸿沟?

在数字化浪潮席卷全球的背景下&#xff0c;连锁门店运营正面临着一场深刻的变革。这场变革不仅关乎技术的升级&#xff0c;更涉及到商业模式、管理理念以及消费者体验的根本性转变。然而&#xff0c;在这场转型之路上&#xff0c;许多门店却常常遭遇各种痛点&#xff0c;让数字…

2023年总结与2024展望

今天是春节后上班第一天&#xff0c;你懂的&#xff0c;今天基本上是摸鱼状态&#xff0c;早上把我们负责的项目的ppt介绍完善了一下&#xff0c;然后写了一篇技术文章&#xff0c;《分布式系统一致性与共识算法》。接着就看了我近几年写的的年度总结&#xff0c;我一般不会在元…

一个服务器实现本机服务互联网化

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上&#xff0c;中微子代理就像是一支潜伏在黑暗中的数字特工队&…

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类 文章目录 LTDMC.dll下载LTDMC.cs LTDMC.dll C#调用封装下载ICard.cs 运动控制卡接口Card.cs 运动控制卡抽象类CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类CardList.cs 总线卡列表封装 LTDMC.dll下载 最新…

【笔记------STM32】MX_RTC_Init()初始化RTC时RTC_ISR_INITF位超时失败的解决方法

RTC和flash有点像&#xff0c;有些功能需要解锁才能配置&#xff0c;虽然cubeMX生成的RTC部分的解锁配置正确&#xff0c;但却没有配置好前提条件&#xff1a;关闭PWR模块的备份域写保护使能&#xff0c;有点奇怪&#xff0c;手动关掉就好了 现象&#xff1a;进入RTC_EnterInit…

java数据结构与算法刷题-----LeetCode239. 滑动窗口最大值

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 1. 法一&#xff1a;指针法 解题思路 我们以每一个窗口来看&#xff0c;找…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

【软考中级备考笔记】数据的表示和校验码

2024/2/18 – 数据的表示和校验码 天气&#xff1a;阴雨 春节假期结束后第一个工作日&#xff0c;开始备考中级软件工程师。 希望在今年5月底的软考中取得中级证书 视频地址&#xff1a;https://www.bilibili.com/video/BV1Qc411G7fB 1. 计算机的总体架构 从下图中可以看出&am…

三防平板丨平板终端丨加固平板丨户外勘测应用

随着科技的不断发展&#xff0c;现代勘测业也在不断升级。相较于传统的勘测设备&#xff0c;三防平板在户外勘测中有着广泛的应用。那么&#xff0c;三防平板在户外勘测中究竟有哪些优势呢&#xff1f; 首先&#xff0c;三防平板具备极强的防水、防尘、防摔能力。在野外勘测中&…

应用管理中心架构的设计与实现

应用管理中心在现代软件开发中扮演着重要角色&#xff0c;它能够帮助开发团队有效管理和监控各种应用的运行情况。本文将介绍如何设计和实现一个高效、可靠的应用管理中心架构&#xff0c;以提升开发团队的工作效率和系统稳定性。 1. 架构概述 - 介绍应用管理中心的整体架构…

大页内存配置引发的数据库性能问题

问题背景: 用户来电报故障&#xff0c;他们一套正常运行的Oracle数据库&#xff0c;突然出现了10分钟左右的性能卡顿问题&#xff0c;期间全部的业务操作都变慢&#xff0c;他们通过查看问题期间的awr报告&#xff0c;发现数据库在问题时间出现大量的libary cache等待事件&…

金蝶K3-WISE与黑湖MES对接集成查询销售订单打通导入销售订单

金蝶K3-WISE与黑湖MES对接集成查询销售订单打通导入销售订单 接入系统&#xff1a;金蝶K3-WISE 金蝶K/3WISE是一款面向成长型企业&#xff0c;适应企业在快速成长过程中业务与管理的不断变化的信息化平台&#xff0c;实现云服务、ERP、物联网的融合&#xff0c;帮助企业从信息化…

基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

功能介绍 以51/STM32单片机作为主控系统&#xff1b; LCD1602液晶显示当前时间、温湿度、药品重量 3次吃药时间、药品类目和药品数量 HX711压力采集当前药品重量 红外感应当前药盒是否打开 DS1302时钟芯片显示当前年月日、时分秒、星期 DHT11采集当前环境温度和湿度 …

电脑卡住不动了怎么办?三招解救你的电脑!

电脑卡住不动是一种常见的故障&#xff0c;可能会给用户带来困扰。这种情况可能由于多种原因引起&#xff0c;包括软件问题、硬件故障或系统错误。那么&#xff0c;电脑卡住不动了怎么办呢&#xff1f;在本文中&#xff0c;我们将介绍电脑卡住不动的可能原因&#xff0c;并提供…

Postgresql 怎么实现在局域网中访问

安装PostgreSQL后&#xff0c;默认情况下只能在本机进行连接访问&#xff0c;如果需要在其他主机上访问PostgreSQL数据库服务器&#xff0c;需要进行配置。 安装连接PostgresSQL数据库可以参考博文&#xff1a;安装连接PostgresSQL数据库教程 一. 整体步骤 主要包括下面几个步…

NLP_BERT与GPT争锋

文章目录 介绍小结 介绍 在开始训练GPT之前&#xff0c;我们先比较一下BERT和 GPT 这两种基于 Transformer 的预训练模型结构&#xff0c;找出它们的异同。 Transformer架构被提出后不久&#xff0c;一大批基于这个架构的预训练模型就如雨后春笋般地出现了。其中最重要、影响…