JAVA - IO模型

本章内容

  1 同步,异步,阻塞,非阻塞的概念

  2 五种IO模型:阻塞式IO,非阻塞式IO,多路复用IO,信号驱动IO,异步IO 各自的特点

同步,异步,阻塞,非阻塞(注意:这里是从用户线程和内核层面来介绍概念的)

同步和异步(描述的是用户线程与内核的交互方式 - 消息的通信机制)

  1 同步 用户线程发起IO后需要等待

  2 异步 用户线程发起IO请求后仍然继续执行,当内核操作完成后会通知用户线程,或者调用用户线程注册的回调函数

阻塞和非阻塞(描述的是程序等待调用结果是的状态 - 调用者的状态)

  1 阻塞 在调用结果返回之前,调用者的执行线程会挂起,线程不能做其它事情,只有等待结果返回才能往下执行

  2 非阻塞 IO操作被调用后立即返回调用者一个状态值,无需等待IO操作彻底完成

IO模型

介绍

  操作系统为了安全,将内存空间分成了用户空间和内核空间,用户进程无法直接操作底层硬件,只能将请求提交给CPU,由CPU去执行

  进程(线程)将请求提交给CPU,等待CPU返回数据(这是一个两段式的过程)

    1 等待数据准备:内核从IO设备将数据拷至内存空间的Buffer中

    2 内核将数据从内部的Buffer中拷贝至进程空间

  

  注意:内核在IO操作时,会为每一个IO设备维护一个Buffer,等待数据输入到Buffer,从Buffer复制到进程内存空间,都需要时间,根据等待模式可以分为:

    1 blocking IO 阻塞式IO (两段都阻塞)

    2 nonblocking IO 非阻塞式IO (第一段不阻塞,第二段阻塞)

    3 IO multiplexing IO复用 (两段都阻塞)

    4 signal driven IO 信号驱动IO (第一段不阻塞,第二段阻塞)

    5 asynchronus IO 异步IO (两段都不阻塞)

下面将对以上五种模型做一个详细的介绍

阻塞式IO

  1 用户线程在读写时阻塞,系统调用不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回

  

  如图:

    1 recvfrom 发起系统调用,当内核无数据报准备好时,要等待数据准备 (第一段) 应用进程阻塞

    2 当内核数据准备好后,将数据拷贝至用户空间(第二段)应用进程阻塞  拷贝完成后,返回成功,让用户进程去处理数据包,此时阻塞结束,将控制权移交给应用进程

  2 缺点

    用户进程在IO过程中被阻塞,不能做任何事情,对CPU的资源利用率不高

非阻塞式IO

  1 用户线程不断发起IO请求,数据未到达前时系统返回一个状态值,数据到达后才真正读取数据(需要用户线程不断确定数据报是否已经准备好)

  

  如图:

    1 当用户进程recvfrom发起一个系统调用,内核无数据包准备好时会返回一个EWOULDBLOCK状态,当用户进程不知道内核有没有准备好数据,需要通过不断轮询的方式去确定数据报是否准备好(这个过程用户进程是非阻塞的)

    2 当内核准备好数据后,内核将数据拷贝至进程空间(用户进程阻塞)

  2 缺点

    用户进程每次请求IO都可以立即返回,但是为了拿到数据,需不断地轮询,无谓地消耗了大量CPU

IO多路复用(模式介绍不是很详细,将在后续BIO,NIO中进行详细介绍)

  1 用户先将需要进行IO操作的socket添加到select中,然后等待阻塞函数select返回,当数据到达后,socket被激活,select返回,用户线程就能接着发起read请求(注意:阻塞的是select)

    这里涉及到操作系统底层提供的 select,poll,epoll三种机制,这里举例为select(将在后续NIO中介绍此种模式的使用)

  

  如图:

    I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作

  2 优点

    可以在单个线程/进程中处理更多的连接

    系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销

信号驱动IO

  

  如图:

    1 先开启套接字的驱动式IO功能,并通过sigachtion系统调用安装一个信号处理函数,该系统调用立即返回,进程继续工作,当数据报准备好时,内核为该进程产生一个SIGIO信号 (第一段不阻塞)

    2 接收到信号后,再次发起系统调用,由内核将数据包拷贝至用户空间(第二段阻塞)

异步IO

  1 工作机制 告知内核启动某个操作,并让内核在整个操作完成后通知我们

  

  如图:

    1 应用进程发起系统调用,内核立即返回一个状态,此时进程继续执行

    2 当内核准备好数据,并将数据包拷贝至用户空间后,通知进程处理 (两段都不阻塞)

