百度Cyber框架面试总结

简介: 百度Cyber框架面试总结

最近面试的过程中,发现不少面试官喜欢问Cyber框架的实现原理和特点,并且会结合操作系统的进程、线程和协程的概念,特此总结一下。

Cyber介绍

Cyber RT是一个runtime framework,可以理解为百度针对ROS 1在自动驾驶环境下的一些天生缺陷做的一套自己的框架(很多缺陷在ROS 2中得到了解决但ROS 2迟迟不见稳定版本)。Cyber RT的目标是做到高并发,低延迟以及高吞吐,这些特性都是自动驾驶任务所必须的。

简单来说,cyber是一个分布式收发消息,和调度框架

其架构,如下图所示:

  1. Apollo实现了最下层的基础库,比如Lock-Free的对象池,Lock-Free的队列等。这么做的目的一个是提高效率,另一个就是减少依赖
  2. 通信机制(从下往上第2,3层),包括服务发现和Publish-Subscribe通信机制。CyberRT也支持跨进程、跨机通信,上层业务逻辑无需关心,通信层会根据算法模块的部署,自动选择相应通信机制。
  3. 通信层之上的数据缓存/融合层(第4层)。不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用。
  4. 再往上是计算模型,包括调度层和任务
  5. 最上面是提供给开发者的接口层

细节介绍

调度

将调度、任务从内核空间放到了用户空间,在原生的thread上加了一层协程(Coroutine),Cyber RT主要调度的就是协程

协程,又称微线程。实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。协程之间可以通过 yield 方式转移执行权,对称(symmetric)、平级地调用对方,而不是像函数那样上下级调用关系。

Cyber RT调度器调度有状态的协程在各个线程上运行。协程不仅切换快,而且调度有着高确定性,

不像线程的调度完全依赖操作系统

通信

上层业务逻辑无需关心如何通信,通信层会根据算法模块的部署,自动选择相应通信机制(进程间、线程间、网络间)

数据处理流程


如上图所示,cyber的数据流程可以分为6个过程。

  1. Node节点中的Writer往通道里面写数据。
  2. 通道中的Transmitter发布消息,通道中的Receiver订阅消息。
  3. Receiver接收到消息之后,触发回调,触发DataDispather进行消息分发。
  4. DataDispather接收到消息后,把消息放入CacheBuffer,并且触发Notifier,通知对应的DataVisitor处理消息。
  1. DataVisitor把数据从CacheBuffer中读出,并且进行融合,然后通过notifier_唤醒对应的协程。
  2. 协程执行对应的注册回调函数,进行数据处理,处理完成之后接着进入睡眠状态。

通信节点概念

1.Component和Node的关系

Component是cyber中封装好的数据处理流程,Component模块在加载之后会执行"Initialize()"函数,这是个隐藏的初始化过程,对用户不可见在"Initialize"中,Component会创建一个Node节点,概念上对应ROS的节点,每个Component模块只能有一个Node节点,也就是说每个Component模块有且只能有一个节点,在Node节点中进行消息订阅和发布

2.Node和Reader\Writer的关系

在Node节点中可以创建Reader订阅消息,也可以创建Writer发布消息,每个Node节点中可以创建多个Reader和Writer。

3.Reader和Receiver,Writer和Transmitter,Channel的关系

一个Channel对应一个Topic,每个Topic都是唯一的。而Channel中包括一个发送器(Transmitter)和接收器(Receiver),通过Receiver接收消息,通过Transmitter发送消息。

一个Reader只能订阅一个通道的消息,如果一个Node需要订阅多个通道的消息,需要创建多个Reader。同理一个Writer也只能发布一个通道的消息,如果需要发布多个消息,需要创建多个Writer。

Reader中调用Receiver订阅消息,而Writer通过Transmitter发布消息。

4.Receiver, DataDispatcher和DataVisitor的关系


