同步 异步 阻塞 非阻塞

另外看这篇 http://www.cnblogs.com/dolphin0520/p/3916526.html

JAVA NIO是同步非阻塞io。同步和异步说的是消息的通知机制,阻塞非阻塞说的是线程的状态 。
下面说说我的理解,client和服务器建立了socket连接:
1、同步阻塞io:client在调用read()方法时,stream里没有数据可读,线程停止向下执行,直至stream有数据。
阻塞:体现在这个线程不能干别的了,只能在这里等着
同步:是体现在消息通知机制上的,即stream有没有数据是需要我自己来判断的。
2、同步非阻塞io:调用read方法后,如果stream没有数据,方法就返回,然后这个线程就就干别的去了。
非阻塞:体现在,这个线程可以去干别的,不需要一直在这等着
同步:体现在消息通知机制,这个线程仍然要定时的读取stream,判断数据有没有准备好,client采用循环的方式去读取,可以看出CPU大部分被浪费了
3、异步非阻塞io:服务端调用read()方法,若stream中无数据则返回,程序继续向下执行。当stream中有数据时,操作系统会负责把数据拷贝到用户空间,然后通知这个线程,这里的消息通知机制就是异步!而不是像NIO那样,自己起一个线程去监控stream里面有没有数据!

作者:芸芸有度
链接:https://www.zhihu.com/question/27991975/answer/56432635
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

NIO 与传统IO的测试,我也做过。两者在普通文件的读取时,速度几乎没有差异。 更有趣的是,如果传统IO,使用的得当(比如使用BufferedInputStream、BufferedReader ),是很快的。如果NIO使用不当(比如,我用MappedByteBuffer,将文件映射到内存,Buffer的大小是文件的总长度43M),速度是传统IO的二十分之一。 引用IBM官方教程中的一句话,来解释:
引用
在 JDK 1.4 中原来的 I/O 包和 NIO 已经很好地集成了。 java.io. 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如, java.io. 包中的一些类包含以块的形式读写数据的方法,这使得即使在更面向流的系统中,处理速度也会更快。**
可以看到,1.4后的IO经过了集成。所以NIO的好处,集中在其他特性上,而非速度了: 1、分散与聚集读取 2、文件锁定功能 3、网络异步IO

1、前言
  在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和书总结一下,加以区别,加深理解。
2、数据流向
  网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分:
  (1)内核等待数据可读
  (2)将内核读到的数据拷贝到进程
详细过程如下图所示:

同步 异步 阻塞 非阻塞_第1张图片

3、网络IO模型详细分析
  常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动形象的例子来说明这四个概念。周末我和女友去逛街,中午饿了,我们准备去吃饭。周末人多,吃饭需要排队,我和女友有以下几种方案:
  (1)我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。
女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞。网络中IO阻塞如下图所示:
同步 异步 阻塞 非阻塞_第2张图片

  (2)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。这就是非阻塞。需要不断的询问,是否准备好了。网络IO非阻塞如下图所示:
同步 异步 阻塞 非阻塞_第3张图片

  (3)与第二个方案差不多,餐厅安装了电子屏幕用来显示点餐的状态,这样我和女友逛街一会,回来就不用去询问服务员了,直接看电子屏幕就可以了。这样每个人的餐是否好了,都直接看电子屏幕就可以了,这就是典型的IO多路复用,如select、poll、epoll。网络IO具体模型如下图所示:
同步 异步 阻塞 非阻塞_第4张图片

  (4)女友不想逛街,又餐厅太吵了,回家好好休息一下。于是我们叫外卖,打个电话点餐,然后我和女友可以在家好好休息一下,饭好了送货员送到家里来。这就是典型的异步,只需要打个电话说一下,然后可以做自己的事情,饭好了就送来了。linux提供了AIO库函数实现异步,但是用的很少。目前有很多开源的异步IO库,例如libevent、libev、libuv。异步过程如下图所示:
同步 异步 阻塞 非阻塞_第5张图片

4、同步与异步
  实际上同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。同步与异步如下图所示:
同步 异步 阻塞 非阻塞_第6张图片

5、阻塞与非阻塞
  简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。详细区别如下图所示:
同步 异步 阻塞 非阻塞_第7张图片

你可能感兴趣的:(同步 异步 阻塞 非阻塞)