阻塞非阻塞同步异步
Posted xingguang1130
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻塞非阻塞同步异步相关的知识,希望对你有一定的参考价值。
1、阻塞与非阻塞
阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
2、同步与异步
同步与异步是对应于调用者与被调用者,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
同步和异步关注的是消息通信机制。
同步操作时,调用者需要等待被调用者返回结果,才会进行下一步操作。
而异步则相反,调用者不需要等待被调用者返回调用,即可进行下一步操作,被调用者通常依靠事件、回调等机制来通知调用者结果。
3、同步与异步调用/线程/通信
1)同步调用与异步调用
在用在调用场景中,无非是对调用结果的不同处理。
同步调用就是调用一但返回,就能知道结果,而异步是返回时不一定知道结果,还得通过其他机制来获知结果,如:
a. 状态 b. 通知 c. 回调函数
2)同步线程与异步线程
同步线程:即两个线程步调要一致,其中一个线程可能要阻塞等待另外一个线程的运行,要相互协商。快的阻塞一下等到慢的步调一致。
异步线程:步调不用一致,各自按各自的步调运行,不受另一个线程的影响。
3)同步通信与异步通信
同步和异步是指:发送方和接收方是否协调步调一致。
同步通信是指:发送方和接收方通过一定机制,实现收发步调协调。 如:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步通信是指:发送方的发送不管接收方的接收状态。 如:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
阻塞可以是实现同步的一种手段!例如两个东西需要同步,一旦出现不同步情况,我就阻塞快的一方,使双方达到同步。
同步是两个对象之间的关系,而阻塞是一个对象的状态。
4、I/O操作
IO分两阶段(一旦拿到数据后就变成了数据操作,不再是IO):
1.数据准备阶段
2.内核空间复制数据到用户进程缓冲区(用户空间)阶段
在操作系统中,程序运行的空间分为内核空间和用户空间。
应用程序都是运行在用户空间的,所以它们能操作的数据也都在用户空间。
阻塞IO和非阻塞IO的区别在于第一步发起IO请求是否会被阻塞:
如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
同步IO和异步IO的区别就在于第二个步骤是否阻塞:
如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
一般来讲: 阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。
5、同步和异步IO 阻塞和非阻塞IO
同步和异步IO的概念:
同步是用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行
异步是用户线程发起I/O请求后仍需要继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数
阻塞和非阻塞IO的概念:
阻塞是指I/O操作需要彻底完成后才能返回用户空间
非阻塞是指I/O操作被调用后立即返回一个状态值,无需等I/O操作彻底完成
6、总结
阻塞、非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
同步、异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。
对Unix来讲:阻塞式I/O,非阻塞式I/O,I/O复用(select/poll/epoll)都属于同步I/O,因为它们在数据由内核空间复制回进程缓冲区时都是阻塞的。只有异步I/O模型(AIO)是符合异步I/O操作的含义的,即在 1数据准备完成、 2由内核空间拷贝回缓冲区后通知进程,在等待通知的这段时间里可以干别的事。
参考:https://www.cnblogs.com/loveer/p/11479249.html
https://www.jianshu.com/p/3d603166f54d
以上是关于阻塞非阻塞同步异步的主要内容,如果未能解决你的问题,请参考以下文章