每一个Receiver接收到消息之后,都会回调中触发DataDispather(发布消息,DataDispather是一个单例,所有的数据分发都在数据分发器中进行,DataDispather会把数据放到对应的缓存中,然后Notify(通知)对应的协程去处理消息。

DataVisitor(消息访问器)是一个辅助的类,一个数据处理过程对应一个DataVisitor,通过在DataVisitor中注册Notify(唤醒对应的协程,协程执行绑定的回调函数),并且注册对应的Buffer到DataDispather,这样在DataDispather的时候会通知对应的DataVisitor去唤醒对应的协程。

也就是说DataDispather(消息分发器)发布对应的消息到DataVisitor,DataVisitor(消息访问器)唤醒对应的协程,协程中执行绑定的数据处理回调函数。


5.DataVisitor和Croutine的关系

实际上DataVisitor中的Notify是通过唤醒协程(为了方便理解也可以理解为线程,可以理解为你有一个线程池,通过线程池绑定数据处理函数,数据到来之后就唤醒对应的线程去执行任务),每个协程绑定了一个数据处理函数和一个DataVisitor,数据到达之后,通过DataVisitor中的Notify唤醒对应的协程,执行数据处理回调,执行完成之后协程进入休眠状态。


6.Scheduler, Task和Croutine

通过上述分析,数据处理的过程实际上就是通过协程完成的,每一个协程被称为一个Task,所有的Task(任务)都由Scheduler进行调度。从这里我们可以分析得出实际上Cyber的实时调度由协程去保障,并且可以灵活的通过协程去设置对应的调度策略,当然协程依赖于进程,Apollo在linux中设置进程的优先级为实时轮转,先保障进程的优先级最高,然后内部再通过协程实现对应的调度策略。

参考链接

https://www.pianshen.com/article/29641500401/
https://zhuanlan.zhihu.com/p/91322837
https://zhuanlan.zhihu.com/p/115046708

相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
缓存 算法 编译器
【C/C++ 泡沫精选面试题01】提高c++性能,你用过哪些方式去提升?
【C/C++ 泡沫精选面试题01】提高c++性能,你用过哪些方式去提升?
490 1
|
5月前
|
NoSQL 编译器 Linux
征服黑盒:手把手教你在QNX系统里玩转编译器与调试器
本文深入解析QNX微内核系统原理与开发实践:从“极简稳定”的微内核架构、核心消息传递机制,到交叉编译(qcc)、远程调试(GDB+pdebug)、性能分析(System/Application Profiler)及共享内存等高阶技术,覆盖驱动开发、C++移植、ROS 2集成与实战IPC服务构建,助力嵌入式开发者掌握车规级实时系统开发全栈能力。(239字)
735 9
|
存储 Java 芯片
终于有人将TWI(串行通讯接口)给讲通了!
终于有人将TWI(串行通讯接口)给讲通了!
终于有人将TWI(串行通讯接口)给讲通了!
|
IDE 网络安全 开发工具
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
本文介绍了如何使用VS Code通过Remote-SSH插件连接远程服务器进行代码开发,并与PyCharm进行了对比。作者认为VS Code在连接和配置多个服务器时更为简单,推荐使用VS Code。文章详细说明了VS Code的安装、远程插件安装、SSH配置文件编写、服务器连接以及如何在连接后切换文件夹。此外,还提供了使用密钥进行免密登录的方法和解决权限问题的步骤。
12686 0
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
|
自然语言处理 Java 测试技术
序列化性能之巅:使用Fury替换Protobuf/Flatbuffers实现10倍加速
问题背景Protobuf/Flatbuffers是业界广泛使用的序列化库,服务于大量的业务场景。但随着业务场景的复杂化,Protobuf/Flatbuffers逐渐不能满足性能需求开始成为系统瓶颈,在这种情况下,用户不得不手写大量序列化逻辑来进行极致性能优化,但这带来了三个问题:大量字段手写序列化逻辑冗长易出错;手写重复序列化逻辑开发效率低下;难以处理发送端和接收端字段变更的前后兼容性问题;这里将
3040 0
|
运维 IDE Java
SOA(面向服务架构)是什么?
SOA(面向服务架构)是什么?
3866 0
SOA(面向服务架构)是什么?