NIO是怎么发展来的

NIO是怎么发展来的

前言—同步、异步 与 阻塞、非阻塞

  • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
  • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。
  • 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
  • 非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

举个生活中简单的例子,你妈妈让你烧水,小时候你比较笨啊,在那里傻等着水开(同步阻塞)。等你稍微再长大一点,你知道每次烧水的空隙可以去干点其他事,然后只需要时不时来看看水开了没有(同步非阻塞)。后来,你们家用上了水开了会发出声音的壶,这样你就只需要听到响声后就知道水开了,在这期间你可以随便干自己的事情,你需要去倒水了(异步非阻塞)。(以上例子来自于:同步异步与阻塞非阻塞的区别

1.BIO的概念

从JDK1.0开始,Java就提供了I/O操作的API,现在,我们习惯于把它称之为BIO(Blocking-IO,也就是阻塞IO。何谓阻塞呢?用一句话简答介绍就是,排队—你必须要等你前面的人完成事情,你才可以做。可能平时我们在用IO中并未感觉,因为我们一般是针对文件进行IO,但是这要在网络IO中,是十分影响性能的

首先,面对客户端发来的请求,服务器就得新建一个线程去处理它,所以,线程和请求的比例是1:1。当用户请求非常多的时候,服务器就会因为创建线程过多而造成宕机。

但也不是说BIO就一无是处,它现在的主要用处是体现在文件IO中。由于是单线程,避免了线程创建和销毁以及线程上下文的频繁切换。在一定情况下,性能比NIO都要好。

2.BIO与NIO的过渡----伪异步IO

首先,介绍一下什么叫“伪异步”,故名思意,是属于假的异步。而异步我们暂且可以理解成非阻塞的(虽然它们不是同一个概念,但个人感觉很相似)。在用BIO做网络IO中,线程和请求的比例是1:1,而且一个请求结束之后,线程就被销毁了,复用性很差,十分浪费资源。而伪异步IO就是针对BIO的这点进行了优化,引入了线程池和消息队列,线程和请求的比例变成了M:N(N可以远远大于M)。这使得服务器不会因为资源消耗过多而宕机。但是它内部还是使用的阻塞型的BIO,在针对一个请求的操作时,还是会阻塞,因为称为伪异步IO

3.NIO的由来

NIO是一种全新的IO,也被称为(Non-Blocking IO,即非阻塞IO),是JDK1.4之后提出的,针对网络IO这块的创新。它提出了和BIO截然不同的概念,以下列出两者的区别:

  • NIO是非阻塞的,BIO是阻塞的
  • NIO是以块的方式传输,BIO是以流的方式传输
  • NIO有选择器,BIO没有

介绍完NIO与BIO的区别,我们再来深入了解NIO的三个核心:Channel、Buffer、Selector

  1. Channel(管道):在NIO中,没有BIO那些字节流的概念,它一切的操作都是基于Channel(管道)进行。这么个比喻吧!把要操作的数据看作是矿藏,Channel就是铁轨,起一个连通的桥梁作用
  2. Buffer(缓冲区):上面把Channel看作铁轨,那Buffer就是运行在铁轨上的火车,专门用来传输数据的。而我们程序员也是直接和火车(Buffer)打交道
  3. Selector(选择器):是NIO多路复用机制的重要体现,什么叫多路复用呢?就是把多个IO的阻塞复用到同一个Selector的阻塞上去。打个比喻,一个餐厅,客人进来先有服务员安排到对应的桌子,这个过程叫“注册”。因为,把每一桌看作是一个Channel的话,那服务员就是Selector,当每桌点完菜,就告知一下服务员,然后服务员就可以为他们进行相应服务。

关于NIO的一些基本操作,可以参考下面博文:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值