【Java网络编程】基于BIO/NIO/AIO的多人聊天室(一):java IO与内核IO

课程《一站式学习Java网络编程 全面理解BIO/NIO/AIO》的学习笔记(一):
java.io梳理 & 同步/异步/阻塞/非阻塞的概念 & 内核IO模型

源码地址:https://github.com/NoxWang/web-program

【Java网络编程】基于BIO/NIO/AIO的多人聊天室(二):BIO聊天室
【Java网络编程】基于BIO/NIO/AIO的多人聊天室(三):NIO概述与实践
【Java网络编程】基于BIO/NIO/AIO的多人聊天室(四):NIO聊天室
【Java网络编程】基于BIO/NIO/AIO的多人聊天室(五):AIO聊天室
【Java网络编程】基于BIO/NIO/AIO的多人聊天室(六):思维导图

一、java.io梳理

网络编程的本质是进程间通信,而进程间通信的基础为IO模型

java.io包中提供了大量与IO操作相关的类和方法,如下图所示,可大致分为字符流(处理单位为字符,可包含多个字节)和字节流(处理单位为字节)两类。下图所示Reader / Writer,InputStream / OutputStream均为接口,可被各种不同类实现,以完成不同的功能。
IO流:字符流与字节流

1.1 字符流

下图为字符流的几个主要实现类

  • CharArrayReader / CharArrayWriter的数据源为字符数组,StringReader / StringWriter的数据源为字符串
  • BufferdReader、FilterReader、InputStreamReader以及对应的Writer实现类为更高级的字符流实现类,它们采用装饰器模式,可在类创建时传入的另一个Reader / Writer的基础上提供更高级的额外功能。
    • BufferedReader:额外提供一个缓冲区,可一次性从数据源中读取较多数据至缓冲区,减少对数据源的直接访问次数。缓冲区位于内存中,效率更高。
    • FilterReader:抽象类,有很多子类,可在传入的Reader的基础上提供更多灵活的功能
    • InputStreamReader:将字节流转换为字符流,常用子类为FileReader(File中存储的数据为字节,FileReader可实现字节到字符的转换,从File中读取字符)
      字符流

1.2 字节流

下图为字节流的几个主要实现类

  • ByteArrayInputStream / ByteArrayOutputStream的数据源为字节数组,FileInputStream / FileOutputStream 的数据源为文件
  • FilterInputStream / FilterOutputStream为抽象类,可使用装饰器模式在传入的InputStream / OutStream 的基础上叠加更高级的功能,常见子类包括:。
    • BufferedInputStream:额外提供缓冲区
    • DataInputStream:从流中读取出指定的Java基本数据类型
    • DataOutputStream:将Java基本数据类型写到输出流中
      字节流

二、同步/异步/阻塞/非阻塞

同步/异步 与 阻塞/非阻塞 可两两组合:同步阻塞同步非阻塞异步阻塞异步非阻塞

2.1 同步 & 异步

区别在于被调用方的行为(通信机制的区别):

  • 同步:已知调用结果后才将调用返回
  • 异步:不需要等待调用结果即可返回,有调用结果后,被调用方会“通知”调用方

2.2 阻塞 & 非阻塞

区别在于调用方的行为(调用状态的区别):

  • 阻塞:调用方在收到调用结果前,不能处理其他任何事务(注意是收到调用结果前,而不是调用返回前)
  • 非阻塞:调用方在收到调用结果前,可处理其他事务

三、内核IO模型

3.1 阻塞式I/O - BIO

应用程序发起系统调用,若此时数据还没有被准备好,则该系统调用不会被返回,它会一直等待,直到数据被准备好(内核缓冲区有了数据,并且被复制到了应用程序缓冲区),系统调用返回。

这样的内核IO模型就对应于BIO(Blocking IO),即BIO是该内核模型在应用层面的一种抽象。
BIO的编程模型与实现见【Java网络编程】基于BIO/NIO/AIO的多人聊天室(二):BIO聊天室
阻塞式IO

3.2 非阻塞式I/O - NIO

应用程序进行系统调用,如果此时数据还没准备好,则调用返回(返回无数据,应用程序会了解到数据还未被准备好)。过一会儿应用程序会再次询问,如果仍没有数据,则调用会再次返回。假设再一次询问时,数据已经准备好,则数据会被复制到应用程序可以访问的缓冲区,调用成功返回。

这样的IO模型对应于应用层面的NIO(Non-blocking IO)。注意此时并没有使用Selector监听,而是通过应用程序的不断轮询来实现非阻塞。
NIO的编程模型与实现见【Java网络编程】基于BIO/NIO/AIO的多人聊天室(三):NIO概述与实践
非阻塞式IO

3.3 I/O多路复用 - NIO + Selector

应用程序发起系统调用,如果此时数据没有准备好,那么我们会要求内核监听这个IO通道。数据准备好后,系统调用返回,通知应用程序此时数据已经准备好(此时并没有将数据返回,只是通知数据已就绪)。接下来应用程序再进行一次系统调用,复制数据并带着数据返回。由于内核可以监听多个IO,任一IO出现状态更新,内核都会返回给应用程序,因此该模型称为IO多路复用

这样的IO模型对应于应用层面的NIO + Selector模型。Selector也称为IO多路复用器
NIO + Selector的模型与实现见:
【Java网络编程】基于BIO/NIO/AIO的多人聊天室(三):NIO概述与实践
【Java网络编程】基于BIO/NIO/AIO的多人聊天室(四):NIO聊天室
IO多路复用

3.4 异步I/O - AIO

以上三种IO模型均为同步IO模型,因为无论阻塞与否,如果我们不再次发起系统调用,我们将无法获得准备好的数据。这次系统调用是无法省略的,因为内核不会主动通知我们调用的结果。

异步IO的流程如下:应用程序发起系统调用,如果数据没准备好,则调用返回,不会阻塞。如果数据已经准备好,则内核会将数据复制,并向应用程序递交信号,告知应用程序此时数据已经准备好。

这样的IO模型对应于应用层面的AIO
AIO的编程模型与实现见【Java网络编程】基于BIO/NIO/AIO的多人聊天室(五):AIO聊天室
异步IO

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值