阻塞(Blocking),非阻塞(Non-Blocking),同步(Sync),异步(Async),重叠(Overlapped)
2012-10-07 11:19
337 查看
Blocking/Non-Blocking VS Sync/Async VS Overlapped
[转载请注明:出自cnblogs,作者:byeyear,Email:east3@163.com]
本文主要讨论几个在网络编程中经常被讨论但也经常被误解的概念:
阻塞(Blocking),非阻塞(Non-Blocking),同步(Sync),异步(Async),重叠(Overlapped)。
首先要明确的是,只有那些会导致发生“数据传输”的函数(accept,connect,send,recv等)才存在这些概念;像socket、bind、listen这些不会引发“数据传输”的函数,是不存在“阻塞非阻塞”或“同步异步”这样的问题的。
其次一个比较重要的问题是,Non-Blocking和Async不是一回事。在一些论坛和关于网络编程的书中,将这两者等同,这是不正确的。
1. Blocking和Non-Blocking
Blocking:只有在函数所请求的操作完成后,函数才会返回。例如,accept会等到连接队列非空才返回;recv会等到数据缓冲区中有数据后才返回。因此,blocking的意思是,操作若不能完成函数就不返回。
Non-Blocking:如果操作无法立即完成,send/recv这样的函数将以失败返回,函数所请求的操作不会得到执行。同时WSAGetLastError函数将返回WSAEWOULDBLOCK。例如,如果缓冲区中没有数据,recv会立即返回。在Non-Blocing模式下,程序可以通过一个循环不停调用recv,直到有数据可用。
2. Async和Overlapped
Async和Overlapped实际上是一个概念。如果我们在调用WSASocket函数的时候指定了WSA_FLAG_OVERLAPPED参数,或直接使用socket函数,那么得到的socket将是支持异步操作的(但却是Blocking的)。你可以使用WSASend,WSARecv等函数,配合Overlapped结构实现Async IO。
如果一个Async IO不能立即完成,函数将以失败返回,同时你WSAGetLastError将返回WSA_IO_PENDING。但是,底层的操作将继续执行。你的程序将在稍后得到通知。
综上,我们可以得到socket I/O操作的三种方法,列于下表:
参考文档:http://support.microsoft.com/kb/181611/en-us?fr=1
[转载请注明:出自cnblogs,作者:byeyear,Email:east3@163.com]
本文主要讨论几个在网络编程中经常被讨论但也经常被误解的概念:
阻塞(Blocking),非阻塞(Non-Blocking),同步(Sync),异步(Async),重叠(Overlapped)。
首先要明确的是,只有那些会导致发生“数据传输”的函数(accept,connect,send,recv等)才存在这些概念;像socket、bind、listen这些不会引发“数据传输”的函数,是不存在“阻塞非阻塞”或“同步异步”这样的问题的。
其次一个比较重要的问题是,Non-Blocking和Async不是一回事。在一些论坛和关于网络编程的书中,将这两者等同,这是不正确的。
1. Blocking和Non-Blocking
Blocking:只有在函数所请求的操作完成后,函数才会返回。例如,accept会等到连接队列非空才返回;recv会等到数据缓冲区中有数据后才返回。因此,blocking的意思是,操作若不能完成函数就不返回。
Non-Blocking:如果操作无法立即完成,send/recv这样的函数将以失败返回,函数所请求的操作不会得到执行。同时WSAGetLastError函数将返回WSAEWOULDBLOCK。例如,如果缓冲区中没有数据,recv会立即返回。在Non-Blocing模式下,程序可以通过一个循环不停调用recv,直到有数据可用。
2. Async和Overlapped
Async和Overlapped实际上是一个概念。如果我们在调用WSASocket函数的时候指定了WSA_FLAG_OVERLAPPED参数,或直接使用socket函数,那么得到的socket将是支持异步操作的(但却是Blocking的)。你可以使用WSASend,WSARecv等函数,配合Overlapped结构实现Async IO。
如果一个Async IO不能立即完成,函数将以失败返回,同时你WSAGetLastError将返回WSA_IO_PENDING。但是,底层的操作将继续执行。你的程序将在稍后得到通知。
综上,我们可以得到socket I/O操作的三种方法,列于下表:
Blocking,Sync | 函数请求的操作完成后才返回 | |
Non-Blocking,Sync | 函数请求的操作若不能立即完成,函数将立即返回 | 函数请求的操作将不会得到执行 |
Non-Blocking,Async | 函数请求的操作若不能立即完成,函数将立即返回 | 函数请求的操作将继续执行 |
相关文章推荐
- 同步(synchronous)/异步(asynchronous)与阻塞(blocking)/非阻塞(non-blocking)
- 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO
- 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式
- 同步(Synchronous)异步(Asynchronous) 阻塞(Blocking)和非阻塞(Non-blocking)的概念
- 同步(Synchronous)异步(Asynchronous) 阻塞(Blocking)和非阻塞(Non-blocking)的概念
- 关于同步(Sync),异步(Async),阻塞(Block),非阻塞等网络通信的一些解释
- Blocking/Non-Blocking VS Sync/Async VS Overlapped
- 半同步半异步I/O的设计模式(half sync/half async)
- c++实现半同步半异步I/O的设计模式(half sync/half async)
- Winscock 的I/O模式,阻塞、非阻塞、重叠、同步与异步
- 领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型都是常用的客户-服务器编程模型
- ASP.NET sync over async(异步中同步,什么鬼?)
- 关于JavaScript中的同步(SYNC)和异步(ASYNC)
- 同步sync 异步async
- Half Sync And Half Async 半同步半异步模式
- 领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型
- asyframe - 基于Boost.asio的半同步/半异步(Half-Sync/Half-Async)通信框架 - Google Project Hosting
- 半同步半异步I/O的设计模式(half sync/half async)
- 设计模式 Concurrency 之 Half_Sync_Half_Async 半同步半异步模式
- GCD编程dispatch_sync(同步)和dispatch_async(异步)方式执行并发队列任务区别