socket编程——阻塞、非阻塞、同步、异步

我这里主要是参考了这篇文章

一开始我很疑惑,同步异步和阻塞非阻塞有什么区别么?看了这篇文章感觉有所悟,所以来总结一下。


阻塞与非阻塞

  • 阻塞
    所谓阻塞,是指将一个IO操作交给底层之后,底层不执行完毕不返回。也就是程序运行到这里就卡住了,直到底层运行完毕才能继续。
    比如说一次接收,对于阻塞的recv,如果对面还没有发任何数据,也就是底层没有接收到任何数据,那么程序就会一直卡在这里,直到对面有数据发送过来,并且接收完毕,才会返回
  • 非阻塞
    非阻塞是指,执行一个IO操作后,如果底层没有准备好,那么就返回错误,而不是一直等待。比如同样是recv,非阻塞状态的时候,如果底层没有收到数据,或者还未接收完毕,那么就会返回错误。进程就需要用while循环一直调用相关函数查看套接口状态,直到查到套接口已经准备好(也就是底层已经接收完毕)再进行接收,这也就是轮询。或者更直接的,直接用while循环反复调用recv函数,直到其不报错。

同步与异步

  • 同步
    所谓同步,是说进程在执行IO操作的时候,需要主动地等待任务的完成。不论是阻塞式的等待,还是非阻塞的轮询,都需要主动地查看任务的状态,直至其完成,才执行其他操作。
  • 异步
    异步是指,将IO操作交给底层之后,就去执行其他操作,不是主动的去查询,而是被动的等待完成的信号。更类似于中断。

总结

所以同步异步与阻塞非阻塞的关系大概是酱婶的:
在这里插入图片描述
阻塞的一定是同步,异步的一定是非阻塞的。
嗯,大概就酱紫吧。

(如有错漏,还望指摘)

原创文章 34 获赞 41 访问量 5947

猜你喜欢

转载自blog.csdn.net/qq_44844115/article/details/103304667