这里所说的概念都是指 API 和 网络 I/O 方面的,如果是其他科目同一词汇可能表达的是完全不同的概念,比如布式系统里的同步表示是各节点按照时钟节拍同步,而异步是收到消息后立即执行
同步就是调用方一直等着被调方完成
异步就是调用方不必等着被调方完成,完成后被调方通知调用方
阻塞就是调用方一直等着消息
非阻塞就是调用方不必一直等待消息,可以先去干别的
举个例子,就用在饭店点菜做例子
同步阻塞就是点完菜在前台一直等着上菜
同步非阻塞就是点完菜在前台处玩手机
异步阻塞就是点完菜回座位一直等着上菜
异步非阻塞就是点完菜回座位上玩手机
同步和异步关心的是调用方和被调方之间消息通信的机制
同步:发出的调用在没有得到结果之前不返回
异步:发出调用即刻返回,等待回调函数返回结果
异步编程:Node.js
阻塞非阻塞关心的是调用方在等待结果时的状态
阻塞是在调用返回结果之前一直等待
非阻塞是在调用返回结果之前不必等待,但是可以经常检查是否完成
是否阻塞和同步异步没有任何关系
你是等着上菜还是玩手机和你在前台等还是在座位等没有任何关系
在类 UNIX 中存在五种 I/O 模型
- 阻塞式I/O
- 非阻塞式I/O
- I/O复用(select,poll,epoll…)
- 信号驱动式I/O(SIGIO)
- 异步I/O(POSIX的aio_系列函数)
想要详细了解请参阅《 UNIX 网络编程:卷一》
对 UNIX 来讲:阻塞式 I/O (默认),非阻塞式 I/O (nonblock),I/O 复用(select/poll/epoll)都属于同步 I/O,因为它们在数据由内核空间复制回进程缓冲区时都是阻塞的(不能干别的事)。只有异步 I/O 模型(AIO)是符合异步 I/O 操作的含义的,即在1数据准备完成、2由内核空间拷贝回缓冲区后 通知进程,在等待通知的这段时间里可以干别的事
陈硕认为在处理 IO 的时候,阻塞和非阻塞都是同步 I/O,而只有使用了特殊的 API 才是异步 IO