IO/NIO概念总结
2016-04-18 23:16
176 查看
IO类型:同步IO 异步IO 阻塞IO 非阻塞IO
阻塞IO:线程在没有读取到数据之前会被挂起
非阻塞IO:线程发送IO请求后可以执行其他任务,不会被挂起
同步IO:数据没有就绪时会被挂起,需要通过用户线程或内核不断询问数据是否就绪,当数据就绪时,线程将数据从内核拷贝到用户线程中。
异步IO:数据没有就绪时不会被挂机,数据询问和拷贝数据都是在内核中执行。
阻塞IO和非阻塞IO属于同步IO和异步IO的第一阶段,即:在查看数据是否就绪时是如何处理的。 同步IO和异步IO关键区别就是前着数据拷贝是由线程执行的,后者数据拷贝时由内核执行的。
IO模型:
阻塞IO模型:
非阻塞IO模型:
多路复用IO模型:NIO是这种模型,用一个线程不段轮询socket的状态,使得一个线程可以管理多个socket,以减少资源的占用。
信号驱动IO模型:利用信号函数来注册线程发起的IO请求,当内核数据就绪时内核便向向线程发送信号,用户接收到信号后,便在信号函数中调用IO读写操作来进行IO请求操作。
异步IO模型:线程只需要发送一个IO请求,由内核完成数据查询和数据拷贝,线程只需要负责使用数据。
前面四种IO模型实际上都属于同步IO,只有最后一种是真正的异步IO,因为无论是多路复用IO还是信号驱动模型,IO操作的拷贝阶段都会引起用户线程阻塞,也就是内核进行数据拷贝的过程都会让用户线程阻塞。
NIO
channel:通道,类似传统IO中的stream,但是可以进行读写,即:channel是双向的
buffer:缓冲区,channel提供渠道,读取和写入必须经由buffer
selector:NIO的核心,上述多路服用模型,一个线程可以管理多个通道,从而减少系统开销。
Demo:
阻塞IO:线程在没有读取到数据之前会被挂起
非阻塞IO:线程发送IO请求后可以执行其他任务,不会被挂起
同步IO:数据没有就绪时会被挂起,需要通过用户线程或内核不断询问数据是否就绪,当数据就绪时,线程将数据从内核拷贝到用户线程中。
异步IO:数据没有就绪时不会被挂机,数据询问和拷贝数据都是在内核中执行。
阻塞IO和非阻塞IO属于同步IO和异步IO的第一阶段,即:在查看数据是否就绪时是如何处理的。 同步IO和异步IO关键区别就是前着数据拷贝是由线程执行的,后者数据拷贝时由内核执行的。
IO模型:
阻塞IO模型:
非阻塞IO模型:
多路复用IO模型:NIO是这种模型,用一个线程不段轮询socket的状态,使得一个线程可以管理多个socket,以减少资源的占用。
信号驱动IO模型:利用信号函数来注册线程发起的IO请求,当内核数据就绪时内核便向向线程发送信号,用户接收到信号后,便在信号函数中调用IO读写操作来进行IO请求操作。
异步IO模型:线程只需要发送一个IO请求,由内核完成数据查询和数据拷贝,线程只需要负责使用数据。
前面四种IO模型实际上都属于同步IO,只有最后一种是真正的异步IO,因为无论是多路复用IO还是信号驱动模型,IO操作的拷贝阶段都会引起用户线程阻塞,也就是内核进行数据拷贝的过程都会让用户线程阻塞。
NIO
channel:通道,类似传统IO中的stream,但是可以进行读写,即:channel是双向的
buffer:缓冲区,channel提供渠道,读取和写入必须经由buffer
selector:NIO的核心,上述多路服用模型,一个线程可以管理多个通道,从而减少系统开销。
Demo:
public class Test { public static voidmain(String[] args) throws IOException { File file = new File("data.txt"); FileOutputStream outputStream = new FileOutputStream(file); FileChannel channel = outputStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); String string = "Hello NIO!"; buffer.put(string.getBytes()); buffer.flip(); channel.write(buffer); channel.close(); outputStream.close(); } }
相关文章推荐
- Linux 自检和 SystemTap
- spymemcached源码中Reactor模式分析
- Java IO与NIO的一些文件拷贝测试
- 一张图看尽 Linux 内核运行原理
- Mysql IO 内存方面的优化
- Linux内核链表实现过程
- Node.js 的异步 IO 性能探讨
- SQL Server误区30日谈 第22天 资源调控器可以调控IO
- mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
- java中的Io(input与output)操作总结(一)
- Java NIO工作原理的全面分析
- GO语言的IO方法实例小结
- java中的Io(input与output)操作总结(四)
- C#路径,文件,目录及IO常见操作汇总
- PHP内核探索之解释器的执行过程
- SQL语句实现查询当前数据库IO等待状况
- 深入理解PHP内核(二)之SAPI探究
- Java进阶教程之IO基础
- C++中Semaphore内核对象用法实例
- 一张图看尽Linux内核运行原理