IO理解


UNIX的5种IO模型

  • 阻塞IO
    进程会一直阻塞(recvfrom的调用), 直到数据拷贝完成
  • 非阻塞IO
    进程反复调用IO函数,采用轮训,占用CPU
  • IO多路复用
    主要是select/epoll方式,能实现对多个IO端口进行监听
  • 信号驱动IO
    通过系统调用sigation执行一个信号处理函数, 生成一个signal信号,通知应用程序来取数据。 通知client可以开始了,
  • 异步IO
    告知内核启动某个操作,并让内核在整个操作完成之后(数据从系统内核复制到用户自己的缓冲区当中),进行通知。 通知client已经完成了

Java的IO和NIO的区别, IO是面向流的, NIO是面向缓冲区的。Java的各种IO流是阻塞的, 当一个线程调用read或write方法, 线程会被阻塞。NIO是线程在空闲时间用于其他通道上执行IO操作,所以一个线程可以管理多个输入和输出通道。
Java NIO的选择器允许一个单独的线程来监视多个输入通道, 你可以注册多个通道使用一个选择器。这种机制,使得一个单独的线程很容易来管理过个通道。这个通道可以是网络连接或者是文件。

BIO

如果是少量的连接,使用非常高的带宽,一次发送大量的数据,这种使用典型的IO机制。
Block-IO 同步阻塞IO,传统的通信方式。优点模式简单,使用方便。缺点处理并发能力低,通信耗时,依赖网速。

NIO

一个请求一个线程,客户端发起的请求都会注册到多路复用器上,多路复用器会轮训到连接有IO请求时,才会启动一个线程进行处理。
需要同时打开成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器。
Non-Block-IO 非阻塞同步IO,区别与传统的BIO,是数据打包和传输方式。原来的IO是流的方式处理数据,NIO是块的方式处理数据, 面向流的I/O系统一次一个字节地处理数据。

AIO

客户端的I/O请求都是由系统先完成,然后再通知服务器应用去启动线程处理。
Asynchronous IO 异步非阻塞IO。在NIO的基础上引入流新的异步通道的概念。
适用于连接数据多而且连接比较长的架构常见,如相册服务器。

IO多路复用

一个线程通过记录和跟踪每一个socket的状态来同时管理多个I/O流, 用以来提供服务器的吞吐能力。
具体的实现应用比如nginx, redis
select, poll, epoll都是IO多路复用的具体实现
select 只能监视1024个连接,会修改传入的参数数组, 无法确定是那个socket的数据, 不是线程安全的,无法预测相关的数据
poll 去掉了1024个连接的限制, 不会修改传入的参数数组, 但poll仍然不是线程安全的
epoll 是线程安全的, 同时能够确定socket里的数据是来自那个socket的, 局限只能在linux上支持


文章作者:
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 !
评论
  目录