BIO、NIO、AIO及衍生出的Netty

JAVA的I/O模型

一、BIO

BIO全称Blocking IO,它作为传统I/O模型,是同步阻塞的。

特点: 1.无连接请求时,accept方法阻塞

         2.无数据可读取时,read方法阻塞

BIO引发的问题: 严重的资源浪费

1.线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。

2.线程本身占用较大内存,像Java的线程栈,一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。

3. 线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高、CPU sy使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。

4.容易造成锯齿状的系统负载。因为系统负载是用活动线程数或CPU核心数,一旦线程数量高但外部网络环境不是很稳定,就很容易造成大量请求的结果同时返回,激活大量阻塞线程从而使系统负载压力过大。

二、NIO

NIO全称Non-blocking I/O,是同步非阻塞的I/O模型。

NIO使用Selector(多路复用器)来监视每一个Client,具体操作是客户端发送的连接请求注册到Selector上,NIO启用一个线程来轮询Selector是否有IO请求,有则进行处理。

NIO三大组件:

Selector 多路复用器 用于监听和注册,当一个Channel注册在Selector,Selector就会自动地轮询注册的Channel是否已就绪I/O事件,通过这样可使用一个线程管理多个Channel

Channel 通道  读取/写入buffer,用于传输

Buffer 缓冲区  针对8种基本类型对应的缓冲区类,用于存储数据

NIO底层支持的Reactor模型(也称Dispatcher模式):

Reactor模型即I/O多路复用统一监听事件,收到事件后分发(Dispatch给某进程),基于事件驱动开发,组件包括Reactors和Handlers。还可将Reactor分成3种:单线程模型(单Reactor模型)、多线程模型(单Reactor多线程)、主从多线程(多Reactor多线程)

三、AIO

AIO即 Asynchronous I/O,也称为NIO2.0,异步非阻塞的I/O模型。

AIO与NIO不同的是,进行读写操作时,只需直接调用read或wirte方法。

它无需一个线程去轮询所有IO操作的状态改变,当有状态的改变时,系统会通知线程处理。

四、NIO衍生的I/O框架---Netty

Netty的线程模型就是Reactor模式的一个实现。

未完的。。

 

部分参考:

1.《Java 开发必备! I/O与Netty原理精讲》文章,公众号:阿里技术

2.《Java NIO浅析》文章 -- https://tech.meituan.com/2016/11/04/nio.html

3.《从 BIO、NIO 聊到 Netty,最后还要手写一个简单的 RPC 框架!毕设/项目经验稳了!》文章,公众号:后端技术进阶

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值