从进程三状态到阻塞非阻塞,以及同步与异步

阻塞/非阻塞

这里,先讲一下进程三状态,即运行(执行)、就绪和等待(阻塞)。
从进程三状态到阻塞非阻塞,以及同步与异步
上图 1 清晰的表明 Linux 典型的进程三状态。

  • 就绪:是指调度程序为该进程分配了除 CPU 以外的其他资源,只要时间片一到(占用 CPU 的进程释放 CPU 资源),进程就可以执行了
  • 运行(执行):顾名思义,进程正在执行
  • 阻塞(等待):由于等待事件发生而无法执行的事件被执行的进程。有许多事件会导致进程阻塞,例如,等待 I/O 完成,应用程序缓冲区不能满足,等待字母(信号)等。

因此,阻塞主要跟进程的状态息息相关。阻塞/非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

同步/异步

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。
同步,就是在发出一个调用 时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了(宏观上,你可以理解成 TCP)。异步,就是发出一个 调用 时,不管收方的状态,调用直接返回,其实是没有返回结果。

借用知乎 2 上的总结

  • 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
  • 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。

所以,我们经常会听到异步 IO,线程被阻塞等待,它们其实不是同一维度的概念。笔者在这里尽量用非常简洁的语言说明同步异步、阻塞非阻塞之间的关系,如果你觉得太简单,可以访问 怎样理解阻塞非阻塞与同步异步的区别?


  1. https://www.cnblogs.com/javarice/p/11814373.html ↩︎

  2. 怎样理解阻塞非阻塞与同步异步的区别?https://www.zhihu.com/question/19732473 ↩︎