[RDMA]Asynchronous Event and Errors

本文详细介绍了IB协议中AsynchronousEvent和AsynchronousError的注册处理机制,区分了关联和非关联的异步事件,包括PathMigrated、CommunicationEstablished等,以及CQError、LocalWorkQueueCatastrophicError等错误类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IB协议中经常会提到Asychronous,它表示事件或错误不与特定的消息传输相关联。本文主要介绍Asynchronous Event与Asynchronous Error的相关内容。

1 Registering a Handler

software执行Set Asychronous Event Handler verb以注册一个处理程序,以便在HCA遇到Asynchronous Event 或 Asynchronous Error 时调用该程序。

每当HCA遇到Asynchronous Event 或 Asynchronous Error 时,它会警告其设备驱动程序(通常通过中断),传递给驱动程序的参数是:

  • HCA句柄。
  • 事件记录。包含指示资源类型和RID(Record ID)的信息,以及发生事件。

驱动程序依次调用异步事件处理程序,并将HCA句柄与事件记录传递给它 。

注册后,所有后续的异步错误将调用错误处理程序,在注册错误处理程序之前发生的异步错误将会丢失。每个HCA只能注册一个错误处理程序,后续调用Set Asychronous Event Handler verb将导致先前的处理程序地址被新的覆盖。

2 Affiliated Asychronous Events

“Affiliated”表示事件与特定的QP或EEC相关联。“Event”表示它并不是错误,而是software可能会发现有用的事件,因此相关的QP与EEC的状态保持不变。当前定义的关联异步事件有:

  • Path Migrated。连接被迁移到备用路径。
  • Communication Established。表明当QP或EEC仍处于RTR状态,
### FF_and_event 通信机制的原理与实现 FF_and_event 是一种常见的异步事件驱动型通信模式,广泛应用于嵌入式系统、操作系统以及跨线程消息传递场景中。以下是关于该通信方式的具体分析: #### 一、FF_and_event 的基本概念 FF_and_event 是指 **Fast Fail and Event** 或者类似的命名约定,具体含义可能因项目而有所不同。通常情况下,这种通信机制的核心在于快速失败检测(Fast Fail)和基于事件的通知机制(Event Notification)。它的主要目的是为了提高系统的响应速度并简化复杂的同步逻辑。 在 Android 蓝牙系统中,`bta_sys_sendmsg` 函数的设计初衷正是为了实现线程隔离和事件分发的统一管理[^1]。这表明 `FF_and_event` 类似的架构可以通过将事件转换到正确的线程来解决多线程环境下的资源竞争问题。 --- #### 二、FF_and_event 的核心原理 1. **快速失败 (Fast Fail)** 快速失败是指当某个条件不满足或者发生错误时,立即终止当前操作并向调用方返回状态码或异常信息。这种方式能够有效避免不必要的计算浪费,并及时通知上层模块采取补救措施。 2. **事件驱动模型 (Event-driven Model)** 在 FF_and_event 中,“event” 部分表示通过回调函数或其他形式注册监听器的方式接收外部触发信号。一旦目标事件被激活,则相应的处理器会被调度运行。这种方法非常适合用于高并发场景中的任务解耦。 3. **队列缓冲区 (Queue Buffering)** 多数实现会引入一个中间缓存结构——通常是 FIFO 队列——用来暂存尚未处理的消息项直到消费者线程取走它们为止。这样做的好处是可以平滑瞬时流量高峰带来的压力。 --- #### 三、FF_and_event 的典型实现方法 下面是一个简单的伪代码示例展示如何构建这样一个框架: ```c++ #include <queue> #include <thread> #include <mutex> #include <condition_variable> class FFAECommunicator { private: std::queue<std::function<void()>> event_queue_; mutable std::mutex mtx_; std::condition_variable cv_; bool stop_flag_; public: void Start() { stop_flag_ = false; std::thread worker_thread([this]() { ProcessEvents(); }); worker_thread.detach(); } void Stop() { { std::lock_guard<std::mutex> lock(mtx_); stop_flag_ = true; cv_.notify_all(); } } template<typename FuncType> void PostEvent(FuncType&& func) { { std::unique_lock<std::mutex> lock(mtx_); if (!stop_flag_) { event_queue_.emplace(std::forward<FuncType>(func)); } else { throw std::runtime_error("Cannot post events after stopping."); } } cv_.notify_one(); } private: void ProcessEvents() { while (true) { std::function<void()> task; { std::unique_lock<std::mutex> lock(mtx_); cv_.wait(lock, [this]() -> bool { return !event_queue_.empty() || stop_flag_; }); if (stop_flag_ && event_queue_.empty()) break; task = std::move(event_queue_.front()); event_queue_.pop(); } if (task) { try { task(); } catch (...) { // Handle exceptions here. } } } } }; ``` 上述代码片段定义了一个名为 `FFAECommunicator` 的类,它利用标准库组件实现了基础的任务排队与执行功能。其中涉及到了互斥锁 (`std::mutex`) 和条件变量 (`std::condition_variable`) 来保护共享数据的安全访问路径[^4]。 --- #### 四、应用场景举例 - **Android 系统中的蓝牙服务**: 如前所述,`bta_sys_sendmsg` 可能采用了类似的策略来进行跨线程间的数据交换; - **RTOS 下的任务协作**: STM32F103RCT6 微控制器配合 LiteOS 操作系统可以很好地完成多种硬件交互需求[^2]; - **高性能网络传输领域**: RDMA 技术减少了传统 TCP/IP 协议栈所带来的延迟开销,从而使得实时性强的应用受益匪浅[^3]。 --- #### 五、总结 综上所述,FF_and_event 提供了一种优雅的方式来应对复杂环境下频繁发生的异步请求挑战。无论是移动终端还是服务器端都可以从中获益良多。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值