互联网招聘网站排行,长沙做网站公司有哪些,用什么框架做网站快,网络营销的广告形式有哪些【转自】http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中#xff0c;有几个名词概念常常会使我们感到迷惑不解。具体如下#xff1a; 序号 问题 1 什么是同步#xff1f; 2 什么是异步#xff1f; 3 什么是阻塞#xff1f; 4 什么是非阻塞#xff1f…【转自】http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中有几个名词概念常常会使我们感到迷惑不解。具体如下 序号 问题 1 什么是同步 2 什么是异步 3 什么是阻塞 4 什么是非阻塞 5 什么是同步阻塞 6 什么是同步非阻塞 7 什么是异步阻塞 8 什么是异步非阻塞 散仙不才在查了一部分资料后愿试着以通俗易懂的方式解释下这几个名词。如有不足之处还望告知。 在弄清楚上面的几个问题之前我们首先得明白什么是同步异步阻塞非阻塞只有这几个单个概念理解清楚了然后在组合理解起来就相对比较容易了。 1,同步和异步是针对应用程序和内核的交互而言的。 2,阻塞和非阻塞是针对于进程在访问数据的时候根据IO操作的就绪状态来采取的不同方式说白了是一种读取或者写入操作函数的实现方式阻塞方式下读取或者写入函数将一直等待而非阻塞方式下读取或者写入函数会立即返回一个状态值。 由上描述基本可以总结一句简短的话同步和异步是目的阻塞和非阻塞是实现方式。 编号 名词 解释 举例 1 同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣服自己亲自干这件事别的事干不了。 2 异步 异步是指用户进程触发IO操作以后便开始做自己的事情而当IO操作已经完成的时候会得到IO完成的通知异步的特点就是通知 告诉朋友自己合适衣服的尺寸大小颜色让朋友委托去卖然后自己可以去干别的事。使用异步IO时Java将IO读写委托给OS处理需要将数据缓冲区地址和大小传给OS 3 阻塞 所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止 去公交站充值发现这个时候充值员不在可能上厕所去了然后我们就在这里等待一直等到充值员回来为止。当然现实社会可不是这样但是在计算机里确实如此。 4 非阻塞 非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 银行里取款办业务时领取一张小票领取完后我们自己可以玩玩手机或者与别人聊聊天当轮我们时银行的喇叭会通知这时候我们就可以去了。 下面我们再来理解组合方式的IO类型就好理解多了。 同步阻塞IOJAVA BIO 同步并阻塞服务器实现模式为一个连接一个线程即客户端有连接请求时服务器端就需要启动一个线程进行处理如果这个连接不做任何事情会造成不必要的线程开销当然可以通过线程池机制改善。 同步非阻塞IO(Java NIO) 同步非阻塞服务器实现模式为一个请求一个线程即客户端发送的连接请求都会注册到多路复用器上多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪这就要求用户进程不停的去询问。 异步阻塞IOJava NIO 此种方式下是指应用发起一个IO操作以后不等待内核IO操作的完成等内核完成IO操作以后会通知应用程序这其实就是同步和异步最关键的区别同步必须等待或者主动的去询问IO是否完成那么为什么说是阻塞的呢因为此时是通过select系统调用来完成的而select函数本身的实现方式是阻塞的而采用select函数有个好处就是它可以同时监听多个文件句柄如果从UNP的角度看select属于同步操作。因为select之后进程还需要读写数据从而提高系统的并发性 Java AIO(NIO.2)异步非阻塞IO: 在此种模式下用户进程只需要发起一个IO操作然后立即返回等IO操作真正的完成以后应用程序会得到IO操作完成的通知此时用户进程只需要对数据进行处理就好了不需要进行实际的IO读写操作因为真正的IO读取或者写入操作已经由内核完成了。 BIO、NIO、AIO适用场景分析: BIO方式适用于连接数目比较小且固定的架构这种方式对服务器资源要求比较高并发局限于应用中JDK1.4以前的唯一选择但程序直观简单易理解。 NIO方式适用于连接数目多且连接比较短轻操作的架构比如聊天服务器并发局限于应用中编程比较复杂JDK1.4开始支持。 AIO方式使用于连接数目多且连接比较长重操作的架构比如相册服务器充分调用OS参与并发操作编程比较复杂JDK7开始支持。 搞清楚了以上概念以后我们再回过头来看看Reactor模式和Proactor模式。 其实阻塞与非阻塞都可以理解为同步范畴下才有的概念对于异步就不会再去分阻塞非阻塞。对于用户进程接到异步通知后就直接操作进程用户态空间里的数据好了。 首先来看看Reactor模式Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤 读取操作 1. 应用程序注册读就绪事件和相关联的事件处理器 2. 事件分离器等待事件的发生 3. 当发生读就绪事件的时候事件分离器调用第一步注册的事件处理器 4. 事件处理器首先执行实际的读取操作然后根据读取到的内容进行进一步的处理 写入操作类似于读取操作只不过第一步注册的是写就绪事件。 下面我们来看看Proactor模式中读取操作和写入操作的过程 读取操作 1. 应用程序初始化一个异步读取操作然后注册相应的事件处理器此时事件处理器不关注读取就绪事件而是关注读取完成事件这是区别于Reactor的关键。 2. 事件分离器等待读取操作完成事件 3. 在事件分离器等待读取操作完成的时候操作系统调用内核线程完成读取操作异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作操作系统扮演了重要角色并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点Proactor中应用程序需要传递缓存区。 4. 事件分离器捕获到读取完成事件后激活应用程序注册的事件处理器事件处理器直接从缓存区读取数据而不需要进行实际的读取操作。 Proactor中写入操作和读取操作只不过感兴趣的事件是写入完成事件。 从上面可以看出Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的Reactor中需要应用程序自己读取或者写入数据而Proactor模式中应用程序不需要进行实际的读写过程它只需要从缓存区读取或者写入即可操作系统会读取缓存区或者写入缓存区到真正的IO设备. 综上所述同步和异步是相对于应用和内核的交互方式而言的同步 需要主动去询问而异步的时候内核在IO事件发生的时候通知应用程序而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。 如果你想吃一份宫保鸡丁盖饭 同步阻塞你到饭馆点餐然后在那等着还要一边喊好了没啊 同步非阻塞在饭馆点完餐就去遛狗了。不过溜一会儿就回饭馆喊一声好了没啊 异步阻塞遛狗的时候接到饭馆电话说饭做好了让您亲自去拿。 异步非阻塞饭馆打电话说我们知道您的位置一会给你送过来安心遛狗就可以了。 “一个IO操作其实分成了两个步骤发起IO请求和实际的IO操作。 同步IO和异步IO的区别就在于第二个步骤是否阻塞如果实际的IO读写阻塞请求进程那么就是同步IO。 阻塞IO和非阻塞IO的区别在于第一步发起IO请求是否会被阻塞如果阻塞直到完成那么就是传统的阻塞IO如果不阻塞那么就是非阻塞IO。 同步和异步是针对应用程序和内核的交互而言的同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪而异步是指用户进程触发IO操作以后便开始做自己的事情而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候根据IO操作的就绪状态来采取的不同方式说白了是一种读取或者写入操作函数的实现方式阻塞方式下读取或者写入函数将一直等待而非阻塞方式下读取或者写入函数会立即返回一个状态值。 所以,IO操作可以分为3类同步阻塞即早期的IO操作、同步非阻塞NIO、异步AIO。 同步阻塞 在此种方式下用户进程在发起一个IO操作以后必须等待IO操作的完成只有当真正完成了IO操作以后用户进程才能运行。JAVA传统的IO模型属于此种方式。 同步非阻塞 在此种方式下用户进程发起一个IO操作以后边可返回做其它事情但是用户进程需要时不时的询问IO操作是否就绪这就要求用户进程不停的去询问从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。 异步 此种方式下是指应用发起一个IO操作以后不等待内核IO操作的完成等内核完成IO操作以后会通知应用程序。” 这段话比较清楚 参考http://blog.csdn.net/brainkick/article/details/9312407