`
和你在一起
  • 浏览: 681603 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

说说IO(二)- IO模型

阅读更多

 

这部分的东西在网络编程经常能看到,不过在所有IO处理中都是类似的。

IO请求的两个阶段

       等待资源阶段IO请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。

       使用资源阶段:真正进行数据接收和发生。

       举例说就是排队服务。

 等待数据阶段,IO分为阻塞IO和非阻塞IO

       阻塞IO:资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。

       非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用

 使用资源阶段,IO分为同步IO和异步IO

       同步IO:应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败。

       异步IO:应用发送或接收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接收,并返回成功或失败的信息给应用。

 

 

按照Unix5IO模型划分

 

  • 阻塞IO
  • 非阻塞IO
  • IO复用
  • 信号驱动的IO
  • 异步IO

从性能上看,异步IO的性能无疑是最好的。

 

各种IO的特点

  • 阻塞IO:使用简单,但随之而来的问题就是会形成阻塞,需要独立线程配合,而这些线程在大多数时候都是没有进行运算的。JavaBIO使用这种方式,问题带来的问题很明显,一个Socket需要一个独立的线程,因此,会造成线程膨胀。
  • 非阻塞IO:采用轮询方式,不会形成线程的阻塞。JavaNIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数。

 

  • 同步IO:同步IO保证一个IO操作结束之后才会返回,因此同步IO效率会低一些,但是对应用来说,编程方式会简单。JavaBIONIO都是使用这种方式进行数据处理。
  • 异步IO:由于异步IO请求只是写入了缓存,从缓存到硬盘是否成功不可知,因此异步IO相当于把一个IO拆成了两部分,一是发起请求,二是获取处理结果。因此,对应用来说增加了复杂性。但是异步IO的性能是所有很好的,而且异步的思想贯穿了IT系统放放面面。

 

17
3
分享到:
评论
6 楼 linuxfs 2013-01-22  
谢谢了,纠结了挺长时间的问题。
5 楼 罗卜头 2011-01-05  
和你在一起 写道
很仔细的同学,好问题:)说不上赐教,一点个人解读,共同学习。

1.Java NIO的底层实现(*nix)就是使用select函数或者poll函数(详见*nix相关书籍),他们两个都属于IO复用的方式,因此,第一个问题,Java NIO属于多用复用;Windows的不知道了。

2.多路复用确实是阻塞的,但是这个阻塞是在select或者poll函数上的或者是在内部实现上(select虽然阻塞,但是能支持多路IO);对Java来说,由于封装了一层,Java的接口屏蔽了这个阻塞,对外呈现出非阻塞的使用方式。感觉这么说可能更恰当一些——JavaNIO底层实现使用了IO多路复用,而在本身NIO的接口使用方式上,是一种非阻塞IO的方式(轮询检查的方式)。




谢谢,您的解释让我茅舍顿开,我对这个问题纠结了好久
window 好像也是多路复用,我不确定
顺便再请教几个问题
1 信号IO在等待阶段是怎么处理的
2 JAVA 以后的AIO 是否就是使用 第5种模型(unix下)
4 楼 和你在一起 2011-01-04  
很仔细的同学,好问题:)说不上赐教,一点个人解读,共同学习。

1.Java NIO的底层实现(*nix)就是使用select函数或者poll函数(详见*nix相关书籍),他们两个都属于IO复用的方式,因此,第一个问题,Java NIO属于多用复用;Windows的不知道了。

2.多路复用确实是阻塞的,但是这个阻塞是在select或者poll函数上的或者是在内部实现上(select虽然阻塞,但是能支持多路IO);对Java来说,由于封装了一层,Java的接口屏蔽了这个阻塞,对外呈现出非阻塞的使用方式。感觉这么说可能更恰当一些——JavaNIO底层实现使用了IO多路复用,而在本身NIO的接口使用方式上,是一种非阻塞IO的方式(轮询检查的方式)。



罗卜头 写道
我有几个模糊不清的概念想请教下
1 在unix中 JAVA NIO === 多路复用? 或者说完全使用多路复用
2 如果是的话, 多路复用 在图上在等待阶段是“堵塞”的,但是你说 "Java的NIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数"

望赐教

3 楼 罗卜头 2011-01-04  
我有几个模糊不清的概念想请教下
1 在unix中 JAVA NIO === 多路复用? 或者说完全使用多路复用
2 如果是的话, 多路复用 在图上在等待阶段是“堵塞”的,但是你说 "Java的NIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数"

望赐教
2 楼 和你在一起 2010-12-22  
IO复用方式,主要还是在IO等待阶段,实现上使用了select或poll方式,为什么说复用呢?可以考虑下Java的NIO实现,使用select函数,N个socket通过select返回当前需要处理的IO,而其他IO则继续阻塞。

与上图的“非阻塞I/O”相比,非阻塞IO需要一直轮询,而IO复用提供了类似通知的方式,因此效率更高。

juda 写道
写的很好,能解释下IO复用吗?谢谢
:evil:

1 楼 juda 2010-12-21  
写的很好,能解释下IO复用吗?谢谢
:evil:

相关推荐

    说说IO:IO原理与解析.zip

    IO模型;IO性能的重要指标;文件系统;逻辑卷管理;Driver & IO Channel;RAID;三分天下 适用人群:Java开发人员 使用场景:想学习JavaIO以及在IO开发中遇到瓶颈 目标:通过本教程的讨论与解析,更加深刻的理解和...

    NIO trick and trap .pdf

    - **Unix的五种IO模型**: - **阻塞IO(Blocked IO)**:程序在读写操作期间被挂起。 - **非阻塞IO(Non-blocking IO)**:程序可以查询I/O状态并进行读写。 - **IO多路复用(IO Multiplexing)**:使用select或epoll等...

    Java后端技术面试汇总-2019

    - **说说线程安全问题**:在多线程环境下,确保数据的一致性和正确性。 - **重入锁的概念**:支持同一个线程多次获得同一把锁。 - **产生死锁的四个条件**:互斥条件、请求与保持条件、不剥夺条件、循环等待条件。...

    JAVA-NIO-DEMO

    传统的IO模型是阻塞式的,而NIO的核心特点是非阻塞,这使得在处理大量并发I/O请求时更为高效。本示例"JAVA-NIO-DEMO"提供了关于Java NIO的实际应用,通过Anontion(注解)、Applet(小程序)和NIO的Demo,帮助开发者...

    Java面试八股文十万字总结.docx

    - **IO**:阻塞I/O模型,每次读写操作都会阻塞。 - **NIO**:非阻塞I/O模型,基于通道和缓冲区,提高了I/O操作的效率。 **30. Java反射的作用与原理** - **作用**:动态获取类的信息并操作对象。 - **原理**:通过...

    仿qq空间的说说、博客系统.zip

    - Socket.IO:实现实时通信,如新动态推送、评论即时通知。 文件"demo_01"可能是项目的一个初步实现或示例代码,包含了基础的结构和部分功能。在实际开发过程中,你需要根据项目需求逐步完善这个示例,实现完整的...

    net常见面试题

    说说.NET中的值类型与引用类型的区别? 在.NET框架中,数据类型可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。这两种类型的主要区别在于它们如何在内存中存储数据。 - **值类型**:这些...

    操作系统-面试题

    操作系统 Linux系统下你关注过哪些内核参数,说说你知道的 centos 内核配置文件为 /etc/sysctl.conf . 修改参数后启用:sysctl -p ... Linux下IO模型有几种,各自的含义是什么。 IO的本质是socket

    java面试宝典

    - **IO的语法**:了解Java IO流的基本操作,如文件读写、网络通信等。 - **虚拟机方面的语法**:理解JVM的基本工作原理,包括内存模型、垃圾回收等。 #### 二、具体知识点详解 1. **一个 ".java" 源文件中是否可以...

    java面试宝典-----面试会用到哦

    这些只是Java面试中常见的一些问题,实际面试中还可能涉及到多线程、集合框架、IO 流、异常处理、设计模式、JVM 内存模型、数据库交互等更广泛的领域。了解并熟练掌握这些知识点对于准备Java面试至关重要。

    百度2019年最新面试题库

    - **NIO(New IO)**: 基于通道(Channel)和缓冲区(Buffer)的非阻塞式I/O模型,可以同时处理多个连接,提高I/O效率。 #### Java8/Java7为我们提供了什么新功能 - **Java 8**: Lambda表达式、Stream API、...

    java面试必会200题.docx

    - **MVC(Model-View-Controller, 模型-视图-控制器)**: - **Model**:负责数据管理和业务逻辑。 - **View**:负责展示数据。 - **Controller**:负责接收输入并调用Model和View完成用户请求。 - 实现技术包括...

    Node应用程序构建 使用MongoDB和Backbone源码

    再来说说Backbone.js,这是一个轻量级的前端MVC(Model-View-Controller)框架,帮助开发者组织JavaScript代码,构建复杂的Web应用。Backbone.js提供了模型、视图、集合和路由器等核心概念,使得前端数据管理与UI...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ 大型公司面试必答之数据结构与算法(二).mp4 │ ├─面试必问-JVM性能调优 │ JVM性能调优 2018-10-25.mp4 │ ├─面试必问-mybaits源码分析 │ │ 鲁班学院-上课笔记mybaits源码分析9-05.docx │ │ │ └─...

    值得收藏的2017年Java开发岗位面试题

    Java IO中的常见类有InputStream、OutputStream、Reader、Writer等,字节流用于处理二进制数据,字符流用于处理文本数据。 2. 讲讲NIO。 Java NIO是Java的新IO-API,提供了异步IO、阻塞IO和选择器等机制。 3. ...

    C# 图像处理、神经网络、遗传算法集

    神经网络是模拟人脑神经元工作方式的计算模型,常用于机器学习和深度学习。C#中可以使用诸如ML.NET这样的库来构建和训练神经网络。你可以创建一个简单的前馈神经网络来解决分类问题,或者使用卷积神经网络(CNN)...

    Java就业面试题264道

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的就业市场竞争中脱颖而出,...在准备面试时,还应关注多线程、集合框架、IO流、异常处理、设计模式、JVM内存模型等相关主题。

Global site tag (gtag.js) - Google Analytics