同步 异步 阻塞 非阻塞

来源:互联网 发布:CK网站源码 编辑:程序博客网 时间:2024/06/05 14:38
同步执行模式:
        所谓同步执行模式,是指语句在同步执行模式下,将始终保持对程序流的控制,直至   程序结束。如查询操作,客户机上的应用程序在向服务器发出查询操作的指令后,将   一直等待服务器将查询结果返回客户机端,然后才继续进行下一步操作。  
        众所周知,应用程序要从一个大表中删除所有的记录将是非常耗时的,如果应用程序   采用的是单线程(thread)同步执行方式,某次删除工作很可能耽误其他重要工作的完   成。如果应用程序等待的是远程任务,那么远程服务器失败或网络故障或一些无法预   知的情况都可能使应用程序无限期地等下去,这是同步执行最大的缺陷。  
        但是同步执行模式可以简化程序编制的复杂性。程序员可以不用过多地了解比较复杂   的ODBC   2.0   API   的使用,而只需使用   ODBC   的同步执行模式或使用数据控制项和数据库对象变量来编写应用程序,可以提高开发效率,但程序运行速度比不上异步执行   模式的速度。  

异步执行模式:
        所谓异步执行模式,是指语句在异步执行模式下,各语句执行结   束的顺序与语句执行开始的顺序并不一定相同。例如   查询操作,客户机上的应用程序在向服务器发出了查   询操作的指令后,将立刻执行查询语句指令的下一条   语句,而不需要等到服务器将查询结果返回客户机端。   异步执行方式使应用程序能摆   脱单个任务的牵制,提高了灵活性和应用程序的执行   效率。但异步执行模式也存在一些问题,如它增加了   编程的复杂性,特别是编写互用性(interoperable)要求较高   的程序。
        在负荷很重的客户/服务器系   统中,适宜采用异步执行模式。在这种环境下,时间   延迟频繁且漫长,相比之下异步执行的开销微不足   道。但是,如果应用运行的环境比较复杂,则必须建   立一套完整的机制,周期性地检查函数执行的状态,   以决定下一步执行方案。进行周期的检查可以有多种方法,如在   应用中设置计时器并处理WM_TIMER信息等。
        虽然使用异步执行模式在编程   序时十分复杂,但可以实现多任务并行执行,使执行的效率大大提高。
        选择并设置执行模式   在应用程序开发中选择同步模式还是异步模式,是一个比   较复杂的层次。当查询或对数据库的修改相对简单时,同步执行模式是一种   很好的选择,它能够在几秒   或更少的时间内返回结果数据。另外,在应用程序获   得结果集前不能继续执行时,根本不必要使用异步执   行模式。在复杂查询情况下,特别是复杂的多行数据   库的UPDATE   或DELETE   操作,可能需要很长的时间才能完成,   需采用异步执行模式,让用户可以同时对程序的其他   部分进行操作。

对于一般程序员来说,如果他对同步执行模式与异步执行模式不了解,   他往往会在对服务器发出一个操作语句(查询或读取一条记录等   操作)后,立该引用服务器返回的执行结果,或者对该   结果进行下一步操作,这是很危险的。因为,在异步   执行模式下,客户机上的后续语句是在该操作语句发   出后接着执行的,但由于各种原因,服务器不一定能   执行完该操作语句,并在后续语句执行前将结果返回   客户机。因此,后续语句在引用前一操作语句的执行   结果时,往往会因为该执行结果并不存在而引用了错   误的值,造成系统错误或死锁,所以在实际应用中应   根据具体情况慎重选择执行模式。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这是MSDN上的解释:
在客户端发出一个方法调用后,客户端将被阻塞,直至调用返回为止,这种方式被称为同步处理。也就是说,在客户端等待期间它不能执行任何代码。若使用异步处理,就可以在等待期间让客户端做其它的事情。

多线程可认为是异步的.
单线程可认为是同步的! 


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

转载自:http://xmuzyq.iteye.com/blog/783218

       在高性能的I/O设计中,有两个比较著名的模式ReactorProactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。

       在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

  一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

   同步阻塞IO

   在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

   同步非阻塞IO:

在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVANIO就属于同步非阻塞IO

   异步阻塞IO

   此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

   异步非阻塞IO:

   在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。   

         搞清楚了以上概念以后,我们再回过头来看看,Reactor模式和Proactor模式。

首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:

读取操作

1. 应用程序注册读就需事件和相关联的事件处理器

2. 事件分离器等待事件的发生

3. 当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器

4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

写入操作类似于读取操作,只不过第一步注册的是写就绪事件。

下面我们来看看Proactor模式中读取操作和写入操作的过程:

读取操作:

1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。

2. 事件分离器等待读取操作完成事件

3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。

4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

Proactor中写入操作和读取操作,只不过感兴趣的事件是写入完成事件。

从上面可以看出,ReactorProactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.

          综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。

原创粉丝点击