同步、异步调用
- 同步:线程调用后自己等待结果
- 异步:线程调用后等待其他线程发送结果
在线程调用层面同步异步和阻塞非阻塞并没有明显的差别,可以将二者看作相同的概念。但在IO层面来看二者是有区别的。在了解他们的区别之前首先要看什么是IO?
操作系统的IO
操作系统分为用户态和内核态,应用程序运行在用户空间,所以io请求需要先切换到内核态将数据从内核空间复制到用户空间。总的来说
IO分为两个步骤:
- 准备数据
- 内核空间数据复制到用户空间
同步,异步,阻塞,非阻塞IO
阻塞,非阻塞IO表示第一个步骤线程是否被阻塞。
同步,异步表示第二个过程是否阻塞,也就是说这个IO调用的结果是由自己线程调用后获得还是由别的线程在完成复制后由回调函数等方式返回该线程来决定
通过上面的图也可以看到,非阻塞IO在发起IO请求后会一直检查数据是否准备完成。
也就是说非阻塞IO和异步IO的区别在于:非阻塞IO在调用后会立即返回一部分已经准备好的数据(也可能是空),而异步IO只会返回完整的数据(返回的数据可能是在调用之后的某个时间)
四种组合
同步阻塞方式:
发送方发送请求之后一直等待响应。
接收方处理请求时进行的IO操作如果不能马上等到返回结果,就一直等到返回结果后,才响应发送方,期间不能进行其他工作。
同步非阻塞方式:
发送方发送请求之后,一直等待响应。
接受方处理请求时进行的IO操作如果不能马上的得到结果,就立即返回,去做其他事情。
但是由于没有得到请求处理结果,不响应发送方,发送方一直等待。
当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方,发送方才进入下一次请求过程。(实际不应用)
异步阻塞方式:
发送方向接收方请求后,不等待响应,可以继续其他工作。
接收方处理请求时进行IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作。 (实际不应用)
异步非阻塞方式:
发送方向接收方请求后,不等待响应,可以继续其他工作。
接收方处理请求时进行IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。
当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。(效率最高)