同步、异步、阻塞、非阻塞

在网络通信中,经常可以看到有人将同步和阻塞等同、异步和非阻塞等同。事实上,这两对概念有一定的区别,不能混淆。两对概念的组合,就会产生四个新的概念,同步阻塞、异步阻塞、同步非阻塞、异步非阻塞

1、同步阻塞方式,发送方向接收方发送请求后,一直等待响应;接收方处理请求时进行的IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。比如,在超市排队付账时,客户(发送方)向收款员(接收方)付款(发送请求)后需要等待收款员找零,期间不能做其他的事情;而收款员等待收款机返回结果(IO)操作后才能把零钱取出来交给客户(响应请求),期间也只能等待,不能做其他事情。这种方式实现简单,但是效率不高。

2、同步非阻塞方式,发送方向接收方发送请求后,一直等待响应;接收方处理请求时进行的IO操作如果不能马上得到结果,就立即返回,去做其他事情,但由于没有得到请求处理结果,不响应发送方,发送方一直等待。一直到IO操作完成后,接收方获得结果响应发送方后,接收方才进入下一次请求过程。在实际中不使用这种方式。

3、异步阻塞方式,发送方向接收方发送请求后,不用等待响应,可以接着进行其他工作;接收方处理请求时进行的IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。这种方式在实际中也不使用。

4、异步非阻塞方式,发送方向接收方发送请求后,不用等待响应,可以继续其他工作;接收方处理请求时进行的IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。继续使用在超市排队付账的例子。客户(发送方)向收款员(接收方)付款(发送请求)后在等待收款员找零的过程中,还可以做其他事情,比如打电话、聊天等;而收款员在等待收款机处理交易(IO操作)的过程中还可以帮助客户将商品打包,当收款机产生结果后,收款员给客户结账(响应请求)。在四种方式中,这种方式是发送方和接收方通信效率最高的一种。

以上所用内容来自:苗泽, Nginx高性能Web服务器详解,电子工业出版社,P55-P56

PS:

1.同步与异步针对的是客户端,同步是指客户端要一直等待服务端返回结果,期间不能做其他事情,异步是指客户端无需等待服务端结果,可以做其他事情

2.阻塞和非阻塞针对的是服务端,阻塞是指服务端对客户的请求执行系统I/O操作时要等待系统给出结果,期间不能做其他事情,非阻塞是指服务端把请求交给系统I/O后,可以做其他事情,并且会轮询查看之前的请求系统是否给出结果,给出就返回,再处理下一个,没给出就直接处理下一个

3.同步非阻塞方式在实际中不使用是因为这样客户对会一直需要等待,因为服务端不会专门开一个线程服务该客户端的请求,所以客户端体验是最差的

4.异步阻塞方式也不在实际中使用是因为客户端可以一直对服务端进行操作,导致服务端压力很大,需要非常多的线程来维护请求,所以这要求服务端的性能非常高才行

参考:

1. https://www.zhihu.com/question/19732473/answer/308092103

2. https://www.cnblogs.com/coffee9527/p/8951046.html

只为训练自己,时刻锤炼一个程序员最基本的技能!
原文地址:https://www.cnblogs.com/coding-wtf/p/9465476.html