java IO 模型--快速分清 同步|阻塞
Posted 能表达的才是自己的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java IO 模型--快速分清 同步|阻塞相关的知识,希望对你有一定的参考价值。
IO 介绍
IO 模型
IO请求 分为两个阶段:等待资源 和 使用资源;
IO请求:一般需要请求特殊资源(如 磁盘、RAM 或文件),当资源被上一个使用者使用没有释放的时候, IO请求会被阻塞,直到资源可用。
等待资源 阶段有两种策略:
- 阻塞:当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系统的方方面面。
一些概念: 1、 IOPS:每秒处理的IO 数量。 2、多路复用技术:
信号通路的带宽大于单一信号的数据量大小,为了有效利用带宽,希望信号通路可以一次性传递多个信号数据,这就是多路复用技术。 分类:频分多路复用 和 时分多路复用
IO 组合方式:
以上是关于java IO 模型--快速分清 同步|阻塞的主要内容,如果未能解决你的问题,请参考以下文章