一文读懂Http的同步、异步,阻塞、非阻塞

1,256 阅读3分钟

1、同步异步

同步机制是指发送方发送请求后,需要等待接收方返回响应后,才能发送下一个请求,而异步机制,发送方发送请求后,不等待接收方响应这个请求,就继续发送下个请求。

2、阻塞非阻塞

阻塞非阻塞,主要指socket读写数据的阻塞和非阻塞方式。Socket的本质其实也是IO操作。每一个TCP Socket的内核中都有一个发送缓冲区和接收缓冲区。对于阻塞模式来说,如果接收缓冲区为空,那么socket的read方法的线程就会阻塞,直到有数据进入接收缓冲区。而对于写数据到socket中而言,如果待发送的数据长度大于发送缓冲区的空余长度,那么write方法会进入阻塞。

3、同步异步与阻塞非阻塞的区别

区分他们非常简单,同步异步与阻塞非阻塞的主要区别是针对对象不同。

  • 同步异步是针对调用者来说的,调用者发起一个请求后,一直干等被调用者的反馈就是同步,不必等去做别的事就是异步。
  • 阻塞非阻塞是针对被调用者来说的,被调用者收到一个请求后,做完请求任务后才给出反馈就是阻塞,收到请求直接给出反馈再去做任务就是非阻塞。

而对于非阻塞模式来说,通过事件触发的方式来达到目的。我们可以认为NIO底层中存在一个I/O调度线程,它不断的扫描每个Socket的缓冲区,当发现写入缓冲区为空的时候,它会产生一个Socket可写事件,此时程序就可以把数据写入到Socket中。如果一次写不完,就等待下一次的可写事件通知;反之,当发现缓冲区里有数据的时候,它会产生一个Socket可读事件,程序收到这个通知事件就可以从Socket读取数据了。

那么基于这些概念又引除了四个概念: 同步阻塞同步非阻塞异步阻塞异步非阻塞

3.1、同步阻塞

发送方向接收方发送请求后,一直等待接收方响应;接收方在处理请求时进行的IO操作如果不能马上得到结果,就一直等待结果返回才响应发送方。期间一直处于阻塞状态;

3.2、同步非阻塞

发送方向接收方发送请求后,一直等待响应,接收方在进行IO操作的时候,可以不需要等待直接去做其他事,而因为还没有获得结果,发送方仍然处于等待状态。接收方获得io的操作完成后,把结果响应给发送方,接收方才进入下一次请求过程

 

3.3、异步阻塞

发送方向接收方发送请求后,不用等待响应,可以接着进行其他操作。接收方处理请求时进行的IO操作如果不能立刻获得结果,就一直等待返回结果后向发送方响应 

 3.4、异步非阻塞

发送方发送请求后,不用等待响应,可以继续做其他事情。接收方处理请求时进行的IO操作如果不能马上得到结果,也不等待,而是去做其他事情。当io操作完成后,把结果通知给接收方,接收方再响应给发送方

以上资料引用于:(17条消息) Nginx-详解其原理_波波烤鸭的博客-CSDN博客_nginx原理