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

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.youkuaiyun.com/historyasamirror/article/details/5778378

http://blog.youkuaiyun.com/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进行比较:


比较项

指标

DBUS

Binder

大数据传输

性能一般,因为数据要拷贝

性能高,因为共享内存只改变映射,无内存拷贝

反映速度

好

好

底层机制

Socket

Share Memory

组网方式

多对多

一对一

语言支持(仅限Android平台)

C

C++ 和JAVA

第三方参与

Dbus-Daemon全程参与

Service Manager, 仅参与服务获取

通信方式

Signal, method call, method return, error messages

Method return, Link to death

寻址方式

对象路径注册,表格函数指针,如/org/cups/printer…

在Host进程注册服务,函数解析(JAVA层有工具)

安全

Authentication机制,复杂

UID检查,简单,Android采用

面向对象

否

是

应用层开发

不支持

支持

代码大小

Dbus + glib(简化版)

已内建



以上表格来源:http://blog.sina.com.cn/s/blog_5377f4930100pe01.html


关系

dbus与同步、异步、阻塞、非阻塞这些个概念有什么关系哪?

这里要看看涉及哪些对象?

一个dbus的daemon守护进程,用于数据转发与管理client和服务端。

两个进程A, B; A可以做服务端,B做客户端。

method call消息,method return消息:如一种流程:B会首先向A发出method call的消息, A通过method return的消息将结果发给B。

error消息:调用方法异常时,返回的错误消息

signal消息:类似于“事件”,通知指定的信号发生了。它们不返回任何内容。

--------------------------------

那么A是如何响应method call消息哪? B又是如何响应method return消息哪?

流程:

方法调用的一般流程:
1.使用不同语言绑定的dbus高层接口,都提供了一些代理对象,调用其他进程里面的远端对象就像是在本地进程中的调用一样。应用调用代理上的方法,代理将构造一个方法调用消息给远端的进程。
2.在DBUS的底层接口中,应用需要自己构造方法调用消息(method call message),而不能使用代理。
3.方法调用消息里面的内容有:目的进程的bus name,方法的名字,方法的参数,目的进程的对象路径,以及可选的接口名称。
4.方法调用消息是发送到bus daemon中的。
5.bus daemon查找目标的bus name,如果找到,就把这个方法发送到该进程中,否则,daemon会产生错误消息,作为应答消息给发送进程。
6.目标进程解开消息,在dbus底层接口中,会立即调用方法,然后发送方法的应答消息给daemon。在dbus高层接口中,会先检测对象路径,接口,方法名称,然后把它转换成对应的对象(如GObject,QT中的QObject等)的方法,然后再将应答结果转换成应答消息发给daemon。
7.bus daemon接受到应答消息,将把应答消息直接发给发出调用消息的进程。
8.应答消息中可以包容很多返回值,也可以标识一个错误发生,当使用绑定时,应答消息将转换为代理对象的返回值,或者进入异常。 


消息通过连接到达目的端后,连接会将挂起在该连接上的进程唤醒,由该进程将消息取走。每个连接都有一个唯一的名字和可选的其他多个名字,用于在多对多通讯时指明消息的发送者和接收者。

消息是Dbus的IPC机制中的一个信息传递媒介。


调用“方法”的方式有哪些?

1.同步调用,使用dbus_g_proxy_call发送方法请求到远端对象,dbus会阻塞等待远端对象的回应,输出参数里将会带有相应的回应数据,以G_TYPE_INVALID作为终止符。

2.异步调用,使用dbus_g_proxy_begin_call,它将返回一个DBusGPendingCall对象,可以使用dbus_g_pending_call_set_notify连接到自己的处理函授中。


有一点确定的是,各目标进程会响应消息,调用指定的方法。


对于同步调用的方式,为防止长时间阻塞另外一个进程,尽量快速处理。

-------

work thread 是与daemon守护进程直接通信的底层的工作进程,当多个请求转向同一client端时,就会启动多个work thread,每个thread相互独立,所以,他们之间不会阻塞。消息响应的次序也不是由请求顺序决定的。


参考:http://blog.youkuaiyun.com/linweig/article/details/5068136

保姆级教程:在OpenBMC项目中用sdbusplus C++接口注册你的第一个D-Bus服务 本文提供了一份详细的OpenBMC项目教程,指导开发者如何使用sdbusplus C++接口注册第一个D-Bus服务。通过温度监控服务的完整实现,深入解析sdbusplus的核心设计、异步事件集成和对象生命周期管理,帮助开发者高效扩展BMC功能。 阅读详情

相关推荐

