回调函数、同步、异步、阻塞、非阻塞、D-BUS等概念的理解

同步、异步与阻塞、非阻塞

这个几个概念很容易被混淆。这些概念基本都是使用在多个部件进行协作或需要在一定时间内完成的场景中。


首先,将这几个概念的定义和应用场景分析一下:

同步、异步

同步

同步的概念是应用在线程上,线程之间的同步是指两个或多个线程对同一个资源的协调使用。

那么什么是同步函数哪? 仍然与线程和资源有关。这里的资源,可以看做线程的操作任务。通常,此时同步函数内有对资源的同步操作,如mutex等。

当一个线程调用一个同步函数时(例如:该函数用于完成写文件任务),如果该函数没有立即完成规定的操作,则该操作会导致该调用线程的挂起(将CPU的使用权交给系统,让系统分配给其他线程使用),直到该同步函数规定的操作完成才返回,最终才能导致该调用线程被重新调度。 


异步

而异步函数,则是即使函数中的操作没有完成,没有结果返回,主线程也不会被阻塞。 而函数的任务则可能由其他线程或子线程来完成。完成后,再通知调用主线程,主线程内应该有相应的机制等待或响应处理结果(这里又是一个主线程对函数结果进行等待处理的过程)。


而当调用结果出来时,通知主线程的方式,即异步调用的实现方式有哪些?

回调函数(register, response)、event(windows)、消息(windows)


阻塞、非阻塞

不同的背景知识,对这些概念的使用范围也不同,这里特指网络IO的阻塞、非阻塞。另外多路IO, 异步IO也是网络IO中的常见形式。

处理IO请求,需要涉及两个对象,一个是本地线程,一个是内核kernel。

一个操作也一般会有两个步骤,如read,首先是数据准备阶段,数据从远程到内核的响应,然后是数据从内核copy到内存阶段。不同的IO类型,这两个阶段的表现形式不同。

若数据准备不足的情况下:

阻塞式IO

linux下,默认socket都是阻塞式IO

数据准备不足情况下,首先,用户线程会被阻塞,kernel会一直等到数据的到来。两个阶段都被阻塞。


非阻塞式IO

若数据准备不足,kernel会返回error给进程。并不会block用户进程,而用户想继续读数据,需要继续询问数据是否准备好了。

用户和kernel都没有被阻塞,但是不能保证获取数据。

而且在数据复制阶段,线程会被阻塞。


多路式IO

单个线程处理多个socket网络连接IO,每个网络连接都是非阻塞式IO,而用户线程是被阻塞,只不过是被select函数阻塞,而不是socket IO阻塞。


异步IO

用户线程发完请求,便立即返回,kernel处理请求,等待数据准备完成,然后,kernel复制数据到内存。

从表象上看,异步的用户进程是没有被阻塞,仍然运行,但kernel中的一个线程会等待“准备数据”(远程数据)。


在数据复制阶段,阻塞、非阻塞、多路IO 的用户线程都会被阻塞,而异步IO不会。

此外,非阻塞与异步的区别,在第一阶段,非阻塞会不断check数据准备是否完成,而异步不会。


以上参考博文:http://blog.csdn.net/historyasamirror/article/details/5778378

http://blog.csdn.net/bzhxuexi/article/details/19552719

回调函数

调用者提供函数指针名称和参数列表,由实现者完成内部的算法或逻辑过程。实现者只需要将这个函数注册一下(与调用者的联系接口),实现者是不负责函数的调用过程,也无法控制函数的调用。

异步调用就是回调函数的一种典型应用。

基于回调函数的异步调用:

A, B两个进程,A向B发送请求,A不等B的响应,继续干自己其他的事情;B收到请求,根据逻辑,在适当的时候处理请求,并调用A的回调函数,完成A的任务。


Dbus

以前用过一个叫DSI的机制,用于分布式系统间的数据传递,能运行与Q-net和Socket之上,是一个master-slave的网络结构。不过这是一个私有的库,资料较少。

对应的开源的机制是D-BUS,只不过dbus是用于桌面应用程序之间的进程通信,或进程与系统内核之间的通信Inter Process communication,IPC. 它也是基于socket实现的。

它的其他特性:低时延、低消耗,二进制的数据交换协议,支持一对一和多对多(需要daemon转发)。


而且,有人做了很漂亮的表格,将dbus与android的IPC通信机制binder进行比较:


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值