共计 1848 个字符,预计需要花费 5 分钟才能阅读完成。
今天就跟大家聊聊有关如何分析 NIO,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
linux 下五种 I / O 模型
1)阻塞 I /O
2) 非阻塞 I /O
3)I/ O 复用
4)信号驱动 I /O
5)异步 I /O
前四种都是同步,只有最后一种才是异步 IO.
1、同步 IO: 如果一个线程请求进行 IO 操作,在 IO 操作完成之前,该线程会被阻塞!
2、异步 IO: 如果一个线程请求进行 IO 操作,IO 操作不会导致请求线程被阻塞!
同步和异步是针对用户线程和内核的交互来说的。同步 IO,用户发出 IO 请求,如果数据没有就绪,需要通过用户线程或者内核不断的轮询数据是否就绪,当数据
就绪时,再将数据从内核拷贝到用户线程。
异步 IO 和同步关键区别:数据拷贝阶段是由用户线程完成还是有内核完成
缓冲区:缓冲区的三个状态变量:容量 capacity、读写限制 limit、读写位置 position。需要正确理解!
通道:NIO 特性,通道不是从 IO 操作所处理的数据这个层次上去抽象,而是表示为一个已经建立好的到支持 IO 操作的实体的链接。一旦建立这个连接,就可以在这个
连接上进行各种 IO 操作。具体做什么操作取决于通道的特性,一般的操作读和写等。在 java NIO 中,不同的实体有不同的通道实现,比如文件通道和网络通道等。
通道在进行读写操作时都是使用缓冲区实现的,而不是字节数组。
套接字通道:
传统的 IO 是阻塞式的,可以一旦有请求就建立连接进行处理,这种一个请求对应一个线程的方式,显然不适合负载压力比较大的情况,因为每个线程都要占用资源,
创建线程也是有代价的,对此引用线程池的实现,以能够复用已有的线程问题,当某个线程由于等待网络操作而阻塞时,其他线程还可以继续执行,整体性能和吞吐量
得到了提高。不过由于多线程太复杂,容易出现很多隐含的错误(*)。
javaNIO 提供了非阻塞式和多路复用的套字节连接
1、阻塞式套节字通道
2、多路复用套字节通道
通过一个专门的选择器(selector)来同时对多个套接字通道进行监听。当其中的某个套接字通道上有它感兴趣的事件发生时,这些通道会变为可用的状态,
可以在选择器的选择操作中被选中。选择器通过一次选择操作可以获取这些被选中的通道列表,然后根据所发生的事件类型分别进行处理。
核心:选择器,非阻塞的套接字通道可以注册到 selector 上,》在进行注册时需要提供一个套接字通道感兴趣的事件列表,这些事件包括连接完成、接收到新连接请求、
有数据可读和可以写入数据等。这些事件都定义在 SelectionKey 类中,在完成注册后可以通过 selector 的 select 方法进行选择。》选择之后可以从 Selector 类的对象中得到一个可用的
套接字通道的列表。
3、IP 组播通道
通过 IP 协议的组播(multicasting)支持可以将数据报文传输给属于同一分组的多个主机。当不同主机上的程序都需要接收相同的数据报文时,使用 IP 组播是最自然地方式。
每一条组播消息都会被属于特定分组的所有主机接收到。每个组播分组都有一个对应的标识符,该标识符是一个 D 类 IP 地址,范围在“224.0.0.1”和“239.255.255.255”之间。
进行组播的程序可以选择加入某个组播分组来接收所有发送给该分组的消息。
通道分为两大类:文件通道、Socket 通道
通道与流:通道时双向的,而流只是从这一个方向到另一个方向。通道可以读或写或者同时读写。
管道:Pipe,广义上讲,管道就是一个用来在两个实体之间单向传输数据的管道,管道通常被用来连接一个进程的输出和另一个进程的输入。Pipe 类实现一个管道范例,
不过它所创建的管道式进程内(在 java 虚拟机进程内部)而非进程间使用的。
管道有一对通道组成:一个可写入的 sink 通道和一个可读取的 source 通道。一旦将某些字节写入接收器的通道,就可以按照与写入时完全相同的顺序从源通道中
读取这些字节。
通道:
DatagramChannel, 针对面向数据报套接字的可选择通道
Pipe.SinkChannel, 表示 Pipe 的可写入结尾的通道。
Pipe.SourceChannel, 表示 Pipe 的可读取结尾的通道。
ServerSocketChannel, 针对面向流的侦听套接字的可选择通道。
SocketChannel,针对面向流的连接套接字的可选择通道。
看完上述内容,你们对如何分析 NIO 有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。