文章目录

  • 五种IO模型
    • Linux设计哲学
    • BIO
    • NIO
    • AIO
    • SIO
    • IO多路复用

五种IO模型

Linux设计哲学

在linux系统中,实际上所有的I/O设备都被抽象为了文件这个概念,一切皆文件,磁盘、网络数据、终端,甚至进程间通信工具管道pipe等都被当做文件对待。

在了解多路复用
select、poll、epoll实现之前,我们先简单回忆复习以下两个概念:

多路: 指的是多个socket网络连接;
复用: 指的是复用一个线程、使用一个线程来检查多个文件描述符(Socket)的就绪状态
多路复用主要有三种技术:select,poll,epoll。epoll是最新的, 也是目前最好的多路复用技术;
  • blockingIO - 阻塞IO
  • nonblockingIO - 非阻塞IO
  • signaldrivenIO - 信号驱动IO
  • asynchronousIO - 异步IO
  • IOmultiplexing - IO多路复用

其中Java实现了BIO、NIO和AIO

BIO

BIO 是 Java 最早提供的 IO 模型,属于同步阻塞式 IO。其特点是,在进行读写操作时,线程会被阻塞,直到操作完成。

工作原理:每处理一个连接,就需要创建一个独立的线程。当有大量连接时,会消耗大量的系统资源,导致性能下降。

适用场景:适用于连接数目较少且固定的场景。

示例:

// 服务器端示例
ServerSocket serverSocket = new ServerSocket(8080);
while(true) {// 阻塞等待客户端连接Socket socket = serverSocket.accept();// 为每个连接创建一个新线程处理new Thread(() -> {// 处理输入流和输出流// ...}).start();
}

进程/线程在从调用recvfrom开始到它返回的整段时间内是被阻塞的

recvfrom成功返回后,应用进程/线程开始处理数据报。

主要特点是进程阻塞挂起不消耗CPU资源,能及时响应每个操作;

实现难度低,适用并发量小的网络应用开发,不适用并发量大的应用,因为一个请求IO会阻塞进程,所以每请求分配一个处理进程(线程)去响应,系统开销大。

NIO

NIO 是 Java 1.4 引入的新 IO 模型,属于同步非阻塞式 IO。它的核心组件有 Channel(通道)、Buffer(缓冲区)和 Selector(选择器)。

工作原理:

Channel:可以进行双向数据传输,类似于传统 IO 中的流,但功能更强大。
Buffer:数据的读写都要通过缓冲区进行,这是一种双向操作。
Selector:单个线程可以通过选择器监控多个通道的事件,从而实现非阻塞 IO。

适用场景:适用于连接数目多且连接比较短(轻操作)的场景,例如聊天服务器。

代码示例:

// 服务器端示例
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(8080));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 非阻塞等待事件int readyChannels = selector.selectNow();if (readyChannels > 0) {Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();// 处理不同事件...keyIterator.remove();}}
}

进程发起IO系统调用后,如果内核缓冲区没有数据,需要到IO设备中读取,进程返回一个错误而不会被阻塞;进程发起IO系统调用后,如果内核缓冲区有数据,内核就会把数据返回进程。

进程轮询(重复)调用,消耗CPU的资源;
实现难度低、开发应用相对阻塞IO模式较难;
适用并发量较小、且不需要及时响应的网络应用开发;

AIO

AIO 是 Java 7 引入的异步 IO 模型,也被称为 NIO 2.0。它基于事件和回调机制,实现了真正的异步非阻塞。

工作原理:应用程序只需发起 IO 操作,然后继续执行其他任务。当 IO 操作完成后,系统会通过回调函数通知应用程序。
适用场景:适用于连接数目多且连接比较长(重操作)的场景,例如相册服务器。

代码示例

// 服务器端示例
AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel client, Void attachment) {// 接受下一个连接serverChannel.accept(null, this);// 处理客户端连接...}@Overridepublic void failed(Throwable exc, Void attachment) {// 处理失败情况}
});

当进程发起一个IO操作,进程返回(不阻塞),但也不能返回果结;内核把整个IO处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据。

特点:

不阻塞,数据一步到位;Proactor模式;
需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;
实现、开发应用难度大;
非常适合高性能高并发应用;

SIO

signaldrivenIO - 信号驱动IO

