您的位置:首页 > 编程语言 > Java开发

NIO总结

2016-02-27 00:00 302 查看
摘要: DatagramChannel,针对面向数据报套接字的可选择通道

Pipe.SinkChannel, 表示 Pipe 的可写入结尾的通道。 

Pipe.SourceChannel, 表示 Pipe 的可读取结尾的通道。 

ServerSocketChannel, 针对面向流的侦听套接字的可选择通道。 

SocketChannel,针对面向流的连接套接字的可选择通道。

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。只有在得到结果之后才会返回。

例如:写作业,饿了,去厨房(内核缓冲区)吃饭,点餐后不知道什么时候能够做出来,只能等着,也可以小睡一会(线程等待状态)。做好了,叫你吃饭(线程唤醒);

非阻塞:不能立刻得到结果之前,不会阻塞当前线程,而会立刻返回。例如:每5分钟去一趟厨房。有就吃,没有就回来继续写作业。

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 socket javaNIO