Unix 5种IO模型的图解分析和比较
(转自http://blog.csdn.net/blueboy2000/archive/2009/08/26/4485874.aspx)
Unix下共有五种I/O模型
l 阻塞I/O
l 非阻塞I/O
l I/O复用(select和poll)
l 信号驱动I/O(SIGIO)
l 异步I/O(Posix.1的aio_系列函数)
l 阻塞I/O模型
应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。
如果数据没有准备好,一直等待。。。。
数据准备好了,从内核拷贝到用户空,IO函数返回成功指示。
在这种模式下,基本上IO操作都会用一个Work Thread来进行(Java)。
l 非阻塞I/O模型
我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。
l I/O复用模型
I/O复用模型会用到select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
目前Java只能支持到多路复用一级,在这种模式下,在一个线程里面以阻塞的模式监听连接,优点在于不用开过多的线程以阻塞的模式等待连接。
l 信号驱动I/O模型
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
l 异步I/O模型
调用aio_read函数,告诉内核描述字,缓冲区指针,缓冲区大小,文件偏移以及通知的方式,然后立即返回。当内核将数据拷贝到缓冲区后,再通知应用程序。
这个操作和信号驱动的区别就是:异步模式等操作完毕后才通知用户程序而信号驱动模式在数据到来时就通知用户程序。
几种I/O模型的比较
前四种模型的区别是第一阶段,第二阶段基本相同,都是将数据从内核拷贝到调用者的缓冲区。而异步I/O的两个阶段都不同于前四个模型。
同步I/O和异步I/O
a.同步I/O操作引起请求进程阻塞,直到I/O操作完成。异步I/O操作不引起请求进程阻塞。
b.我们的前四个模型都是同步I/O,只有最后一个异步I/O模型是异步I/O。
Java nio和多路复用
java 1.4 nio提供的select,这是一种多路复用I/O(multiplexed non-blocking I/O)模型,底层是使用select或者poll。I/O复用就是,阻塞在select或者poll系统调用的某一个之上,而不是阻塞在真正的I/O系统调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll,可以提高并发idle connection的性能(http://blogs.sun.com/alanb/entry/epoll)。
"BIO是指阻塞IO方式,即读和写必须为同步方式,NIO是指异步读,同步写的方式,AIO是指异步读,异步写的方式。
在网络协议上java对于TCP/IP和UDP/IP均支持,在网络IO的操作上,目前java仅支持BIO和NIO两种方式。"
相关推荐
相比于BIO模型,NIO和IO多路复用降低了资源消耗,提高了系统吞吐量。在Linux环境下,epoll是最优的选择,因为它解决了select和poll的局限性,提供了更好的性能和可扩展性。在设计高性能的网络服务时,理解并合理利用...
本文图解了BIO和NIO两种编程模型的根本区别,并给出了样例代码。BIO和NIO没有孰优孰劣之分,只有应用场景之分。此外,对于NIO来讲,可以有很多方面的优化,例如,读取到数据之后,对数据的处理可以放在别的线程中...
GPT-2 不是一个特别新颖的架构,而是一种与 Transformer 解码器非常类似的架构。不过 GPT-2 是一个巨大的、基于 Transformer 的语言模型,它是在一个巨大的数据集上训练的。在这篇文章,我们会分析它的结构,以及...
Java学习图解是一份以图形化方式展示Java编程语言核心概念和语法的教学资源,适合初学者快速入门。十分钟学习JAVA的描述可能意味着这份资料旨在通过简洁明了的方式,让学习者在较短的时间内对Java有初步的认识。下面...
通过以上分析,我们可以看到Qt5.7不仅提供了丰富的GUI编程工具,还涵盖了数据处理、文件操作和网络通信等多个方面,是一个全面且强大的开发框架。理解并熟练掌握这些知识点,将有助于开发出高效、美观的跨平台应用...
中间的风扇阵列将服务器分为计算和IO两部分,前面板的内存区域设有导风罩以增强散热。风扇模块化设计使得维护工作变得简单,无需工具即可拆卸。此外,服务器还预留了双SD模块插槽,用于存放虚拟化程序,提供虚拟机...
Linux 的网络IO模型简介4 1.1.3. IO复用技术介绍7 1.1.4. JAVA的异步IO8 1.1.5. 业界主流的NIO框架介绍10 2.NIO入门10 2.1. NIO服务端10 2.2. NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动...
7种常见的设计模式和使用场景 Java必会基础与新版本特性 集合框架 JVM内存模型 性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 并发与多线程 多线程基础知识 常见关键字 多线程锁...
在分析和设计控制系统时,考生需要考虑系统的静态和动态特性,并运用控制理论中的分析和设计方法,例如根轨迹法、Bode图分析、频域分析等,来确保系统性能满足技术要求。 由于文件是OCR扫描的文本,可能存在一些...
IO Linux 计算机网络 HTTP/HTTPS TCP/IP 7种常见的设计模式及使用场景 Java必会基础与新版本特性 线上问题排查 集合框架 哈希映射 并发哈希映射 数组列表 向量 深入浅出JVM JVM内存模型 性能调优、线上问题...
11. **Java IO与NIO**:了解旧版IO系统和新引入的非阻塞IO模型(NIO),以及它们在处理输入输出中的差异和优势。 12. **Java反射**:理解反射的概念,以及如何在运行时动态地访问类、接口、方法和字段。 通过...
- **UML图**:统一建模语言图,包括类图、序列图、用例图等,用于软件开发中的需求分析和设计。 - **网络拓扑图**:展示网络设备和连接,帮助理解网络结构和配置。 - **组织结构图**:描绘公司或项目团队的结构...
80_Netty复合缓冲区详解与3种缓冲区适用场景分析 81_Netty引用计数的实现机制与自旋锁的使用技巧 82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与...
Twisted是一种广泛应用于网络编程的Python库,尤其擅长于处理高并发和非阻塞IO操作。在本文档的开头,作者指出对于那些希望快速了解Twisted的人来说,本教程可能并不是最佳选择,因为真正理解和掌握Twisted及异步...
32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与分析 36_文件通道用法详解 37_Buffer深入详解 38_NIO堆外内存与...
在编译器设计中,词法分析和语法分析器就是解释器模式的应用。 16. **迭代器模式**:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。Java集合框架中的`Iterator`接口就是迭代器模式的体现。 17. **...
6. `java.awt`:与`javax.swing`一起工作,提供了基本的GUI组件和事件处理模型。 7. `java.sql`:用于数据库交互,包括连接管理、执行SQL语句、结果集处理等。 8. `java.nio`:非阻塞I/O,提供了更高效的数据传输...
第80讲:Netty复合缓冲区详解与3种缓冲区适用场景分析 第81讲:Netty引用计数的实现机制与自旋锁的使用技巧 第82讲:Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 第83讲:...