IO

分组 :
1. 基于字节操作的I/O接口 : InputStream 和 OutputStream
2. 基于字符操作的I/O接口 : Writer 和 Reader
3. 基于磁盘操作的I/O接口 : File
4. 基于网络操作的I/O接口 : Socket


五种IO模型 :
1. 阻塞IO-->在读写数据过程中发生阻塞现象     最传统
当用户线程发出IO请求后 , 内核会去查看数据是否就绪 , 如果数据没有就绪 , 那么就会等待数据就绪 , 而用户线程就会处于阻塞状态 , 用户线程交出CPU . 
                                                                                      当数据就绪之后,内核会将数据拷贝到用户线程中 , 并返回结果给用户线程 , 用户线程才解除block状态
典型的IO阻塞例子:  data = socket.read();

2. 非阻塞IO
当用户线程发起read操作后 , 并不需要等待 , 而是马上就得到一个结果 , 如果结果是error , 就知道数据还没有准备好 , 于是可以再次发送read操作 , 一旦内核中的数据准备好 , 并且又再次收到用户线程的请求 , 那么它马上就可以将数据拷贝到用户线程中 , 并返回结果
典型的非阻塞IO例子: while(true){
                                        data=socket.read();
                                        if(data!=error){
                                             //处理数据   
                                            break;
                                        } 
                                  }
注:很少使用while来循环读取数据,因为这会导致CPU的使用率很高,影响读取性能

3. 多路复用IO-->Java  NIO就是采用此种模型       在多路复用模型中 , 会有一个线程不断去轮询多个socket的状态 , 只有当socket真正有读写事件时 , 才会调用实际的IO操作.
优点 : 只需要用一个线程去管理所有的socket
在Java NIO中 , 通过selector.select()去查询每个通道是否有到达事件,但这种方式回引起阻塞的.
对比非阻塞IO : 之所以比非阻塞运行效率高 , 是因为多路复用使用的一个轮询线程是处在内核中的 , 而非阻塞则是依赖用户线程来实现轮询socket状态 , 这个效率内核远比用户线程高得多.
注 : 多路复用IO通过轮询的方式检测是否有事件到达 , 并且逐一对到达的事件进行响应 , 但如果响应的事件体过大 , 则会延迟后续的事件处理 , 并且会影响新的事件轮询.

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

5. 异步IO   最理想
当用户线程发送请求之后 , 立刻就可以去做其他的事情 . 
另一方面以内核的角度来看 , 当它受到一个asynchronous read之后 , 它会立刻返回 , 说明 read请求已经发送成功 , 因此不会对用户线程产生任何block ; 
然后 , 内核会等待数据准备完成 , 然后将数据拷贝到用户进程中 ;
当这一切结束之后 , 内核会给用户线程发送一个信号 , 告诉它read操作已完成 .
注 : 异步IO是需要底层操作系统的支持 ,Java  7中 , 提供了异步IO ,即 Asynchronous IO

两种高性能IO设计模式 Reactor  和  Proactor
                                                  |                        |
                                                 |                        |
                                                  V                  V
                                         多路复用IO           异步IO




NIO详解

基础概念 : Channel (通道/双向)        Buffer(缓冲)        Selector(选择器)核心
                          ||                                      ||                          ||
                                                            V                    V
                    Stream(单向)                 读取必须放           轮询每个注册的Channel         


1. Channel-->提供从文件 , 网络读取数据的渠道
常用通道 : FileChannel
                 SocketChannel
                 ServerSocketChannel
                 DatagramChannel
注 : Channel的write方法之前必须将Buffer flip掉 , 否则无法正确写入内容

2. Buffer-->>一个容器 , 一个连续数组
常用Buffer子类 : ByteBuffer
                            IntBuffer
                            CharBuffer
                            LongBuffer
                            DoubleBuffer
                            FloatBuffer
                            ShortBuffer

3. Selsector-->>能够检测多个注册的通道上是否有事件发生
配合  SelectionKey , 一个SelectionKey表示一个到达的事件 , 这2个类构成了服务端处理业务的关键




































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值