当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。

特点:回调机制,实现、开发应用难度大;

IO多路复用

大多数文件系统的默认IO操作都是缓存IO。在Linux的缓存IO机制中,操作系统会将IO的数据缓存在文件系统的页缓存

(page cache)。也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间中。

这种做法的缺点就是,需要在应用程序地址空间和内核进行多次拷贝,这些拷贝动作所带来的CPU以及内存开销是非常大的。

至于为什么不能直接让磁盘控制器把数据送到应用程序的地址空间中呢?最简单的一个原因就是应用程序不能直接操作底层硬件。

总的来说,IO分两阶段:

1)数据准备阶段

2)内核空间复制回用户进程缓冲区阶段

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

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

相关文章

FeatherScan v4.0 – 适用于Linux的全自动内网信息收集工具

前言 在平时渗透打靶的时候&#xff0c;经常要自己手工输入命令&#xff0c;做各种基本的信息收集&#xff0c;非常的繁琐&#xff0c;所以自研了一款工具&#xff0c;这款工具没有接入AI&#xff0c;因为不合适&#xff0c;接入了AI的话在一些不能上网的环境下进行信息收集&a…

如何精准筛选优质SEO服务资源?

核心要点&#xff1a; 中小企业选择SEO服务常陷困惑——效果难量化、承诺不透明、策略模糊化。本文剖析核心痛点&#xff0c;拆解技术合规性、策略透明度、行业经验匹配度等关键筛选维度&#xff0c;提供一套清晰的评估路径&#xff0c;助您在复杂市场中找到真正专业的合作伙伴…

在教育领域中,如何通过用户ID跑马灯来对视频进行加密?

文章目录前言一、什么是用户跑马灯二、用代码如何实现用户ID跑马灯的功能三、如何通过用户ID跑马灯来对视频进行加密&#xff1f;总结前言 在教育领域&#xff0c;优质视频课程易遭非法传播。为强化版权保护与责任追溯&#xff0c;引入基于用户ID的跑马灯水印技术成为有效手段…

MCP协议:AI时代的“万能插座”如何重构IT生态与未来

MCP协议&#xff1a;AI时代的“万能插座”如何重构IT生态与未来 在人工智能技术爆炸式发展的浪潮中&#xff0c;一个名为Model Context Protocol&#xff08;MCP&#xff09; 的技术协议正以惊人的速度重塑IT行业的底层逻辑。2024年11月由Anthropic首次发布&#xff0c;MCP在短…

同步,异步复位问题

1.同步复位的基本原理是&#xff0c;复位信号仅在时钟的有效边沿影响或重置触发器的状态。复位的主要目标之一是使 ASIC 在仿真时进入已知状态。由于复位树的扇出较大&#xff0c;复位信号相对于时钟周期可能成为 “晚到信号”。即使复位信号会通过复位缓冲树进行缓冲&#xff…

数组和指针回顾,练习与解析

代码见&#xff1a;登录 - Gitee.com 1.数组和指针练习与解析 1.1数组名 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小。 2.&数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址。 3.除此之…

【牛客刷题】活动安排

文章目录一、题目介绍二、解题思路2.1 核心问题2.2 贪心策略2.3 正确性证明三、算法分析3.1 为什么按结束时间排序&#xff1f;3.2 复杂度分析3.3 算法流程图解3.3.1 流程图说明3.3.2 关键步骤说明四、模拟演练五、完整代码一、题目介绍 活动安排 题目描述 给定 nnn 个活动&am…

第1讲:C语言常见概念

目录 一、什么是C语言&#xff1f; 二、C语言的历史与成就 三、编译器选择&#xff08;VS2022&#xff09; 1、编译与链接 2、编译器对比 3、VS2022的优缺点 四、VS项目与源文件、头文件介绍 五、第一个C语言程序 六、main函数 七、printf和库函数 八、关键字介绍 …

WinUI3入门18:从APP打开商店链接以及实现内购

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

BI布局拖拽 (1) 深入react-gird-layout源码

因为有个拖拉拽的需求&#xff0c;类似于quickBi那样的效果。在网上调研了一下发现react-grid-layout实现效果类似&#xff0c;但其也有局限性&#xff0c;比如不支持嵌套&#xff0c;不支持在多个gridLyaout之间互相拖拽。 要求&#xff1a;基于react-grid-layout的思路&#…

