NIO重要组件

15 篇文章 0 订阅
9 篇文章 0 订阅

NIO重要组件

本篇不打算含有过多的代码解释,大概率是纯原理的文章,旨在更加理解Netty框架的底层原理 – NIO的原理。接下来认识一下最重要的三个组件。

Channel

顾名思义这是通信管道的意思,在NIO中充当数据通道的作用。

NIO所有数据都通过Buffer对象处理;不会将字节写入channel通道中,但是将字节数据可以写入缓冲区;同理,你也不能在channel通道中读取到字节,而是将数据输入到缓冲区,然后channel从缓冲区读取字节。

img

channel通道是双向的,不像是BIO那样是流(单向的),所以可以同时读写数据

Buffer

在数据打包和传输的方式上,BIO是面向流进行传输的,也就是一个字节一个字节这样传输,效率是比较慢的;而NIO就是面向块进行传输的。

缓冲区一般来说是个字节数组,但又不仅仅是个字节数组,还是一个可以跟踪系统的读/写进程。

缓冲区类型用的最多的是ByteBuffer,八大数据类型每个都有自己的缓冲区类型。

缓冲区中有三个重要的状态变量:positionlimitcapacity

  • position :表明下次读/写数据的位置;
  • limit:写模式下还可以写入多少数据、读模式下还可以读取多少数据;
  • capacity:表明缓冲区的最大存储数据容量;

开始 初始化capacity为7的字节数组,此时position为0,limit为6;

img

开始写入数据,比如写入3个数据,此时position就到了该位置。

img

切换到读取数据模式,调用flib()方法

  • limit设置到position的位置;
  • position设置为0;

img

之后就一直读取数据,知道position == limit,要知道 position 是要小于或者等于 limit的。调用clear()方法。

clear()方法主要做了两件事:

  • limit设置为capacity相同;
  • 设置position为0。

Selector

传统的BIO中,写出和读取数据都是会阻塞的,需要等到完全读取或者完全写出才能有下一步的操作。所以需要采用异步IO,在读取数据的同时也可以写出数据。同步程序常常要 求助于 轮询,或者创建大量的线程连接;而异步程序不需要求助轮询,只需要少数的线程就可以监听管理任何通道的事件。

下面内容是参考 知乎 岛雨 的文章;

我们知道BIO中,有两个阻塞(监听阻塞、读取/写出数据时阻塞),而NIO就是为了解决这两个根本的阻塞而产生的;

img

代码就不实现了。。。。。

selector之前首先我们要了解IO多路复用器

根据操作系统的知识我们知道,计算机硬件资源是有内核态来控制的,而我们的程序是运行在用户态的,但IO相关的函数是在内核态的。所以发生IO读写操作的时候,会有内核态到用户态的切换过程,而这个过程代价很大,需要减少切换次数。

在没有selector时我们在内核态和用户态的切换过程中付出的代价很大,由此,看能不能一次性将把要检查的socket全部扔给内核态,让内核态告诉我们有哪些socket有客户端来连接了,有哪些socket有客户端来发送数据了,然后针对性地做出相应的处理即可,而不是一个一个socket连接去找内核检查对应的状态。IO多路复用器应运而生。

Selector类 = NIO + IO多路复用器 封装

简单来说Selector就是一条线程可以管理多个管道

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值