第十七章 java IO模型总结

本文介绍了JAVA中的IO模型,包括从计算机结构和应用程序角度理解IO,详细阐述了BIO(阻塞IO)、NIO(非阻塞IO,也称IO多路复用)和AIO(异步IO)的工作原理和应用场景。BIO适合低并发,NIO适用于高并发和负载,而AIO则引入了事件和回调,提供了更高级别的异步处理能力。

IO模型

从计算机结构角度解读

IO就是输入/输出。
计算机结构分为五大部分:
运算器,控制器,存储器,输入设备,输出设备
CPU中包含控制器和运算器;CPU和存储器进行交互;而输入设备输入到计算机中;计算机通过输出设备输出。
IO描述了计算机系统与外部设备之间通信的过程

从应用程序角度解读

操作系统需要保证稳定性和安全性,一个进程的地址空间划分为用户空间和内核空间
平时运行的应用程序都是运行再用户空间,只有内核空间才能进行系统态级别的资源有关的操作。例如:
文件管理,进程同行,内存管理。
如果要进行IO操作,一定要依赖内核空间的能力。但是用户空间的程序不能之间访问内核空间。如果要执行IO操作时,用户空间没有执行操作的权限,只能发起系统调用请求操作系统帮忙完成。

结论:用户进程要执行IO操作的话,需要通过系统调用来间接访问内核空间。开发中较多的是:磁盘IO和网络IO。分别代表: 读写文件,网络请求和响应。从应用程序的视角来看,应用程序对操作系统的内核发起IO调用,就说发起了系统调用,操作系统负责的内核执行具体的IO操作。即应用程序实际上只发起了IO操作的调用,具体IO的执行是由操作系统的内核来完成。
应用程序发起IO调用的两个步骤:

  1. 内核等待IO设备准备好数据
  2. 内核将数据从内核空间拷贝到用户空间

常见的IO模型

UNIX系统下,IO模型总共有五种:
同步阻塞IO,同步非阻塞IO,IO多路复用,信号驱动IO,异步IO

Java中常见的3种IO模型

BIO(Blocking)

同步阻塞IO模型
同步阻塞IO模型中,应用程序发起read调用后,会一直阻塞,直到内核把数据拷贝到用户空间
过程如下:
应用程序发起read调用,内核进行准备数据,数据就绪后进行拷贝数据,read调用进行返回。此时才解除阻塞。
如果客户端连接数量不高的情况,这样使用没问题。但是对十万或百万级的连接,传统的BIO不可行,需要更搞笑的IO处理模型来应对更高的并发量

NIO(Non-blocking也叫New)

IO多路复用模型。或者是同步非阻塞IO模型
NIO是Java1.4引入的,对应java.nio包。提供Channel,Selector,Buffer等抽象。支持面向缓冲的,基于通道的IO操作方法。对于高负载,高并发的应用,应该使用NIO

同步非阻塞IO模型 过程如下:
应用程序会一直发起read调用,等待数据从内核空间拷贝到用户空间的这段时间,线程依然是阻塞的,直到内核把数据拷贝到用户空间。但应用程序调用read后,内核进行准备数据和数据就绪阶段,不阻塞。通过轮询操作,避免一直阻塞。
但是这种IO模型同样存在问题:应用程序不断进行IO系统调用轮询数据是否已经准备好的过程是十分消耗CPU资源的

IO多路复用模型 过程如下:
线程首先发起select调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起read调用。read调用的过程,就是数据从内核空间到用户空间,这个阶段还是阻塞的。

当前支持IO多路复用的系统调用,有select,epoll等。select系统调用,目前几乎在所有的操作系统上都有支持。
select 调用 :内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持
epoll 调用 :linux 2.6 内核,属于 select 调用的增强版本,优化了 IO 的执行效率

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。

Java中的NIO,有一个重要的选择器的概念,也叫做多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了后,才会为其服务。
过程如下:
服务器端有一个线程,即为选择器,可以连接多个通道,一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况 准备好后写入到缓冲区,客户端从缓冲区进行读取。

AIO (Asynchronous)

AIO就是NIO 2.Java 7引入了NIO的改进版,是异步IO模型
基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那,当后台处理完成,操作系统会通知响应的线程进行后续的操作。

过程如下:
应用程序调用read,直接得到read返回,不阻塞。等待内核通过准备数据,数据就绪,拷贝数据整个过程完成后,进行回调。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值