跨时钟域基石:两级DFF同步器原理与工程实践

数字系统设计中,不同时钟域之间进行异步bus交互极为常见,而信号跨越时钟域时最核心的风险就是亚稳态。触发器采样若落在建立/保持时间窗口内,输出便处于不确定状态,并可能向后续逻辑传播,造成偶发性功能异常。两级DFF同步器通过“打两拍”方式,将亚稳态限制在第一级寄存器内,利用一个目的时钟周期完成解析,从而输出稳定合法电平,是单比特控制信号跨时钟域处理最基础、最通用的方案。在FPGA与芯片设计中,它广泛应用于使能、握手、中断等信号,但多bit数据总线、窄脉冲等场景需配合异步FIFO、脉冲同步器等策略。可靠性可用M

weixin_26913055的博客 267

Dbus

文章目录DBus三层架构:底层接口层总线层应用封装层 DBus (Desktop Bus) 是一种 IPC 机制, 由 freedesktop.org 项目提供, 用于进程间通信或进程与内核的通信 tips: IPC机制还有 fifo管道, share memory, semaphore, message queue, socket … DBus三层架构: 底层接口层 主要通过 libdbus...

weixin_44280688的博客 1796

Verilog入门:从软件思维到硬件描述的核心概念与实战避坑指南

硬件描述语言(HDL)是数字电路设计的核心工具,它通过代码定义硬件结构而非执行软件流程。其核心原理在于并行性,所有电路模块在物理上同时工作,这与软件的顺序执行思维截然不同。这种并行特性带来了巨大的技术价值,使得工程师能够高效设计复杂的集成电路、FPGA和ASIC。在FPGA开发、数字信号处理、通信系统等应用场景中,掌握Verilog的硬件描述思维至关重要。本文聚焦Verilog基础,深入解析模块定义、数据类型、赋值语句等核心概念,并针对初学者常见的仿真错误、锁存器生成和时序违例等实战问题提供解决方案,帮助读

weixin_30628077的博客 530

从D-Bus到Redfish:揭秘BMCWeb如何成为硬件管理的‘翻译官‘

本文深入解析了BMCWeb在OpenBMC开源项目中的核心作用,它作为硬件管理的“协议翻译官”,将底层硬件的D-Bus接口实时、准确地转换为符合Redfish标准的现代化RESTful API。文章详细阐述了其分层架构设计、核心组件以及从HTTP请求到D-Bus调用的完整翻译链路,揭示了BMCWeb如何高效连接硬件与现代自动化运维流程。

wind6的博客 746

OpenBMC实战:entity-manager如何用boost::asio实现单线程事件驱动架构

本文深入剖析了OpenBMC核心服务entity-manager如何采用基于boost::asio的单线程事件驱动架构。文章解释了该架构如何通过io_context事件循环高效处理D-Bus消息与JSON配置,在资源受限的嵌入式环境中实现高并发、无锁的异步I/O操作,从而在简化代码复杂度的同时,确保系统配置管理的稳定性与响应效率。

weixin_29220405的博客 266

dbus总线通信的原理和使用

1.什么是D-Bus D-Bus是一种高级的进程间通信机制,它由freedesktop.org项目提供,使用GPL许可证发行。D-Bus最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。目前,D-Bus已被大多数Linux发行版所采用,开发者可使用D-Bus实现各种复杂的进程间通信任务。 2.D-Bus的相关概念 D-Bu

yang1fei2的博客 8803

dbus-rs 入门教程:10 分钟理解 D-Bus 消息总线与 Rust 的结合

如果你想在 Linux 上让不同的进程互相"说话",D-Bus 消息总线几乎是绕不开的基础设施,而 **dbus-rs** 正是连接 D-Bus 消息总线与 Rust 语言的官方级桥梁。本文是一份面向初学者的 **dbus-rs 入门教程**,不预设你了解 IPC 或消息总线,只用 10 分钟带你跑通客户端、服务器、属性读取与信号监听等核心场景,帮你快速判断它是否适合你的下一个 Rust 项目。

gitblog_00450的博客 338

【嵌入式Bluetooth应用开发笔记】第一篇:DBUS概述与蓝牙开发小试牛刀

gdbus是Glib库提供的DBus API的实现,是基于DBus C API的一层封装。Glib是GNOME桌面环境的核心库,提供了许多常用的工具和组件,如事件循环、线程、内存管理、字符串处理、数据结构等。gdbus封装了DBus API,提供了一组更易用的API,比DBus C API更加简洁、直观、安全和高效。使用gdbus开发DBus应用程序,可以大大提高开发效率和代码质量。

