Java IO/NIO的基本概念学习

一、IO模型

  1. 阻塞IO模型

最传统的IO模型,即在读写数据过程中会发生阻塞现象(可以理解为等待)。
当用户线程发出IO请求之后,内核会去查看数据是否就绪,若为就绪,用户线程则处于阻塞状态,并交出CPU。当数据就绪,内核则将数据拷贝到用户线程,并返回结构给用户线程,用户线程解除block状态(即阻塞状态)。
例:data = socket.read();若数据没有就绪,则一直阻塞在read()方法。

在这里插入图片描述

  1. 非阻塞IO模型

当用户线程发起一个读写操作后,并不需要等待,而是马上得到一个结果。若结果返回一个error是,则代表数据还未准备好,于是它可以再次发送该操作,一旦内核准备好数据,并且用户线程请求,则马上将数据拷贝到用户线程,然后返回。但在此情况下,用户线程需要不断询问内核数据是否就绪(轮询频率?),也就是不会交出CPU,一直占用。

  1. 多路复用IO模型

多路复用IO模型是当前使用比较多的模型。Java NIO 就是该模型。
原理:有一个线程不断去轮询多个socket(程序通信的端点抽象),只有当socket真正的读写事件是,才真正调用实际的IO读写操作。 多路复用IO模型,只需要一个线程就可以管理多个socket,系统无需再建立新的线程,只有当socket真正的读写时,才会使用IO资源,因此大大减少了资源占用。(Java NIO中使用selector.select()去查询是否有达到事件)。

Socket就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象)的。

多路复用IO模型效率高于非阻塞IO,是因为非阻塞IO不断询问socket状态是通过用户线程去进行的,而多路复用是内核中进行的。
在这里插入图片描述
Java NIO模型
在这里插入图片描述
Java BIO、AIO、NIO

  1. 信号驱动IO模型

当用户线程发起IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪是就会发送一个信号给用户线程,用户线程收到信号之后,便在信号函数中调用IO函数进行读写操作。

  1. 异步IO模型

最理想的IO模型,用户线程发起IO请求,当结束内核返回的成功信号是表示IO操作已完成,可以直接去使用数据(无需用户线程再调用IO函数,主要交给内核去实现了,需要OS的底层实现)。
在这里插入图片描述

二、Java IO包


JAVA NIO

NIO:主要有三个核心部分:channel,buffer,selector.传统IO基于字节流和字符流操作,NIO基于channel和buffer操作。单线程监听多个数据通道。

在这里插入图片描述

(1)channel(通道)

和IO中的Stream差不多,只不过Stream为单向,channel为双向,即可读也可写。
1.FileChannel(对应IO)
2.DatagramChannel(对应UDP)
3.SocketChannel(对应TCP的Client)
4.ServerSocketChannel(对应TCP的Server)

(2)Buffer(缓冲区)
缓冲区,实际上就是一个容器,一个连续的数组。Channel提供从文件、网络读取数据的通道,但是读取和写入数据必须经由Buffer。也就是client写数据给server时,先写到buffer,再由buffer到channel.接收方如此。

(3)Selector

NIO的核心类,能够检测多个注册的通道上是否有事件发生,若有则获取事件并针对每个事件进行相应的响应处理。

关于NIO的实例
使用NIO进行Socket通信

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值