总结:

  1 阻塞式IO:用户进程发起系统调用,阻塞用户进程,内核处理数据报,当两段全部处理完成后,返回成功指示,再由用户进程去处理数据报

  2 非阻塞式IO:用户进程发起系统调用,当内核数据报未准备好时,返回一个状态给用户进程,用户进程继续执行,未阻塞,但需要发起轮询,不断地询问内核数据报是否准备好,当发现数据报已准备好时,阻塞用户进程,由内核将数据报拷贝至用户空间,拷贝完成后,返回成功指示,由用户进程去处理

  3 多路复用IO:用户进程将IO请求注册到select中,用户进程继续执行,select发起系统调用,内核做数据准备,当内核准备好数据时,返回相应用户进程的可读指示,用户进程再发起系统调用,用户进程阻塞,内核将数据报拷贝至用户空间,拷贝完成后,返回成功指示,由用户进程去处理

  4 信号驱动IO:用户进程发起系统调用,当内核数据报未准备好时,返回一个状态给用户进程,用户进程继续执行,未阻塞,当内核准备好数据时,通过信号通知用户进程,用户进程再发起系统调用,用户进程阻塞,内核将数据报拷贝至用户空间,拷贝完成后,返回成功指示,由用户进程去处理

  5 异步IO:用户进程发起系统调用,当内核数据包未准备好是,返回一个状态给用户进程,用户进程继续执行,未阻塞,当内核准备好数据,并将数据拷贝至用户空间后,通知用户进程去直接处理数据报  

原文地址:https://www.cnblogs.com/hpzhu/p/9364517.html

时间: 2024-08-29 22:55:17

JAVA - IO模型的相关文章

Java IO模型&NIO

Java IO模型&NIO Java IO模型NIO 楔子 概述 网络服务 经典的服务设计 经典的SocketServer循环阻塞 可伸缩目标 分而治之 事件驱动设计 背景知识AWT 事件 Reactor 模式 Reactor基础模式 Java NIO 支持 Channels Buffers Selectors SelectionKeys Reactor 模式实践 第一步初始化 第二步循环分发 第三步接收者 第四步 Handler设置 第五步请求处理 还有一种状态Handler 多线程版本Rea

Java IO模型:BIO、NIO、AIO

Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基本说明 BIO模型图 缺点: 如果有很多个Client,则会产生很多个线程.压力主要是在服务器端.客户端的压力并不大. 另外建立连接之后,并不是在时时刻刻的使用.会有空间时间. 会阻塞. NIO模型图 特点: 事件驱动 多路复用 Netty底层使用的NIO模型 AIO模型 目前还未得到广泛运用.异步

java IO 模型--快速分清 同步|阻塞

IO 介绍 IO 模型 IO请求 分为两个阶段:等待资源 和 使用资源: IO请求:一般需要请求特殊资源(如 磁盘.RAM 或文件),当资源被上一个使用者使用没有释放的时候, IO请求会被阻塞,直到资源可用. 等待资源 阶段有两种策略: 阻塞:当IO请求资源没有准备好的时候,请求阻塞,直到得到资源的响应(有资源 或者 超时异常): 非阻塞:资源不可用时,IO请求直接返回,返回数据不可用标志. 使用资源 阶段,IO 分为 同步IO 和 异步IO 同步IO:应用阻塞在发送数据和接受数据阶段,直到数据

从底层入手,图解 Java NIO BIO MIO AIO 四大IO模型与原理

目录 写在前面 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下: 写在最后 疯狂创客圈 百万级流量 高并发实战 疯狂创客圈 Java 分布式聊天室[ 亿级流量

Netty学习(1):IO模型之BIO

概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用如何的方式来进行数据的接受和发送,因为存在着发送方和接收方两个角色,因此IO模型一般分为以下3类:BIO(同步阻塞).NIO(同步非阻塞).AIO(异步非阻塞).其3者的区别如下: BIO:是最传统的Java IO模型,采用的方式为服务器新接受到一个连接,就建立一个线程,但是如果这个连接不做任何事情

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

IO模型-java版

描述IO,我们需要从两个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO | NIO | AIO 以Java的角度,理解,linux c里也有AIO的概念(库),本文只从Java角度入手. BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO,简单理解:一个请求一个线程 AIO,异步非阻塞IO,简单理解:一个有效请求一个线程 BIO 在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程

Java 网络 IO 模型

在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创建服务端 socket ServerSocket serverSocket = new ServerSocket(20000); client = serverSocket.accept(); // 客户端连接成功,输出提示 System.out.println("客户端连接成功"); /

Java网络编程和NIO详解3:IO模型与Java网络编程模型

Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址