百无禁忌想,脚踏实地干 5908

从扫描器到 SIEM:zero-breach 的 STIX、MISP 与 Pi-hole 黑名单导出实战指南

zero-breach 是一个免费、本地、只读的间谍软件痕迹扫描器,用于检测 AdFection / Candiru 广告投毒间谍软件活动留下的痕迹:无网络请求、无需管理员权限、零依赖,仅靠 Python 标准库即可运行。除了单机排查,它最有价值的是把同一套 405 条经过人工筛选的威胁指标(IOC),一键导出为 STIX 2.1 威胁情报包、MISP 事件和 Pi-hole / AdGuard

gitblog_00741的博客 82

dbus-async:异步DBus库

dbus异步 一个纯Rust编写的异步DBus库。 用法 将此添加到您的Cargo.toml : [ dependencies ] dbus-async = " ~2.1.0 " 您必须指定应使用哪个Tokio Runtime。 对于多线程,请将其添加到您的Cargo.toml : [dependencies.tokio] version = " ~1.1.1" features = [ "rt-multi-thread" ] 对于单线程,请将其添加到您的Cargo.toml : [dependencies.tokio] version = "~1.1.1" features = [ "rt" ] 例子 use dbus_async :: DBus; use dbus_message_parser :: Message; use std :: convert :: TryInto;

从立创商城到Cadence:手把手教你实现封装格式的精准迁移

本文详细介绍了如何从立创商城获取元器件封装并精准迁移至Cadence Allegro的全流程。通过实战案例MAX31865ATP+T芯片,逐步解析Altium Designer格式转换、Cadence环境配置、封装导入验证等关键步骤,提供常见问题解决方案和效率提升技巧,帮助硬件工程师实现封装格式的高效迁移。

weixin_42519985的博客 214

ARM Cortex-M EPI非阻塞读取与FIFO中断机制详解

在嵌入式系统开发中,外部存储器接口(EPI)是连接微控制器与外部存储设备的关键模块。其核心原理在于通过地址映射实现数据交换,但传统阻塞式访问会占用大量CPU时间,成为系统性能瓶颈。为解决这一问题,EPI模块引入了非阻塞读取机制,允许CPU发起请求后立即处理其他任务,数据由硬件自动搬运至内部FIFO缓冲区,再通过中断或DMA通知CPU批量处理,极大提升了系统并发效率。这一技术对于需要高速数据流的应用场景,如图像传感器采集、LCD帧缓冲更新以及与FPGA的数据交互至关重要。本文以TI Tiva™ TM4C129

cunfuteng7334的博客 419

博科的SAN交换机基本操作

2、添加用户testuser赋予user权限可以访问1-128VF默认VF为128账号描述"Test user"密码为password123。1、创建zone别名(100是指当前设备Domain ID,1和2是指对应的index号)2,删除新接入设备的ZONE或保持ZONE配置一致。3、将zone添加到当前生效的CFG中。2、将zone添加到当前生效的CFG中。3、将zone添加到当前生效的CFG中。3,将添加的级联端口持续关闭。4、将当前zone生效。4、将当前zone生效。1、查看当前所有用户。

chenjunokok的博客 1837

从D-Bus到Redfish:BMCWeb如何成为服务器管理的‘翻译官‘

本文深入探讨了BMCWeb在OpenBMC生态中的关键作用,作为服务器管理的'翻译官',它将底层硬件的D-Bus信号转换为标准化的Redfish RESTful API,实现了跨厂商、跨平台的统一管理。文章详细解析了BMCWeb的架构设计、协议转换机制及实际应用案例,展示了其在提升运维效率和降低开发复杂度方面的显著优势。

e1f2g的博客 65

实测有效!YOLOv8融合EMA注意力机制后,在无人机航拍目标检测中的性能提升对比

本文详细介绍了YOLOv8融合EMA注意力机制在无人机航拍目标检测中的性能提升效果。通过多尺度特征融合和通道-空间双重注意力机制,EMA模块显著提升了小目标检测的准确率,mAP@0.5平均提升4.2%,同时保持推理速度基本不变。文章还提供了模型定制、训练技巧和实际部署优化的全流程指南。

weixin_33704234的博客 390

手把手教你用C++和NI-VISA写个简易仪器上位机(附QT工程配置)

本文详细介绍了如何使用C++和QT框架结合NI-VISA驱动开发跨平台仪器控制上位机软件。从Ubuntu环境配置、VISA通信核心架构设计到QT界面与业务逻辑解耦,提供了完整的实战指南和代码示例,帮助开发者快速构建专业级仪器控制程序。

weixin_42522374的博客 273

