java IO 模型--快速分清 同步|阻塞

IO 介绍

IO 模型

IO请求 分为两个阶段:等待资源 和 使用资源;
IO请求:通常须要请求特殊资源(如 磁盘、RAM 或文件),当资源被上一个使用者使用没有释放的时候, IO请求会被阻塞,直到资源可用。java

等待资源 阶段有两种策略:编程

  • 阻塞:当IO请求资源没有准备好的时候,请求阻塞,直到获得资源的响应(有资源 或者 超时异常);
  • 非阻塞:资源不可用时,IO请求直接返回,返回数据不可用标志。

使用资源 阶段,IO 分为 同步IO 和 异步IO缓存

  • 同步IO:应用阻塞在发送数据和接受数据阶段,直到数据发送或接收完毕 或 失败返回;
  • 异步IO:应用发送或接受数据后,即返回,数据写入OS 缓存,由OS 完成数据的发送或接受,完成后,发送成功后失败标志给应用。

Unix IO 模型

  • 阻塞IO:等待资源阻塞,使用资源同步;
  • 非阻塞IO:等待资源轮询,使用资源同步;
  • IO 复用:支持多路复用,等待阻塞在复用选择器上,使用资源同步的方式;
  • 信号驱动 :等待资源通知,使用资源同步;
  • 异步IO :等待 和 使用 采用通知的方式。

各类IO特色:异步

  • 阻塞IO:使用简单,可是每一个socket请求会新建一个线程处理,这些线程大多数是没有运算的,形成线程的膨胀;Java BIO 使用这种方式。
  • 非阻塞IO:采用轮询的方式,所以不会形成线程的膨胀。java NIO 采用这种方式,大大减小了线程数,可使用一个线程完成对全部socket 的监听。
    另外,NIO 底层采用多路复用IO的方式(select阻塞,支持多路复用),可是java 的实现接口,采用了轮询的方式,貌似一种非阻塞的形态。
  • 同步IO:IO 操做结束以后才返回,效率低些,可是编程方式简单。java BIONIO 都是采用这种方式。
  • 异步IO:因为异步IO 只是写入了缓存,由缓存到磁盘成功与否未可知,所以异步IO 至关于把IO操做分红了两部分:发起请求,获取返回结果。所以对应用来讲增长了编程复杂性。
    可是异步IO的性能是很是好的,而异步的思想贯穿了IT系统的方方面面。

一些概念: 一、 IOPS:每秒处理的IO 数量。 二、多路复用技术:
信号通路的带宽大于单一信号的数据量大小,为了有效利用带宽,但愿信号通路能够一次性传递多个信号数据,这就是多路复用技术。 nio中就是,一个线程能够监听多个通讯信道(不一样的socket),因此是多个通讯信道复用一个监听|轮询线程,即多路复用
分类:频分多路复用 和 时分多路复用socket

IO 组合方式:
IO 组合方式性能

相关文章
相关标签/搜索