同步异步和阻塞非阻塞概念辨析

同步异步和阻塞非阻塞概念辨析

IO系统调用

阻塞和非阻塞描述的是进程的一个操作是否会使得进程被挂起等待。阻塞总是和系统调用联系起来,若进程调用了系统调用,而该系统调用不能够立即完成(例如涉及到了IO操作),于是内核会将该进程设置为等待状态,调度其他进程上台运行,直到所请求的IO操作完成后再调度其重新上台运行。

在进行IO操作时,CPU需要与外部设备(例如磁盘、键盘鼠标等)进行交互,例如CPU向外设发送一个读取数据的请求后,就转而去执行其它任务了,直到外设准备好数据后向CPU发送一个中断信号,CPU再来读取相应的设备缓冲区。从这一点上来看,CPU与外设之间的交互是异步非阻塞的。

而大部分操作系统默认为用户级应用程序提供的都是阻塞式的系统调用API,因为阻塞式的调用可以使得应用程序的代码的执行顺序和编写顺序一致,使得程序开发更简单且不易出错。

大部分操作系统同时也会提供非阻塞的系统调用API,非阻塞的IO系统调用不会挂起程序,而是会立即返回一个值。

异步IO系统调用:调用后不会阻塞,应用程序可以继续执行其他的操作,等IO操作完成后,操作系统会通知调用进程(通知方式可以是设置一个用户空间的特殊变量或者触发一个signal或产生一个软中断或调用应用程序的回调函数)。

非阻塞IO和异步IO的区别:

  • 非阻塞IO:调用后立即返回可以拿到的数据,可以是完整的数据,也可以是不完整的数据,也可以是空数据。
  • 异步IO:结果必须是完整的,完成后会通过某种方式通知调用的进程。

进程级通信

仅就从进程级通信的角度分析,阻塞和同步(非阻塞和异步)就是一对同义词,且需要针对发送方和接收方作区分对待。

  • 阻塞式发送:发送方进程会被一直阻塞,直到消息被接收方收到。(即发送方要确保接收方同步收到消息才会接下来的操作。)
  • 非阻塞式发送:发送方进行调用send()后,立即返回。
  • 阻塞式接收:接收方调用recv()后一直阻塞,直到有消息可用。
  • 非阻塞式接收:接收方调用recv()后,直接返回,有可能得到一个消息,有可能得到空值。

猜你喜欢

转载自blog.csdn.net/qq_38600065/article/details/107464966