Verilog开发实战:从阻塞赋值到跨时钟域处理的常见陷阱与解决方案

硬件描述语言(HDL)是数字电路设计的核心工具,其核心原理在于描述并发执行的硬件电路而非顺序执行的软件程序。理解这一根本差异是掌握Verilog等语言的关键技术价值,它直接决定了设计能否正确映射为实际硬件电路。在工程实践中,阻塞赋值与非阻塞赋值的误用、不完整敏感信号列表导致的锁存器推断、以及跨时钟域信号处理不当等问题,是导致仿真与综合结果不一致、系统不稳定的高频痛点。这些易错点广泛存在于FPGA开发、ASIC设计等应用场景中,尤其是在涉及复杂状态机、高速接口和系统集成的项目中。本文聚焦于Verilog开发中

weixin_33851177的博客 520

手把手教你用89C52单片机驱动0.96寸OLED(IIC接口,附完整代码)

本文详细介绍了如何使用89C52单片机通过I2C接口驱动0.96寸OLED显示屏,包括硬件连接、I2C通信原理、SSD1306驱动芯片的初始化及显存管理技巧,并提供了完整的代码示例和常见问题排查方法,帮助电子爱好者快速掌握OLED显示技术。

weixin_30781433的博客 369

dbus-rs 架构深度解析:Channel 双层设计与非阻塞实现原理

D-Bus 是 Linux 桌面系统中最核心的进程间通信(IPC)消息总线,而 **dbus-rs** 正是 Rust 语言生态中最成熟的 D-Bus 绑定库,为应用提供了与系统服务、桌面组件通信的完整能力。这篇 dbus-rs 架构解析文章,将带你深入理解它最具特色的 **Channel 双层设计**——同一套 API 背后同时支撑着基于 C 库的 FFI 实现与纯 Rust 实现,并剖析其 *

gitblog_00569的博客 310

在PPT里如何做出晶莹剔透的高级水泡感出来呢

水晶汽泡被大量使用在TED场景的演讲片稿中,给人以强烈的视觉冲击感。其实实现很简单。本篇就用三步教会大家如何制作这样的一种PPT效果。

打造全国最全的AI Agent开发知识领域的博客 1534

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

Zuul1.0和2.0我们该如何选择?

https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2651008077&idx=4&sn=c1fc508cb24e8f3585d2bf301df76253&chksm=bdbed41e8ac95d080b4db14b009aa3e48dc34469e6317c60c5731b089c766b4d15...

177

《30天入门 SAP BTP 开发》教程的目录和使用说明,建议收藏

本教程分为两部分:第一部分为SAP BTP入门系列,包含从基础概念到操作步骤的系统性学习内容,建议零基础用户按顺序学习;第二部分为专题文章集合,涵盖SAP BTP的多个技术点,适合已有基础的用户按需查阅。教程包含账号申请、Global Account操作、Java应用开发、AI工具使用等丰富内容,同时解答常见问题并提供实战案例。所有文章均附带详细链接,便于读者系统学习或针对性查阅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4377

从Bus Hound到QT代码:手把手教你抓包分析并控制自定义HID设备(Windows平台)

本文详细介绍了在Windows平台下使用Bus Hound抓包工具和QT+HIDAPI实现自定义HID设备通信的全过程。从设备识别、协议分析到代码实现,手把手教你完成抓包分析并控制HID设备,适用于嵌入式开发和硬件交互领域。

weixin_30908103的博客 380

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【简记】Operating System—— I/O

This memo is based on the course of Dr.Li with Operating System as the reference book.本章内容:传统的PC机总线结构: 总线( bus ) 是一组线和一组严格定义的可以描述在线上传输信息的协议。I/O端口通常有4 种寄存器,即状态寄存器、控制寄存器、数据输入寄存器与数据输出寄存器。 · 数据输入寄存器被主机读出

qqqqq1993qqqqq的博客 526

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

bluetui深度解析:基于Rust的异步蓝牙架构设计

bluetui是一款基于Rust语言开发的Linux蓝牙管理TUI工具,它采用现代化的异步架构设计,为用户提供高效、响应式的蓝牙设备管理体验。本文将深入剖析bluetui的异步架构设计原理,帮助开发者理解其内部工作机制和技术实现。 ## 异步编程模型:Tokio与async/await bluetui采用Rust生态中成熟的Tokio异步运行时,通过async/await语法构建非阻塞的异步任

gitblog_01143的博客 788

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 车辆姿态相关的一些传感器
下一篇: 倒车辅助Park Assist
viewcode
博客等级 码龄16年 993粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值