浅谈阻塞非阻塞与同步异步

阻塞非阻塞与同步异步区别

 
  • 同步阻塞
  • 同步非阻塞
  • 异步

同步阻塞

Linux上的IO默认情况下均为阻塞IO,所有的套接字也默认为阻塞套接字,我们所说的「阻塞」是指系统调用等待数据报达到这一行为。

这个过程就相当于一个人去书店买书,但是书卖完了,于是他就在书店一直等到书店到货并买到书之后才回家。

同步非阻塞

同样以买书的例子来说,非阻塞这一过程就是一个人去书店买书,如果书卖完了就回家。后面可能伴随着另一行为就是过一段时间再来书店看看书到货没(这就是轮询)。

另外对于IO复用(epoll/poll/select)就相当于一个人要买书,他先打电话询问书店老板是否有货,如果有货就去书店买。如果没货,就让书店老板在到货的时候通知他。

异步

异步IO是由POSIX规范定义的。它们的具体工作机制是:告知内核启动某个操作,并让内核在整个操作(包括把数据从内核复制到用户缓冲区这一过程)完成后再通知我们。

可以看到异步与同步的区别就在将数据从内核复制到用户缓冲区这一过程上。对于同步操作来说,这个过程是由用户来完成,用户在进行复制的过程中是不能做其他的动作的。而对于异步操作来说,将数据报复制到用户缓冲区这一过程是由内核来完成的,只是在内核完成这一操作后通知用户该缓冲区可以用了,用户在内核复制的过程中可以进行其他的动作行为。

相应的,对于买书这一行为就与同步时不同了。相当于一个人打电话向书店订购一本书,书店负责送货上门,书店有货就立即送货,如果没货就等到货后再送货,但是此人对这一过程不关心,他只知道当书店送货上门后就可以阅读这本书了。

总结

同步IO操作(synchronous I/O operation)导致请求阻塞,直到I/O操作完成。

异步IO操作(asynchronous I/O operation)不导致请求阻塞。

不管是阻塞IO还是非阻塞IO,当他们把数据从内核拷贝到用户缓冲区这一过程都是「阻塞」的(这里的阻塞与前文中同步阻塞/同步非阻塞中的「阻塞」意义不同,前文中的阻塞指系统调用等待数据准备好这一过程),所以阻塞IO/非阻塞IO都属于同步IO。需要注意的是异步IO并没有阻塞或者非阻塞一说。

原文地址:https://www.cnblogs.com/lyxdw/p/9875149.html