同步和异步的概念与消息的通知机制有关。对于消息的处理者而言,在同步的情况下,由处理消息者自己去等待消息是否被触发;在一步的情况下,由触发机制来通知处理消息者,然后进行消息的处理。这里要注意,同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制。
阻塞与非阻塞与消息等待处理机制有关。阻塞模式是指在指定套接字上调用函数执行操作时,在没有完成操作之前,函数不会立即返回。例如服务器在调用acept函数等待客户端的连接时,知道收到一个客户端的连接请求后才会从阻塞等待中返回。非阻塞模式时指定在套接字上调用函数指定操作时,无论操作是否完成都立即返回。例如,在非阻塞模式下调用recv函数接收数据时,程序会直接读取套接字底层机制中的接收缓冲区,无论是否读到数据,函数会立即返回,而不会一直在此函数上阻塞等待。
同步与阻塞,异步与非阻塞并不是两对相同的概念,这里要注意理解消息的通知和消息的处理是不同的。在真实的IO操作时,消息的通知仅仅指所关注的IO事件何时满足,这个时候我们可以选择持续等待事件满足(同步方式),或通过触发机制来通知事件何时满足(异步方式);而如何处理这个IO事件则是对消息的处理,这里我们要选的是持续阻塞等待处理还是发生阻塞的情况下跳出阻塞等等。
实际上同步操作也可以是非阻塞的,比如以轮询的方式处理网络IO事件,消息的通知方式仍然是主动等待,但在消息处理发生阻塞时并不等待;异步操作也是可以被阻塞的,比如使用IO复用模型时,当关注的网络事件没有发生时,程序会在select函数调用处阻塞。
还是那一句,同步异步针对的是消息的通知机制,阻塞与非阻塞针对的是消息处理的机制,两组概念所属的范畴就不一样。