IO与NIO的区别,阻塞与非阻塞的区别

1人阅读 评论(0) 收藏 举报
分类:

阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,知道传输完毕为止。

非阻塞概念:应用程序直接可以获取到已经转备好的数据,无需等待。

IO为同步阻塞形式,NIO为同步非阻塞形式、NIO并没有实现异步,在JDK1.7之后,升级了NIO库包,支持异步阻塞通信模型即NIO2.0(AIO)

同步与异步: 同步与异步一般是面向操作系统和应用程序对IO操作的层面上来区别的。

同步时:应用程序(代码)会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪;或者采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据。

已不是,则所有的IO读写操作交给操作系统处理,与我们的应用程序没有直接关系,我们的程序不需要关系IO读写,当操作系统完成IO读写操作时,会给我们应用程序发送通知,我们的应用程序直接拿走数据即可。

同步说的是server服务器的执行方式;阻塞说的是具体的技术,接受数据方式、状态(IO、NIO)

阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(block,线程进入阻塞状态)。

同步 /异步描述的是执行IO操作的主体是谁,同步是由用户进程自己去执行最终的IO操作。异步是用户进程自己不关系实际IO操作的过程,只需要由内核在IO完成后通知它既可,由内核进程来执行最终的IO操作。

这两组概念交集在一起参生的非阻塞同步IO和非阻塞异步IO的概念就不难理解。

非阻塞同步IO指的是用户调用读写方法是不阻塞的,立刻返回的,而且需要用户线程来检查IO状态。需要注意的是,如果发现有可以操作的IO,那么实际用户进程还是会阻塞等待内核复制数据到用户进程,它与同步阻塞IO的区别是后者全程等待。

非阻塞异步IO指的是用户调用读写方法是不阻塞的,立刻返回,而且用户不需要关注读写,只需要提供回调操作,内核线程在完成读写后回调用户提供的callback。

这两个概念的不同造成了编程模型的不同。

非阻塞同步IO由于读写方法非阻塞,并且需要用户自己来进行读写,所以每次调用读写方法实际读写的字节数是不确定的,所以需要一个Buffer来保存每次读写的字节状态。更重要的是用户不知道什么时候完成了读写,一般需要用while循环判断Buffer的状态来跟踪读写。

非阻塞异步IO由于是内核线程进行读写,并且在IO完成后会回调用户提供的callback,编程模型就比较简单,用户只需要调用读写,提供回调就可以了,比如 read(filename, callback)

select / poll / epoll 从本质上说都是非阻塞同步IO,select会收到IO就绪的状态,然后通知用户去处理IO,实际的IO操作还需要用户等待内核复制操作。

要理解IO就绪和完成的区别。就绪指的是还需要用户自己去处理,完成指的是内核帮助完成了,用户不用关心IO过程,只需要提供回调函数。

理解了非阻塞同步IO和非阻塞异步IO的区别之后,就不难理解Java NIO的设计了。NIO是围绕ByteBuffer来进行读写的,ByteBuffer是一个缓冲区,用来记录读写的状态,通过多次检查ByteBuffer的状态来确定IO是否完成。

Java 1.7的NIO2.0 引入了非阻塞异步IO的概念,编程模型大大简化了。用户只需要关注回调函数即可。

查看评论

《Java之IO , BIO , NIO , AIO 知多少?》

-
  • 1970年01月01日 08:00

IO 与 NIO :其本质就是阻塞和非阻塞的区别

阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,知道传输完毕为止。 非阻塞概念:应用程序直接可以获取到已经转备好的数据,无需等待。 IO为同步阻塞形式,NIO为同...
  • z15732621582
  • z15732621582
  • 2017-12-30 20:13:51
  • 617

NIO(一)——阻塞/非阻塞/同步/异步/NIO/select/epoll基本概念

这个系列是我对NIO的个人理解,某些概念难免会与有理解上的偏差,希望各路大神能给在下指点出来,感激不尽!IO一般指的是内核与外部进行数据交互的所发生的事情。典型分为网络IO(socket),磁盘IO(...
  • nyyjs
  • nyyjs
  • 2017-07-27 16:58:40
  • 321

socket阻塞与非阻塞的区别

  • 2011年07月02日 10:19
  • 97KB
  • 下载

java IO 概念误区---------同步/异步与阻塞/非阻塞的区别

同步/异步与阻塞/非阻塞的区别我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别.这两组概念常...
  • kangojian
  • kangojian
  • 2010-07-03 16:24:00
  • 6460

阻塞IO、非阻塞IO的区别

1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合。 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值。 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现。 3)继承...
  • yyxyong
  • yyxyong
  • 2017-03-17 18:45:49
  • 6747

java 同步/异步IO和阻塞/非阻塞IO 关系和概念解析

java io模型,及相关同步异步,阻塞非阻塞概念解析
  • u014631304
  • u014631304
  • 2017-08-29 18:37:32
  • 131

理解同步/异步和阻塞/非阻塞的区别

同步/异步和阻塞/非阻塞的区别...
  • linhuaiyang
  • linhuaiyang
  • 2017-03-30 09:37:04
  • 732

Java NIO与阻塞IO的研究

一.java NIO 和阻塞I/O的区别  1. 阻塞I/O通信模型 假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的,它会一直等到数...
  • adreamer_bj
  • adreamer_bj
  • 2016-07-25 17:00:00
  • 890

简谈java中的阻塞非阻塞与同步异步

在学习java网络编程时,我遇到了同步/异步,阻塞/非阻塞着四种调用方式。在这里我就大概的说一下我对它们的理解。 同步/异步主要针对客户端:         同步:就是当客户端发出一个功能...
  • hjh_walker
  • hjh_walker
  • 2016-09-05 12:26:21
  • 3076
    个人资料
    持之以恒
    等级:
    访问量: 6156
    积分: 532
    排名: 9万+
    文章存档