CentOS环境搭建-快速升级G++版本

在CentOS环境中快速升级G编译器版本&#xff0c;对于追求最新语言特性的开发者来说至关重要。由于CentOS默认的软件仓库可能不提供G的最新版本&#xff0c;我们通常需要借助第三方软件源&#xff0c;如Developer Toolset或使用Spack等包管理器来完成这一任务。下面将详细介绍两…

分布式接口幂等性的演进和最佳实践,含springBoot 实现(Java版本)

一、背景&#xff1a;为什么需要幂等性 在微服务、分布式架构下&#xff0c;网络不可靠、请求重试机制&#xff08;如前端超时重发、客户端重发、网关重试、消息消费失败重试等&#xff09;会带来重复请求&#xff0c;如果接口没有幂等性&#xff0c;可能导致&#xff1a; 重复…

OGRE 3D----6. 背景图片渲染实现详解

1. 背景图片渲染原理 1.1 渲染队列机制 Ogre3D 使用渲染队列(Render Queue)来控制对象的渲染顺序。背景图片需要在所有其他对象之前渲染,因此我们将其设置为 RENDER_QUEUE_BACKGROUND。 1.2 视图变换控制 为了让背景图片始终保持在场景的最远处,我们需要: 使用单位投影…

K线连续涨跌统计与分析工具

K线连续涨跌统计与分析工具 1. 概述 本工具是一个用于分析金融时间序列数据(特别是K线数据)的Python脚本,主要功能是统计连续n根同方向K线后,第n+1根K线的涨跌情况。该工具不仅提供统计分析功能,还支持图形化标记以验证结果,帮助交易者和量化分析师识别市场中的特定模式…

jQuery EasyUI 简介

jQuery EasyUI 简介 引言 随着互联网技术的飞速发展,前端开发变得越来越重要。jQuery EasyUI 作为一款流行的前端UI框架,极大地简化了前端开发的工作流程,提高了开发效率。本文将详细介绍 jQuery EasyUI 的起源、特点、使用方法以及在实际项目中的应用。 一、jQuery Easy…

《测试开发:从技术角度提升测试效率与质量》

测试开发的核心工作内容与职责解析 一、测试开发的定位与核心价值 测试开发&#xff08;Test Development&#xff0c;简称 TestDev 或 SDET&#xff09;是融合软件开发能力与测试工程思维的复合型岗位&#xff0c;不同于传统测试工程师&#xff0c;其核心目标是通过技术手段提…

20250710解决KickPi的K7开发板刷机之后出现DDR异常:ch:1 dq0 fail,write:0x1,read:0x20300

20250710解决KickPi的K7开发板刷机之后出现DDR异常&#xff1a;ch:1 dq0 fail,write:0x1,read:0x20300 2025/7/10 20:36[BEGIN] 2025/7/10 19:29:03 /DDR 2f85f4b2d4 cym 25/03/04-14:38.55,fwver: v1.09 In ch0 ttot10 ch0 ttot10 ch1 ttot10 ch0 ttot18 LPDDR4, 2112MHz chan…

Ansible:强大的自动部署工具

文章目录零、Ansible介绍一、安装 ansible二、配置SSH密钥1.检查密钥是否存在2.两边的机器要互相有对方的密钥三、自动部署1.传输文件(1)inventory.ini(2)sync_blt.yml(3)执行命令2.安装软件(1)inventory.ini(2)install_efvs.yml(3)执行命令零、Ansible介绍 Ansible 是一个开源…

Nacos的基本功能以及使用Feign进行微服务间的通信

Nacos是Dynamic Naming and Configuration Service的缩写。What’s Nacos? 下面结合SpringBoot项目&#xff0c;为你介绍Nacos的基本功能以及如何使用Feign进行微服务间的通信。 一、Nacos的基本功能 Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管…

C1编译器和C2编译器Test01

在HotSpot VM中内嵌有两个JIT编译器&#xff0c;分别为Client Compiler和Server Compiler&#xff0c;通常简称为C1编译器和C2编译器。开发人员可以通过如下命令显式指定JVM在运行时到底使用哪一种即时编译器。(1)-client&#xff1a;指定JVM运行在Client模式下&#xff0c;并使…