IO

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:04   987   0
分组 :
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之后 , 它会立刻返回 , 说明
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